segunda-feira, 6 de abril de 2015

0.0.0.17.7.0 - Proposta de programa para resolver o problema

001 import java.util.Scanner;
002 
003 public class Conversor {
004     public static void main (String[] args){
005         int opt=0// opcao de conversao
006         int num10; // numero base 10 - destruido na conversao
007         String num12; // numero base 12;
008         int len;// comprimento do número base 12
009         int m;  // digito para conversor 10->12
010         int i;  // contador para conversor 12 ->10
011         char c; // caracter corrente para conversor 12->10
012         boolean numErr; // flag de erro no numero base 12
013         Scanner sc=new Scanner (System.in)// leitor de teclado
014 
015         do {
016             System.out.println ("1 para 10->12; 2 para 12->10; 3 para sair");
017             System.out.println ("(inteiros - tipo diferente dá pau.)");
018             opt=sc.nextInt();
019             switch (opt) {
020                 case 1// 10->12;
021                     System.out.println ("Digite o número decimal.");
022                     System.out.println ("(inteiros - tipo diferente dá pau.)");
023                     num10=sc.nextInt();
024                     num12="";
025                     while (num10>0) {
026                         m=num10%12;
027                         num10/=12;
028                         switch (m) {
029                             case 0:
030                                 num12='A'+num12;
031                                 break;
032                             case 1:
033                                 num12='B'+num12;
034                                 break;
035                             case 2:
036                                 num12='C'+num12;
037                                 break;
038                             case 3:
039                                 num12='D'+num12;
040                                 break;
041                             case 4:
042                                 num12='E'+num12;
043                                 break;
044                             case 5:
045                                 num12='F'+num12;
046                                 break;
047                             case 6:
048                                 num12='G'+num12;
049                                 break;
050                             case 7:
051                                 num12='H'+num12;
052                                 break;
053                             case 8:
054                                 num12='I'+num12;
055                                 break;
056                             case 9:
057                                 num12='J'+num12;
058                                 break;
059                             case 10:
060                                 num12='K'+num12;
061                                 break;
062                             case 11:
063                                 num12='L'+num12;
064                                 break;
065                             default
066                                 System.out.println ("Erro desconhecido.");
067                         }
068                     }
069                     System.out.println ("Resultado:" + num12);
070                     break;
071                 case 2// 12->10;
072                     System.out.println ("Digite o número base 12.");
073                     num12=sc.next();
074                     len=num12.length();
075                     numErr=false;
076                     num10=0;
077                     i=0;
078                     while ((i<len)&&(!numErr)){
079                         c=num12.charAt(i);
080                         i++;
081                         num10*=12;
082                         switch (c) {
083                             case 'A':
084                                 num10+=0;
085                                 break;
086                             case 'B':
087                                 num10+=1;
088                                 break;
089                             case 'C':
090                                 num10+=2;
091                                 break;
092                             case 'D':
093                                 num10+=3;
094                                 break;
095                             case 'E':
096                                 num10+=4;
097                                 break;
098                             case 'F':
099                                 num10+=5;
100                                 break;
101                             case 'G':
102                                 num10+=6;
103                                 break;
104                             case 'H':
105                                 num10+=7;
106                                 break;
107                             case 'I':
108                                 num10+=8;
109                                 break;
110                             case 'J':
111                                 num10+=9;
112                                 break;
113                             case 'K':
114                                 num10+=10;
115                                 break;
116                             case 'L':
117                                 num10+=11;
118                                 break;
119                             default
120                                 System.out.println ("Erro dígito não corresponde a número.");
121                                 numErr=true;
122                         }
123                     }
124                     if (!numErrSystem.out.println ("Resultado:" + num10);
125                     break;
126                 case 3break;
127                 default:
128                     System.out.println ("Digite novamente.");
129             }
130         while (opt!=3);
131     }
132 }
Java2html

2 comentários:

  1. Professor, não consegui entender a função da variável numErr. Qual é o seu papel? Que significado tem a expressão "flag" - nos comentários? Qual a relação existente da variável quando inserida no segundo while?

    Grato desde já!

    ResponderExcluir
    Respostas
    1. numErr indica se houve erro no formato do número ou não.
      O código lê o número na base 12 caracter por caracter, converte-o em seu valor numérico e soma ao acumulador (que conterá o resultado final). Caso algum caracter não tenha valor numérico correspondente (ou seja, não é uma letra de A a L) então o número digitado está errado. Isso é indicado por numErr. Como preciso apenas que numErr assuma dois valores, escolhi usar um boolean.

      numErr = false significa que não houve erro na leitura consequentemente o resultado está correto e escolhi que pode ser mostrado na tela.
      numErr = true significa que houve erro na leitura (a mensagem de erro é mostrada no default do switch) consequentemente a conversão é interrompida, o resultado não está correto e escolhi que não será mostrado na tela. Para interromper a repetição do conversor, numErr está na expressão relacional avaliada no while.

      Um boolean usado como indicador pode ser chamado flag. No caso, é um flag de erro.

      Excluir