Ir para conteúdo

POWERED BY:

Arquivado

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

ToAs

Programa para calcular peso ideal

Recommended Posts

Ola pessoal, é o meu primeiro post no forum! Espero não fazer nada de errado! :grin:

 

Estou tentando fazer um exercicio, só que quando eu digito a altura ele ja calcula o peso! sem colocar o sexo...

 

erromx.jpg

 

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

main()
{
   float altura,resultado;
   char sexo,m;

   printf("Digite sua altura: ");
   scanf("%f", &altura);
   printf("Digite seu sexo Feminino [F] ou Masculino [M]: ");
   scanf("%c", &sexo);

   if(sexo == 'm')
   {
           resultado = 72.7*altura-58;
           printf("Peso ideal: %f\n",resultado);
}
   else
   {
           resultado = 62.1*altura-44.7;
           printf("Peso ideal: %f\n",resultado); 
}
   system ("pause");
}

 

Se alguem puder me ajudar eu agradeço!

Abraçoss....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola pessoal, é o meu primeiro post no forum! Espero não fazer nada de errado! :grin:

 

Estou tentando fazer um exercicio, só que quando eu digito a altura ele ja calcula o peso! sem colocar o sexo...

 

erromx.jpg

 

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

main()
{
   float altura,resultado;
   char sexo,m;

   printf("Digite sua altura: ");
   scanf("%f", &altura);
   printf("Digite seu sexo Feminino [F] ou Masculino [M]: ");
   scanf("%c", &sexo);

   if(sexo == 'm')
   {
           resultado = 72.7*altura-58;
           printf("Peso ideal: %f\n",resultado);
}
   else
   {
           resultado = 62.1*altura-44.7;
           printf("Peso ideal: %f\n",resultado); 
}
   system ("pause");
}

 

Se alguem puder me ajudar eu agradeço!

Abraçoss....

 

ToAs,

 

Tentei compilar teu programa e realmente não entendi o porque dele pular o segundo scanf. Talvez alguém mais experiente que eu possa explica-lo.

 

Bom, mas igual. Consegui resolver este bug invertendo as posições dos scanf.

Seu código ficaria assim:

int main()
{
   float altura,resultado;
   char sexo = 0x00;

   printf("Digite seu sexo Feminino [F] ou Masculino [M]: ");
   scanf("%c", &sexo);
   printf("Digite sua altura: ");
   scanf("%f", &altura);

   if(sexo == 'm')
   {
           resultado = 72.7*altura-58;
           printf("Peso ideal: %f\n",resultado);
   }
   else
   {
           resultado = 62.1*altura-44.7;
           printf("Peso ideal: %f\n",resultado);
   }

   return 0;
}

Compilou e funcionou aqui com o Code::Blocks.

 

Uma dica: se o seu programa executou da forma esperada, não esqueça de retornar ao sistema operacional que ele executou com sucesso retornando 0(instrução return 0).

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola pessoal, é o meu primeiro post no forum! Espero não fazer nada de errado! :grin:

 

Estou tentando fazer um exercicio, só que quando eu digito a altura ele ja calcula o peso! sem colocar o sexo...

 

erromx.jpg

 

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

main()
{
   float altura,resultado;
   char sexo,m;

   printf("Digite sua altura: ");
   scanf("%f", &altura);
   printf("Digite seu sexo Feminino [F] ou Masculino [M]: ");
   scanf("%c", &sexo);

   if(sexo == 'm')
   {
           resultado = 72.7*altura-58;
           printf("Peso ideal: %f\n",resultado);
}
   else
   {
           resultado = 62.1*altura-44.7;
           printf("Peso ideal: %f\n",resultado); 
}
   system ("pause");
}

 

Se alguem puder me ajudar eu agradeço!

Abraçoss....

Troca o scanf("%c", &sexo); por scanf("%s", &sexo);

Compartilhar este post


Link para o post
Compartilhar em outros sites
Troca o scanf("%c", &sexo); por scanf("%s", &sexo);

 

Não faça isso, isso não faz o MENOR sentido.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Apesar de o tipo de &sexo ser correto para o formato %s, o programa vai ter UB, já que o objeto que conterá os valores lidos só tem 1 byte.

 

O problema aqui é relacionado a caracteres restantes no buffer de stdin após a leitura da altura. Como scanf lê apenas os valores aos quais %f faz referência, qualquer outra coisa enviada pelo teclado fica armazenada e é lida na segunda chamada (que deveria ler o sexo). Como a tecla 'enter' é usada para indicar ao SO que a digitação acabou, '\n' é enviado ao buffer junto com a altura (isto no linux. No Windows, se não me engano, '\r' e '\n' são enviados por 'enter').

 

De forma geral, o ideal é usar fgets para ler uma linha de entrada, e sscanf para fazer parsing dos valores necessários:

 

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

int main(void)
{
   char buff[256];
   int leitura = 0;

   printf("Altura: ");
   float altura = 0.0f;

   if (fgets(buff, sizeof buff, stdin) == NULL)
   {
fprintf(stderr, "Erro de leitura. Abortando.\n\n");
return EXIT_FAILURE;
   }

   if ((leitura = sscanf(buff, "%f", &altura)) == 0)
   {
fprintf(stderr, "Formato invalido.\n\n");
return EXIT_FAILURE;
   }

   printf("Sexo (m/f): ");
   int sexo;

   if ((sexo = getchar()) == EOF)
   {
fprintf(stderr, "Erro de leitura. Abortando.\n\n");
return EXIT_FAILURE;
   }

   if (sexo != 'm' && sexo != 'M' &&
sexo != 'f' && sexo != 'F')
   {
fprintf(stderr, "Formato invalido.\n\n");
return EXIT_FAILURE;
   }

   printf("\n\tAltura:\t%f\n\tSexo:\t%c\n\n", altura, sexo);

}

 

Compile desta forma:

 

gcc -std=c99 -Wall -Wextra -pedantic -Werror [entrada.c] -o [saida]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa do stdin eu não sabia. Bom aprender coisas novas. :rolleyes:

 

O problema aqui é relacionado a caracteres restantes no buffer de stdin após a leitura da altura. Como scanf lê apenas os valores aos quais %f faz referência, qualquer outra coisa enviada pelo teclado fica armazenada e é lida na segunda chamada (que deveria ler o sexo). Como a tecla 'enter' é usada para indicar ao SO que a digitação acabou, '\n' é enviado ao buffer junto com a altura (isto no linux. No Windows, se não me engano, '\r' e '\n' são enviados por 'enter').

 

Por que quando inverti os "scanf" funcionou??

 

int main()
{
   float altura,resultado;
   char sexo = 0x00;

   printf("Digite seu sexo Feminino [F] ou Masculino [M]: ");
   scanf("%c", &sexo);
   printf("Digite sua altura: ");
   scanf("%f", &altura);

   if(sexo == 'm')
   {
           resultado = 72.7*altura-58;
           printf("Peso ideal: %f\n",resultado);
   }
   else
   {
           resultado = 62.1*altura-44.7;
           printf("Peso ideal: %f\n",resultado);
   }

   return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por causa de uma peculiaridade do formato %c:

 

(...) Most conversions discard initial white space characters (the exceptions are noted below) (...)

 

Sobre %c:

 

(...) The usual skip of leading white space is suppressed. To skip white space first' date=' use an explicit space in the format. (...)

[/quote']

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.