Logica Na estação

34 respostas
ClovisCmb

Olá pessoal…Bem tive uma prova hj e o ultimo exercicio era assim:
…Crie um programa que receba do usuario o DIA, MES, ANO. Crie uma classe testadora tbm…Ao informaro dia o e o mes deve ter um metodo que exiba qual estação do ano esta…
Os dados eram os seguintes:
Outono 20 março a 19junho ; Inverno20junho a 19setembro; Primavera 20 setembro a 19 dezembro ; Primavera 20 dezembro a 19 março…

Bem na verdade não consegui terminar esse ultimo exercicio…Sinceramente não consegui pensar e o tempo não ajudou pois eram 10 exercicios tbm…
eu fiz até esse ponto:

[color=darkred] import java.util.Scanner; [/color]

[color=darkred]  public class Estacao{[/color]

[color=red]private  int mes;

private int ano;

private  int dia;[/color]
[color=darkred]  	public int getAno() { [/color]
	   [color=red]return [/color] ano;
          }

public void setAno(int ano) {
	this.ano = ano;
}

public int getDia() {
	return dia;
}

public void setDia(int dia) {
	this.dia = dia;
}

public int getMes() {
	return mes;
}

public void setMes(int mes) {
	this.mes = mes;

Na parte do MAIn e testa eu ja não sabia o que fazer…

34 Respostas

ClovisCmb

Alguem poderia me mostrar a logica do programa?

abraço

M

Por que você não cria uma Interface EstacaoDoAno com dois métodos: Calendar getInicio(), Calendar getFim(), String getEstacao() …algo assim.
Inverno, Primavera, Outono e Verao serão implementações da sua interface EstacaoDoAno (ou modele como classe abstrata, já que as estações são fortemente especializadas da EstacaoDoAno).

Pense em OO para desenvolver…

thegoergen

Como o mfjeng .

Daí, quando o usuário digitar a data, verifica se ela está entre o getInicio() e o getFim() de cada estação… Acho que não precisa criar classes separadas para cada estação. Apenas crie um atributo Nome na classe EstacaoDoAno, e no main você cria um Array de EstacaoDoAno.

ClovisCmb

Eu estou aprendendo estruturas de dados em OO na faculdade ainda…

Achei que vcs poderiam me mandar um exemplo…EU não aprendi Interface ainda…so queria fazer algo mais completo para aprender mais …

Vlws

thegoergen

Classe estação do ano.

/*
 * EstacaoDoAno.java
 *
 * Created on 29 de Março de 2008, 10:30
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package exemplos.guj;

import java.util.Date;

/**
 *
 * @author Diego Inácio Goergen
 */
public class EstacaoDoAno {
      
      private String nome;
      private Date inicio;
      private Date fim;
      
      /** Creates a new instance of EstacaoDoAno */
      public EstacaoDoAno() {
      }

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Date getInicio() {
		return inicio;
	}

	public void setInicio(Date inicio) {
		this.inicio = inicio;
	}

	public Date getFim() {
		return fim;
	}

	public void setFim(Date fim) {
		this.fim = fim;
	}

public static void main(String[] args){
	      
	      EstacaoDoAno[] estacoes = new EstacaoDoAno[]{ new EstacaoDoAno(), new EstacaoDoAno(), new EstacaoDoAno(), new EstacaoDoAno() };
	      
	      estacoes[0].setNome("Verão");
	      // Agora cadastra as datas de início e fim, que eu não pesquisei...
	      estacoes[1].setNome("Outono");
	      // Agora cadastra as datas de início e fim, que eu não pesquisei...
	      estacoes[2].setNome("Inverno");
	      // Agora cadastra as datas de início e fim, que eu não pesquisei...
	      estacoes[3].setNome("Primavera");
	      // Agora cadastra as datas de início e fim, que eu não pesquisei...


// Com tudo cadastrado, leia os valores que o usuário digitar e teste...
	}
      
}

Essa classe é suficiente. Instancie ela 4 vezes agora.

[EDIT]

Desculpe, mas eu coloquei a data como Date, esqueci que era para ler DIA, MES e ANO… mas com Date é mais fácil e simples, eu acho…

ClovisCmb

HUmm…vetores…Não pensei nisso…

Mais ainda não entendi direito…Mas estou começando a imaginar OO…

vlw abraço.

thegoergen

Bom… agora você tem um vetor com todas as estações, certo??

E agora você lê o dia, mes e ano que o usuário digitar e cria um Date, assim:

new Date(ano, mes, dia);

E com esse Date criado, você verifica em qual estação ele se encaixa. Talvez cri um método na classe EstacaoDoAno, que verifica se o dia está naquela estação:

public boolean isNestaEstacao(Date d){ // A data está nesta estação quando ela for depois do início E antes do final... return d.after(this.getInicio()) && d.before( this.getFim() ); }

ClovisCmb

É ai meu problema …eu estava pensando na logica de como saber …
Porque por exemplo o Verão e de 20 de março a 19 de junho…

Minha duvida é como vai fiakr a condição pq eu posso ter o dia 20 de março abril maio que ainda e verão, em junhuo naum pois ja iria para outono…

Sabe as ideias vem na cabeça mais naum consigo passar ela para codigos…

vlw

thegoergen

Mas o after e o before do Date funcionam assim. Você não precisa se preocupar com isso…

ClovisCmb

Não consegui enchegar isso…

Vo digitar o codigo ak ver se consego ver o Antes e Depois…

thegoergen

ClovisCmb:
Não consegui enchegar isso…

Vo digitar o codigo ak ver se consego ver o Antes e Depois…

Isso, pega o código, preenche ele com o que eu não sabia (as datas de início e fim) e com a leitura dos dados, e testa. talvez tenha problemas, mas a base é isso.

ClovisCmb

thegoergen:
ClovisCmb:
Não consegui enchegar isso…

Vo digitar o codigo ak ver se consego ver o Antes e Depois…

Isso, pega o código, preenche ele com o que eu não sabia (as datas de início e fim) e com a leitura dos dados, e testa. talvez tenha problemas, mas a base é isso.

As datas eu tenho…Devo implementar nas estações?
Outono 20 março a 19junho ; Inverno20junho a 19setembro; Primavera 20 setembro a 19 dezembro ; Primavera 20 dezembro a 19 março…

thegoergen

Coloca ali no main, logo depois de setar os nomes.

ClovisCmb

Vou cadastrar todas as datas em um vetor???/

Não tenho um conhecimento para fazer isso ainda…

thegoergen

ClovisCmb:
Vou cadastrar todas as datas em um vetor???/

Não tenho um conhecimento para fazer isso ainda…

Não é num vetor separado, é em cada estação, logo depois do nome. assim:

estacoes[1].setNome("Outono");
	    estacoes[1].setInicio( new Date(2008,3,20) );
	    estacoes[1].setFim( new Date(2008,6,19) );
ClovisCmb
thegoergen:
ClovisCmb:
Vou cadastrar todas as datas em um vetor???/

Não tenho um conhecimento para fazer isso ainda...

Não é num vetor separado, é em cada estação, logo depois do nome. assim:

estacoes[1].setNome("Outono");
	    estacoes[1].setInicio( new Date(2008,3,20) );
	    estacoes[1].setFim( new Date(2008,6,19) );


Um....Uma pergunta o  estacoes[1].setInicio( new Date(2008,3,20) estacoes[1].setFim( new Date(2008,6,19) );
Ja delimita as datas sozinho?...POr exemplo se eu entrar com 20 de junho ele ja sabe q e pro proximo etc..?
thegoergen

o estacoes[1] é o outono. o estacoes[0] é o verão, como estão os nomes… mas se quiser mudar a ordem pode trocar.

O Array estacoes é um array com EstacaoDoAno. Tem várias estacoes, cada uma delas é um objeto EstacaoDoAno diferente… Isso é OO

thegoergen

Cara... Foi mals... mas eu fiz uma caca... Testei melhor, e deua laguns erros. Usando GregorianCalendar funciona melhor. Testa essa cllasse aqui!!

import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 *
 * @author Diego Inácio Goergen
 */
public class EstacaoDoAno {
      
      private String nome;
      private Calendar inicio;
      private Calendar fim;
      
      /** Creates a new instance of EstacaoDoAno */
      public EstacaoDoAno() {
      }
      
      public String getNome() {
	    return nome;
      }
      
      public void setNome(String nome) {
	    this.nome = nome;
      }
      
      public Calendar getInicio() {
	    return inicio;
      }
      
      public void setInicio( Calendar inicio) {
	    this.inicio = inicio;
      }
      
      public Calendar getFim() {
	    return fim;
      }
      
      public void setFim( Calendar fim) {
	    this.fim = fim;
      }
      
      public boolean isNestaEstacao( Calendar d){
	    // A data está nesta estação quando ela for depois do início E antes do final...
	    return d.after(this.getInicio()) && d.before( this.getFim() );
      }
      
      public static void main(String[] args){
	    
	    EstacaoDoAno[] estacoes = new EstacaoDoAno[]{ new EstacaoDoAno(), new EstacaoDoAno(), new EstacaoDoAno(), new EstacaoDoAno() };
	    
	    estacoes[0].setNome("Verão");
	    
	    estacoes[0].setInicio( new GregorianCalendar(2007,11,20) );
	    estacoes[0].setFim( new GregorianCalendar(2008,2,19) );
	    
	    estacoes[1].setNome("Outono");
	    estacoes[1].setInicio( new GregorianCalendar(2008,2,20) );
	    estacoes[1].setFim( new GregorianCalendar(2008,5,19) );
	    
	    estacoes[2].setNome("Inverno");
	    estacoes[2].setInicio( new GregorianCalendar(2008,5,20) );
	    estacoes[2].setFim( new GregorianCalendar(2008,8,19) );
	    
	    estacoes[3].setNome("Primavera");
	    estacoes[3].setInicio( new GregorianCalendar(2008,8,20) );
	    estacoes[3].setFim( new GregorianCalendar(2008,11,19) );
	    
	    // Aqui acabou a inicialização... agora vamos testar a data de hoje...
	    
	    Calendar c = new GregorianCalendar();
	    for (int i = 0; i < estacoes.length; i++){
		  if (estacoes[i].isNestaEstacao(c)){
			System.out.println( " A data " + c.getTime() + " está na estação " + estacoes[i].getNome());
		  }
	    }
      }
      
      
}

[EDIT]

Alterei os parâmetros e atributos para Calendar, substituindo os GregorianCalendar

ClovisCmb

Nossa …nunca tinha visto essa classe…

Vou testar ak…

vlws kra abraço!

thegoergen

A GregorianCalendar herda da classe Calendar, ou implementa ela, não sei direito… ela tem mais funções que a Date.

E no main eu faço a inicialização das estações e depois faço um testezinho rápido…

ClovisCmb

Se no caso o usuario digitasse uma data e um mes…
Ai a partir da leitura do dados que ele informou eu apresentaria a estação juntamente com a data e o mes que ele digitou…

Estava pensando em utilizar
Import java.util.Scanner; ( que eu conheço)

no main criar o objeto
                            
                           Scanner input = new Scanner(System.in);

depois como ficaria as condições de enviar os set ou get para validar a estação?

ClovisCmb

import java.util.Scanner;
public class EstacaoInicio {

Scanner input = new Scanner(System.in);
//variaveis

private int ano;

private int mes;

private int dia;

//metodo construtor

public EstacaoInicio(){
}
//get e set
public int getAno() {
	return ano;
}
public void setAno(int ano) {
	this.ano = ano;
}
public int getDia() {
	return dia;
}
public void setDia(int dia) {
	this.dia = dia;
}
public int getMes() {
	return mes;
}
public void setMes(int mes) {
	this.mes = mes;
}
//metodos de entrada de dados
public void entraData(){
	do{
	System.out.println("Digite o dia");
    dia=input.nextInt();
	}while (dia>31);
}
public void entraMes(){
	do{
	System.out.println("Digite o mes");
	mes=input.nextInt();
	}while (mes>12);
	}
public void entraAno(){
	System.out.println("Entre com o ano");
	ano=input.nextInt();
}
public void informaEstacao(){
	//outono e de 20 de 3 a 20 de 6
	//inverno de 21 de 6 a  22 de 9
	//primavera 23 do 9 a 20 do 12
	//verão de 21 do 12 a 19 do 3
	if ( (dia >=20 && mes == 12) || (mes <3) || ( dia <20 && mes == 3)){
		System.out.println("É verão");
		
	}
	else if(( dia>=20 && mes ==3) || (mes <6 ) || (dia <20 && mes == 6)){
		System.out.println("Outono");
	 }
	else if((dia >=20 && mes == 6) || (mes <9) || (dia <20 && mes == 9)){
		System.out.println("Inverno");
      }
	else {
		System.out.println("Primavera");
	}
}

}

public class TestaEstacao {

public static void main(String[] args) {

EstacaoInicio estacao = new EstacaoInicio();

estacao.entraData();

estacao.entraMes();

estacao.entraAno();

estacao.informaEstacao();
}

}

Consegui resolver!

R

Só uma dúvida, você declarou um construtor vazio, não seria mais fácil não escreve-lo e deixar o construtor padrão?

thundercas

Sim Rafael, daria na mesma. Creio que ele tenha escrito apenas para facilitar a visualização.

Quanto ao Gregorian, nunca utilizei, sempre utilizo apenas Calendar. Dei uma pesquisa e vi que a GregorianCalendar é uma SubClasse da Calendar, mas não consegui visualizar qual a real vantagem de utilizá-la ao invés da Calendar.

thegoergen

thundercas:

Quanto ao Gregorian, nunca utilizei, sempre utilizo apenas Calendar. Dei uma pesquisa e vi que a GregorianCalendar é uma SubClasse da Calendar, mas não consegui visualizar qual a real vantagem de utilizá-la ao invés da Calendar.

:oops: Usei o GregorianCalendar apenas porque a classe Calendar é abstrata, daí eu substituí todos os Date por GregorianCalendar… Poderia ter utilizado o GregorianCalendar apenas na hora de testar:

Calendar c = new GregorianCalendar();
ClovisCmb

Então acho q a logica fikou boa…

Naum entendi o CAlendar…

Fiz o padrão para ver melhor interpretação…

ABraço

thegoergen

O que importa é que tu entendeu. Agora que tu viu a lógica e entendeu um pouco de Java, bem-vindo ao GUJ e ao Mundo do Java!

O Calendar, junto com a Date, São as classes que tratam as datas no Java. E acredite, elas fazem milagres…

ClovisCmb

Blz…Entendi a logica foram umas horas bem aplicadas, digem q a pratica leva a perfeição…

Obrigado pela ajuda ai e até breve!

abraço!

ClovisCmb

E se o construtor padrão mudar em uma possivel atualização do JAVA??

Meus programas param de rodar?

Caso o java não fornesa o construtor padrão!

K

gostaria de ver o esse código da estação completo, tem como postar?

ClovisCmb

Tem sim kra…

ClovisCmb

/*POr
Clovis da Costa Mandoline Bento
CLovisCMB
*/

import java.util.Scanner;
public class EstacaoInicio {

Scanner input = new Scanner(System.in);
//variaveis

private int ano;

private int mes;

private int dia;

//metodo construtor

public EstacaoInicio(){
}
//get e set
public int getAno() {
	return ano;
}
public void setAno(int ano) {
	this.ano = ano;
}
public int getDia() {
	return dia;
}
public void setDia(int dia) {
	this.dia = dia;
}
public int getMes() {
	return mes;
}
public void setMes(int mes) {
	this.mes = mes;
}
//metodos de entrada de dados
public void entraData(){
	do{
	System.out.println("Digite o dia");
    dia=input.nextInt();
	}while (dia>31);
}
public void entraMes(){
	do{
	System.out.println("Digite o mes");
	}while(mes>12);
	mes=input.nextInt();
        while((mes == 2 && dia > 29) || (mes > 12 || dia>31)){
            System.out.println("Dia invalido no mes de Fevereiro");      
        	System.out.println("Digite o mes");
                    mes=input.nextInt();
                 System.out.println("Digite o dia");
                  dia=input.nextInt();
                  }
                  }
	
public void entraAno(){
	System.out.println("Entre com o ano");
	ano=input.nextInt();
}
public void informaEstacao(){
	//outono e de 20 de 3 a 20 de 6
	//inverno de 21 de 6 a  22 de 9
	//primavera 23 do 9 a 20 do 12
	//verão de 21 do 12 a 19 do 3
	if ( (dia >=20 && mes == 12) || (mes <3) || ( dia <20 && mes == 3)){
		System.out.println("É verão - " + dia +"/"+ mes+"/"+ ano);
		
	}
	else if(( dia>=20 && mes ==3) || (mes <6 ) || (dia <20 && mes == 6)){
		System.out.println("Outono-"  + dia+"/"+ mes +"/"+ ano);
	 }
	else if((dia >=20 && mes == 6) || (mes <9) || (dia <20 && mes == 9)){
		System.out.println("Inverno - " + dia +"/"+ mes+"/"+ ano);
      }
	else {
		System.out.println("Primavera-" + dia +"/"+ mes+"/"+ ano);
	}
}

}

/*
Classe Testa
*/

public class TestaEstacao {

public static void main(String[] args) {

EstacaoInicio estacao = new EstacaoInicio();

estacao.entraData();

estacao.entraMes();

estacao.entraAno();

estacao.informaEstacao();
}

}

K

vlw cara, testei aqui funciono blz…

ClovisCmb

Que isso kra…pressisando tamo ae

flws

Criado 27 de março de 2008
Ultima resposta 16 de abr. de 2008
Respostas 34
Participantes 6