Montando um construtor com Split String

0 respostas
D

--------------------------------------------------------------------------------------------------------
Editado 2: Eu consegui resolver o caso, caso alguém queira saber a resolução eu vou colocar no final do post, parece que só de expor o problema ele acaba clareando e se resolvendo.

Se a administração achar melhor trancar o topico ou mesmo apagar, eu nao me importo, so de ter o espaço, e apesar da resolução ter sido rapida da minha parte mesmo, acho que cabe espaço de discussão sobre os erros cometidos.

---------------------------------------------------------------------------------------------------------

Bom dia pessoal, sou novo no forum e sou novo no mundo do java.

To acompanhando o livro: "Java, como Programar" 8ª ed de 2010, e como to aprendendo na labuta por conta, eu travei no exercicio 3.16, que segue:

(Se quiserem podem pular o enunciado do exercicio, a duvida real esta a seguir)

Livro:
:pg 80 - 3.16 -Calculadora de Frequencia Cardiaca Alvo:

Ao realizar exercicios fisicos, você pode utilizar um monitor de frequencia cardiaca para ver se sua frequencia permanece dentro de um intervalo seguro, sugerido pelos seus treinadores e médicos.

Segundo a AMerican Heart Assossiation (AHA) (www.americanheart.org/presenter.jhtml?identifier=4736), a fórmula para calcular a frequencia cardiaca máxima por minuto é 220 menos sua idade.

Sua frequencia cardiaca alvo é um intervalo entre 50 - 85% da frequencia cardiaca máxima. [Nota: essas formulas são estimativas fornecidas pelo AHA. As frequencias cardiacas máximas e alvo podem variar com base na sua saúde, capacidade fisica, idade e sexo da pessoa. Sempre consulte um médico ou profissional da saude qualificado antes de começar ou modificar um programa de exercicios físicos]

Crie uma classe chamada HeartRates . Os atributos da classe devem incluir o nome, sobrenome e data de nascimento da pessoa (Consistindo em atributos separados para mes, dia e ano de nascimento).

Sua classe deve ter um construtor que recebe esses dados como parâmetros. Para cada atributo forneça métodos set e get. A Classe deve incluir um método que calcula e retorna a idade da pessoa (em anos), um método que calcula e retorna frequencia cardiaca máxima da pessoa e um método que calcula e retorna a frequencia cardiaca alvo da pessoa.

Escreva um aplicativo Java que solicite a informação da pessoa - calcule e imprima a idade da pessoa (em anos), intervalo de frequencia cardiaca máxima ed frequencia cardiaca-alvo.

O Livro ainda nao ensinou a procurar a pegar a data do usuario e calcular com data do atual pegando do pc em questão, eu to levando em conta que preciso criar uma variavel data de nascimento e uma da data de hoje e configurar elas (ou pedir ao usuario que o faça).

Se eu fizer até onde o livre me ensina, eu criaria 6 variaveis de tempo (uma para dia uma para mes e uma para ano, tanto de nascimento quanto da data de hoje), e faria o usuario preencher isso que nem um bobo hahaha.

Então foi que eu vi em algum lugar o uso da função Split String, onde eu poderia usar os seguintes comandos:

string texto = "banana,maçã,laranja";

string frutas[] = texto.split(",");
System.out.println(frutas[0]); //imprime banana
System.out.println(frutas[1]); //imprime maçã
System.out.println(frutas[2]); //imprime laranja

Então pensei em usar com as datas, como o Split manda as coisas em outra String, eu preciso do Integer.parseInt... ae começam os problemas e eu nao consigo fazer funcionar...

Atualmente, os métodos de setNascimento e setIdade estão assim:

public void setNasc (String nascimento){
		String splitN[] = nascimento.split("/");	//separa a data em tres variaveis novas, a cada barra "/" sendo elas: d[0] - dia / d[1] - mes / d[2] - ano
		this.nascDia = Integer.parseInt(this.splitN[0]);
		this.nascMes = Integer.parseInt(this.splitN[1]);
		this.nascAno = Integer.parseInt(this.splitN[2]);
	}
	public void setHoje (String hoje){
		String splitH[] = this.hoje.split("/");	//separa a data em tres variaveis novas, a cada barra "/" sendo elas: d[0] - dia / d[1] - mes / d[2] - ano
		this.hjDia = Integer.parseInt(this.splitH[0]);
		this.hjMes = Integer.parseInt(this.splitH[1]);
		this.hjAno = Integer.parseInt(this.splitH[2]);
	}
	public void setIdade(int idade){
		if (hjMes < nascMes){
			this.idade = this.hjAno - this.nascAno - 1;
		} else if (this.hjMes == this.nascMes && this.hjDia < this.nascDia){
			this.idade = this.hjAno - this.nascAno - 1;
		}else {
			this.idade = this.hjAno - this.nascAno;	
		}

EDITADO:
Encontrei uma das soluções e ja vou postar aqui:

public void setNasc (String nascimento){
		String splitN[] = nascimento.split("/");	
		this.nascDia = Integer.parseInt(splitN[0]); //Aqui estava Integer.parseInt(this.splitN[0]); 
		this.nascMes = Integer.parseInt(splitN[1]); // e nas outras também.
		this.nascAno = Integer.parseInt(splitN[2]);
	}
	public void setHoje (String hoje){
		String splitH[] = this.hoje.split("/");	//separa a data em tres variaveis novas, a cada barra "/" sendo elas: d[0] - dia / d[1] - mes / d[2] - ano
		this.hjDia = Integer.parseInt(splitH[0]);
		this.hjMes = Integer.parseInt(splitH[1]);
		this.hjAno = Integer.parseInt(splitH[2]);
	}
	public void setIdade(int idade){
		if (hjMes < nascMes){
			this.idade = this.hjAno - this.nascAno - 1;
		} else if (this.hjMes == this.nascMes && this.hjDia < this.nascDia){
			this.idade = this.hjAno - this.nascAno - 1;
		}else {
			this.idade = this.hjAno - this.nascAno;	
		}

Agora eu to só com erros na classe de teste...

[size=18]Classe Construtora: [/size]
//Classe CardioRate - exercicio 3.16, pg 80
//Mais informações: Javadoc no fim do arquivo.
public class CardioRate 
{
	//Variaveis
	private String nome;
	private String sobrenome;
	private int idade;
	//Data de nascimento
	private int nascDia;
	private int nascMes;
	private int nascAno;
	//Dia de hj
	private int hjDia;
	private int hjMes;
	private int hjAno;
	//Variaveis de data:
	private String hoje;
	private String splitH;
	private String nascimento;
	private String splitN;
	//Variaveis de calculo cardiaco
	private double mxRate = 220;
	private double minAlvo;
	private double mxAlvo;
	
	//CONTRUTOR:	
	public CardioRate (
			String nome,
			String sobrenome,
			int idade,
			
			int nascDia,
			int nascMes,
			int nascAno,
			
			int hjDia,
			int hjMes,
			int hjAno,
			
			String hoje,
			String splitH,
			String nascimento,
			String splitN,
			
			double mxRate,
			double minAlvo,
			double mxAlvo

			)
	{
		//---SETTERS:-----------
		this.nome = nome;		
		this.sobrenome = sobrenome;
		this.idade = idade;
		
		this.nascDia = nascDia;
		this.nascMes = nascMes;
		this.nascAno = nascAno;
		
		this.hjDia = hjDia;
		this.hjMes = hjMes;
		this.hjAno = hjAno;
		
		this.hoje = hoje;
		this.nascimento = nascimento;
		
		this.mxRate = mxRate;
		this.minAlvo = minAlvo;
		this.mxAlvo = mxAlvo;
		
	}//Fim do Construtor
	/*A Função principal do construtor é inicializar as variaveis dentro da classe que for utiliza-lo */	
	
	public void setNasc (String nascimento){
		String splitN[] = nascimento.split("/");	//separa a data em tres variaveis novas, a cada barra "/" sendo elas: d[0] - dia / d[1] - mes / d[2] - ano
		this.nascDia = Integer.parseInt(splitN[0]);
		this.nascMes = Integer.parseInt(splitN[1]);
		this.nascAno = Integer.parseInt(splitN[2]);
	}
	public void setHoje (String hoje){
		String splitH[] = this.hoje.split("/");	//separa a data em tres variaveis novas, a cada barra "/" sendo elas: d[0] - dia / d[1] - mes / d[2] - ano
		this.hjDia = Integer.parseInt(splitH[0]);
		this.hjMes = Integer.parseInt(splitH[1]);
		this.hjAno = Integer.parseInt(splitH[2]);
	}
	public void setIdade(int idade){
		if (hjMes < nascMes){
			this.idade = this.hjAno - this.nascAno - 1;
		} else if (this.hjMes == this.nascMes && this.hjDia < this.nascDia){
			this.idade = this.hjAno - this.nascAno - 1;
		}else {
			this.idade = this.hjAno - this.nascAno;	
		} 
			
	}
	//------------GETTERS-------------------
	//invoca os valores da variavel nome
	public String getNome (){
		return nome;
	}
	//invoca os valores da variavel sobrenome
	public String getSobrenome (){
		return sobrenome;
	}
	//invoca os valores da variavel idade
	public int getIdade (){
		return idade;
	}
	//invoca os valores da variavel nascDia
	public int getNascDia (){
		return nascDia;
	}
	//invoca os valores da variavel nascMes
	public int getNascMes(){
		return nascMes;
	}
	//invoca os valores da variavel nascAno
	public int getNascAno(){
		return nascAno;
	}
	//invoca os valores da variavel hjDia
	public int getHjDia(){
		return hjDia;
	}
	//invoca os valores da variavel hjMes
	public int getHjMes(){
		return hjMes;	
	}
	//invoca os valores da variavel hjAno
	public int getHjAno(){
		return hjAno;
	}
	
//----------DEMAIS MÉTODOS---------------
	//Calcula a frequencia cardiaca máxima
	public double getMaxRate(){
		this.mxRate = 220 - this.idade;		
		return mxRate;
	}
	//Calcula a frequencia cardiaca alvo minima:
	public double getMinRateAlvo (){
		this.minAlvo = this.mxRate *0.50;
		return minAlvo;
	}
	//Calcula a frequencia cardiaca alvo máxima:
	public double getMaxRateAlvo (){
		this.mxAlvo = this.mxRate * 0.85;
		return mxAlvo;
	}
}//fim da classe CardioRate
[size=18]Classe Teste (main): [/size]
import java.util.Scanner;
public class CardioRateTeste {
	public static void main (String args []){
		String nome;
		String sobrenome;
		String nascimento = "07/09/1983";
		String hoje = "10/09/2013";
		int hjDia=0;
		int hjMes=0;
		int hjAno=0;
		int idade = 0;
		
		//------------------------------------------------------------
		//Geração de um Scanner chamado "dados"
		Scanner dados = new Scanner(System.in);
		//Geração de um CardioRate chamado "pessoa"
		CardioRate pessoa = new CardioRate (" "," ",0," ",0," ",0,0,0,0);
		
		System.out.printf("Qual o seu nome? ");
			nome = dados.next();
		System.out.printf("Qual seu sobrenome? ");
			sobrenome = dados.next();
		System.out.printf("Informe sua data de nascimento: ");
			nascimento = dados.next();
		
		pessoa.setNasc(nascimento);
		pessoa.setHoje(hoje,hjDia,hjMes,hjAno);
		pessoa.setIdade(idade);

		System.out.printf("sua idade é %s\n\nSua frequencia cardiaca máxima é: %.1f\n\n"
		+ "Sua frequencia alvo minima é %.1f\n\n"
		+ "E sua frequencia alvo máxima é %.1f\n\n", 
		pessoa.getIdade(),
		pessoa.getMaxRate(),
		pessoa.getMinRateAlvo(),
		pessoa.getMaxRateAlvo());
		
		//---TESTE DE SPLIT----
	System.out.printf("Você Nasceu em: %s/%s/%s\n\nHoje é: %s/%s/%s", pessoa.getNascDia(),pessoa.getNascMes(),pessoa.getNascAno(), pessoa.getHjDia(),pessoa.getHjMes(),pessoa.getHjAno());
		
	}//fim do método main
}// fim da classe CardioRateTeste

Ficou bem grande pra minha primeira duvida, mas como eu cacei na net e nao achei ate agora, o esquema é postar.

Valeu qualquer dica ou sugestão, mesmo que seja pra dizer que do jeito q eu to fazendo nao vai rolar nunca =p

Abraços à todos.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Solução do problema:

Eu estava fazendo referencias à "this.variavel" o tempo todo, isso deve ter causado conflitos ou erros de exeption, os erros no main eram basicamente de referencias, mas como sou novato há métodos e referencias que eu nao sei exatamente quando e como usar sem quebrar a cabeça...

seguem os codigos corrigidos:

//Classe CardioRate - exercicio 3.16, pg 80
//Mais informações: Javadoc no fim do arquivo.
public class CardioRate 
{
	//Variaveis
	private String nome;
	private String sobrenome;
	private int idade;
	//Data de nascimento
	private int nascDia;
	private int nascMes;
	private int nascAno;
	//Dia de hj
	private int hjDia;
	private int hjMes;
	private int hjAno;
	//Variaveis de data:
	private String hoje;
	private String splitH;
	private String nascimento;
	private String splitN;
	//Variaveis de calculo cardiaco
	private double mxRate = 220;
	private double minAlvo;
	private double mxAlvo;
	
	//CONTRUTOR:	
	public CardioRate (
			String nome,
			String sobrenome,
			int idade,
			
			int nascDia,
			int nascMes,
			int nascAno,
			
			int hjDia,
			int hjMes,
			int hjAno,
			
			String hoje,
			String splitH,
			String nascimento,
			String splitN,
			
			double mxRate,
			double minAlvo,
			double mxAlvo

			)
	{
		//---SETTERS:-----------
		this.nome = nome;		
		this.sobrenome = sobrenome;
		this.idade = idade;
		
		this.nascDia = nascDia;
		this.nascMes = nascMes;
		this.nascAno = nascAno;
		
		this.hjDia = hjDia;
		this.hjMes = hjMes;
		this.hjAno = hjAno;
		
		this.hoje = hoje;
		this.nascimento = nascimento;
		
		this.mxRate = mxRate;
		this.minAlvo = minAlvo;
		this.mxAlvo = mxAlvo;
		
	}//Fim do Construtor
	/*A Função principal do construtor é inicializar as variaveis dentro da classe que for utiliza-lo */	
	
	public void setNasc (String nascimento){
		String splitN[] = nascimento.split("/");	//separa a data em tres variaveis novas, a cada barra "/" sendo elas: d[0] - dia / d[1] - mes / d[2] - ano
		this.nascDia = Integer.parseInt(splitN[0]);
		this.nascMes = Integer.parseInt(splitN[1]);
		this.nascAno = Integer.parseInt(splitN[2]);
	}
	public void setHoje (String hoje){
		String splitH[] = hoje.split("/");	
		this.hjDia = Integer.parseInt(splitH[0]);
		this.hjMes = Integer.parseInt(splitH[1]);
		this.hjAno = Integer.parseInt(splitH[2]);
	}
	public void setIdade(int idade){
		if (hjMes < nascMes){
			idade = this.hjAno - this.nascAno - 1;
		} else if (this.hjMes == this.nascMes && this.hjDia < this.nascDia){
			this.idade = this.hjAno - this.nascAno - 1;
		}else {
			this.idade = this.hjAno - this.nascAno;	
		} 
			
	}
	//------------GETTERS-------------------
	//invoca os valores da variavel nome
	public String getNome (){
		return nome;
	}
	//invoca os valores da variavel sobrenome
	public String getSobrenome (){
		return sobrenome;
	}
	//invoca os valores da variavel idade
	public int getIdade (){
		return idade;
	}
	//invoca os valores da variavel nascDia
	public int getNascDia (){
		return nascDia;
	}
	//invoca os valores da variavel nascMes
	public int getNascMes(){
		return nascMes;
	}
	//invoca os valores da variavel nascAno
	public int getNascAno(){
		return nascAno;
	}
	//invoca os valores da variavel hjDia
	public int getHjDia(){
		return hjDia;
	}
	//invoca os valores da variavel hjMes
	public int getHjMes(){
		return hjMes;	
	}
	//invoca os valores da variavel hjAno
	public int getHjAno(){
		return hjAno;
	}
	
//----------DEMAIS MÉTODOS---------------
	//Calcula a frequencia cardiaca máxima
	public double getMaxRate(){
		this.mxRate = 220 - this.idade;		
		return mxRate;
	}
	//Calcula a frequencia cardiaca alvo minima:
	public double getMinRateAlvo (){
		this.minAlvo = this.mxRate *0.50;
		return minAlvo;
	}
	//Calcula a frequencia cardiaca alvo máxima:
	public double getMaxRateAlvo (){
		this.mxAlvo = this.mxRate * 0.85;
		return mxAlvo;
	}
}//fim da classe CardioRate

Classe teste:

import java.util.Scanner;
public class CardioRateTeste {
	public static void main (String args []){
		String nome;
		String sobrenome;
		String nascimento;
		String hoje;
		int nascDia;
		int nascMes;
		int nascAno;
		int hjDia;
		int hjMes;
		int hjAno;
		int idade = 0;
		
		//------------------------------------------------------------
		//Geração de um Scanner chamado "dados"
		Scanner dados = new Scanner(System.in);
		//Geração de um CardioRate chamado "pessoa"
		CardioRate pessoa = new CardioRate ("","",0,0,0,0,0,0,0,"","","","",0.0,0.0,0.0);
		
		System.out.printf("Qual o seu nome? ");
			nome = dados.next();
		System.out.printf("Qual seu sobrenome? ");
			sobrenome = dados.next();
		System.out.printf("Informe sua data de nascimento: ");
			nascimento = dados.next();
		System.out.printf("informe a data de hoje: ");
			hoje = dados.next();
		
		pessoa.setNasc(nascimento);
		pessoa.setHoje(hoje);
		pessoa.setIdade(idade);
			
		System.out.printf("sua idade é %s\n\nSua frequencia cardiaca máxima é: %.1f\n\n"
		+ "Sua frequencia alvo minima é %.1f\n\n"
		+ "E sua frequencia alvo máxima é %.1f\n\n", 
		pessoa.getIdade(),
		pessoa.getMaxRate(),
		pessoa.getMinRateAlvo(),
		pessoa.getMaxRateAlvo());
		
		//---TESTE DE SPLIT----
	System.out.printf("Você Nasceu em: %s/%s/%s\n\nHoje é: %s/%s/%s", pessoa.getNascDia(),pessoa.getNascMes(),pessoa.getNascAno(), pessoa.getHjDia(),pessoa.getHjMes(),pessoa.getHjAno());
		
	}//fim do método main
}// fim da classe CardioRateTeste
Criado 10 de setembro de 2013
Respostas 0
Participantes 1