AGRADECIMENTO...

Pessoal, Gostaria de pedir desculpas aqueles que deixam perguntas/comentários/elogios/críticas e ainda não foram respondidos.

Aproveito a oportunidade para informar a todos que devido a correria do dia a dia não conclui o curso de BSI, por isso meus conhecimentos são limitados rsrsrs...

Ainda não retirei o blog do ar porque tem ajudado a diversos estudantes, principalmente os iniciantes.

As vezes, quando o trabalho me permite, ainda arrisco tentar resolver algumas questões rs... mas para não deixar esse blog parar no tempo, o ESTUDANTE que quiser enviar a resolução de alguma questão (código próprio) para o meu e-mail, terei o prazer de posta-la neste blog e será mantido a autoria.

Desde já agradeço a todos pelas visitas e desejo bons estudos.

Thiago Campos
(srthiago@hotmail.com)

quarta-feira, 13 de junho de 2012

Algarismo Romano em Java

Escreva um programa que converta um número decimal em algarismo Romano (Valores ate 3999).

Código Java

//Autor: Thiago Campos
//Data: 13/06/2012
//Programa escreve o numero decimal em Algarismo Romano para valores ate 3999

import java.util.Scanner;

/**
 *
 * @author Thiago
 */
public class RomanConverter {

    public static void main(String[] args) {
        //declaração de variaveis
        Scanner leia = new Scanner(System.in);
        int vlr, n;
        int sobra = 0;
        String roma = "";

        System.out.print("Informe um numero entre 1 e 3999:");
        vlr = leia.nextInt();
       
        n = vlr; //guarda o valor digitado
       
        //para 1000 ->M
        if (vlr < 4000) {
            while (vlr >= 1000) {
                roma += "M";
                vlr -= 1000;
            }
            //para 900 ->CM
            while (vlr >= 900) {
                roma += "CM";
                vlr -= 900;
            }
            //para 500 -> D
            while (vlr >= 500) {
                roma += "D";
                vlr -= 500;
            }
            //para 400 -> CD
            while (vlr >= 400) {
                roma += "CD";
                vlr -= 400;
            }
            //para 100 -> C
            while (vlr >= 100) {
                roma += "C";
                vlr -= 100;
            }
            //para 90 -> XC
            while (vlr >= 90) {
                roma += "XC";
                vlr -= 90;
            }
            //para 50 -> L
            while (vlr >= 50) {
                roma += "L";
                vlr -= 50;
            }
            //para 40 -> XL
            while (vlr >= 40) {
                roma += "XL";
                vlr -= 40;
            }
            //para 10 -> X
            while (vlr >= 10) {
                roma += "X";
                vlr -= 10;
            }
            //para 9 -> IX
            while (vlr >= 9) {
                roma += "IX";
                vlr -= 9;
            }
            //para 5 -> V
            while (vlr >= 5) {
                roma += "V";
                vlr -= 5;
            }
            //para 4 -> IV
            while (vlr >= 4) {
                roma += "IV";
                vlr -= 4;
            }
            //para 1 -> I
            while (vlr >= 1) {
                roma += "I";
                vlr -= 1;
            }
            System.out.println("O Algarismo Romano correspondente a " +n+ " é " + roma);
        } else {
            System.out.print("Valor Inválido!");
        } //fim do else
    } //fim do main
} //fim da classe

13 comentários:

  1. Olá Thiago
    achei um erro no seu codigo
    o valor de 900 é "CM" e não "CD" ;)

    ResponderExcluir
    Respostas
    1. Obrigado Gliter! Você tem razão, 900 é CM e não CD. O referido erro já foi corrigido.

      Obrigado pela atenção dada ao meu código. A idéia deste blog é ajudar estudantes a tirar suas dúvidas sobre código Java.
      Ps. Também sou estudante e tenho muiiitas dúvidas! rs...

      Portanto, sinta-se a vontade para encontrar erros...
      Um abraço!

      Excluir
  2. na verdade o seu codigo funciona para até 4999, pois a partir deste valor devemos usar uma barra em cima dos valores, etc etc

    ResponderExcluir
    Respostas
    1. Hum... Confesso que não pensei fazê-lo para 4999, é tanto que há uma validação de entrada para valores ate 3999.

      Outro detalhe é que para fazê-lo funcionar ate 4999 precisarei inserir ao código um while (vlr >= 4000) para que ele escreva corretamente 4 mil. Senão escreverá MMMM ao invés de MV(v com traço em cima).

      E sinceramente, não sei se tem como escrever um traço em cima da letra.

      Mais uma vez, obrigado pela dica.
      Um abraço

      Excluir
  3. O seu código compilou perfeitamente, Thiago.
    Meu professor de DSC I me passou esse exercício em sala e estava tendo muitas dificuldades para resolvê-lo. O seu código vai me ajudar bastante. Vou tentar entender cada passo que vc usou. Muito obrigado!

    ResponderExcluir
  4. Fico grato em saber que te ajudei Hediman, Espero que você realmente entenda como foi feito afinal, este é o objetivo, AJUDAR! Bons estudos!

    ResponderExcluir
  5. E se fosse ao contrario, de romano para arabe????

    ResponderExcluir
  6. Segue algoritmo mais organizado e mais fácil:
    package javaromano;

    public class JavaRomano {

    public static void main(String[] args) {

    }

    public static String gerar(int valor) {
    String romanos[] = new String[]{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
    int div[] = new int[]{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    String saida = "";
    String termos = "";
    int res = 0;
    int i = 0;
    do {
    res = valor / div[i];
    termos = "";
    for (int j = 1; j <= res; j++) {
    termos += romanos[i];
    }
    saida += termos;
    valor = valor % div[i];
    i++;
    } while (valor != 0);
    return saida;
    }

    public static long romanoToDecimal(String romano) {
    String r[] = new String[]{"CM", "CD", "XC", "XL", "IX", "IV", "M", "D", "C", "L", "X", "V", "I"};
    int d[] = new int[]{900, 400, 90, 40, 9, 4, 1000, 500, 100, 50, 10, 5, 1};
    String valor = romano;
    for (int i = 0; i < r.length; i++) {
    if (valor.contains(r[i])) {
    valor = valor.replace(r[i], d[i] + "#");
    }
    }
    Object decimais[] = valor.split("#");
    long total = 0;
    for (int i = 0; i < decimais.length; i++) {
    if (decimais[i].toString() != null) {
    total += new Integer(decimais[i].toString());
    }
    }
    return total;
    }

    }

    Para usar :gerar(valor decimal) retorna a String com valor em Romano;
    romatoToDecimal(String romano) retorna o inteiro com o valor em romano convertido.

    ResponderExcluir
  7. Este comentário foi removido pelo autor.

    ResponderExcluir
  8. Ola, eu gostaria de postar uma abreviação do seu programa usando array e ciclo for;

    import java.util.Scanner;

    /**
    *
    * @author tom rita
    * based in Thiago Campo
    */
    public class TesteNumeros {
    public static void main(String[] args) {
    //declaração de variaveis
    Scanner leia = new Scanner(System.in);
    int vlr, n;
    int sobra = 0;
    String roma = "";
    String[] r={"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
    int[] i={1,4,5,9,10,40,50,90,100,400,500,900,1000};

    System.out.print("Informe um numero entre 1 e 3999:");
    vlr = leia.nextInt();

    n = vlr; //guarda o valor digitado

    if (vlr < 4000) {
    for(int cont=12;cont>-1;cont--){
    while (vlr>=i[cont]){
    roma += r[cont];
    vlr -= i[cont];
    }

    }
    System.out.println("O Algarismo Romano correspondente a " +n+ " é " + roma);
    } else {
    System.out.print("Valor Inválido!");
    } //fim do else



    }



    }

    ResponderExcluir
  9. Obrigado Marcelo e Tom pelas novas maneiras de se obter o resultado. Fiquem a vontade para reescrever e postar novas opções de códigos. É buscando novas soluções que aprendemos sempre algo mais. Um grande abraço.

    ResponderExcluir
  10. como posso converter um numero decimal para texto?

    ex.:se digitar 2 deve imprimir dois.

    ResponderExcluir
  11. Olá... uma opção seria usar o CASE caso seja um numero limitado... tipo de 1 a 10... mas tb funcionará intervalos maiores, so ficará cansativo faze-lo.

    ResponderExcluir