Número por extenso - Trabalho

7 respostas
S

Bom dia pessoal,
Estou postando um trabalho que fiz de java, onde um usuário digita um número de 0 a 1000 e numa caixa de diálogo o número é retornado por extenso. Foi meu primeiro “grande projeto” em java, mas agora que eu estou tentando estudar melhor a linguagem vi que posso aperfeiçoar esse código, até para ficar bem mais legível. Vcs poderiam me ajudar postando códigos do mesmo programa mostrando o que eu poderia estar melhorando (talvez usando herança, polimorfismo, não sei)?

Ficaria muito grato.

Desculpe se o código ficou muito grande. Foi meu primeiro contato com a linguagem. rsrs

import javax.swing.JOptionPane; // importação da biblioteca p/ exibição das janelas gráficas;
public class Extenso { // declaração da classe Extenso;

	public static void main(String[] args) { // chamada do método main para iniciar o programa;
		
		int num;		// declaração da variável num para capturar o numero digitado;
		String U[];		// declaração do vetor unidade;
		String d[];		// declaração do vetor dezena;
		String c[];		// declaração do vetor centena;
		String conv;	// declaração da variável de conversão;
//---------------------------------------------------		
		U = new String[21];	// atribui a variável U um objeto String de 21 posições;
		d = new String[11]; // atribui a variável d um objeto String de 11 posições;
		c = new String[11]; // atribui a variável c um objeto String de 11 posições;
/*---------------------------------------------------		
	Cada posição do vetor U recebe um nome de acordo com o numero */	
		U[0] = "Zero";
		U[1] = "Um";
		U[2] = "Dois";
		U[3] = "Três";
		U[4] = "Quatro";
		U[5] = "Cinco";
		U[6] = "Seis";
		U[7] = "Sete";
		U[8] = "Oito";
		U[9] = "Nove";
		U[10] = "Dez";
		U[11] = "Onze";
		U[12] = "Doze";
		U[13] = "Treze";
		U[14] = "Quatorze";
		U[15] = "Quinze";
		U[16] = "Dezesseis";
		U[17] = "Dezessete";
		U[18] = "Dezoito";
		U[19] = "Dezenove";
/*---------------------------------------------------		
Cada posição do vetor d recebe um nome de acordo com o numero */	
		d[2] = "Vinte"; 
		d[3] = "Trinta";
		d[4] = "Quarenta";
		d[5] = "Cinquenta";
		d[6] = "Sessenta";
		d[7] = "Setenta";
		d[8] = "Oitenta";
		d[9] = "Noventa";
/*---------------------------------------------------		
Cada posição do vetor c recebe um nome de acordo com o numero */		
		c[1] = "Cento";
		c[2] = "Duzentos";
		c[3] = "Trezentos";
		c[4] = "Quatrocentos";
		c[5] = "Quinhentos";
		c[6] = "Seiscentos";
		c[7] = "Setecentos";
		c[8] = "Oitocentos";
		c[9] = "Novecentos";
		c[10]= "Mil";
//----------------------------------------------		

		conv = JOptionPane.showInputDialog("Digite um numero: "); // atribui uma caixa de texto a variavel conv;
		num = Integer.parseInt(conv); // converte a variavel 
//---------------------------verificações--------------------------------------------------------------------		
		if (num ==1000){ // verifica se o numero digitado é igual a mil
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n" + c[10]);	
		}  // se for igual exibe o vetor correspondente
//----------------------------------------------------------------------------------------------						
			if (num > 1000){ // verifica se o numero é maior que mil
			JOptionPane.showMessageDialog(null,"O numero digitado não é válido");
		} // se for, exibe a mensagem indicada;
//----------------------------------------------------------------------------------------------		
			if (num<=19){ // verifica se o numero é menor ou igual a 19
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + U[num]);
		} // se for, exibe o vetor U na posição do numero digitado;
	if (num > 19 && num < 100){ // verifica se o numero entra nessas condições respectivamente
		int dez = Integer.parseInt(conv.substring(0,1)); // se entrar o numero é dividido em substrings 
		int uni = Integer.parseInt(conv.substring(1,2)); // o primeiro numero recebe o nome de dez e o segundo uni
		if (uni == 0){ // verifica se o segundo numero é igual a zero;
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + d[dez]);// se for, apenas exibe a posição 
		} // do vetor da substring dez;  
		else { // senão, recebe a posição das substrings dez e uni;
		JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + d[dez] + " e " + U[uni]);
	}
	}
	
//---------------------------------------------------------------------------------------------	
	if (num >99 && num < 1000){// verifica se o numero entra nessas condições;
		int cen = Integer.parseInt(conv.substring(0,1));// se entrar, o primeiro numero é atribuido a variavel cen
		int dez = Integer.parseInt(conv.substring(1,2));// o segundo é atribuido a variavel dez;
		int uni = Integer.parseInt(conv.substring(2,3));// o terceiro é atribuido a variavel uni;
		if (cen ==1 && dez == 0 && uni == 0)// essa condição corresponde ao numero cem;
		{ c[1]= "Cem";// se for assim, o vetor c[1] recebe a palavra Cem;
		JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + c[cen]);// exibe de acordo com cen;
		} else
		if (dez == 0 && uni ==0){// verifica o segundo e o terceiro numero;
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + c[cen]); // exibe de acordo com cen;
		} else
		if (dez ==0){ // se o segundo numero for igual a zero, o vetor d não sera exibido;
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + c[cen] + " e " + U[uni]);
		} else
		if (uni == 0){// se o ultimo numero for igual a zero, o vetor U não sera exibido;
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + c[cen] + " e " + d[dez]);
		} else 
			if (dez ==1){// se o segundo numero for 1;
			int dezeuni = Integer.parseInt(conv.substring(1,3));// dezena e unidade tornam-se uma unica string 	
JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + c[cen] + " e " + U[dezeuni]);		
			}
		else { // não passando por nenhuma das condições acima;
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + c[cen] + " e " + d[dez]+ " e " + U[uni]);
			// sera exibido o vetor c,d e U;
					
				}
			}
		
	}
}

7 Respostas

jaboot

Cara, te falar que o https://github.com/caelum/caelum-stella já faz isso.

S

Vcs poderiam me ajudar, pessoal? Juro que não faço mais :smiley: . kkkkk

regis_hideki
Soruji:
Bom dia pessoal, Estou postando um trabalho que fiz de java, onde um usuário digita um número de 0 a 1000 e numa caixa de diálogo o número é retornado por extenso. Foi meu primeiro "grande projeto" em java, mas agora que eu estou tentando estudar melhor a linguagem vi que posso aperfeiçoar esse código, até para ficar bem mais legível. Vcs poderiam me ajudar postando códigos do mesmo programa mostrando o que eu poderia estar melhorando (talvez usando herança, polimorfismo, não sei)?

Ficaria muito grato.

Desculpe se o código ficou muito grande. Foi meu primeiro contato com a linguagem. rsrs

import javax.swing.JOptionPane; // importação da biblioteca p/ exibição das janelas gráficas;
public class Extenso { // declaração da classe Extenso;

	public static void main(String[] args) { // chamada do método main para iniciar o programa;
		
		int num;		// declaração da variável num para capturar o numero digitado;
		String U[];		// declaração do vetor unidade;
		String d[];		// declaração do vetor dezena;
		String c[];		// declaração do vetor centena;
		String conv;	// declaração da variável de conversão;
//---------------------------------------------------		
		U = new String[21];	// atribui a variável U um objeto String de 21 posições;
		d = new String[11]; // atribui a variável d um objeto String de 11 posições;
		c = new String[11]; // atribui a variável c um objeto String de 11 posições;
/*---------------------------------------------------		
	Cada posição do vetor U recebe um nome de acordo com o numero */	
		U[0] = "Zero";
		U[1] = "Um";
		U[2] = "Dois";
		U[3] = "Três";
		U[4] = "Quatro";
		U[5] = "Cinco";
		U[6] = "Seis";
		U[7] = "Sete";
		U[8] = "Oito";
		U[9] = "Nove";
		U[10] = "Dez";
		U[11] = "Onze";
		U[12] = "Doze";
		U[13] = "Treze";
		U[14] = "Quatorze";
		U[15] = "Quinze";
		U[16] = "Dezesseis";
		U[17] = "Dezessete";
		U[18] = "Dezoito";
		U[19] = "Dezenove";
/*---------------------------------------------------		
Cada posição do vetor d recebe um nome de acordo com o numero */	
		d[2] = "Vinte"; 
		d[3] = "Trinta";
		d[4] = "Quarenta";
		d[5] = "Cinquenta";
		d[6] = "Sessenta";
		d[7] = "Setenta";
		d[8] = "Oitenta";
		d[9] = "Noventa";
/*---------------------------------------------------		
Cada posição do vetor c recebe um nome de acordo com o numero */		
		c[1] = "Cento";
		c[2] = "Duzentos";
		c[3] = "Trezentos";
		c[4] = "Quatrocentos";
		c[5] = "Quinhentos";
		c[6] = "Seiscentos";
		c[7] = "Setecentos";
		c[8] = "Oitocentos";
		c[9] = "Novecentos";
		c[10]= "Mil";
//----------------------------------------------		

		conv = JOptionPane.showInputDialog("Digite um numero: "); // atribui uma caixa de texto a variavel conv;
		num = Integer.parseInt(conv); // converte a variavel 
//---------------------------verificações--------------------------------------------------------------------		
		if (num ==1000){ // verifica se o numero digitado é igual a mil
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n" + c[10]);	
		}  // se for igual exibe o vetor correspondente
//----------------------------------------------------------------------------------------------						
			if (num > 1000){ // verifica se o numero é maior que mil
			JOptionPane.showMessageDialog(null,"O numero digitado não é válido");
		} // se for, exibe a mensagem indicada;
//----------------------------------------------------------------------------------------------		
			if (num<=19){ // verifica se o numero é menor ou igual a 19
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + U[num]);
		} // se for, exibe o vetor U na posição do numero digitado;
	if (num > 19 && num < 100){ // verifica se o numero entra nessas condições respectivamente
		int dez = Integer.parseInt(conv.substring(0,1)); // se entrar o numero é dividido em substrings 
		int uni = Integer.parseInt(conv.substring(1,2)); // o primeiro numero recebe o nome de dez e o segundo uni
		if (uni == 0){ // verifica se o segundo numero é igual a zero;
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + d[dez]);// se for, apenas exibe a posição 
		} // do vetor da substring dez;  
		else { // senão, recebe a posição das substrings dez e uni;
		JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + d[dez] + " e " + U[uni]);
	}
	}
	
//---------------------------------------------------------------------------------------------	
	if (num >99 && num < 1000){// verifica se o numero entra nessas condições;
		int cen = Integer.parseInt(conv.substring(0,1));// se entrar, o primeiro numero é atribuido a variavel cen
		int dez = Integer.parseInt(conv.substring(1,2));// o segundo é atribuido a variavel dez;
		int uni = Integer.parseInt(conv.substring(2,3));// o terceiro é atribuido a variavel uni;
		if (cen ==1 && dez == 0 && uni == 0)// essa condição corresponde ao numero cem;
		{ c[1]= "Cem";// se for assim, o vetor c[1] recebe a palavra Cem;
		JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + c[cen]);// exibe de acordo com cen;
		} else
		if (dez == 0 && uni ==0){// verifica o segundo e o terceiro numero;
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + c[cen]); // exibe de acordo com cen;
		} else
		if (dez ==0){ // se o segundo numero for igual a zero, o vetor d não sera exibido;
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + c[cen] + " e " + U[uni]);
		} else
		if (uni == 0){// se o ultimo numero for igual a zero, o vetor U não sera exibido;
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + c[cen] + " e " + d[dez]);
		} else 
			if (dez ==1){// se o segundo numero for 1;
			int dezeuni = Integer.parseInt(conv.substring(1,3));// dezena e unidade tornam-se uma unica string 	
JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + c[cen] + " e " + U[dezeuni]);		
			}
		else { // não passando por nenhuma das condições acima;
			JOptionPane.showMessageDialog(null,"O numero digitado foi:\n " + c[cen] + " e " + d[dez]+ " e " + U[uni]);
			// sera exibido o vetor c,d e U;
					
				}
			}
		
	}
}

Primeiramente, algumas sugestões. Prefira trocar isso:

int num; // declaração da variável num para capturar o numero digitado;
String U[]; // declaração do vetor unidade;
String d[]; // declaração do vetor dezena;
String c[]; // declaração do vetor centena;
String conv; // declaração da variável de conversão;

Por algo mais ou menos assim:

int nuumeroDigitado;
String unidade[];
String dezena[];
String centena[];
String variavelconversao;

A vantagem do segundo, é que, ao contrário do comentário, é carregado durante todo o código. Se há comentários demais, é porque o código não está muito claro.

Segundo, o nome dos dois primeiros vetores não estão muito sugestivos do que eles fazem. do jeito que está, parece que o primeiro representa apenas o ultimo dígito da direita (unidades), e o segundo, apenas o penúltimo (dezenas), o que não ocorre.

Terceiro, por que você carregou os arrays com mais posições do que o necessário? No primeiro, você carregou 21 posições e usou 20. No segundo, você carregou 11 e usou 10.

S

Muito obrigado pelas dicas.

Então, como eu disse no começo, foi meu primeiro contato com a linguagem. Na verdade, estou buscando uma forma de aperfeiçoar o código usando melhor os conceitos de programação orientada a objetos, como encapsulamento, polimorfismo,herança. Creio que se eu conseguir dominar bem essas técnicas, meu código ficará naturalmente mais legível.

Com relação ao uso dos arrays, eu não entendi. Acho que se o código for testado, dá pra ver que nenhum array foi desnecessário.

Obrigado.

regis_hideki

Soruji:
Muito obrigado pelas dicas.

Então, como eu disse no começo, foi meu primeiro contato com a linguagem. Na verdade, estou buscando uma forma de aperfeiçoar o código usando melhor os conceitos de programação orientada a objetos, como encapsulamento, polimorfismo,herança. Creio que se eu conseguir dominar bem essas técnicas, meu código ficará naturalmente mais legível.

Com relação ao uso dos arrays, eu não entendi. Acho que se o código for testado, dá pra ver que nenhum array foi desnecessário.

Obrigado.

Quando você fez isso:

U = new String[21]; // atribui a variável U um objeto String de 21 posições;  
d = new String[11]; // atribui a variável d um objeto String de 11 posições;

Criou um array U de 21 posições, ou seja, de 0 a 20, mas o U[20] não foi utilizado. O mesmo acontece com o d[10].

Não sei se daria para mudar muuuuuita coisa com esse código a fim de treinar práticas de OO. Eu sugeriria procurar outro tipo de problema.

regis_hideki

Estou enviando um exercício que tive no segundo semestre, e que mexe com herença e polimorfismo. Muita coisa nele poderia ser melhorada, mas para por em prática esses fundamentos, acho válido.

InicianteJavaHenriqu

Olá Soruji :smiley:

Você pode começar aprendendo:

“Como não aprender orientação a objetos: o excesso de ifs” por Guilherme Silveira

E em seguida ver este mesmo exercício feito por Arizoide

flw :thumbup:

Criado 2 de fevereiro de 2012
Ultima resposta 9 de fev. de 2012
Respostas 7
Participantes 4