Contar portas abertas e fechadas, exercício caelum, ajuda galera =]

14 respostas
sinister182

Seguinte galera acabei de fazer esse exercício que estava na apostila de java da caelum:

Programa3
Classe:CasaAtributos:cor,porta1,porta2,porta3Método:voidpinta(Strings),intquantasPortasEstaoAbertas()

Crie uma casa e pinte-a.Crie trêsportas e coloque-as na casa; abra e feche as mesmas como desejar.
Utilize o método quantasPortasEstaoAbertas() para imprimir o número de portas abertas.

Resolvi da seguinte maneira:

class exercício_4_14_3 {
	String cor;
	int porta1;
	int porta2;
	int porta3;

	void pinta(String casacor) {
		casacor = "Alaranjada";
	}
	
	public int abre(int passavalor) {
		return 1;
	}

	public int fecha(int passavalor) {
		return 0;
	}
	
	void quantasPortasEstaoAbertas() {
		int soma = porta1 + porta2 + porta3;
		if (soma == 0 ) {
			System.out.println ("Todas as portas estão fechadas");
		}else {
			System.out.println (soma + " Portas estão abertas");
		}
	}
}
class exercício_4_14_3_testa {
	public static void main(String[] args) {
		
		exercício_4_14_3 casa = new exercício_4_14_3();
		casa.cor = "Azul";
		casa.porta1 = casa.fecha(casa.porta1);
		casa.porta2 = casa.fecha(casa.porta2);
		casa.porta3 = casa.abre(casa.porta3);
		
		casa.quantasPortasEstaoAbertas();
	}
}

O código funcionou certinho (não coloquei excessões caso seja uma porta aberta (Está), duas ou mais (Estão)...mas enfim) porém fiquei com algumas dúvidas.

1 - Eu usei o "return", pelo que eu entendi o return (se for o caso) me retorna para a variavel local "passavalor" o valor 1 que por sua vez é passado para a variável porta1 (por exemplo) é isso que acontece ?

2 - porta1 é uma variável e nesse caso um atributo da classe lass exercício_4_14_3 certo ? se for isso mesmo....tentei chamar o metodo "fecha" da seguinte maneira: casa.porta1.fecha() ou mesmo casa.porta1.fecha(casa.porta1) mas o seguinte erro apareceu:

exercÝcio_4_14_3_testa.java:6: int cannot be dereferenced
casa.porta1.fecha(casa.porta1) = casa.fecha(casa.porta1);

3 - pensei na seguinte possibilidade: seria meu atributo porta1 que pertence ao objeto casa que estaria chamando o método "fecha" e isso não é possível, correto ? E da forma que eu estava chamando o método, como pelo que parece eh o atributo porta1 que o chama, o método não saberia a qual atributo de qual objeto dar o retorno...correto ? dai vem esse erro..algo +- assim pessoal ?

4 - apenas objetos podem chamar métodos ?

5 - esta correto fazer da seguinte forma: casa.porta3 = casa.abre(casa.porta3); ? ou existe uma forma correta ou melhor de se fazer isso ?

Galera desculpem-me pelo monte de dúvidas mas nas férias não tenho a quem perguntar...ai é o pessoal do guj que sofre =P

Abraços

14 Respostas

sinister182

galera…alguém pode dar uma força ?

Felipeuff

1 - Eu usei o “return”, pelo que eu entendi o return (se for o caso) me retorna para a variavel local “passavalor” o valor 1 que por sua vez é passado para a variável porta1 (por exemplo) é isso que acontece ?

A expressão casa.porta1 = casa.fecha(casa.porta1); que está na linha 6 da sua segunda class faz uma chamada ao método fecha que retorna o valor 0 que é atribuido ao atributo porta1 do objeto casa. Então é sim, é isso que acontece.

4 - apenas objetos podem chamar métodos ?

Se vc tiver chamando um método dentro da própria classe, então não tem o porque de instanciar um objeto. Mas sim, são os objetos que realizam (chamam) uma ação (método).

peczenyj

Vc passa os argumentos para os metodos mas não faz nada com eles?

void pinta(String casacor) {  
        casacor = "Alaranjada";  // pq passar casacor? faz sentido ?
    }  
      
    public int abre(int passavalor) {  
        return 1;  // pq passar passavalor? faz sentido ?
    }

Para mim, cada porta poderia ser um booleano, se true ela estaria aberta. bastaria ver quantas são true para contar quantas estao abertas.

sinister182
peczenyj:
Vc passa os argumentos para os metodos mas não faz nada com eles?
void pinta(String casacor) {  
        casacor = "Alaranjada";  // pq passar casacor? faz sentido ?
    }  
      
    public int abre(int passavalor) {  
        return 1;  // pq passar passavalor? faz sentido ?
    }

Para mim, cada porta poderia ser um booleano, se true ela estaria aberta. bastaria ver quantas são true para contar quantas estao abertas.

Hmm é porque eu pensava que deveria ter uma variável pro return jogar o valor, então nem precisa ?

faviandrade

Bom dia… pessoal, também tentei fazer este programinha de estudo , e no momento de definir o método abre e fecha, pensei em realizar com o peczenyj citou, com bolean… true = aberta, false = fechada, porém… depois como armazenar isso em um contador???

pq… de qualquer maneira, eu preciso falar quantas estão abertas ou fechadas… e não quais…
alguém fez com o tipo boleano ???

Grato.

V
class ContaPortas{  
     public static void main(String [] args) {  
         //Cria objeto casa  
         Casa casa = new Casa();  
           
         //Teste  
         casa.PortasAbertas(); //Mostra quantas portas estão abertas  
           
         casa.fechaPorta(); //Fecha uma porta  
           
         casa.PortasAbertas(); //Mostra quantas portas estão abertas   
   
     }  
 }  

///////////////////////////////////////////////////////////////////////////////////////////////////////////

class Casa {
	//Gera variáveis da instância
		private int porta1 = 1;
		private int porta2 = 1;
		private int porta3 = 1;
		private int quantasPortasEstaoAbertas = porta1 + porta2 + porta3;
		
	//Gera métodos
		
		//Abre porta
		void abrePorta(){
			if (quantasPortasEstaoAbertas < 3){
				quantasPortasEstaoAbertas += 1;
			}
		}
		
		//Fecha porta
		void fechaPorta(){
			if (quantasPortasEstaoAbertas > 0){
				quantasPortasEstaoAbertas -= 1;
			}
		}
		
		
		//Conta portas abertas
		void PortasAbertas(){ 
			System.out.println(quantasPortasEstaoAbertas + " estão abertas!");
		}

}

Resultado:
3 estão abertas!
2 estão abertas!

luizfelipeams

Eu fiz esse exercicio, mas me baseando como se fosse uma continuação do numero 2 da apostila, pois achei melhor pra praticar e ja usar alguns atributos e metodos ja criados na classe Porta:

Programa 2
Classe: Porta Atributos: aberta, cor, dimensaoX, dimensaoY, dimensaoZ Métodos: void abre(), void fecha(),
void pinta(String s), boolean estaAberta()
Crie uma porta, abra e feche a mesma, pinte-a de diversas cores, altere suas dimensões e use o método
estaAberta para verificar se ela está aberta.

Eu fiz de uma forma que seguisse os conhecimentos que a apostila forneceu até o momento, pois a intenção era
praticar o que eu estava aprendendo no exato momento.
Bom, vou postar pra ver se vale de alguma ajuda.
=)

package caelum;

public class Porta {

	boolean aberta = false;
	String cor;
	float dimensaoX;
	float dimensaoY;
	float dimensaoZ;

	void abre() {
		if (this.aberta == true) {
			System.out.println("A porta já está aberta.");
		} else {
			this.aberta = true;
			System.out.println("A porta está aberta.");
		}
	}

	void fecha() {
		if (this.aberta == false) {
			System.out.println("A porta já está fechada.");
		} else {
			this.aberta = false;
			System.out.println("A porta está fechada.");
		}
	}

	void pinta(String corEscolhida) {
		if (this.cor == corEscolhida) {
			System.out.println("A porta ja está com essa cor");
		} else {
			this.cor = corEscolhida;
			System.out.println("A porta está com a cor " + this.cor);
		}

	}

	boolean estaAberta() {
		if (this.aberta) {
			System.out.println("A porta está aberta");
			return true;
		} else {
			System.out.println("A porta está fechada");
			return false;
		}
	}

}
package caelum;

public class Casa {


	String cor;
	Porta porta1 = new Porta();
	Porta porta2 = new Porta();
	Porta porta3 = new Porta();
	Porta porta4 = new Porta();
	
	void pinta(String corCasa){
		if (this.cor == corCasa) {
			System.out.println("A casa ja está com essa cor");
		} else {
			this.cor = corCasa;
			System.out.println("A casa está com a cor " + this.cor);
		}
	}
	
	int quantasPortasEstaoAbertas(){
		int cont=0;
			if(this.porta1.aberta){				
				cont = cont+1;
			}
			if(this.porta2.aberta){
				cont = cont+1;
			}
			if(this.porta3.aberta){
				cont= cont+1;
			}
			if(this.porta4.aberta){
				cont= cont+1;
			}
		
		return cont; 
	}
	
}

E por fim a classe de teste que eu usei para testar se as classes funcionaram corretamente.

package caelum;

public class TestaCasa {

	public static void main(String[] args) {

		Casa c = new Casa();		
		c.porta1.aberta=false;
		c.porta1.estaAberta();
		c.porta2.aberta=true;
		c.porta2.estaAberta();
		c.porta3.aberta=true;
		c.porta3.estaAberta();
		c.porta4.aberta=false;
		c.porta4.estaAberta();
		System.out.println("Numero de portas abertas: "+c.quantasPortasEstaoAbertas());
		c.pinta("Azul");
		c.pinta("Azul");
		c.porta1.pinta("amarelo");		
		c.porta1.pinta("amarelo");
		c.porta2.pinta("verde");
		c.porta2.pinta("verde");
	}
}

Espero ter ajudado.

A

Estou começando nos exercícios também, olha como eu fiz:

public class Casa {

String cor;

boolean porta1;

boolean porta2;

boolean porta3;
public static void main(String[] args) {
    Casa casa = new Casa();
    casa = new Casa();
    
    casa.cor = "Vermelho";
    casa.porta1 = true;
    casa.porta2 = false;
    casa.porta3 = true;
    
    casa.pinta("Azul");
    casa.quantasPortasEstaoAbertas();       
    
}

void pinta(String corEscolhida){
    if(this.cor == corEscolhida){
        System.out.println("A casa já esta pintada com essa cor ");
    }else{  
        this.cor = corEscolhida;
        System.out.println("A casa foi pintada de " +this.cor);
        }
}



int quantasPortasEstaoAbertas(){
    int cont = 0;
    if(this.porta1 == true)
    {
       cont++; 
    }if(this.porta2 == true){
        cont++;
    }if(this.porta3 == true){
        
        cont++;
    }
    System.out.println("Estão abertas " +cont +" portas");
   return cont;
    
    
    
}

}

espero ter ajudado;
abraço

R

[quote=sinister182][quote=peczenyj]

Eu fiz assim:
public class Casa {
	String cor;
	int porta1;
	int porta2;
	int porta3;

	void quantasPortasAbertas() {
		int portasAbertas = this.porta1 + this.porta2 + this.porta3; 	
		System.out.println("O número de portas abertas é: " + portasAbertas);
	}

	//Método que abre a porta selecionada
	int abre() {
		return 1;
		
	}
	
	//Método que fecha a porta selecionada
	int fecha() {
		return 0;
	}
	
	//Método que pinta a casa
	void pintar(String cor) {
		this.cor = cor;
		System.out.println("A casa foi pintada de: " + this.cor);
	}

}




public class TestarCasa {

	public static void main(String[] args) {

		Casa c = new Casa();
		
		c.porta1 = c.abre();
		c.porta3 = c.abre();
		c.quantasPortasAbertas();
		
		c.pintar("Verde");

		System.out.println("A casa agora está pintada de: " + c.cor);
		
		c.porta1 = c.fecha();
		c.quantasPortasAbertas();
		
		
		
	}
}
R

alguém sabe como eu faço pra identar o código na hora de postar aqui no GUJ?
Eu copio e colo o código direto do eclipse mas ele fica todo alinhado a esquerda!
Quero postar no fórum meus códigos todos identados como mostra na figura!

abs

Vynko

Reinaldo,
Coloque assim;

Seu código aqui, o meu não apareceu "codificado" porque desativei o BBCode, observe isso também.
R
public class CodigoIdentado{
//Vlw meu camarada...

}
J

Usei a class Porta do exercício dois para fechar, abrir e verificar as portas da casa que estão abertas.

/*
 * Classe: Porta
 * Atributos: aberta, cor, dimensaoX, dimensaoY, dimensaoZ
 * Métodos: void abre()
 *          void fecha()
 *          void pinta(String s)
 *          boolean estaAberta()
 * */

class Porta
{
	boolean aberta;
	String cor;
	double dimensaoX;
	double dimensaoY;
	double dimensaoZ;
	
	void abre()
	{
		this.aberta = true;
	}

	void fecha()
	{
		this.aberta = false;
	}

	void pinta(String s)
	{
		this.cor = s;
	}

	boolean estaAberta()
	{
		return this.aberta;
	}
}
/*
 * Classe: Casa 
 * Atributos: cor, porta1, porta2, porta3 
 * Método: void pinta(String s),
 * int quantasPortasEstaoAbertas()
 * */

class Casa
{
	String cor;
	Porta porta1 =  new Porta();
	Porta porta2 =  new Porta();
	Porta porta3 =  new Porta();

	void pinta(String color)
	{
		this.cor = color;
	}

	int quantasPortasEstaoAbertas()
	{
		int abertas = 0;
		if(this.porta1.estaAberta())
		{
			abertas +=1;
		}
		if(this.porta2.estaAberta())
		{
			abertas +=1;
		}
		if(this.porta3.estaAberta())
		{
			abertas +=1;
		}

		return abertas;
	}
}
class TestaCasa
{
	public static void main(String[] args)
	{	
		Casa c1 = new Casa();

		c1.pinta("Verde");
		
		c1.porta1.abre();
		c1.porta2.abre();
		c1.porta3.fecha();

		System.out.println("Cor da casa: " + c1.cor);
		System.out.println("Portas abertas: " + c1.quantasPortasEstaoAbertas());

	}
}
F

Graças ao código do luizfelipeams consegui concluir o meu sem “atalhos”:



Criado 30 de janeiro de 2009
Ultima resposta 11 de set. de 2014
Respostas 14
Participantes 11