Problema para comparar valores

Olá pessoal, preciso comparar alguns valores para retornar uma resultado de IMC, porém o programa só está pedindo para entrar os dados, está mostrando o IMC e não prossegue na verificação. Acredito que o problema possa estar nesse trecho da verificação:

/Verificação Feminina para o Cálculo de IMC
			
		if(c[i].getSexo().equalsIgnoreCase("F"))
						if(resultadoIMC<19.1)
				JOptionPane.showMessageDialog(null,"Você está abaixo do peso ideal");
			else
				if((resultadoIMC>=19.1) && (resultadoIMC<=25.8))
					JOptionPane.showMessageDialog(null,"Você está no peso ideal");
				else
					if((resultadoIMC>25.8) && (resultadoIMC<=27.3))
						JOptionPane.showMessageDialog(null,"Você está marginalmente acima do peso ideal");
					else
						if((resultadoIMC>27.3) && (resultadoIMC<=32.3))
							JOptionPane.showMessageDialog(null,"Você está acima do peso ideal");
						else
							if(resultadoIMC>32.3)
								JOptionPane.showMessageDialog(null,"Você está Obeso");
											
							//Verificação Masculina para o Cálculo de IMC
		
								if(c[i].getSexo().equalsIgnoreCase("M"))
												if(resultadoIMC<20.7)
										JOptionPane.showMessageDialog(null,"Você está abaixo do peso ideal");
									else
										if((resultadoIMC>=20.7) && (resultadoIMC<=26.4))
											JOptionPane.showMessageDialog(null,"Você está no peso ideal");
										else
											if((resultadoIMC>26.4) && (resultadoIMC<=27.8))
												JOptionPane.showMessageDialog(null,"Você está marginalmente acima do peso ideal");
											else
												if((resultadoIMC>27.8) && (resultadoIMC<31.1))
													JOptionPane.showMessageDialog(null,"Você está acima do peso ideal");
												else
													if(resultadoIMC>31.1)
														JOptionPane.showMessageDialog(null,"Você está obeso");

Será que estou errando em algum sinal de comparação ou na forma como estou fazendo essa comparação?

Primeiro, quando você aninha if e else, utilize {}.
Fica mais fácil de identificar o motivo da falha.

Altera aí, debuga e depois diz onde está a dificuldade.

Desculpa, não entendi muito bem, sou novato em Java e estou com um pouco de dificuldade. Poderia me dar um exemplo? Obrigado.

O que o drsmachado quis dizer, é que, nas instruções if e else vc coloque chaves para o código ficar mais claro tipo assim:

if(c[i].getSexo().equalsIgnoreCase("F")) { if(resultadoIMC<19.1) { JOptionPane.showMessageDialog(null,"Você está abaixo do peso ideal"); }else if((resultadoIMC>=19.1) && (resultadoIMC<=25.8)) { JOptionPane.showMessageDialog(null,"Você está no peso ideal"); } } ...

Entendeu???

Há sim… entendi sim, eu tinha entendido outra coisa.

Ok, assim que eu terminar de colocar {} eu posto aqui novamente.

Obrigado.

Olá pessoal, terminei de colocar os {} nos if e else, não consigo comparar e retornar o que se pede (se a pessoa está no peso, abaixo, acima ou obeso), não consigo entender o que fiz errado.

Será que alguém poderia analisar as comparações e me dar uma luz?

Obrigado!

	//Verificação Feminina para o Cálculo de IMC
			
		if(c[i].getSexo().equalsIgnoreCase("F")){
									if(c[i].CalculaImc()<19.1){
				JOptionPane.showMessageDialog(null,"Você está abaixo do peso ideal");}
		
			else if((c[i].CalculaImc()>=19.1) && (c[i].CalculaImc()<=25.8)){
					JOptionPane.showMessageDialog(null,"Você está no peso ideal");}
				else if((c[i].CalculaImc()>25.8) && (c[i].CalculaImc()<=27.3)){
						JOptionPane.showMessageDialog(null,"Você está marginalmente acima do peso ideal");}
					else if((c[i].CalculaImc()>27.3) && (c[i].CalculaImc()<=32.3)){
							JOptionPane.showMessageDialog(null,"Você está acima do peso ideal");}
						else if(c[i].CalculaImc()>32.3){
								JOptionPane.showMessageDialog(null,"Você está Obeso");}
							
		
							//Verificação Masculina para o Cálculo de IMC
		
								if(c[i].getSexo().equalsIgnoreCase("M")){
												if(c[i].CalculaImc()<20.7){
										JOptionPane.showMessageDialog(null,"Você está abaixo do peso ideal");}
									else if((c[i].CalculaImc()>=20.7) && (c[i].CalculaImc()<=26.4)){
											JOptionPane.showMessageDialog(null,"Você está no peso ideal");}
										else if((c[i].CalculaImc()>26.4) && (c[i].CalculaImc()<=27.8)){
												JOptionPane.showMessageDialog(null,"Você está marginalmente acima do peso ideal");}
											else if((c[i].CalculaImc()>27.8) && (c[i].CalculaImc()<31.1)){
													JOptionPane.showMessageDialog(null,"Você está acima do peso ideal");}
												else if(c[i].CalculaImc()>31.1){
														JOptionPane.showMessageDialog(null,"Você está obeso");}
}
		
		System.exit(0);
}
}
}
}

Porquê a verificação masculina fica dentro do if de verificação feminina?
Neste caso, se o dado de entrada for M, o bloco nunca será executado.

DICA: Além do uso de chaves, tente identar(não sei se esse é o termo correto) seu código, pois aumenta a legibilidade do mesmo.

Exemplo:

if(a>b){
         if(a>c){
                 if(a>d){
                 //...
                 }else{
                 //...
                 }
         else{
         //...
}else{
//....
}

Não quero confundir você, mas vou postar um código de exemplo e gostaria que você tentasse entender antes como é possível fazer a mesma regra de negócio sem usar tantos if’s e else’s:

Além do mais, mesmo você iniciando em java, é interessante você começar a aplicar junto aos seus estudos, boas práticas, como por exemplo no if onde se testa o sexo da pessoa, evite utilizar String’s para validações, há um jeito mais elegante e intuitivo de se fazer usando números (como nas classes a seguir):

A classe Pessoa que possue peso, altura e até pode devolver seu imc já calculado:

public class Pessoa {

	public static final int SEXO_MASCULINO = 1; // IDENTIFICADOR AUXILIAR
	public static final int SEXO_FEMININO = 2; // IDENTIFICADOR AUXILIAR

	private int sexo;
	private double altura;
	private double peso;

	public void setAltura(double altura) {
		this.altura = altura;
	}

	public int getSexo() {
		return sexo;
	}

	public void setSexo(int sexo) {
		this.sexo = sexo;
	}

	public double getPeso() {
		return peso;
	}

	public void setPeso(double peso) {
		this.peso = peso;
	}

	public double getAltura() {
		return altura;
	}

	public double getIMC() {
		return peso / (altura * altura);
	}

}

Depois a classe de diagnóstico (não precisa se atentar aos statics e final ainda, apenas aprecie com moderação):

import javax.swing.JOptionPane;

public class Diagnostico {

	private static final int MINIMO = 0; // IDENTIFICADOR AUXILIAR
	private static final int MAXIMO = 1; // IDENTIFICADOR AUXILIAR

	private static final double[] PESO_FEMININO_IDEAL = { 19.1, 25.8 };  // FAIXA DE PESO
	private static final double[] PESO_MASCULINO_IDEAL = { 20.7, 26.4 }; // FAIXA DE PESO

	public static void diagnosticaIMC(double imc, int sexo) {

		String mensagem = "";

		switch (sexo) {
		case Pessoa.SEXO_FEMININO:

			if (imc < PESO_FEMININO_IDEAL[MINIMO]) {
				mensagem = "Você está abaixo do peso ideal";
			}

			if (imc >= PESO_FEMININO_IDEAL[MINIMO] && imc <= PESO_FEMININO_IDEAL[MAXIMO]) {
				mensagem = "Você está no peso ideal";
			}

			if (imc > PESO_FEMININO_IDEAL[MAXIMO]) {
				mensagem = "Você está acima do peso ideal";
			}

			break;

		case Pessoa.SEXO_MASCULINO:

			if (imc < PESO_MASCULINO_IDEAL[MINIMO]) {
				mensagem = "Você está abaixo do peso ideal";
			}

			if (imc >= PESO_MASCULINO_IDEAL[MINIMO] && imc <= PESO_MASCULINO_IDEAL[MAXIMO]) {
				mensagem = "Você está no peso ideal";
			}

			if (imc > PESO_MASCULINO_IDEAL[MAXIMO]) {
				mensagem = "Você está acima do peso ideal";
			}

			break;
			
		default:
			mensagem = "Não foi possível diagnosticar o seu IMC.";
		}

		JOptionPane.showMessageDialog(null, mensagem);

	}
}

E por fim uma classe que realiza os testes necessários para pessoas diferentes:

public class TestaDiagnosticoIMC {

	public static void main(String[] args) {
		
		Pessoa mulher = new Pessoa();
		mulher.setSexo(Pessoa.SEXO_FEMININO);
		mulher.setPeso(45.0);	
		mulher.setAltura(1.60);
		
		Diagnostico.diagnosticaIMC(mulher.getIMC(), mulher.getSexo());
		
		Pessoa homem = new Pessoa();
		homem.setSexo(Pessoa.SEXO_MASCULINO);
		homem.setAltura(1.80);
		homem.setPeso(120.0);
		
		Diagnostico.diagnosticaIMC(homem.getIMC(), homem.getSexo());
		
	}

}

Qualquer dúvida quanto ao código ou à lógica inserida, não hesite em questionar.

Fiz um pouco na pressa, mas espero ter ajudado com essa idéia.

Obrigado spidermanx, vou analisar e procurar entender cada parte do código. Assim que terminar e testar eu envio novamente. Abraço e muito obrigado.

Poderia usar tbm switch :smiley: :smiley: :smiley:

Eu creio que usar switch não irá funcionar InicianteJavaHenrique, pois se não me engano a estrutura do switch aceita apenas tipos primitivos int

No teu codigo original, tudo se resumia na falta de uma chave que fechasse o if feminino e
a colocação (ou não - dispensavel) do else antes do if masculino, assim:

[code]//Verificação Feminina para o Cálculo de IMC

    if (c[i].getSexo().equalsIgnoreCase("F")) {
        if (c[i].CalculaImc() < 19.1) {
            JOptionPane.showMessageDialog(null, "Você está abaixo do peso ideal");
        } else if ((c[i].CalculaImc() >= 19.1) && (c[i].CalculaImc() <= 25.8)) {
            JOptionPane.showMessageDialog(null, "Você está no peso ideal");
        } else if ((c[i].CalculaImc() > 25.8) && (c[i].CalculaImc() <= 27.3)) {
            JOptionPane.showMessageDialog(null, "Você está marginalmente acima do peso ideal");
        } else if ((c[i].CalculaImc() > 27.3) && (c[i].CalculaImc() <= 32.3)) {
            JOptionPane.showMessageDialog(null, "Você está acima do peso ideal");
        } else if (c[i].CalculaImc() > 32.3) {
            JOptionPane.showMessageDialog(null, "Você está Obeso");
        }
    }

    else
    //Verificação Masculina para o Cálculo de IMC   
    if (c[i].getSexo().equalsIgnoreCase("M")) {
        if (c[i].CalculaImc() < 20.7) {
            JOptionPane.showMessageDialog(null, "Você está abaixo do peso ideal");
        } else if ((c[i].CalculaImc() >= 20.7) && (c[i].CalculaImc() <= 26.4)) {
            JOptionPane.showMessageDialog(null, "Você está no peso ideal");
        } else if ((c[i].CalculaImc() > 26.4) && (c[i].CalculaImc() <= 27.8)) {
            JOptionPane.showMessageDialog(null, "Você está marginalmente acima do peso ideal");
        } else if ((c[i].CalculaImc() > 27.8) && (c[i].CalculaImc() < 31.1)) {
            JOptionPane.showMessageDialog(null, "Você está acima do peso ideal");
        } else if (c[i].CalculaImc() > 31.1) {
            JOptionPane.showMessageDialog(null, "Você está obeso");
        }
    }[/code]

E como disseram também, tudo se resume ao final, na tua falta de indentacao.
Se voce estiver usando o NetBeans, procure usar Alt+Shift+F para formatar o codigo automaticamente.

No Eclipse deve ter algo equivalente.

No eclipse utiliza Ctrl + Shift + F

Apesar de já estar resolvido, eu analisaria com carinho a solução proposta pelo spidermanx.

Apenas mudaria alguns pontos na solução dele:

  • Não criaria constantes como int, usaria uma enum.
  • Não faria os ifs separados… faria um if só colocando valores e respostas como parâmetros
    Geralmente esse tipo de regra pode ser encaixada em tabelas verdades.

No fim, faria algo mais ou menos assim (fiz no notepad, portanto pode ter alguns erros):

enum IMC {

	HOMEM(19.1, 25.8, 27.3, 32.3),
	MULHER(20.7, 26.4, 27.8, 31.1);
	
	private int[] pesos = new int[5];
	private String[] diagnosticos = { 
		&quot;Você está abaixo do peso ideal&quot;, 
		&quot;Você está no peso ideal&quot;, 
		&quot;Você está marginalmente acima do peso ideal&quot;,
		&quot;Você está acima do peso ideal&quot;,
		&quot;Você está Obeso&quot;
	};
	
	IMC(double pesoMinimo, double  pesoIdeal, double  pesoMarginal, double  pesoObeso) {
		pesos[0] = 0;
		pesos[1] = pesoMinimo;
		pesos[2] = pesoIdeal;
		pesos[3] = pesoMarginal;
		pesos[4] = pesoObeso;
	}
	
	String diagnosticoIMC(double peso) {
		for( int i = 4; i &gt;=0; i--)
			if ( peso &gt; pesos[i] )
				return diagnosticos[i];
	}
}

Caramba AbelBueno, enxutou legal a proposta que mostrei, já ouvi falar sobre enum em java, mas ainda não conheço a tecnologia, preciso correr atrás… rsrsrs.

Bem, fiz o código acima pra clarear um pouco a idéia do nosso amigo que usou muitos if’s e else’s e utilizou String’s para validar o sexo da pessoa a qual o IMC está sendo diagnosticado.

Realmente eu não conheço de enum’s, mas pra quem está iniciando não fica um pouco confuso? Eu pelo menos estou analisando o seu código postado e estou tendo dificuldades, mas aos poucos estou pegando o conceito da coisa.

Valeu pela demonstração.