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

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:

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

}

		[/code]

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

}[/code]

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

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

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).

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

[code] void pinta(String casacor) {
casacor = “Alaranjada”; // pq passar casacor? faz sentido ?
}

public int abre(int passavalor) {  
    return 1;  // pq passar passavalor? faz sentido ?
}[/code]

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

[quote=peczenyj]Vc passa os argumentos para os metodos mas não faz nada com eles?

[code] void pinta(String casacor) {
casacor = “Alaranjada”; // pq passar casacor? faz sentido ?
}

public int abre(int passavalor) {  
    return 1;  // pq passar passavalor? faz sentido ?
}[/code]

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

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

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.


 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!

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.

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

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

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

Reinaldo,
Coloque assim;

Seu código aqui, o meu não apareceu "codificado" porque desativei o BBCode, observe isso também.

public class CodigoIdentado{
//Vlw meu camarada...

}

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

	}
}

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