Ir ao conteúdo

Erro de lógica com if...else ?


N0vato

Posts recomendados

Postado

Olá gente,gostaria de pedir que alguém me indicasse o erro no seguinte código:

imc=peso/altura*altura;

if(imc<18.5)

{

estimc="Baixo peso";

}

else

{

if(imc<25)

{

estimc="Normal";

}

else

{

if(imc<30)

{

estimc="Pre-obeso";

}

else

{

if(imc<35)

{

estimc="Obeso classe I";

}

else

{

if(imc<40)

{

estimc="Obeso classe II";

}

else

{

estimc="Obeso classe III";

}

}

}

}

}

switch(s)

{

case 'f':

case 'F':

if(imc<19.1)

{

nhanes="Abaixo do peso";

}

else

{

if(imc<25.8)

{

nhanes="Peso normal";

}

else

{

if(imc<27.3)

{

nhanes="Marginalmente acima do peso";

}

else

{

if(imc<32.3)

{

nhanes="Acima do peso ideal";

}

else

{

nhanes="Obeso";

}

}

}

}

break;

case 'm':

case 'M':

if(imc<20.7)

{

nhanes="Abaixo do peso";

}

else

{

if(imc<26.4)

{

nhanes="No peso normal";

}

else

{

if(imc<27.8)

{

nhanes="Marginalmente acima do peso";

}

else

{

if(imc<31.1)

{

nhanes="Acima do peso ideal";

}

else

{

nhanes="Obeso";

}

}

}

}

break;

}

o programa compilou, agora o problema é que eu inseri os dados s como M,altura como 1.75 e peso como 75, o imc desses dados é 24.5, mas na saída do programa apareceu Obeso classe III - Obeso.Pelo jeito ele entrou pelo último else do primeiro laço if...else e pelo case 'M' do switch e depois pelo último else do laço if...else do switch, alguém sabe me dizer por que ?

Postado

Sua lógica está errada;

Se o primeiro IF está: if (x<10), e o ultimo está: if(x<1000), se o número informado for menor que 10, os 2 são verdadeiros.

Use um parâmetro mais adequado como por exemplo:

if (x>5 && x<10)

se x maior que 5 e menor q 10 = verdadeiro.

if (x>10 && x<20)

se x maior que 10 e menor q 20 = verdadeiro.

E Assim por diante.

Além disso, para fazer o cálculo da "altura²", ao invéz de fazer "altura*altura", use a função pow da bilioteca math.h, ficando assim:

imc=peso/pow(altura,2);

E outra coisa, na função switch(), vocÊ indicou 'f' e 'F', você pode usar a função toupper(), acho que da biblioteca stdio ou stdlib, ela converte tudo para maiúsculo, assim você somente indica as letras em maiúsculo.

Exemplo:

switch( toupper( op ) ) {

case 'F': exit(1);

}

Bem acho que é simplesmente isso, se eu estiver errado me corrijam, pois também sou iniciante no assunto.

Postado

PSyKoKiLLeR, sobre o problema do < e > de fato ficaria mais elegante e mais claro, mas no exemplo específico não mudaria a execução pois os demais ifs só serão executados se o anterior for falso. Então "5", apesar de ser <10 e <100 só seria executado no 10, nem chegaria no 100. Isso é extremamente perigoso, muito fácil cometer erros de lógica, pois se a execução chegar até o <100 ele será executado mesmo que não devesse.

Acho que o problema é simplesmente a fórmula

imc=peso/altura*altura;

Não tenho certeza, mas acho que isso significa:

imc=(peso/altura)*altura;

E se multiplicar pela altura qualquer imc indicará obesidade mórbida.

Então coloque

imc=peso/(altura*altura);

ou imc=peso/pow(altura,2); (como o PSyKoKiLLeR já sugeriu)

e veja se resolve. Posta aí o resultado.

Postado
os demais ifs só serão executados se o anterior for falso. Então "5", apesar de ser <10 e <100 só seria executado no 10, nem chegaria no 100. Isso é extremamente perigoso, muito fácil cometer erros de lógica, pois se a execução chegar até o <100 ele será executado mesmo que não devesse.
Postado

De modo algum, compile isso e veja o resultado de saída:

#include <stdio.h>#include <stdlib.h>
int main(){    int x=1;
    while(x!=0){        scanf("%d", &x);        if(x<10)            printf("X é menor que 10!\n");        else if(x<20)                 printf("X é menor que 20!\n");            else if(x<30)                     printf("X é menor que 30!\n");                else if(x<40)                         printf("X é menor que 40!\n");                    else if(x<50)                             printf("X é menor que 50!\n");                        else printf("X é maior que 50!");    }    system("pause");    return 0;}

Pra encerrar digita 0.

Postado

Gente, muito obrigado, PSyKoKiLLeR, de fato, é verdade o que o barutaji observou, como eu usei else com chaves, ou if else aninhados como se diz, se alguma condição if é satisfeita o programa sai do laço,sem que os demais testes sejam feitos.O erro realmente era a falta de parênteses na fórmula do imc, pois me esqueci da precedência dos operadores.Quanto aos intervalos eu realmente gostaria de escrever com && mas meu professor cobra que escrevamos menos possível.Muito obrigado.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...