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 (!numErr) System.out.println ("Resultado:" + num10);
125 break;
126 case 3: break;
127 default:
128 System.out.println ("Digite novamente.");
129 }
130 } while (opt!=3);
131 }
132 }
|
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?
ResponderExcluirGrato desde já!
numErr indica se houve erro no formato do número ou não.
ExcluirO 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.