Calcular Idade

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:

[code]public static int calcularIdade(String dataNascimento) {

}[/code]
Se me pudessem ajudar. Agradecia

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

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:

[quote=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:

[code]public static int calcularIdade(String dataNascimento) {

}[/code]
Se me pudessem ajudar. Agradecia

PS: Não é permitido usar o GregorianCalendar nem o Calendar.[/quote]

O que vc precisa ?? Calcular o que ?

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

[quote=fernandopaiva]

O que vc precisa ?? Calcular o que ? [/quote]

Preciso de calcular a Idade .

[quote=Peaceandlove][quote=fernandopaiva]

O que vc precisa ?? Calcular o que ? [/quote]

Preciso de calcular a Idade .[/quote]

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+

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

Pode me ajudar cara ?

vlw.

[quote=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();[/quote]

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:

[quote=InicianteJavaHenrique][quote=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();[/quote]

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: [/quote]

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é?

[quote=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, &quot;/&quot;);  
        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é?[/quote]

Se funciona você pode usar :smiley:

Tbm tem o .split()

flw :thumbup:

Eu fiz como disseste so que no fim vai dar :

 Sua idade é: -1880 

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

[code]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);[/code]

A data que usei foi: 13/06/1993

O que está mal aí :oops:

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

Já consegui muito obrigado aos dois. :smiley:

Vlw ! :thumbup:

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] 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![/quote]

Obrigado ! Abraço !

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!

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

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!

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

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

[code]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 ) {}
         
     }
    

    }

}[/code]

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