[RESOLVIDO] Dúvida ao utilizar metódos

5 respostas
Onimatsu

E aí moçada! Como é que vai?
Estou seguindo um exercício e estou com problemas em três metódos "quantasPortasEstaoAbertas" e "totalDePortas" o outro "adicionaPorta(Porta p)" desde já a IDE não acusa nenhum erro mais no debug passa direto.

 Programa:
Classe: Casa Atributos: cor, totalDePortas, portas[] Métodos: void pinta(String s), int quantasPortasEs-
taoAbertas(), 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.

Como eu fiz: Casa
public class Casa {
	String cor;
	int totalDePortas;
	Porta [] portas = new Porta [10];
	
	void pinta(String s) {
		this.cor = s;
		System.out.println(this.cor);
	}

	int quantasPortasEstaoAbertas() {
		int cont = 0;
		for (int x = 0; x > portas.length; x++) {
			// É possivel chamar o atributo diretamente pois portas é do tipo Porta
			if (portas[x].aberta == true) {
				cont = x;
			}
			System.out.println(cont);
		}return cont;
	}

	void adicionaPorta(Porta p) {
		for (int i = 0; i > portas.length; i++) {
			if (portas[i] == null) {
				p = new Porta();
                portas[i] = p;
			} else {
				System.out.println("Array cheia");
			}
		}
	}

	int totalDePortas() {
		for (int i = 0; i > portas.length; i++) {
			if (portas[i] != null) {
				i = totalDePortas;
			}
		}
		System.out.println(totalDePortas);
		return totalDePortas;
	}
}
Porta
public class Porta {
	boolean aberta;

	boolean estaAberta() {
		if (this.aberta == true) {
			System.out.println("Porta aberta");
		} else {
			System.out.println("Porta fechada");
		}
		return false;
	}

}
Testador
public class Testador {
	public static void main(String[] args) {
		// Cria casa
		Casa minhaCasa = new Casa();
		
		// Cria porta 
		Porta novaPorta = new Porta();
		// Adiciona valor boleano diretamente ao atributo class Porta
		novaPorta.aberta = true;
		// Utiliza de um metódo class Porta (somente para demonstração)
		novaPorta.estaAberta();
		
		// Valores originais atributos class Casa
		minhaCasa.cor = "Amarelo";
		minhaCasa.totalDePortas = 2;
		
		// Modificando os valores metódos class Casa
		minhaCasa.pinta("Branco");
		minhaCasa.adicionaPorta(novaPorta);	
		minhaCasa.quantasPortasEstaoAbertas();
		minhaCasa.totalDePortas();
	}
}
Por favor se possível me mostrem também como deixar o código mais simplificado sem linhas desnecessárias.

5 Respostas

nakai000

Fala brother, eu peguei seu código e fiz algumas alterações nas classes

Classe Casa

public class Casa {
      String cor;
      int totalDePortas;
      Porta [] portas = new Porta [10];
   
       public Casa(int p){
		 	totalDePortas = p;
			
			for(int i = 0; i < totalDePortas; i++)
         {
				Porta porta = new Porta("fechada");
            portas[i] = porta;
         }
			
         for(int i = totalDePortas; i < portas.length; i++)
         {
            portas[i] = null;
         }
      }
   
       void pinta(String s) {
         this.cor = s;
         System.out.println(this.cor);
      }
   
       int quantasPortasEstaoAbertas() {
         int cont = 0;
         for (int x = 0; x < totalDePortas; x++) {
         // É possivel chamar o atributo diretamente pois portas é do tipo Porta
            if (portas[x].aberta == true) {
               cont++;
            }			
         }
         System.out.println("Núumero de portas abertas: " + cont);
         return cont;
      }
   
       void adicionaPorta(Porta p) {
         if (totalDePortas < portas.length) {
            portas[totalDePortas] = p;
				totalDePortas++;
         } 
         else {
            System.out.println("Array cheia");
         }
      }
   
       int totalDePortas() {
         int cont = 0;
         for (int i = 0; i < portas.length; i++) {
            if (portas[i] != null) {
               cont++;
            }
         }
         System.out.println("Total de portas: " + cont);
         return cont;
      }
   }

Classe Porta

public class Porta {
	boolean aberta;
	
	Porta(String s){
		if(s.equals("aberta"))
			aberta = true;
		else
			aberta = false;
	}

	boolean estaAberta() {
		if (this.aberta == true) {
			System.out.println("Porta aberta");
		} else {
			System.out.println("Porta fechada");
		}
		return false;
	}

}

Classe Testador

public class Testador {
       public static void main(String[] args) {
      // Cria casa
         Casa minhaCasa = new Casa(2);
      
      // Cria porta 
         Porta novaPorta = new Porta("aberta");
      // Adiciona valor boleano diretamente ao atributo class Porta
         novaPorta.aberta = true;
      // Utiliza de um metódo class Porta (somente para demonstração)
         novaPorta.estaAberta();
      
      // Valores originais atributos class Casa
         minhaCasa.cor = "Amarelo";
      
      // Modificando os valores metódos class Casa
         minhaCasa.pinta("Branco");
         minhaCasa.adicionaPorta(novaPorta);	
         minhaCasa.quantasPortasEstaoAbertas();
         minhaCasa.totalDePortas();
      }
   }

O que eu reparei no seu código antigo foi que em alguns loops estavam i > portas.length,
então ele nem executava pois a variável i estava com o valor 0.

Testa o código que eu coloquei e ve se funciona, qualquer dúvida é só pergunta :wink:

Onimatsu

Boa cara me ajudou muito.
Eu fiz um erro feio mesmo quando usava o debug eu reparei que o loop deveria ser i < portas.length por isso ele passava direto. Enquanto ao exercício as demais classes ficaram iguais com exceção de Casa que eu mudei três metódos e o Testador que eu criei uma novaPorta() para mais testes.
Como eu estava estudando eu pequei pouca coisa do que você postou esses dois metódos eu fiz sozinho a diferença com o anterior é que adicionei uma condição se falso que para o código e deixa mais eficiente para ele não continuar percorrendo array mesmo depois de satisfazer a condição.

int quantasPortasEstaoAbertas() { int cont = 0; for (int x = 0; x < portas.length; x++) { if (portas[x] != null && portas[x].aberta == true) { cont = x + 1; } else { break; } } System.out.println("Portas abertas: " + cont); return cont; } int totalDePortas() { int cont = 0; for (int i = 0; i < portas.length; i++) { if (portas[i] != null) { cont = i + 1; } else { break; } } System.out.println("O total de portas é: " + cont); return cont; } Já o código que adiciona as portas que eu fiz funcionou mais não como o seu funcionou pois eu não consegui exibir a mensagem de array cheia no meu, então eu adimito que foi Crtl C Crtl V.
Eu queria que você explicasse essa parte do seu código linha 4, calma eu sei que isso é um contador mas a minha dúvida é: Se eu criasse um contador dentro do metódo aquele de costume cont++ quando eu sair desse metódo e voltar para ele mais tarde quando eventualmente fosse adicionar uma novaPorta2() esse cont++ estaria zerado ou com o último valor? Se o cont ++ estivesse zerado seria por isso que você usou o totalDePortas++ por que ele se refere a um atributo e por isso acrescentar a ele o valor tornaria fixo na próxima execução do mesmo metódo pois o atributo fica fora do metódo sendo assim o valor continua existindo mesmo depois de terminada a primeira execução que seria novaPorta1()?

void adicionaPorta(Porta p) { if (totalDePortas < portas.length) { portas[totalDePortas] = p; totalDePortas++; } else { System.out.println("Array cheia"); } }

nakai000

Isso mesmo, se eu utilizasse cont com o valor 0 eu teria que executar um loop
sempre que fosse necessário adicionar uma porta ou verificar se o vetor está cheio,
utilizando a variável totalDePortas eu só preciso verificar se o valor dela é
menor do que o tamanho do vetor :wink:

Onimatsu

Opa velho valeu! Realmente é muito mais eficiente usar ifs do que usar loops vou utilizar mais isso nos próximos exercícios que eu fizer. Eu fiz um teste com o cont só que fora do loop utilizando ele como atributo sem valor definido, funciona da mesma forma só que cria um atributo sem nexo por isso vou deixar do mesmo jeito que o seu. Flw!

F
[quote=Onimatsu]Boa cara me ajudou muito.
Eu fiz um erro feio mesmo quando usava o debug eu reparei que o loop deveria ser i < portas.length por isso ele passava direto. Enquanto ao exercício as demais classes ficaram iguais com exceção de Casa que eu mudei três metódos e o Testador que eu criei uma novaPorta() para mais testes.
Como eu estava estudando eu pequei pouca coisa do que você postou esses dois metódos eu fiz sozinho a diferença com o anterior é que adicionei uma condição se falso que para o código e deixa mais eficiente para ele não continuar percorrendo array mesmo depois de satisfazer a condição.
[code]	int quantasPortasEstaoAbertas() {
		int cont = 0;
		for (int x = 0; x < portas.length; x++) {
			if (portas[x] != null && portas[x].aberta == true) {
				cont = x + 1;
			} else {
				break;
			}
		}
		System.out.println("Portas abertas: " + cont);
		return cont;
	}
int totalDePortas() {
		int cont = 0;
		for (int i = 0; i < portas.length; i++) {
			if (portas[i] != null) {
				cont = i + 1;
			} else {
				break;
			}
		}
		System.out.println("O total de portas é: " + cont);
		return cont;
	}
Já o código que adiciona as portas que eu fiz funcionou mais não como o seu funcionou pois eu não consegui exibir a mensagem de array cheia no meu, então eu adimito que foi Crtl C Crtl V. Eu queria que você explicasse essa parte do seu código linha 4, calma eu sei que isso é um contador mas a minha dúvida é: Se eu criasse um contador dentro do metódo aquele de costume cont++ quando eu sair desse metódo e voltar para ele mais tarde quando eventualmente fosse adicionar uma novaPorta2() esse cont++ estaria zerado ou com o último valor? Se o cont ++ estivesse zerado seria por isso que você usou o totalDePortas++ por que ele se refere a um atributo e por isso acrescentar a ele o valor tornaria fixo na próxima execução do mesmo metódo pois o atributo fica fora do metódo sendo assim o valor continua existindo mesmo depois de terminada a primeira execução que seria novaPorta1()?
void adicionaPorta(Porta p) {  
       if (totalDePortas < portas.length) {  
          portas[totalDePortas] = p;  
     totalDePortas++;  
       }   
       else {  
          System.out.println("Array cheia");  
       }  
    }
[/quote]

Voce também poderia tratar o caso dessa forma:

void adicionaPorta(Porta p) {
     
        try {
            portas[totalDePortas] = p;
            totalDePortas++;             
        } catch (IndexOutOfBoundsException a) {
            System.out.printf("\nErro: posição inválida (%s).\n"
                    + "Array completa", a.getMessage());
        }
    }
Criado 22 de dezembro de 2010
Ultima resposta 26 de mar. de 2013
Respostas 5
Participantes 3