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

11 respostas
rafael.pezzuto

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.

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

}

11 Respostas

heladioxerez

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…

rafael.pezzuto

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

rafael.pezzuto

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

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

}
K

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

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;
	}

Classe TestaCasa

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
	}
}
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!!!
rafael.pezzuto

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.

rafael.pezzuto

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:

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");
	}
}
K

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

F

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

rafael.pezzuto

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

moderador, pode mudar o titulo para [RESOLVIDO]

M

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

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;
	}
}

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

F



Criado 4 de setembro de 2009
Ultima resposta 11 de set. de 2014
Respostas 11
Participantes 6