Idade por extenso(Questão prova)

Ola Galera tive uma prova ontem bem interresante sobre java, detalhe eu a fiz longe de computador, longe de IDE, longe de compilador, ou seja, no maozão.

Quando cheguei em casa tentei refazer, funciona mas eu sei que pode ser melhor,

esse o código:

import java.util.Scanner;

public class Pessoa{	
	private String nome;
	private String []dataNascimento;
	private String []unidade = {"zero","um","dois","tres","quatro","cinco","seis","sete","oito","nove"};
	private String []casaDez = {"dez","onze","doze","treze","quatorze","quinze","dezesseis","dezessete","dezoito","dezenove"};
	private String []dezenas = {"vinte","trinta","quarenta","cinquenta","sessenta","setenta","oitenta","noventa"};
	private int idade;
	
	public Pessoa(String nome, String dtNasc){
		this.nome = nome;
		this.dataNascimento = dtNasc.split("/");	
	}
	
	public int calculaIdade(String dataAtual){
		String []dtAtual = dataAtual.split("/");
		int diaA = Integer.parseInt(dtAtual[0]);
		int mesA = Integer.parseInt(dtAtual[1]);
		int anoA = Integer.parseInt(dtAtual[2]);
		
		int diaN = Integer.parseInt(dataNascimento[0]);
		int mesN = Integer.parseInt(dataNascimento[1]);
		int anoN = Integer.parseInt(dataNascimento[2]);
				
		if (diaN >= diaA && mesN >= mesA)
			idade = anoA - anoN - 1;
		else 
			idade = anoA - anoN;
		
		return idade;				
	}
	
	public String mostraIdadeExt(){
		if (idade >= 0 && idade <= 9)
			return unidade[idade];
		if (idade >= 10 && idade <= 19)
			return casaDez[idade-10];
		if (idade >= 20 && idade <= 99){	
			int tempId = idade/10;
			int tempUn = idade-(tempId*10);	
				
			if (idade % 10 == 0)
				return dezenas[tempId-2];
			else
				return dezenas[tempId-2] + " e " + unidade[tempUn];
		}
		return "";
	}
	
	public static void main(String []args){
		Scanner scan = new Scanner(System.in);		
		System.out.println("Informe o nome da pessoa: ");
		String nome = scan.nextLine();
		System.out.println("Informe a data de Nascimento: ");
		String dtN  = scan.nextLine();
		System.out.println("Informe a data atual");
		String dtA  = scan.nextLine();
	
		Pessoa p = new Pessoa(nome, dtN);		
		
		System.out.println("Idade: " +p.calculaIdade(dtA) + " ( "+p.mostraIdadeExt()+" anos )");
	}
}

Alguem poderia me ajudar a melhorá-lo?

[color=darkred][b]Talvez uma malhora poderia ser feita com o uso da classe Date do pacote java.util

Tbm achei interessante seu programa…

A sua idéia de criar um array de Strings com os nomes foi bastante criativa…

oK,
[/b][/color]

[quote=betoecomp][color=darkred][b]Talvez uma malhora poderia ser feita com o uso da classe Date do pacote java.util

Tbm achei interessante seu programa…

A sua idéia de criar um array de Strings com os nomes foi bastante criativa…

oK,
[/b][/color][/quote]

Eai Beto, pode deixar na proxima versão eu vou colocar sua sugestão, sobre o uso de arrays é bem interresante porque eu utilizo o indice para recuperar o nome por extenso da idade,

será que eu poderia utilizar Collections?

Se sim acho que o desempenho não seria o mesmo né. valeu

[color=darkblue][b]Talvez uma Hashtable ou Map…
Vc colocava uma String e um inteiro como chave…


Hashtable<Integer, String> numeros = new Hashtable();

numeros.put(10, "dez");
String s = numeros.get(10); // o valor de s seria "dez"

Espero ter ajudado…
[/b][/color]

Vou passar o fim de semana tentando fazer.

Valeu!

Eu achei interessante esta questão, por isso resolvi fazer outra versão utilizando as classes Calendar e GregorianCalendar. Acho que está versão tem algumas melhorias como:

  • o cálculo da idade é feito pelo método add da classe Calendar;
  • a data atual é obtida do sistema;
  • utilização de enum;
  • o método toString foi implementado.
    Ainda pode ser melhorado através do tratamento de exceções.

Espero ter ajudado!

Valeu!!!

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;

public class Pessoa {

	private int idade;

	private String nome;

	GregorianCalendar dtNasc;

	Pessoa(String nome, int ano, int mes, int dia) {
		this.nome = nome;
		this.dtNasc = new GregorianCalendar(ano, mes - 1, dia);
		GregorianCalendar hoje = new GregorianCalendar();
		hoje.add(Calendar.DAY_OF_MONTH, -dtNasc.get(Calendar.DAY_OF_MONTH));
		hoje.add(Calendar.MONTH, -dtNasc.get(Calendar.MONTH));
		hoje.add(Calendar.YEAR, -dtNasc.get(Calendar.YEAR));
		this.idade = hoje.get(Calendar.YEAR);
	}	

	enum NumerosDe0A19 {
		zero, um, dois, tres, quatro, cinco, seis, sete, oito, nove, dez, onze, doze, treze, quatorze, quinze,                                                     dezesseis, dezessete, dezoito, dezenove
	};

	enum DezenasDe20A90 {
		vinte, trinta, quarenta, cinquenta, sessenta, oitenta, noventa
	};

	public void mostraIdadeExt() {
		System.out.println("\nOlá, " + nome + "!");
		System.out.print("Você tem ");
		if (idade >= 0 && idade <= 19) {
			System.out.print(Pessoa.NumerosDe0A19.values()[idade]);

		} else {
			String idStr = Integer.toString(idade);
			int dezena = Integer.parseInt(idStr.substring(0, 1));
			int unidade = Integer.parseInt(idStr.substring(1, 2));
			System.out.print(Pessoa.DezenasDe20A90.values()[dezena - 2]);
			if (unidade != 0) {
				System.out
						.print(" e " + Pessoa.NumerosDe0A19.values()[unidade]);
			}
		}
		System.out.println(" anos.");
	}

	public String toString() {
		mostraIdadeExt();
		return "";
	}

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.print("Digite seu nome: ");
		String nome = input.next();
		System.out.print("Digite a data do seu nascimento (dd/mm/aaaa): ");
		String dtNasc = input.next();
		int dia = Integer.parseInt(dtNasc.split("/")[0]);
		int mes = Integer.parseInt(dtNasc.split("/")[1]);
		int ano = Integer.parseInt(dtNasc.split("/")[2]);
		Pessoa p = new Pessoa(nome, ano, mes, dia);
		System.out.println(p);

	}

}

Valeu Java Man, seu codigo esta bem legal, existem algumas coisinhas que eu não conheço como o enum… mas eu me comprometo a descobrir como funciona…

Valeu