Calcular Idade

46 respostas
P

Boa Tarde,

/*  M  E  T  O  D  O  S       A      I  M  P  L  E  M  E  N  T  A  R  */
    /**
     * Metodo que recebe uma String com a data de nascimento e devolve a idade
     *
     * A data de nascimento tem OBRIGATORIAMENTE O SEGUINTE
     * FORMATO: DD/MM/AAAA
     *
     * @param dataNascimento
     * @return retorna a idade
     */

Gostaria que me dessem aqui uma ajuda que tenho para fazer. Ja tenho o metodo criado:

public static int calcularIdade(String dataNascimento) {
 

}
Se me pudessem ajudar. Agradecia

PS: Não é permitido usar o GregorianCalendar nem o Calendar.

46 Respostas

InicianteJavaHenriqu

Nesse seu exercício da faculdade tem que obrigatoriamente receber a data de nascimento como String :?:

Pode receber mais um parâmetro na sua função calcularIdade :?:

Se sim, você poderia fazer isto:

public static int calcularIdade(String dataNascimento, String dataAtual) { /*Aqui você vai precisar usar substring para "quebrar" os parâmetros a cada "/" pesquise sobre isto é fácil. Depois você guarda em variáveis o dia atual, o dia do nascimento, o mês atual, o mês de nascimento, o ano atual e o ano de nascimento.*/ a=aa-an; dda=a*365; m=ma-mn; ddm=m*30; d=da-dn; td=dda-ddm-d; i=td/365; System.out.println("Sua idade é: " + i); }

flw :thumbup:

fernandopaiva
Peaceandlove:
Boa Tarde,
/*  M  E  T  O  D  O  S       A      I  M  P  L  E  M  E  N  T  A  R  */
    /**
     * Metodo que recebe uma String com a data de nascimento e devolve a idade
     *
     * A data de nascimento tem OBRIGATORIAMENTE O SEGUINTE
     * FORMATO: DD/MM/AAAA
     *
     * @param dataNascimento
     * @return retorna a idade
     */

Gostaria que me dessem aqui uma ajuda que tenho para fazer. Ja tenho o metodo criado:

public static int calcularIdade(String dataNascimento) {
 

}
Se me pudessem ajudar. Agradecia

PS: Não é permitido usar o GregorianCalendar nem o Calendar.

O que vc precisa ?? Calcular o que ?

P

Sim posso fazer isso !

Essa parte de dividir é através do String Tokenizer? ficando assim?

StringTokenizer st = new StringTokenizer(data, "/"); if (st.countTokens() != 3) { return false; } String dia, mes, ano; dia = st.nextToken(); mes = st.nextToken(); ano = st.nextToken();

P

fernandopaiva:

O que vc precisa ?? Calcular o que ?

Preciso de calcular a Idade .

fernandopaiva

Peaceandlove:
fernandopaiva:

O que vc precisa ?? Calcular o que ?

Preciso de calcular a Idade .

Realmente é muita pouca informacao para resolver um problema. Se um professor meu desse um problema desses diria q ficou louco.

Exercicio. “Calcule a idade”…Sim, mas calcular o que por***…Quer saber se eh menor de idade se eh maior de idade qdo nasceu. etc…etc.

estranho isso.

t+

P

Recebo uma data de Nascimento, subtraio a data de Hoje e recebo a idade.

Pode me ajudar cara ?

vlw.

InicianteJavaHenriqu

Peaceandlove:
Sim posso fazer isso !

Essa parte de dividir é através do String Tokenizer? ficando assim?

StringTokenizer st = new StringTokenizer(data, "/"); if (st.countTokens() != 3) { return false; } String dia, mes, ano; dia = st.nextToken(); mes = st.nextToken(); ano = st.nextToken();

Isto funciona :?:

Segue a legenda das minhas variáveis:

da = dia atual
ma = mês atual
aa = ano atual
dn = dia nascimento
mn = mês nascimento
an = ano nascimento
d = dias
m = meses
a = anos
td = total de dias
ddm = dias dos meses
dda = dias dos anos
i = idade

flw :thumbup:

P

InicianteJavaHenrique:
Peaceandlove:
Sim posso fazer isso !

Essa parte de dividir é através do String Tokenizer? ficando assim?

StringTokenizer st = new StringTokenizer(data, "/"); if (st.countTokens() != 3) { return false; } String dia, mes, ano; dia = st.nextToken(); mes = st.nextToken(); ano = st.nextToken();

Isto funciona :?:

Segue a legenda das minhas variáveis:

da = dia atual
ma = mês atual
aa = ano atual
dn = dia nascimento
mn = mês nascimento
an = ano nascimento
d = dias
m = meses
a = anos
td = total de dias
ddm = dias dos meses
dda = dias dos anos
i = idade

flw :thumbup:

Sim funciona, eu tenho outro método que faz isso.
Está aqui:

public static boolean isFormatoDataCorrecto(String data) { if (data == null || data.length() == 0) { return false; } StringTokenizer st = new StringTokenizer(data, "/"); if (st.countTokens() != 3) { return false; } String dia, mes, ano; dia = st.nextToken(); mes = st.nextToken(); ano = st.nextToken(); for (int i = 0; i < dia.length(); i++) { if (!Character.isDigit(dia.charAt(i))) { return false; } } return true; }
Basta apenas utilizar a parte do Tokenizer neste né?

InicianteJavaHenriqu

Peaceandlove:
Sim funciona, eu tenho outro método que faz isso.
Está aqui:

public static boolean isFormatoDataCorrecto(String data) {  
        if (data == null || data.length() == 0) {  
            return false;  
        }  
        StringTokenizer st = new StringTokenizer(data, "/");  
        if (st.countTokens() != 3) {  
            return false;  
        }  
        String dia, mes, ano;  
        dia = st.nextToken();  
        mes = st.nextToken();  
        ano = st.nextToken();  
        for (int i = 0; i &lt; dia.length(); i++) {  
            if (!Character.isDigit(dia.charAt(i))) {  
                return false;  
            }  
        }  
        return true;  
    }

Basta apenas utilizar a parte do Tokenizer neste né?

Se funciona você pode usar :smiley:

Tbm tem o .split()

flw :thumbup:

P
Eu fiz como disseste so que no fim vai dar :
Sua idade é: -1880

:shock: Está o código que usei:

Scanner teclado = new Scanner(System.in);
        Date now = new Date();
        System.out.println("Insira uma data: ");
        String data = teclado.next();
        StringTokenizer st = new StringTokenizer(data, "/");
        if (st.countTokens() != 3) {
            System.out.println("Erro");
        }
        String dn, mn, an;
        dn = st.nextToken();
        mn = st.nextToken();
        an = st.nextToken();
        int dni = Integer.parseInt(dn);
        int mni = Integer.parseInt(mn);
        int ani = Integer.parseInt(an);
        int da = now.getDay();
        int ma = now.getMonth();
        int aa = now.getYear();

       int a = aa - ani;
       int dda = a * 365;
       int m = ma - mni;
       int ddm = m * 30;
       int d = da - dni;
       int td = dda - ddm - d;
       int i = td / 365;
        System.out.println("Sua idade é: " + i);

A data que usei foi: 13/06/1993

O que está mal aí :oops:

fernandopaiva

veja como fazer.

public class VerificaIdade {
    private final SimpleDateFormat DATEFORMAT = new SimpleDateFormat("yyyy");             
    private Scanner sc;
        
    public VerificaIdade(){        
        System.out.println("Ano nascimento: ");
        sc = new Scanner(System.in); 
        verificaIdade(sc.next());
    }
    
    public void verificaIdade(String ano){
        /**         * 
         * @param ano Ano de Nascimento
         */
        try {
            Date hoje = new Date();
            Date nascimento = DATEFORMAT.parse(ano);            
            int today = Integer.parseInt(DATEFORMAT.format(hoje));
            int born = Integer.parseInt(DATEFORMAT.format(nascimento));
            int diferenca = today - born;
            if(diferenca < 18){
                System.out.println("Menor de idade");
            }else if(diferenca >= 18){
                System.out.println("Maior de idade");
            }            
        } catch (ParseException ex) {
            Logger.getLogger(VerificaIdade.class.getName()).log(Level.SEVERE, null, ex);
        }
    }        
    
    public static void main(String[] args){
        new VerificaIdade();
    }
    
}
P

Já consegui muito obrigado aos dois. :smiley:

Vlw ! :thumbup:

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:

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;
	}
Abraço!
P

Vingdel wrote:

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:

view plaincopy to clipboardprint?
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]) && Integer.parseInt(dtNasc[0]) > Integer.parseInt(dtHoje[0]))  
    idade--;  
else if(Integer.parseInt(dtNasc[1]) > Integer.parseInt(dtHoje[1]))  
    idade--;  
return idade;

}
Abraço!

Obrigado ! Abraço !

Vingdel

Dei uma editada no código para melhorar as verificações de dia e mês, se for usá-lo, ele está melhor agora.

Abraço!

davidbuzatto

Alguém ai lembrou de tratar anos bissextos? 8)

Vingdel

Você fala de, por exemplo, uma pessoa que nasceu em 29/02/2008?

No meu código, essa pessoa fará aniversário no dia 01/03 dos anos que não são bissextos, caso seja ano bissexto, fará em 29/02 mesmo. Não sei se tem uma regra para isso quando tratamos de idade, tem?

Abraço!

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

davidbuzatto

Ta ai o código caso você tenha interesse.

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.Scanner;

/**
 *
 * @author David Buzatto
 */
public class P11219 {
    
    public static void main( String[] args ) {
        
        Scanner s = new Scanner( System.in );
        //Scanner s = new Scanner( new Object().getClass().getResourceAsStream( "/teste.txt" ) );
        
        int nCases;
        int anos;
        GregorianCalendar currDate = new GregorianCalendar();
        GregorianCalendar birthDate = new GregorianCalendar();
        DateFormat df = new SimpleDateFormat( "dd/MM/yyyy" );
        
        nCases = Integer.parseInt( s.nextLine() );
        
        for ( int i = 1; i <= nCases; i++ ) {
            
            try {
                
                s.nextLine();

                currDate.setTime( df.parse( s.nextLine() ) );
                birthDate.setTime( df.parse( s.nextLine() ) );
                
                System.out.printf( "Case %d#: ", i );
                
                if ( birthDate.compareTo( currDate ) > 0 ) {
                    System.out.println( "Invalid birth date" );
                } else {
                    
                    anos = 0;
                    boolean leapProcessing = false;
                    
                    if ( birthDate.get( GregorianCalendar.DAY_OF_MONTH ) == 29 &&
                            birthDate.get( GregorianCalendar.MONTH ) == 1 ) {
                        leapProcessing = true;
                    }
                    
                    if ( leapProcessing ) {
                        
                        while ( true ) {
                            birthDate.add( GregorianCalendar.YEAR, 1 );
                            if ( anos % 4 == 0 )
                                birthDate.add( GregorianCalendar.DAY_OF_MONTH, 1 );
                            /*if ( anos % 4 == 3 )
                                birthDate.add( GregorianCalendar.DAY_OF_MONTH, -1 );*/
                            if ( anos != 0 && birthDate.isLeapYear( birthDate.get( GregorianCalendar.YEAR ) ) )
                                birthDate.add( GregorianCalendar.DAY_OF_MONTH, -1 );
                            if ( !( birthDate.compareTo( currDate ) > 0 ) ) {
                                anos++;
                            } else {
                                break;
                            }
                        }
                        
                    } else {
                        while ( true ) {
                            birthDate.add( GregorianCalendar.YEAR, 1 );
                            if ( !( birthDate.compareTo( currDate ) > 0 ) ) {
                                anos++;
                            } else {
                                break;
                            }
                        }
                    }
                    
                    if ( anos > 130 ) {
                        System.out.println( "Check birth date" );
                    } else {
                        System.out.println( anos );
                    }
                    
                }
                
            } catch ( ParseException exc ) {}
            
        }
        
    }
    
}

Tem um monte de coisa desnecessária (a flag leapProcessing por exemplo), mas com o objetivo é resolver o problema, eu acabo não refatorando.

[]'s

Vingdel

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

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!

davidbuzatto

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!

Vingdel
Acabei de resolver o exercício, segue meu código aplicado a ele:
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();
	}
}
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!

fernandopaiva
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:

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;
	}
Abraço!

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 ;)

t+ e boa sorte.

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!

T

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

R

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.

fernandopaiva

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!

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

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

Vingdel

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


Bom, então vou fazer os tratamentos aqui e vou submeter pra eles.
Abraço!

Vingdel
Segue o código que submeti para UVa:
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();
	}
}

Abraço!

R

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.

InicianteJavaHenriqu

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:

R

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

InicianteJavaHenriqu

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

flw :thumbup:

R

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.

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

Vingdel
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

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:

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.
Esse foi o último código que enviei:
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();
	}
}
SAÍDA:
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

Já não sei qual pode ser meu erro.

Abraço!

davidbuzatto

Olá,

Viu só, não é tão trivial como parece :D
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:
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
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

davidbuzatto

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

davidbuzatto

Vingdel, vc é o usuário Delano Lima (Delano Lima de Carvalho) do UVa?
Vi no live submissions.

[]'s

R

eu testei o programa dele e funcionou bem. não vi erros. quanto a coisas a mais nem reparei. e quanto ao meu, que fiz, gostaram, que acharam. usei uma lógica inusitada ou diferente talvez... sempre há muitas formas de se fazer a mesma coisa. estava ali para download. segue o código...

import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;



    
/**
 *
 * @author raghy
 */


//falta um try catch para entradas erradas das esperadas...

public class CalcularIdade extends JFrame implements ActionListener {

    JButton b1, b2;
    JTextField jT1 = new JTextField();
    JTextField jT2 = new JTextField();
    JTextField jT3 = new JTextField();
    JLabel jTvalor = new JLabel(&quot;Resultado : &quot;);
    
    
    int equacao = 0;
    String data=&quot;&quot;;
    
    
    
     Date date= new Date();
    String dataToda = &quot;dd/MM/yyyy&quot;;
    String formatod = &quot;dd&quot;;    
      String formatoM = &quot;MM&quot;;
        String formatoyy = &quot;yy&quot;;
    SimpleDateFormat formatter2 = new SimpleDateFormat(dataToda);
    

       int calculoAno;
    
    
    
    public CalcularIdade() {
//painel e titulo doframe
        setTitle(&quot;calcular idade&quot;);
        setLocationRelativeTo(null);
  setBounds(100,75,800,450);
        setResizable(false);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);
       getContentPane().setBackground(new Color(255,245,180));



        Font F = new Font(&quot;Sans Serif&quot;, Font.BOLD, 16);
        Font F1 = new Font(&quot;Sans Serif&quot;, Font.ITALIC, 14);
        Font F2 = new Font(&quot;Sans Serif&quot;, Font.ITALIC, 20);
        //botao 1 ou calcula...
        b1 = new JButton();
        b1.setText(&quot;Calcular&quot;);
        b1.setSize(100, 25);
        b1.setLocation(50, 200);
        b1.setBackground(Color.orange);
        b1.setForeground(Color.blue);
        b1.setFont(new Font(&quot;Sans Serif&quot;, Font.BOLD, 14));
        b1.setBorder(BorderFactory.createBevelBorder(1, Color.white, Color.black));
        b1.setEnabled(true);
        b1.addActionListener(this);



        b2 = new JButton();
        b2.setText(&quot;limpar&quot;);
        b2.setSize(100, 25);
        b2.setLocation(50, 260);
        b2.setBackground(Color.orange);
        b2.setForeground(Color.blue);
        b2.setFont(new Font(&quot;Sans Serif&quot;, Font.BOLD, 14));
        b2.setBorder(BorderFactory.createBevelBorder(1, Color.white, Color.black));
        b2.setEnabled(true);
        b2.addActionListener(this);





        //label1
        JLabel L1 = new JLabel();
        L1.setText(&quot;Coloque a idade&quot;);
        L1.setSize(200, 35);
        L1.setFont(F);
        L1.setLocation(45, 5);
        L1.setForeground(Color.blue);


        //label2
        JLabel L2 = new JLabel();
        L2.setText(&quot;DIA e MES com dois digitos &quot;);
        L2.setSize(300, 35);
        L2.setFont(F);
        L2.setLocation(45, 25);
        L2.setForeground(Color.blue);


        //label2
        JLabel L3 = new JLabel();
        L3.setText(&quot;ANO com 4 digitos&quot;);
        L3.setSize(200, 35);
        L3.setFont(F);
        L3.setLocation(45, 45);
        L3.setForeground(Color.blue);




        //jT1

        jT1.setFont(F2);
        jT1.setText(&quot;&quot;);
        jT1.setLocation(40, 85);
        jT1.setSize(35, 35);



        //+
        JLabel mais = new JLabel();
        mais.setText(&quot;+&quot;);
        mais.setSize(200, 35);
        mais.setFont(F);
        mais.setLocation(93, 85);
        mais.setForeground(Color.blue);
        //+
        JLabel igual = new JLabel();
        igual.setText(&quot;=&quot;);
        igual.setSize(200, 35);
        igual.setFont(F);
        igual.setLocation(185, 85);
        igual.setForeground(Color.blue);





        //jT2

        jT2.setFont(F2);
        jT2.setText(&quot;&quot;);
        jT2.setLocation(120, 85);
        jT2.setSize(35, 35);



        //jT3

        jT3.setFont(F2);
        jT3.setText(&quot;&quot;);
        jT3.setLocation(210, 85);
        jT3.setSize(65, 35);



        //label resultado


        jTvalor.setSize(200, 35);
        jTvalor.setFont(F);
        jTvalor.setLocation(45, 135);
        jTvalor.setForeground(Color.blue);





        CalcularIdade.Painel p = new CalcularIdade.Painel();
        p.setBounds(490, 50, 270, 270);
        p.setBorder(BorderFactory.createLineBorder(Color.black, 2));
        getContentPane().setLayout(null);
        getContentPane().add(p);



        getContentPane().add(L1);
        getContentPane().add(L2);
        getContentPane().add(L3);


        getContentPane().add(mais);
        getContentPane().add(igual);

        getContentPane().add(jT1);
        getContentPane().add(jT2);
        getContentPane().add(jT3);

        getContentPane().add(jTvalor);


        getContentPane().add(b1);
        getContentPane().add(b2);








    }

   

    //acao dos botoes
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == b1) {
          
           
               int dia=(Integer.parseInt(jT1.getText()) );
                int mes=(Integer.parseInt(jT2.getText()) );
                 int ano=(Integer.parseInt(jT3.getText()) );
               
       data=&quot;&quot;+jT1.getText()+&quot;/&quot;+jT2.getText()+&quot;/&quot;+jT3.getText();

   
      date= new Date();
     formatod = &quot;dd&quot;;    
       formatoM = &quot;MM&quot;;
         formatoyy = &quot;yyyy&quot;;
   formatter2 = new SimpleDateFormat(formatoyy);  
   
    calculoAno=(Integer.parseInt(formatter2.format(date)))    - ano;
  SimpleDateFormat   formatter3 = new SimpleDateFormat(formatod);      
  SimpleDateFormat   formatter1 = new SimpleDateFormat(formatoM);  
    if (   (Integer.parseInt(formatter1.format(date))) &gt;=mes   &&   (Integer.parseInt(formatter3.format(date))) &gt;=dia)
    //ou seja se o mes atual for maior que o da data, ainda não fez aniversario.
    {        
          calculoAno=   (   (Integer.parseInt(formatter2.format(date)))    - ano);
    }
    
    else {
           calculoAno=(   (Integer.parseInt(formatter2.format(date)))    - ano   )-1    ;
    }
    
        }




        if (e.getSource() == b2) {

            jT1.setEnabled(true);
            jT2.setEnabled(true);
            jT3.setEnabled(true);

            jT1.setText(&quot;&quot;);
            jT2.setText(&quot;&quot;);
            jT3.setText(&quot;&quot;);


        }
    }

 
   
     class Painel extends JPanel {

        @Override
        public void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            Font F1 = new Font(&quot;Sans Serif&quot;, Font.BOLD, 30);
            g2.setColor(Color.white);
            g2.fillRect(10, 10, 250, 250);
            g2.setFont(F1);
            g2.setColor(Color.red);

            g2.drawString(&quot;&quot; + data+&quot;&quot;+&quot;&quot;, 15, 125);
            formatter2 = new SimpleDateFormat(dataToda);
             g2.drawString(&quot;&quot; + formatter2.format(date)+&quot;&quot;+&quot;&quot;, 15, 90);
             
               g2.drawString(&quot;&quot; + calculoAno +&quot;  anos.&quot;, 15, 175);
             
             
repaint();

        }
    }
     
     
      public static void main(String[]args) {
     new CalcularIdade().setVisible(true);
    }
    
    

}

só estranho que não consegui gerar o jar, através do netbeans... ele não enxerga o main. e não vejo o porquê.

R

segue o projeto para o netbeans, se alguém quiser ver , porque não gera o jar…

Vingdel

davidbuzatto:
Vingdel, vc é o usuário Delano Lima (Delano Lima de Carvalho) do UVa?
Vi no live submissions.

[]'s

Sim este sou eu…

Vingdel
davidbuzatto:
Olá,

Viu só, não é tão trivial como parece :D
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.

Java Specifications:

The Java programs submitted must be in a single source code (not .class) file. Nevertheless, you can add as many classes as you need in this file. All the classes in this file must not be within any package.

All programs must begin in a static main method in a Main class.

[color=red]Do not use public classes[/color]: even Main must be non public to avoid compile error.

Use buffered I/O to avoid time limit exceeded due to excesive flushing.
Não tentei todos os 34 casos, mas tentei os 10 primeiro e ficou assim:
C:\Users\Delano\Desktop>java Main
10

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

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

Parece que está tudo certo. Porém acho que o problema está na minha validação, pois se nos teste eles digitam uma data inválida (exemplo: 32/11/2001) meu código pede a data de novo.

O pior é que eles não dizem o que não ficou nos padões propostos, se devo tratar esses erros, não deixam claro.

Abraço!

davidbuzatto

Olhe a descrição do input:

[]'s

Vingdel

davidbuzatto:
Olhe a descrição do input:

[]'s

Enxuguei o código ao máximo e enviei, tomara que agora seja aceito.
Vou aguardar…

Abraço!

Criado 20 de janeiro de 2012
Ultima resposta 22 de jan. de 2012
Respostas 46
Participantes 7