Cálculo de idade para passagens de ônibus

5 respostas
P

Boa noite a todos;

Estou com um problema e se postei esse tópico após muito pesquisar.

Vejam, por favor, o código abaixo:


import java.awt.Color;

import java.util.Calendar;

import java.util.Date;

import javax.swing.JOptionPane;
public class idade {

public idade(Date data){

System.out.println(calcIdade(data));

}
public int calcIdade(Date dataNasc){

Date hoje = new Date();

Calendar cal = Calendar.getInstance();
cal.setTime(hoje);
int day1 = cal.get(Calendar.DAY_OF_YEAR);
int ano1 = cal.get(Calendar.YEAR);

cal.setTime(dataNasc);
int day2 = cal.get(Calendar.DAY_OF_YEAR);
int ano2 = cal.get(Calendar.YEAR);

int nAno = ano1 - ano2;

if(day1 < day2)
	nAno--;

return nAno;

}

public static void main(String[] args){

int year;
year = Integer.parseInt (
JOptionPane.showInputDialog("Qual seu ano de nascimento (Ex.: 1981)?") );

int month;
month = Integer.parseInt (
JOptionPane.showInputDialog("Qual seu mês de nascimento (Ex.: 2, para fevereiro)?") );

int day;
day = Integer.parseInt (
JOptionPane.showInputDialog("Qual seu dia de nascimento (Ex.: 16)?") );

Calendar c = Calendar.getInstance();
c.set(year, month, day);
new idade(c.getTime());

if(nAno > 65){
JOptionPane.showMessageDialog(null, "Você tem direito a passagens gratuitas.");
}

else {

JOptionPane.showMessageDialog(null, Você não tem direito a passagens gratuitas.”);

}
}

}


Trata-se de um programa em que a partir da idade da pessoa, sabemos se ela pode ou não ter passe-livre nos ônibus.

Os mais experientes notarão que o programa acima não está funcionando. Não funciona porque eu quero usar a variável “nAno” em dois métodos. Pelo o que eu li, não tenho como ter uma “variável global” em Java. O que eu posso fazer para que a verificação da idade funcione?

Desde já, obrigado.

5 Respostas

V

Olá,

vamos começar do começo, você pode sim acessar de forma global uma variável em java, basta você declarar ela como public static. Para entender melhor como este modificador de acesso funciona veja o artigo do nosso amigo Rafael Steil

http://www.guj.com.br/articles/121

mas não é bem esse o caso.

Se você analisar melhor você vai perceber que você poderia armazenar a data em uma variável na sua classe Idade e chamar o método calcIdade, que retornaria o valor procurado.

De uma olhada nas adaptações que eu fiz no seu código, para que ele funcione

import java.util.Calendar;
import java.util.Date;
import javax.swing.JOptionPane;

// nome de classe comeca com letra maiúscula
public class Idade {

	//novo campo - armazena internamente a data de nascimento
	private Date dataNasc;

	public Idade(Date data) {
		//data de nascimento é armazenada
		dataNasc = data;
		System.out.println(calcIdade());
	}

	// o método calcIdade já possui acesso a data de nascimento
	// logo não é necessário passa-la como parâmetro
	
	public int calcIdade() {
		Date hoje = new Date();
		Calendar cal = Calendar.getInstance();

		cal.setTime(hoje);
		int day1 = cal.get(Calendar.DAY_OF_YEAR);
		int ano1 = cal.get(Calendar.YEAR);

		cal.setTime(dataNasc);
		int day2 = cal.get(Calendar.DAY_OF_YEAR);
		int ano2 = cal.get(Calendar.YEAR);

		int nAno = ano1 - ano2;

		if (day1 < day2)
			nAno--;

		return nAno;

	}

	public static void main(String[] args) {

		int year;
		year = Integer.parseInt(JOptionPane
				.showInputDialog("Qual seu ano de nascimento (Ex.: 1981)?"));

		int month;
		month = Integer
				.parseInt(JOptionPane
						.showInputDialog("Qual seu mês de nascimento (Ex.: 2, para fevereiro)?"));

		int day;
		day = Integer.parseInt(JOptionPane
				.showInputDialog("Qual seu dia de nascimento (Ex.: 16)?"));

		Calendar c = Calendar.getInstance();
		c.set(year, month, day);
		
		//armazena o objeto Idade
		Idade idade = new Idade(c.getTime());

		//chama o método que retorna o valor desejado
		if (idade.calcIdade() > 65) {
			JOptionPane.showMessageDialog(null,
					"Você tem direito a passagens gratuitas.");
		} else {
			JOptionPane.showMessageDialog(null,
					"Você não tem direito a passagens gratuitas.");
		}

	}
}

qualquer dúvida pode perguntar

Pedro_Amorim

Acho que vc escreveu muita coisa pra fazer algo simples… Mas tá ai o código modificado E reforçando: nome de classe começa com maiúcula

import java.util.Calendar;
import java.util.Date;
import javax.swing.JOptionPane;

public class Idade {

  // sinceramente nao havia necessidade do construtor
    public int calcIdade(Date dataNasc) {
        Date hoje = new Date();
        Calendar cal = Calendar.getInstance();

        cal.setTime(hoje);
        int day1 = cal.get(Calendar.DAY_OF_YEAR);
        int ano1 = cal.get(Calendar.YEAR);

        cal.setTime(dataNasc);
        int day2 = cal.get(Calendar.DAY_OF_YEAR);
        int ano2 = cal.get(Calendar.YEAR);

        int nAno = ano1 - ano2;

        if (day1 < day2) {
            nAno--;
        }

        return nAno;

    }

    public static void main(String[] args) {
        // simplifique!!!
        int year = Integer.parseInt(JOptionPane.showInputDialog("Qual seu ano de nascimento (Ex.: 1981)?"));
        int month = Integer.parseInt(JOptionPane.showInputDialog("Qual seu mês de nascimento (Ex.: 2, para fevereiro)?"));
        int day = Integer.parseInt(JOptionPane.showInputDialog("Qual seu dia de nascimento (Ex.: 16)?"));

        Calendar c = Calendar.getInstance();

        c.set(year, month, day);

        Idade idade = new Idade();
        
        //Passando o retorno do do metodo para a condição note que acrescentei o ">=" nao faz sentido só ter o ">" se vc teve o trabalho de fazer isso:
       /* 
          if (day1 < day2) {
            nAno--;
          }
      */

        if (idade.calcIdade(c.getTime()) >= 65) {
            JOptionPane.showMessageDialog(null, "Você tem direito a passagens gratuitas. Sua idade é: " + idade.calcIdade(c.getTime()));
        } else {
            JOptionPane.showMessageDialog(null, "Você não tem direito a passagens gratuitas. Sua idade é: " + idade.calcIdade(c.getTime()));
        }

    }
}

Caso tenha dúvida estamos aí =D

P

Bom dia, Pedro Amorim e victorrseloy;

Primeiramente, muitíssimo obrigado pelo auxílio de vocês.

Sei que muito se fala em “elegância do código” e que, sob este aspecto, o meu deve ser um verdadeiro desastre. Agradeço a paciência de vocês por relevar isso…

Entretanto, espero - com muito treino e auxilio - conseguir ir refinando os meus métodos.

Como não tenho experiência também na utilização do Fórum, ao lado do título coloquei “[Resolvido]”. Espero que isso seja o correto a ser feito.

Um grande abraço, amigos!

PS: Quem sabe um dia eu também não consiga auxiliar alguém aqui… :O)

Rodrigo_Sasaki

é o correto sim hehe… mas você tem que fazer isso no seu primeiro post la em cima… não no último, senão não aparece pro pessoal

abraço :slight_smile:

L

Vou postar só para deixar uma biblioteca que ajuda bastante a trabalhar com datas: Joda-Time.

O código para calcular idades com ela fica bastante simples:

import javax.swing.JOptionPane;

import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.joda.time.PeriodType;
import org.joda.time.format.DateTimeFormat;

public class Main {

	public static void main(String[] args) {
		String nascimento = JOptionPane.showInputDialog("Qual sua data de nascimento(Ex.: 12/12/1981)?");   
		
		DateTime dataNascimento = DateTimeFormat.forPattern("dd/MM/yyyy").parseDateTime(nascimento);
		Interval tempoVida = new Interval(dataNascimento, new DateTime());
		int idade = tempoVida.toPeriod(PeriodType.years()).getYears();
		if (idade >= 65) {   
            JOptionPane.showMessageDialog(null,   
                    "Você tem direito a passagens gratuitas.");   
        } else {   
            JOptionPane.showMessageDialog(null,   
                    "Você não tem direito a passagens gratuitas.");   
        }
	}
}
Criado 19 de maio de 2011
Ultima resposta 20 de mai. de 2011
Respostas 5
Participantes 5