Calcular Idade

[quote=davidbuzatto]O problema é o ciclo.

Nasceu dia 29/02. No próximo ano, conta mais um ano se estiver em 01/03 até encontrar mais um ano bissexto (que não é necessariamente de 4 em 4 anos!). Se o ano que está sendo pesquisado for bissexto, a pessoa vai fazer aniversário no dia 29/02 e não no dia 01/03 concorda? Precisa tratar isso para ter um resultado mais preciso.

Tem um problema no UVa que trata extamente disso (idade): http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2160
Ainda não consegui resolvê-lo, apesar do meu programa estar gerando as saídas esperadas.

[]'s[/quote]

Mas o meu código trata exatamente como você descreveu, se a pessoa nasceu em 29/02/2008 fica assim como resultado:

29/02/2008 até 01/03/2009 result 0 (não tratei meses para esse caso)
01/03/2009 até 28/02/2010 result 1
01/03/2010 até 28/02/2011 result 2
01/03/2011 até 28/02/2012 result 3
29/02/2012 até 28/02/2013 result 4
e assim por diante…

Isso porque tiro a diferença entre os anos atual e de nascimento e depois verifico se a pessoa ja fez aniversário ou não pelo mês e dia, caso ela não tenha feito aniversário eu reduzo 1 da diferença entre os anos. Faça uns testes aí e veja se você acha algo de errado. De qualquer forma, vou olhar seu código e o exercício que você indicou.

Grande Abraço!

Vingdel, depois vou dar uma olhada no seu código.
Tente fazer o exercício para validar seu algoritmo. Se der certo me avisa.

Apaguei seu tópico duplicado.
Vou dormir hehe.

Abraço!

Acabei de resolver o exercício, segue meu código aplicado a ele:[code]import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Scanner;

public class HowOldAreYou {
Scanner entrada = new Scanner(System.in);
public HowOldAreYou(){
System.out.print("Casos a testar: ");
int casos = entrada.nextInt();
String[] datasNasc = new String[casos];
for(int i = 0; i < casos; i++){
System.out.print("Digite a data numero “+(i+1)+”: ");
datasNasc[i] = entrada.next();
}

	for(int i = 0; i < casos; i++){
		if(calcIdade(datasNasc[i]) < 0)
			System.out.println("Case #" +(i+1)+ ": Invalid birth date");
		else if(calcIdade(datasNasc[i]) > 130)
			System.out.println("Case #" +(i+1)+ ": Check birth date");
		else
			System.out.println("Case #" +(i+1)+ ": " + calcIdade(datasNasc[i]));
	}
}

public int calcIdade(String nasc){

	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	Date hoje = new Date();
	String[] dtHoje = sdf.format(hoje).split("/");

	String[] dtNasc = nasc.split("/");
	
	int idade = 0;
	idade = Integer.parseInt(dtHoje[2]) - Integer.parseInt(dtNasc[2]);
	if(Integer.parseInt(dtNasc[1]) > Integer.parseInt(dtHoje[1]))
		idade--;
	else if(Integer.parseInt(dtNasc[1]) == Integer.parseInt(dtHoje[1]) && Integer.parseInt(dtNasc[0]) > 

Integer.parseInt(dtHoje[0]))
idade–;
return idade;
}

public static void main (String[] args) {

	new HowOldAreYou();
}

}
[/code]Obs.: Só não achei necessário fazer a entrada de duas datas, estou tomando como base do que seria entrada da data atual a data atual real.

Abraço!

[quote=Vingdel]fernandopaiva o seu código não está verificando o dia e o mês de nascimento, seu código entende que eu tenho 30 anos, porém eu tenho 29, afinal nasci em 12/11/1982. De acordo com seu código, se eu tivesse nascido em 21/11/1994 eu seria “Maior de Idade”, porém eu teria 17 anos.

Fiz assim:

[code] public int calcIdade(String nasc){

	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	Date hoje = new Date();
	String[] dtHoje = sdf.format(hoje).split("/");

	String[] dtNasc = nasc.split("/");
	
	int idade = 0;
	idade = Integer.parseInt(dtHoje[2]) - Integer.parseInt(dtNasc[2]);
	if(Integer.parseInt(dtNasc[1]) > Integer.parseInt(dtHoje[1]))
		idade--;
	else if(Integer.parseInt(dtNasc[1]) == Integer.parseInt(dtHoje[1]) && Integer.parseInt(dtNasc[0]) > Integer.parseInt(dtHoje[0]))
		idade--;
	return idade;
}[/code]Abraço![/quote]

Pra quem disse q o problema era apenas “Calcular Idade”, sem criterios ou informacoes do que realmente queria, a maneira como fiz funciona ;).
Eu apenas respondi o que foi pedido, “Calcular Idade”, como disse em um post acima: Se um professor me pedisse apenas isso sem informacao qquer faria isso e pronto, pois o problema proposto falta informacoes para resolucao :wink:

t+ e boa sorte.

Sim, porém seu cálculo da idade está errado. Você não pode dizer que uma pessoa com 17 anos é “maior de idade” supondo que uma pessoa seja “maior de idade” com 18 anos ou mais. Entendo seu questionamento, porém não justifica o erro do seu código.

EDIT: Não diria nem que o código está errado, mas sim incompleto, que faz com que em alguns casos o retorno seja errado.

Abraço!

Como estão nesses links, eu acho mais fácil:

http://www.furutani.com.br/2009/02/calculo-da-diferenca-entre-datas-em-java/
http://javafree.uol.com.br/topic-856736-Diferencas-entre-datas.html

fernando, não precisa ter um porque ali. ele calcula porque recebe apenas a data de nascimento e com isso pode ter a idade. pode servir para um site de relacionamentos ou qualquer cadastro. ou ainda de astrologia, diversas coisas, a idade da pessoa já é o interesse do cálculo, só com a data de nascimento.

independente de ser maior ou menor.

uma coisa importante aí, é que tem que ser avaliado o dia de hoje, para ver se fez aniversário, se está fazendo ou coisa parecida.

mas nao pode receber inteiros por exemplo, ou mesmo a data, em um textfield formatado?
ficaria mais fácil, eu acho. se inseridos em campos separados.

[quote=Vingdel]Sim, porém seu cálculo da idade está errado. Você não pode dizer que uma pessoa com 17 anos é “maior de idade” supondo que uma pessoa seja “maior de idade” com 18 anos ou mais. Entendo seu questionamento, porém não justifica o erro do seu código.

EDIT: Não diria nem que o código está errado, mas sim incompleto, que faz com que em alguns casos o retorno seja errado.

Abraço![/quote]

exatamente Vingdel, vc disse: EDIT: Não diria nem que o código está errado, mas sim incompleto, que faz com que em alguns casos o retorno seja errado.

Foi exatamente o q eu disse, problema mau proposto resposta mau dada concorda ? Eh a msma coisa de eu chegar aqui e dizer “Nome do meu tatatatatatatatatatata vô”, nem minha bisavó vai saber…kkkkkkkkkkkkkkk !!! Teria q recorrer a um cartório da época q pegou fogo q nao salvou os documentos q se perderam ao vento q foi pras cucuias etc…etc…etc.Enfim, sao mais de 1milhao de coisas a se fazer a se procurar a se entender pois o problema proposto falta informacoes para solucao.

Como eu disse, se um professor meu de calculo chegar e der " 1 + 1 = ? ", depende…Derivada, Integral, Encontre as Coordenadas, Uma lei de Newton, Um problema de Física …Q por** q vc quer q eu faca ??? Eh o q eu perguntaria ao professor e foi o perguntei no meu primeiro post. Para verificar as datas, daria para fazer de uma maneira bem mais simples como vc fez, usando apenas before() after() compare() ou implementando um between()…Mas pra isso deveria ter q converte-la para o formato americano ou ate msm usar locale, ai iria do gosto do fregues, mas seria bem mais facil q ficar quebrando strings.

Mas como disse, fica dificil vc imaginar o que uma pessoa quer com apenas a linha “Calcular Idade”, ai vc pergunta…calcular o q ? Eh maior q 18, menor, nascido, o dia q nasceu, a hora q nasceu, qtos anos vai fazer daqui 50 anos, qtos anos tinha quando aconteceu uma ocorrencia…etc…etc…etc…etc… Enfim, 1 milhao de possibilidades para um problema com poucas informacoes para solucao.

#DONE

t+ e otimo fds pra todos.

[]s

Oi Vingdel,

Submeta o problema no UVa para ver se realmente está certo.
Na descrição do problema são apresentados apenas casos triviais.
Existem várias entradas críticas que são testadas no sistema de julgamento e eles esperam que você trate QUALQUER entrada que seja válida a partir da descrição do problema.

[]'s

[quote=davidbuzatto]Oi Vingdel,

Submeta o problema no UVa para ver se realmente está certo.
Na descrição do problema são apresentados apenas casos triviais.
Existem várias entradas críticas que são testadas no sistema de julgamento e eles esperam que você trate QUALQUER entrada que seja válida a partir da descrição do problema.

[]'s[/quote]
Bom, então vou fazer os tratamentos aqui e vou submeter pra eles.
Abraço!

Segue o código que submeti para UVa:[code]import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Scanner;
import java.util.InputMismatchException;
import java.text.ParseException;

public class HowOldAreYou {
Scanner input = new Scanner(System.in);
int cases;
boolean valida;
public HowOldAreYou(){
System.out.println("\nINPUT: \n");
do{
System.out.print(“Number of Cases (1-200 inclusive): “);
try{
cases = input.nextInt();
if(cases < 1 || cases > 200)
throw new InputMismatchException();
}catch(InputMismatchException e){
System.out.println(“Warning: Please enter only a 1-200 number.”);
input.nextLine();
continue;
}
}while(cases < 1 || cases > 200);
System.out.println(””);
String[] datasNasc = new String[cases];
for(int i = 0; i < cases; i++){
valida = false;
while(!valida){
System.out.print(“Type the date of case #”+(i+1)+": “);
datasNasc[i] = input.next();
try{
SimpleDateFormat df = new SimpleDateFormat(“dd/MM/yyyy”);
df.setLenient(false);
df.parse(datasNasc[i]);
valida = true;
}catch(ParseException e){
System.out.println(“Warning: Please, be sure to enter the correct date in the DD/MM/YYYY format.”);
}
}
}
System.out.println(”\nOUTPUT: \n");
for(int i = 0; i < cases; i++){
if(calcIdade(datasNasc[i]) < 0)
System.out.println(“Case #” +(i+1)+ “: Invalid birth date”);
else if(calcIdade(datasNasc[i]) > 130)
System.out.println(“Case #” +(i+1)+ “: Check birth date”);
else
System.out.println(“Case #” +(i+1)+ ": " + calcIdade(datasNasc[i]));
}
}
public int calcIdade(String nasc){

	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	Date hoje = new Date();
	String[] dtHoje = sdf.format(hoje).split("/");

	String[] dtNasc = nasc.split("/");
	
	int idade = 0;
	idade = Integer.parseInt(dtHoje[2]) - Integer.parseInt(dtNasc[2]);
	if(Integer.parseInt(dtNasc[1]) > Integer.parseInt(dtHoje[1]))
		idade--;
	else if(Integer.parseInt(dtNasc[1]) == Integer.parseInt(dtHoje[1]) && Integer.parseInt(dtNasc[0]) > Integer.parseInt(dtHoje[0]))
		idade--;
	return idade;
}

public static void main (String[] args) {

	new HowOldAreYou();
}

}[/code]

Abraço!

ai galera resolvi estudar a questão e fiz um programa também para calcular a idade. ficou bem bacaninha. acho que não tem bugs. é só olhar a lógica no código.
valeu.
para os iniciantes, também tem muita instrução boa e coisa legal de aproveitar no código.

aguardo coments.

Este tópico evolui bastante :thumbup:

Para o que inicialmente era um exercício de faculdade e com poucas informações (aliás, apenas um enunciado e um “método criado” (somente o nome :lol: )…

…agora já tem o suficiente para impressionar :shock: o professor que pediu este exercício.

O que eu gostaria de saber é:

  • você entendeu como fazer este exercício Peaceandlove :?:

E tenho tbm uma dica para vc Peaceandlove (que por incrível que pareça, ninguém lembrou de perguntar se vc tinha tentando fazer algo mais que dar o nome ao seu método inicialmente) tente o máximo possível resolver o seu problema sozinho (caso vc tenha tentando peço desculpas :smiley: ) antes de pedir ajuda (que acabou sendo a resposta integral do exercício), pois como vc viu era só uma questão de lógica (e não tão difícil assim :smiley: , digo isto da parte que eu ajudei (qndo entrou questões como ano bissexto dificultou mais).

flw :thumbup:

então isso que eu ia falar. ano bissexto não tem nada haver. exceto se a data corresponder a alguma situação ali perto, mas nem assim.

porque na minha lógica eu comparo a data de hoje, com a data do nascimento se é maior ou menor, independe do que aconteceu antes dela, baixe meu programa para ver.
ano bissexto ali é desnecessário. pelo menos a princípio, penso isto.

da uma olhada.aguardo coments

Legal :smiley: raghy mais um programinha útil que você fez.

flw :thumbup:

isso aí, testou funcionou?

acho que não tem erro na lógica ali não, né?

funcionou em todos os testes.

e como disse quanto aos anos bissextos, não precisa-se nem pensar neles.

Vingdel, o seu programa passou no teste?
Pergunto isso pois você joga um monte decoisas na saída que não deviam estar lá, sendo assim, o sistema de julgamento não vai aceitar.

[]'s

[quote=davidbuzatto]Vingdel, o seu programa passou no teste?
Pergunto isso pois você joga um monte decoisas na saída que não deviam estar lá, sendo assim, o sistema de julgamento não vai aceitar.

[]'s[/quote]

Pois é david, já enviei 3. O primeiro foi recusado pois eu não li os pré requesitos do código e não compilou no compilador deles, nada pode ser public, tudo tem que ser static, a classe tem que chamar Main, enfim, cheio de detalhes que eu não sabia. Acertei essas coisas, porém por algumas diferenças na entrada e saída ficou incompativel, já o terceito mandei como eles pedem na proposta, porém igualmente na segunda vez recebi a resposta:

[quote]Your submission with number 9666276 for the problem 11219 - How old are you? has failed with verdict Wrong answer.

Although your program was successful at compilation and execution stages, it was not able of solving the proposed problem.[/quote]Esse foi o último código que enviei:[code]import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Scanner;
import java.util.InputMismatchException;
import java.text.ParseException;

class Main {
static Scanner input = new Scanner(System.in);
static int cases;
static boolean valida;
static void HowOldAreYou(){

	do{
		// System.out.print("Number of Cases (1-200 inclusive): ");
		try{
			cases = input.nextInt();
			if(cases < 1 || cases > 200)
				throw new InputMismatchException();
		}catch(InputMismatchException e){
			System.out.println("Warning: Please enter only a 1-200 number.");
			input.nextLine();
			continue;
		}
	}while(cases < 1 || cases > 200);
	System.out.println("");
	String[] datasNasc = new String[cases];
	String[] datasHoje = new String[cases];
	for(int i = 0; i < cases; i++){
		valida = false;
		while(!valida){
			//System.out.print("Type the date of case #"+(i+1)+": ");
			datasHoje[i] = input.next();
			datasNasc[i] = input.next();
			System.out.println("");
			try{
				SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");  
				df.setLenient(false);
				df.parse(datasNasc[i]);
				valida = true;
			}catch(ParseException e){
				System.out.println("Warning: Please, be sure to enter the correct date in the DD/MM/YYYY format.");
			}
		}
	}

	// System.out.println("\nOUTPUT: \n");
	for(int i = 0; i < cases; i++){
		if(calcIdade(datasNasc[i], datasHoje[i]) < 0)
			System.out.println("Case #" +(i+1)+ ": Invalid birth date");
		else if(calcIdade(datasNasc[i], datasHoje[i]) > 130)
			System.out.println("Case #" +(i+1)+ ": Check birth date");
		else
			System.out.println("Case #" +(i+1)+ ": " + calcIdade(datasNasc[i], datasHoje[i]));
	}
}
static int calcIdade(String nasc, String hj){

	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	// Date hoje = new Date();
	// String[] dtHoje = sdf.format(hoje).split("/");

	String[] dtHoje = hj.split("/");

	String[] dtNasc = nasc.split("/");
	
	int idade = 0;
	idade = Integer.parseInt(dtHoje[2]) - Integer.parseInt(dtNasc[2]);
	if(Integer.parseInt(dtNasc[1]) > Integer.parseInt(dtHoje[1]))
		idade--;
	else if(Integer.parseInt(dtNasc[1]) == Integer.parseInt(dtHoje[1]) && Integer.parseInt(dtNasc[0]) > Integer.parseInt(dtHoje[0]))
		idade--;
	return idade;
}

public static void main (String[] args) {

	Main myWork = new Main();
	myWork.HowOldAreYou();
}

}[/code]SAÍDA:

[quote]C:\Users\Delano\Desktop>java Main
4

01/01/2007
10/02/2007

09/06/2007
28/02/1871

12/11/2007
01/01/1984

28/02/2005
29/02/2004

Case #1: Invalid birth date
Case #2: Check birth date
Case #3: 23
Case #4: 0[/quote]Já não sei qual pode ser meu erro.

Abraço!

Olá,

Viu só, não é tão trivial como parece :smiley:
Então, na verdade ele pede que tudo seja público, mas isso não influencia. Basta que sua classe se chame Main e que o seu código esteja no método main.
O Scanner deve ser criado a partir do System.in, como você faria em um programa normal.

Tente essas entradas:

[code]34

01/01/2007
10/02/2007

09/06/2007
28/02/1871

12/11/2007
01/01/1984

28/02/2005
29/02/2004

01/01/2004
02/01/2004

02/01/2130
01/01/2000

01/01/2031
02/01/1900

02/02/2031
02/02/1900

01/02/2031
01/02/2031

02/02/2031
03/02/2031

02/02/2031
03/01/2031

29/02/2008
29/02/2000

28/02/2008
29/02/2000

01/03/2008
29/02/2000

01/03/2001
29/02/2000

28/02/2001
29/02/2000

29/02/2000
29/02/2000

29/02/2000
28/02/2000

05/06/2031
06/06/1900

01/02/1984
02/01/1984

12/12/2004
12/12/2003

01/01/2031
02/01/1900

01/01/2004
01/02/2004

28/2/2001
1/3/2001

29/2/2000
1/3/2000

2/10/2000
2/11/1999

30/6/1978
8/9/1967

1/3/2000
29/2/2000

31/11/2005
01/12/1870

31/11/2002
01/12/1870

19/02/2012
19/03/2010

01/05/1150
01/01/1103

29/02/1100
29/02/1100

30/01/0001
30/01/0000[/code]

A saída esperada é:

Case #1: Invalid birth date Case #2: Check birth date Case #3: 23 Case #4: 0 Case #5: Invalid birth date Case #6: 130 Case #7: 130 Case #8: Check birth date Case #9: 0 Case #10: Invalid birth date Case #11: 0 Case #12: 8 Case #13: 7 Case #14: 8 Case #15: 1 Case #16: 0 Case #17: 0 Case #18: 0 Case #19: 130 Case #20: 0 Case #21: 1 Case #22: 130 Case #23: Invalid birth date Case #24: Invalid birth date Case #25: Invalid birth date Case #26: 0 Case #27: 10 Case #28: 0 Case #29: Check birth date Case #30: Check birth date Case #31: 1 Case #32: 47 Case #33: 0 Case #34: 1

[]'s

Como estamos falando de um problema que envolve datas, deem uma olhada nesses problemas:

300 - Maya Calendar Achei esse muito legal. ©
579 - ClockHands Legal. Dica: Cuidado com o ponteiro da hora :smiley: ©
893 - Y3K Problem Legal. Parece difícil, mas é bem fácil. (Java)
10070 - Leap Year or Not Leap Year Dica: Inteiros muuuito grandes. Cuidado com o formato da saída :smiley: (Java)
10371 - Time Zones Cuidado com o offset das timezones. (Java)
10683 - The decadary watch Esse é legal :smiley: Não vou contar o segredo :smiley: (Java)
11356 - Dates Fácil. (Java)
11650 - Mirror Clock Mais um para tomar cuidado com o ponteiro da hora :smiley: ©
11677 - Alarm Clock E se mudar o dia? (Java)
11947 - Cancer or Scorpio Legal :smiley: (Java)

Bom divertimento :smiley:

Os que precisam usar um calendário, fiz em Java. Os outros fiz em C.

Meu progresso no UVa pode ser visto no link uhunt ali na minha assinatura :smiley:
Estou de férias e ando viciado nesses problemas… Sou cadastrado no Uva desde 2006, mas comecei a fazer mais seriamente depois do natal :smiley:
Esse ano vou dar uns desafios desses para meus alunos de estruturas de dados. Quem fiz ganha ponto extra ;D Se alguém se destacar, vamos para a maratona.

[]'s