Jump to content

Converter números entre bases


jfosorio
 Share

Recommended Posts

Pessoal,

tenho de desenvolver um programa no qual o utilizador dá o número, a base do número e a base para a qual quer converter.

Alguém sabe se há algum método java para fazer isto, ou o código tem de ser todo à "unha"? Já sei que existem métodos para converter para binário, octal e hexadecimal. Mas para o que se pretende, não chega.

A minha estratégia seria primeiro converter tudo para decimal, e depois realizar as operações aritméticas necessárias para converter para a base pretendida. Porém, o problema são as bases acima de 10 (que já envolvem letras). Nestes casos, tenho de verificar cada caractere da string e atribuir a cada letra o valor respectivo. Isto já sem mencionar a validação de cada um dos parâmetros...

Enfim, desta forma o programa vai ficar um pouco extenso. Só não sei se existe alguma forma mais optimizada de fazer isto...

Se alguém puder dar-me umas dicas, ou sugerir-me alguma exemplo para estudar, desde já agradeço.

CSS 3D Text - Partilha mensagens em 3D com os teus amigos no Facebook!

Portal de Informática it4life - Emprego, notícias, fórum, comunidade.

Link to comment
Share on other sites

Boas

a semana passada tive que fazer um exercício do género, não foi em Java, foi em Scheme, mas a lógica do exercício é a mesma.

(define imprime-ate-base-20
  (lambda (num base)
    (cond ((< num base) (display (decimal->outra num)))
          (else
           (imprime-ate-base-20 (quotient num base) base)
           (display (decimal->outra (remainder num base)))))))

(define decimal->outra
  (lambda (num)
    (cond ((< num 10) num)
          ((= num 10) "a")
          ((= num 11) "b")
          ((= num 12) "c")
          ((= num 13) "d")
          ((= num 14) "e")
          ((= num 15) "f")
          ((= num 16) "g")
          ((= num 17) "h")
          ((= num 18) "i")
          ((= num 19) "j")
          (else "?"))))



Ou seja, forneces o número e a base, depois se o número for menor que a base ele vai chamar o procedimento "decimal->outra" com esse número e faz o display do resultado, se não vai-te imprimir o resto da divisão do número pela base (e recorrendo ao "decimal->outra" para apresentar o resultado) e volta a chamar o procedimento "imprime-na-base" em que o número vai ser o número anterior sem o número menos significativo.

Funciona (como se pode ver pelo nome do procedimento) até base = 20.

Espero que tenhas conseguido perceber como está feito.

Link to comment
Share on other sites

Depois de algumas dores de cabeça, cheguei a um resultado minimamente satisfatório.

Deixo aqui o código para os possíveis interessados:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        String num;
        int baseI, baseC;
        Scanner ler = new Scanner(System.in);

        System.out.println("<Conversão Entre Bases>");
        System.out.print("\n(digite <SPACE> para sair)\nIntroduza o número para converter: ");
        num = ler.nextLine();
        while (!num.equals(" ")) {
            System.out.print("Indique qual a base do número (entre 2 e 16): ");
            baseI = ler.nextInt();
            System.out.print("Indique a base para conversão (entre 2 e 16): ");
            baseC = ler.nextInt(); ler.nextLine();
            if (converter(num, baseI, baseC).equals(" ")) {
                System.out.println("A(s) base(s) indicadas estão incorretas!");
            } else {
                System.out.println("Resultado:\n" + num + " (base " + baseI + ") = " + converter(num, baseI, baseC)
                        + " (base " + baseC + ")");
            }
            System.out.print("\n(digite <SPACE> para sair)\nIntroduza o número para converter: ");
            num = ler.nextLine();
        }
    }

    private static String converter(String n, int bi, int bc) {
        int j, i, dig, decimal;
        String numc, num;
        numc = num = "";
        //inicialização das variáveis
        dig = decimal = 0;
        j = n.length() - 1;

        if (bi < 2 || bi > 16 || bc < 2 || bc > 16) {
            return " ";
        }
        //converter para decimal
        for (i = 0; i < n.length(); i++, j--) {
            dig = Integer.parseInt(n.substring(i, (i + 1)), 16);
            if (dig > bi) {
                return " ";
            } else {
                decimal += dig * Math.pow(bi, j);
            }
        }

        //converter para a base pretendida
        while (decimal >= bc) {
            num += caracteres(decimal % bc);
            decimal /= bc;
        }
        num += caracteres(decimal % bc);

        //inverter a String
        for (i = num.length() - 1; i >= 0; i--) {
            numc += num.charAt(i);
        }
        return numc;
    }

    private static String caracteres(int d) {
        switch (d) {
            case 10:
                return "A";
            case 11:
                return "B";
            case 12:
                return "C";
            case 13:
                return "D";
            case 14:
                return "E";
            case 15:
                return "F";
            default:
                return String.valueOf(d);
        }
    }
}

Possivelmente, o código poderá ser optimizado. Se alguém tiver alguma sugestão, agradecia que me a comunicasse!

Cumprimentos para todos

CSS 3D Text - Partilha mensagens em 3D com os teus amigos no Facebook!

Portal de Informática it4life - Emprego, notícias, fórum, comunidade.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.