Ir ao conteúdo
  • Cadastre-se

Exericicio peso ideal, problema com char e do-while


Matheus Lone

Posts recomendados

"Faça um programa que receba o sexo da pessoa, digitado como um caractere 
(‘h’  e  ‘H’  para  homens, ‘m’  e  ‘M’  para  mulheres),  e  mostre  o  seu  peso  ideal,  de 
acordo com a sua altura. Utilize as fórmulas abaixo. 
  Homens: (72,7*altura) - 58 
  Mulheres: (62,1*altura) - 44,7"

Independente se coloco H ou M ou um char invalido(que deveria entrar no else final) ele calcula como se fosse H  e nao faz o do-while se estiver errado...

To quebrando a cabeca e nao consigo descobrir  

Desde ja agradeco

 

#include <stdlib.h>
#include <math.h>
#include <stdio.h>

int main() {
    char c; float peso,altura ;
    printf("insira sua altura por favor em Metros.cm\n") ;
    scanf("%f",&altura);
    printf("\nvc e H ou M? H/M\n") ;
    c=getche();
    if (c=(('H')||('h'))) {
        peso=((72.7*altura)-58) ;
        printf("peso ideal=%f\n",peso);
        } else if(c=(('M')||('m'))){
                  peso=((62.1*altura)-44.7);
                  printf("peso ideal=%f\n",peso);
                  }
    else {
       do{printf("caractere invalido, tente novamente\n");
       printf("\ninsira sua altura em Metros.cm por favor\n") ;
    scanf("%f",&altura);
    printf("\nvc e H ou M? H/M\n") ;
    c=getche();
    if (c=(('H')||('h'))) {
        peso=((72.7*altura)-58) ;
        printf("peso ideal=%f\n",peso);
        } else if(c=(('M')||('m'))){
                  peso=((62.1*altura)-44.7);
                  printf("peso ideal=%f\n",peso);
                  }

       }
       while (c!=(('H')||('h'))||(('M')||('m'))) ;
       return(0);
    }

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Matheus Lone    ali no primeiro if você colocou c='h' então quando ele ler isso

ele vai fazer c=h e aí faz como se fosse h.  então você precisa colocar dois sinais

de igualdade para fazer as comparações assim :

if (c==(('H')||c==('h')))

e precisa colocar isso dentro de um loop. pode ser while ou do while 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Matheus Lone disse:

Obrigado, mas ainda nao entendi a diferenca de usar '==' ou '=' , por mais que tenha sido o q resolveu o problema

O operador =(atribuição) em C/C++ é um caractere que serve para atribuir um valor a uma variável, então no caso você esta esta atribuindo a c, o valor binário(true o false) de comparar 'H' com 'h' usando o operador ||(or), que gera um true neste caso, pois tanto 'H' como 'h' tem um valor positivo, que você pode averiguar na tabela asc2, o "'H'||'h'" é como afirmar "O 'H' é verdadeiro ou o 'h' é verdadeiro?",um pouco sem sentido mas... logicamente ambos são verdadeiros já que o 'H' ocupa o numero 72 na tabela, e o 'h' ocupa o numero 104. O operador or(||) quer saber se apenas um dos 2 H/h são verdadeiros, e ambos são verdadeiros neste caso, já que em C, somente o zero é considerado falso, e o resto é considerado verdadeiro, incluindo os números negativos.
Então o resultado de c=(('H')||('h')) é como atribuir 1 a c. porém como c é um char, o que se atribui a c é o caractere 1 da tabela asc2, se tentar imprimir isso vai sair uma carinha feliz como você pode ver abaixo:
b84559a075c8408a9169fde0b69527c2.png

 

Isso é o mesmo que acontece quando você tenta imprimir 1 como se fosse um char: printf("%c", 1);
009d6dce72624d77bffa91815167c1cd.png


porém se tentar imprimir o c como um int você vera a magia:
8cf75f61cb10499aa07cb25468d0679b.png

Isso prova que o valor que guarda c é o caractere 1 da tabela asc2. Com isso você ja sabe para que serve o operador =.

 

Agora vamos ao operador ==.
O operador == igual que o || serve para comparar um valor porém com outros critérios. Por enquanto que o operador or(||) quer saber se pelo menos um dos valores é verdadeiro, o operador quer saber se ambos valores são identicos, cada um tem sua aplicação no seu devido caso conforme o que queiramos saber, igual que com outros operadores como &&, <, >, etc. Cada operador desses tem sua aplicação, porém todos tem algo em comum... todos geram true ou false e você pode provar isso fazendo:
int a = 10;
int b = 10;
printf("%d", ( a==b )); //a é igual a b? Se sim, gera 1(true), se não, gera um 0 (false).
printf("%d", ( a||b )); //Pelo menos um deles é verdadeiro? Se sim, gera 1(true), se não, gera um 0 (false).
printf("%d", ( a<b ));//a é menor que b? Se sim, gera 1(true), se não, gera um 0 (false).
printf("%d", ( a>b ));//a é maior que b? Se sim, gera 1(true), se não, gera um 0 (false).
printf("%d", ( a&&b ));//Ambas variaveis são verdadeiras? Se sim, gera 1(true), se não, gera um 0 (false).
...
Como você pode ver, dependendo do valor de a e b conforme o operador aplicado, se pode dizer que o operador é o contexto, e que conforme esse contexto se gera 1 ou 0.
Por o operador de negação '!' adiante inverte a resposta, tipo se a resposta seria sim, a saída será não, e se a saída será não invertida será sim.
int a = 10;
int b = 10;
printf("%d", !( a==b )); //a é igual a b? Se sim, gera 0(false), se não, gera um 1(true).
printf("%d", !( a||b )); //Pelo menos um deles é verdadeiro? Se sim, gera 0(false), se não, gera um 1(true).
printf("%d", !( a<b ));//a é menor que b? Se sim, gera 0(false), se não, gera um 1(true).
printf("%d", !( a>b ));//a é maior que b? Se sim, gera 0(false), se não, gera um 1(true).
printf("%d", !( a&&b ));//Ambas variaveis são verdadeiras? Se sim, gera 0(false), se não, gera um 1(true).
...

Agora bem... com o anterior você ja sabe para que serve ==, igualemnte a &&, <, >, ||, etc, servem para comparar.
A resposta a sua pergunta é: O '=' serve para atribuir, e '==' serve para comparar!

Agora existe outra pergunta....
P or que seu programa falha nesse ponto?
A toma de decisão if, o único que quer saber é se um valor é verdadeiro o false, para saber se entra ou não dentro do corpo onde está seu código. Em teoria if(1) funciona. Por quê? Porque 1 é true! O if(0) por outro lado falha. Ja sabe por quê? Claro... 0 é false. E if(-32)? Antes falei que qualquer numero diferente a zero é true, incluído os negativos e positivos. OK?

Então ja da para saber p q seu programa falha? Claro que sim...
O if (c=(('H')||('h'))) como ja sabemos acontece a atribuição do valor positivo 1 a c a causa da comparação de 'H' com 'h' conforme o contexto or(||) que quer saber se pelo menos um dos valores é verdadeiro, e como ambos são verdadeiros pois essa comparação gera um true, e esse true e atribuido a c. Que precisa if para funcionar? Um true! E ele tem esse true pois c guarda um true. TADAH!!! Falho descoberto!!! ushuehsheush

vou embora to cansado de escrever suheushe
sorte!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Matheus Lone    aqui se código com algumas modificações :

#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
int main(){
  char c[10];
  float peso,altura ;
  c[0]='h';
  do{
    printf("insira sua altura por favor em Metros.cm --> ") ;
    scanf("%f",&altura);
    printf("voce é Homem ou Mulher?     H / M   --> ") ;
    fflush(stdin);
    scanf("%c",&c[0]);
    if(c[0]!='h' && c[0]!='H' && c[0]!='m' && c[0]!='M'){
      printf("Caractere Invalido, Tente Novamente\n\n");
    }
    }while(c[0]!='h' && c[0]!='H' && c[0]!='m' && c[0]!='M');
    if (c[0]=='H' || c[0]=='h'){
      peso=((72.7*altura)-58);
      printf("Seu Peso Ideal é = %.2f Kg\n\n",peso);
    }
    if(c[0]=='M' || c[0]=='m'){
      peso=((62.1*altura)-44.7);
      printf("Seu Peso Ideal é = %.2f Kg\n\n",peso);
    }
    return(0);
}

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...