Exercício 5.8 da apostila FJ-11 da Caelum [Resolvido]

Olá pessoas,

Estou no início do aprendizado java e me deparei com um problema que não consigo resolver. É o exercício 5.8 da apostila FJ-11 (Caelum). Tentei de tudo e não consegui fazer funcionar. Vejam o meu código e se puderem me corrigir, por favor… Agradeceria.

1. O objetivo dos exercícios a seguir é fixar os conceitos vistos até agora. Se você está com dificuldade em
alguma parte desse capítulo, aproveite e treine tudo o que vimos até agora no pequeno programa abaixo:
Programa: Classe: Casa Atributos: cor, totalDePortas, portas[] Métodos: void pinta(String s), int quantasPortasEstaoAbertas(),
void adicionaPorta(Porta p), int totalDePortas().
Crie uma casa, pinte-a. Crie três portas e coloque-as na casa através do método adicionaPorta, abra
e feche-as como desejar. Utilize o método quantasPortasEstaoAbertas para imprimir o número de portas
abertas e o método totalDePortas para imprimir o total de portas em sua casa.

Eu não entendi esse termo “portas[]”. Trata-se de um array simples de boolean, ou seria um array da classe Porta? O que consegui até agora foi o seguinte.

[code]class Casa {

String cor = "Neutra";
int totalDePortas = 0;
Porta[] minhasPortas;

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

int quantasPortasEstaoAbertas() {
	int contadorDePortasAbertas = 0;
	for(int i = 0; i < minhasPortas.length; i++) {
		if(minhasPortas[i].aberta = true) {
			contadorDePortasAbertas += 1;
		} else {
			contadorDePortasAbertas += 0;
		}
	}
	return contadorDePortasAbertas;
}

void adicionaPorta(Porta p) {
	for(int i = 0; i < minhasPortas.length; i++) {
		if(minhasPortas[i] == null) {
			minhasPortas[i] = p;
			break;
		}
	}
}

int totalDePortas() {
	for(int i = 0; i < minhasPortas.length; i++) {
		if(minhasPortas[i] != null) {
			totalDePortas += 1;
		}
	}
	return totalDePortas;
}

}

class Porta {

boolean aberta = false;

}

class TestaCasa {

public static void main(String[] args) {

	Casa minhaCasa = new Casa();
	minhasPortas = new Porta[5];
	minhasPortas[0] = new Porta();
	minhasPortas[1] = new Porta();
	minhasPortas[2] = new Porta();
	minhasPortas[3] = new Porta();
	minhasPortas[4] = new Porta();
			
	adicionaPorta(0);
	adicionaPorta(1);
	adicionaPorta(2);
	adicionaPorta(3);
	adicionaPorta(4);
			
	minhaCasa.minhasPortas[0].aberta = true;
	minhaCasa.pinta("Ouro");
	
	System.out.println(minhaCasa.cor);
	System.out.println(minhaCasa.minhaPorta[0].aberta);
	
}

}[/code]

Pra começar declare um modificador de acesso para seus metodos, no caso em anexo voce podera declarar public…
Na linha 4 declare a variavel como static pois de acordo com a criação de objetos nao e criado uma variavel para cada objeto e sim uma unica variavel
para todos os objetos, afinal isso e só um contador.


static int totalDePortas = 0; 

Depois na declaração dos atributos declare porta como int.


int portas[];

Nas Linhas 13 e 14 execute dessa forma:

 for(int i = 0; i < portas[].length; i++) {  
 if(portas[i].aberta = true) {  

Nas linhas 16,17 e 18 o comando else é facultativo pois se o if retornar false ele
sai do bloco if e retorna o valor da variavel que ja tinha sido inicializado como 0.

Na linha 23 declare:

public void adicionaPorta(int p) { 

Dentro do metodo adicionarPorta declare desta forma:

 for(int i = 0; i < portas[].length; i++) {  
   if(portas[i] == null) {  
     portas[i] = p;
     this.setTotalDePortas();

Desta forma ele adicionara a porta e automaticamente xamara o metodo para adicionar 1 ao contador…

Declare o metodo intTotalDePortas como “void setTotalDePortas()”:

public void setTotalDePortas(){
  totalDePortas++;
}

Declare tambem um novo metodo “getTotalDePortas()”:

public int getTotalDePortas(){
 return totalDePortas;
}

Não sera preciso declarar essa Classe Porta das linhas 43 a 47, então apaga…

No metodo main declare:


        //Declara a variavel minhaCasa para referenciar o objeto que esta sendo criado...

        Casa minhaCasa = new Casa();  

         // pela variavel minha casa a qual faz referencia ao objeto que foi criado acessa o 
         // metodo adicionarPorta para criar uma nova porta no array de portas

         minhaCasa.adicionarPorta(1);  
         minhaCasa.adicionarPorta(2);
         minhaCasa.adicionarPorta(3);
         minhaCasa.adicionarPorta(4);
         minhaCasa.adicionarPorta(5);
                   
         // para abrir ou fechar uma porta voce tera que declar um metodo la na classe Porta que se chamara portaAberta(){}
         // do mesmo jeito se quiser fechar a porta tera que declarar uma classe que execute essa ação
         // OBS: lembrese que os metodos servem para executar açoes e os mesmos sao xamados atraves de referencia aos metodos para poder ser executado.
         // no nosso caso ao declarar um metodo para abrir ou fechar a porta voce deve receber um parametro int no metodo pois voce precisara saber qual porta 
         // voce quer abrir ou fechar
         // do mesmo jeito quando voce for chamar um metodo voce tera que passar um parametro condizente com o que o metodo pede,
         // no caso um int com o numero da porta
         // lembre-se na hora de fazer o controle do metodo vc tera de subtrair um ao inteiro recebido como numero da porta pois as portas estao guardadas num
         // array que inicia do zero entao quando vc passa que quer fechar a porta 1 na verdade vc estara fechando a porta zero pois a porta um se localiza na 
         // posiçao zero do array.

 
         minhaCasa.aberta(1);
         // a avaliação que a porta estara aberta e feita no cordo do metodo portaAberta que sera declarado na classe Porta
         // ao passar o parametro 1 vc estara passando o numero da porta que vc quer abrir entao o metodo recebe o parametro subtrai em 1 e atribui  true
         minhaCasa.pinta("Ouro");  1-
         

         //Usa o metodo printf para receber dados formatados
         // %s recebe uma strig que e passada como parametro atraves do metodo minhaCasa.getCor()
         // /n caractere de nova linha
  
         System.out.printf("A cor da casa e: %s \n", minhaCasa.getCor());  

Axo que de cara isso deve diminuir os erros do seu codigo…

Obrigado pela resposta imediata! Vou verificar o código com suas sugestões/correções e postar se consegui. Obrigado mesmo.

Olá novamente, então, fiz as modificações que você sugeriu. Consegui fazer funcionar com algumas mudanças.

[code]class Casa {

String cor = "Neutra";
static int totalDePortas = 0;
int portas[] = new int[10]; //define o tamanho da array

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

public void adicionaPorta(int p) {
	for(int i = 0; i < portas.length; i++) { //mudei o termo "portas[]" para "portas", pois trata-se de inteiros e não de classe
		if(portas[i] == 0) { //tive que comparar com o inteiro zero e não mais com o termo null, pois acusava erro
			portas[i] = p;
			this.setTotalDePortas();
			break; //tive que acrescentar o break, porque senão o método getTotalDePortas retornaria o tamanho da array, e não apenas as portas adicionadas
		}
	}
}

public void setTotalDePortas() {
	totalDePortas++;
}

public int getTotalDePortas() {
	return totalDePortas;
}

public String getCor() {
	return cor;
}

}

class TestaCasa {

public static void main(String[] args) {

	Casa minhaCasa = new Casa();
	minhaCasa.adicionaPorta(1);
	minhaCasa.adicionaPorta(2);
	minhaCasa.adicionaPorta(3);
	minhaCasa.adicionaPorta(4);
	minhaCasa.adicionaPorta(5);
	
	minhaCasa.pinta("Ouro");
	
	System.out.printf("A cor da casa e: %s \n", minhaCasa.getCor());
	
	minhaCasa.pinta("Bege");
	
	System.out.printf("A cor da casa e: %s \n", minhaCasa.getCor());
	
	System.out.printf("Ha %s portas na casa\n", minhaCasa.getTotalDePortas());
}

}[/code]

Rafael, fiz quase igual vc cara, inclusive copiei alguns códigos seus rs do seu primeiro post q vc estava fazendo… Acho que aquele atendia mais o que o exercício estava pedindo… Eu quase consegui fazer esse bendito deste exercício, mas por algum motivo inexplicavel, o resultado das portas abertas e do total de portas que é uma coisa até simples, não é mostrada… Vejam só galera, com esta meu código… Não consigo entender onde está o erro:

Classes Porta e Casa

[code]class Porta {

boolean aberta;

}

public class Casa {
String cor;
int totalDePortas;
Porta[] portas = new Porta[3];

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

void adicionaPorta(Porta p) {
	for (int i = 0; i < portas.length; i++) {
		if(portas[i] == null) {
			portas[i] = p;
			break;
		}
	}	
}

public int quantasPortasEstaoAbertas() {
	int contadorDePortasAbertas = 0;
	for(int i = 0; i < this.portas.length; i++) {
		if(this.portas[i].aberta == true) {
			contadorDePortasAbertas += 1;
		}
	
	}
	return contadorDePortasAbertas;
		
}

int totalDePortas() {
	for(int i = 0; i < this.portas.length; i++) {
		if(this.portas[i] != null) {
			totalDePortas += 1;
		}
	}
	return totalDePortas;
}

[/code]

Classe TestaCasa

[code]public class TestaCasa {
public static void main(String[] args) {

	Casa minhaCasa = new Casa();
	
	Porta p1 = new Porta();
	Porta p2 = new Porta();
	Porta p3 = new Porta();
	
	minhaCasa.pinta("Azul");
	
	p1.aberta = true;
	minhaCasa.adicionaPorta(p1);
	
	p2.aberta = false;
	minhaCasa.adicionaPorta(p2);
	
	p3.aberta = true;
	minhaCasa.adicionaPorta(p3);
	
	minhaCasa.quantasPortasEstaoAbertas();   // NÃO MOSTRA QUANTAS PORTAS ESTÃO ABERTAS.. MAS O MÉTODO AO MEU VER ESTÁ PERFEITO
	
	minhaCasa.totalDePortas(); // MESMA COISA, NÃO MOSTRA O TOTAL DE PORTAS
}

}[/code]

Aí está o código pessoal, estou aqui de cabeça quente pq vi, revi, tentei fazer e nao consegui… Pra mim os métodos quantasPortasEstaoAbertas() e totalDePortas() da classe Casa estão certos, mas não mostra o resultado deles. O Eclipse não mostra nenhum erro, nem aparece nada. Alguém aí poderia me ajudar, por favor? Obrigado!!!

Olá kaizenman, concordo com vc, o que eu consegui nao atende ao exercicio. Mas eu vou retomar o modo anterior e seguir o que vc fez. Em breve posto o que consegui.

Olá, conseguimos! (rs). Não retorna nada porque vc esqueceu de atribuir o resultado dos metodos a uma variavel e depois pedir para imprimir a variaval, veja:

[code]public class TestaCasa {
public static void main(String[] args) {

	Casa minhaCasa = new Casa();
	
	Porta p1 = new Porta();
	Porta p2 = new Porta();
	Porta p3 = new Porta();
	
	minhaCasa.pinta("Azul");
	
	p1.aberta = true;
	minhaCasa.adicionaPorta(p1);
	
	p2.aberta = false;
	minhaCasa.adicionaPorta(p2);
	
	p3.aberta = true;
	minhaCasa.adicionaPorta(p3);
	
	int resultadoPortasAbertas = minhaCasa.quantasPortasEstaoAbertas();
	System.out.println(resultadoPortasAbertas + " portas estao abertas");
	
	int resultadoTotalDePortas = minhaCasa.totalDePortas();
	System.out.println("Ha " + resultadoTotalDePortas + " portas na casa");
}

}[/code]

hehehhe agora que fui ver… verdade conseguimos… foi fodinha esse exercício … mas aí esta… totalmente feito rs… flw

Tava doido tb sem conseguir fazer esse exercicio, mas, agora consegui, tb desse jeito…

Não tem a necessidade de se usar variáveis para retornar os totais.

System.out.println("Portas abertas: "+minhaCasa.quantasPostasEstaoAbertas());
System.out.println("Total de portas: "+minhaCasa.totalDePortas());

realmente fajo, basta fazer como você fez. valeu.

moderador, pode mudar o titulo para [RESOLVIDO]

Olá Amigos, sou novo aqui, e estou tendo dificuldades para enteder o processo de OO, principalmente na parte de Composição.
Por exemplo:

[code]class Porta
{
private boolean estaAberta;
private String cor;
private int dimX, dimY;

//construtor
public Porta(boolean e, String c, int x, int y)
{
	estaAberta=e;
	cor=c;
	dimX=x;
	dimY=y;
}
//acessor
public boolean getEstaAberta()
{
	return estaAberta;
}
public String getCor()
{
	return cor;
}
public int getDimX()
{
	return dimX;
}
public int getDimY()
{
	return dimY;
}

	
//modificadores
public void setEstaAberta(boolean e)
{
	estaAberta=e;
}
public void setCor(String cor)
{
	cor=cor;
}
public void setCor(Porta oporta, String c)
{
	oporta.cor=c;
}
public void setDimX(int x)
{
	dimX=x;
}
public void setDimY(int y)
{
	dimY=y;
}

//metodos
public void abre()
{
estaAberta=true;
}
public void fecha()
{
estaAberta=false;
}
}[/code]

E eu gostaria de Criar uma Classe Casa e uma Classe Teste Casa…
So que eu gostaria de criar dois objetosCasas no Teste, e em cada um desses Objetos Casas diferenciar as portas, Tanto em quantidade, cor, dimensoes e etc…
afinal, nem todas as casas sao iguais…
Essa eh a minha duvida, como eu defino o numero de portas q o ojbCasa vai ter… e como eu acesso e modifico os items portas da casa via TesteCasa??
Muito obrigado se eu for atendido!
Abracos a todos