001 import java.util.Scanner;
002 /**
003 Caso considere-se que o problema seja apenas usar métodos, o mais intuitivo (na minha opinião) é separar cada conversor em um método.
004 As variáveis são declaradas em um ou em outro de acordo com o uso.
005 Em escopos disjuntos (como em dois métodos), pode-se declarar variáveis
006 locais de mesmo nome. Cada uma pertencerá ao respectivo escopo.
007 Em escopos aninhados, é permitido caso um seja de classe e outro de
008 método. Não é permitido caso um seja de método e outro de bloco dentro
009 do método (por exemplo num for ou num if).
010 É alternativa também declarar as variáveis compartilhadas no escopo
011 da classe (o que nas condições adequadas pode ser chamado "variável
012 global"). Porém o uso de variáveis globais quando é possÃvel usar
013 variáveis locais não é boa prática de programação pois permite que
014 métodos interfiram uns com os outros.
015
016 Há vários pontos em usar métodos:
017 1-) ter blocos de código reutilizáveis, evitando reescrever código;
018 2-) facilitar depuração de código (os métodos podem ser testados
019 individualmente);
020 3-) facilitar o entendimento do código (métodos que já sabemos O QUE
021 fazem ou que não precisamos saber COMO fazem não são de leitura
022 obrigatória);
023 4-) distribuir a tarefa de codificação (cada programador é encarregado
024 por um método);
025 5-) substituir métodos é fácil (se dois métodos A e B fazem a mesma
026 coisa e tem a mesma assinatura, podemos substituir um pelo outro
027 quase sem esforço)
028
029 Não há metodologia que resulte na "melhor" partição do código em métodos.
030 Há heurÃsticas (mas todas elas podem ser violadas):
031 1-) Quanto menos variáveis em comum há entre dois trechos de
032 código, maior a chance de que eles possam ser separados em métodos
033 distintos.
034 2-) Caso as tarefas sejam distintas (CUIDADO - isto é subjetivo), por
035 exemplo receber dados, calcular e escrever o resultado, a semântica
036 permite separar o exemplo em três partes que "contém uma idéia" e por
037 isso "faz sentido" individualmente.
038 3-) Caso deseje-se codificar algo que tenha analogia com uma coisa ou
039 uma idéia já existente, é mais intuitivo que o código seja dividido
040 segundo essa analogia (por exemplo num simulador de vôo, que exista algo no código que represente o altÃmetro, o manche, a alavanca de
041 aceleração,....)
042
043 Note que a leitura do código melhora.
044
045 Vamos ao jeito fácil:
046 */
047
048 public class Conversor2 {
049 static int opt=0; // opcao de conversao
050 static int num10; // numero base 10 - destruido na conversao
051 static String num12; // numero base 12;
052 static int len;// comprimento do número base 12
053 static int m; // digito para conversor 10->12
054 static int i; // contador para conversor 12 ->10
055 static char c; // caracter corrente para conversor 12->10
056 static boolean numErr; // flag de erro no numero base 12
057 static Scanner sc=new Scanner (System.in); // leitor de teclado
058
059 /**
060 Este é o ponto de entrada do programa: o método que é invocado
061 pela JVM.
062 Pergunta ao usuário que conversor ele deseja usar e invoca
063 o método que faz a conversão. Permite também que o usuário
064 termine o programa e que refaça a escolha caso tenha digitado
065 uma opção que não existe.
066 */
067 public static void main (String[] args){
068 do {
069 System.out.println ("1 para 10->12; 2 para 12->10; 3 para sair");
070 System.out.println ("(inteiros - tipo diferente dá pau.)");
071 opt=sc.nextInt();
072 switch (opt) {
073 case 1: // 10->12;
074 dez2doze(); // invocação do método
075 break;
076 case 2: // 12->10;
077 doze2dez(); // invocação do método
078 break;
079 case 3: break;
080 default:
081 System.out.println ("Digite novamente.");
082 }
083 } while (opt!=3);
084 }
085
086 /** Esta é a declaração, ou definição do método. Dizemos como deve
087 ser a invocação (a assinatura do método) e o que ele deve fazer
088 (o bloco de código do método).
089 Este método pergunta ao usuário o valor inteiro na base 10 que
090 o usuário deseja converter, converte-o para um String que
091 representa o número na base 12 e o escreve na tela.
092 A conversão é feita por divisões sucessivas.
093 */
094 public static void dez2doze () {
095 System.out.println ("Digite o número decimal.");
096 System.out.println ("(inteiros - tipo diferente dá pau.)");
097 num10=sc.nextInt();
098 num12="";
099 while (num10>0) {
100 m=num10%12;
101 num10/=12;
102 switch (m) {
103 case 0:
104 num12='A'+num12;
105 break;
106 case 1:
107 num12='B'+num12;
108 break;
109 case 2:
110 num12='C'+num12;
111 break;
112 case 3:
113 num12='D'+num12;
114 break;
115 case 4:
116 num12='E'+num12;
117 break;
118 case 5:
119 num12='F'+num12;
120 break;
121 case 6:
122 num12='G'+num12;
123 break;
124 case 7:
125 num12='H'+num12;
126 break;
127 case 8:
128 num12='I'+num12;
129 break;
130 case 9:
131 num12='J'+num12;
132 break;
133 case 10:
134 num12='K'+num12;
135 break;
136 case 11:
137 num12='L'+num12;
138 break;
139 default:
140 System.out.println ("Erro desconhecido.");
141 }
142 }
143 System.out.println ("Resultado:" + num12);
144 }
145
146 /**
147 Este método pergunta ao usuário o valor na base 12 que
148 o usuário deseja converter, recebe-o como String, converte-o em
149 número inteiro na base 10 e o escreve na tela.
150 A conversão é feita por soma de produto do dÃgito por potência.
151 */
152 public static void doze2dez () {
153 System.out.println ("Digite o número base 12.");
154 num12=sc.next();
155 len=num12.length();
156 numErr=false;
157 num10=0;
158 i=0;
159 while ((i<len)&&(!numErr)){
160 c=num12.charAt(i);
161 i++;
162 num10*=12;
163 switch (c) {
164 case 'A':
165 num10+=0;
166 break;
167 case 'B':
168 num10+=1;
169 break;
170 case 'C':
171 num10+=2;
172 break;
173 case 'D':
174 num10+=3;
175 break;
176 case 'E':
177 num10+=4;
178 break;
179 case 'F':
180 num10+=5;
181 break;
182 case 'G':
183 num10+=6;
184 break;
185 case 'H':
186 num10+=7;
187 break;
188 case 'I':
189 num10+=8;
190 break;
191 case 'J':
192 num10+=9;
193 break;
194 case 'K':
195 num10+=10;
196 break;
197 case 'L':
198 num10+=11;
199 break;
200 default:
201 System.out.println ("Erro dÃgito não corresponde a número.");
202 numErr=true;
203 }
204 }
205 if (!numErr) System.out.println ("Resultado:" + num10);
206 }
207
208 }
|
Nenhum comentário:
Postar um comentário