Ir para conteúdo

POWERED BY:

Arquivado

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

AndreVidal

Iniciando em C

Recommended Posts

A questão é a seguinte:

 

Tendo como dados de entrada a altura e o sexo de uma pessoa (M: masculino e

F: feminino), construa um programa que calcule e exiba o peso ideal, utilizando

as seguintes fórmulas:

para homens: (72.7* H)-58

para mulheres: (62.1*H)-44.7

 

Consigo fazer no visualg, mas não sei o porque do erro no Dev C++.

 

Aí vai o que eu fiz:

 

#include<stdlib.h>

#include<stdio.h>

 

int main () {

float h,peso;

char s;

printf("Entre com a altura da pessoa: ");

scanf("%f", &h);

printf("Entre com o sexo<M/F>: ");

scanf("%c", &s);

if (s==M) {

peso=(72.7*h)-58;

printf("O peso ideal eh %f",peso);

}

if (s==F) {

peso=(62.1*h)-44.7

printf("O peso ideal eh %f",peso);

}

if ((s!=F) && (s!=M)) {

printf("Sexo invalido");

}

system("pause");

return 0;

}

 

 

Acredito que o erro seja na condição, alguém pode me ajudar?

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

O que acontece é que você está comparando a variável s com a variável M e com a variável F, e não comparando com um caracter.

 

Quando quiser comparar com um caracter, coloque uma aspa simples de cada lado do caracter ( ex: 'M' ), para identificar que é um caracter.

 

Além disso, sua estrutura if pode ser melhorada. Use uma escada if-else-if, ou, ainda melhor, um switch para o caso.

 

 

Abaixo ambas as versões.

 

PS: Switch é melhor porque é um pouco mais rápido (e bem mais fácil de ler e entender) nesse tipo de caso.

 

 

Outra coisa, dê nomes melhores para as suas variáveis, não precisa ter medo de escrever. Dê nomes que descrevam o que elas fazem, para que servem. Porque usar uma variável char chamada s, se pode chamá-la de sexo? Vai ficar muito mais óbvio para que serve, e os outros que lerem o seu código o entenderão mais fácil também. Entendido?

 

 

Também faltou um ; em um dos statements.

 

 

Código com escada If-Else-If.

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

int main(void) { /* Essa é a declaração de main melhor de ser utilizada. */
   float h,peso;
   char s;

   printf("Entre com a altura da pessoa: ");
   scanf("%f", &h);
   printf("Entre com o sexo<M/F>: ");
   scanf("%c", &s);

   if (s=='M') {
       peso=(72.7*h)-58;
       printf("O peso ideal eh %f",peso);
   }

   else if (s=='F') {
       peso=(62.1*h)-44.7;
       printf("O peso ideal eh %f",peso);
   }

   else {
       printf("Sexo invalido");
   }

   system("pause");
   return 0;
}

 

 

Código com switch.

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

int main(void) { /* Essa é a declaração de main melhor de ser utilizada. */
   float h,peso;
   char s;

   printf("Entre com a altura da pessoa: ");
   scanf("%f", &h);
   printf("Entre com o sexo<M/F>: ");
   scanf("%c", &s);

   switch(s) {
       case 'M': case 'm':
           peso = ( 72.7 * h ) - 58;
           printf("O peso ideal eh %f", peso);
           break;

       case 'F': case 'f':
            peso = ( 62.1 * h ) - 44,7;
            printf("O peso ideal eh %f", peso);
            break;

       default:
            printf("Sexo inválido.");

   system("pause");
   return 0;
}

Note que eu, nesse exemplo, permiti que o usuário entre com os caracteres M e m, ou F e f (C e C++ não são case sensitive). Antes só se aceitava M e F.

 

 

Dever de casa: tente modificar seu programa para não ser necessária a utilização da variável peso, e coloque nomes mais descritivos nas outras variáveis, fazendo as substituições nos devidos locais. Dos dois exemplos dados por mim.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda cara, mas mesmo assim ainda dá erro nesse seu programa que você fez baseado no meu.

 

Parece que é erro no scanf do caracter. Pra quebrar o galho eu fiz assim:

 

inclui a biblioteca conio.h e fiz:

 

printf("Entre com o sexo<M/F>: ");

s=getch();

printf("%c",s);

 

Dá certo assim, mas porque com o scanf dá erro?

 

Não sabia que podia colocar else if junto, fazer essa escala.

 

E outra.. não sabia esse jeito do escolha-caso no Dev C++, não tem isso na minha apostila!

Realmente é um jeito mais fácil de fazer e no visualg que é case sensitive não precisei colocar M e m, F e f.

 

Vou tentar fazer o deverzinho de casa!

 

Abraços!

 

Edit¹: Fiz aqui o dever de casa... mas não deu muito certo, olha o que eu tentei:

 

 

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

 

int main (void) {

char sexo;

float altura;

 

printf("Entre com a altura: ");

scanf("%f", &altura);

printf("Entre com o sexo<M/F>: ");

sexo=getch();

printf("%c", sexo);

 

switch (sexo) {

case 'M': case 'm':

printf("\nO peso ideal eh:\n", ((72.7*altura)-58));

break;

 

case 'F': case 'f':

printf("\nO peso ideal eh:\n", ((62.1*altura)-44.7));

break;

 

default:

printf("\nSexo invalido\n");

}

system("PAUSE");

return 0;

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho o scanf() dar erro... não lembro direito como ele funciona, então posso ter passado errado.

 

A verdade é que não se usa scanf() nos programas profissionais. Usa-se fgets() para strings e getchar() para caracteres.

 

Esse getch() pode ser substituido por getchar(), que é da STD e do mesmo header do scanf() (stdio.h)...

 

Dê uma olhada na documentação do scanf depois apra descobrir porque...

 

PS: atenção para o resto no buffer de entrada que o scanf() deixa. NUNCA o utilize com getchar(). Prefira criar uma função, caso vier a necessidade de um programa sério, de limpar o buffer de entrada enquanto utiliza getchar(), para evitar erros.

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho o scanf() dar erro... não lembro direito como ele funciona, então posso ter passado errado.

 

A verdade é que não se usa scanf() nos programas profissionais. Usa-se fgets() para strings e getchar() para caracteres.

 

Esse getch() pode ser substituido por getchar(), que é da STD e do mesmo header do scanf() (stdio.h)...

 

Dê uma olhada na documentação do scanf depois apra descobrir porque...

 

PS: atenção para o resto no buffer de entrada que o scanf() deixa. NUNCA o utilize com getchar(). Prefira criar uma função, caso vier a necessidade de um programa sério, de limpar o buffer de entrada enquanto utiliza getchar(), para evitar erros.

 

Abraços :D

 

Estranho mesmo.. mas agora funcionou, coloquei para ler o sexo com scanf() primeiro que a altura, vai entender.. rs

e testei esse getchar() e meu Kaspersky alertou aqui.. vai entender também rs

e não deu certo, como uso ele?

 

responde meu edit lá de cima : )

 

abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pegando seu código, ficaria:

 

PS: provavelmente o getchar() não funcionou pois usou scanf() antes para pegar a altura, certo? Aí fica sujeira no buffer de entrada, e o getchar() não funciona.

 

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

int main(void) { /* Essa é a declaração de main melhor de ser utilizada. */
   float h;
   char s;

   printf("Entre com a altura da pessoa: ");
   scanf("%f", &h);
   printf("Entre com o sexo<M/F>: ");
   s = getch();

   switch(s) {
       case 'M': case 'm':
           printf("O peso ideal eh %f", ( 72.7 * h ) - 58);
           break;

       case 'F': case 'f':
            printf("O peso ideal eh %f", ( 62.1 * h ) - 44,7);
            break;

       default:
            printf("Sexo inválido.");

   system("pause");
   return 0;
}

 

Essa é a solução do dever de casa ;D

 

 

O Kaspersky alerta tudo... mas estranho alertar por uma coisa dessas ;D

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então deve ser por essa sujeira no buffer de entrada que o scanf não deve funcionar para caracter depois que já foi utilizado uma vez, porque se eu inverter e colocar primeiro o sexo, ele funciona normalmente!

 

E no dever de casa eu só esqueci mesmo do %f.

 

Grande Abraço e muito obrigado!

você é fera!

 

Edit¹: Testei aqui e parece que deu um errozinho... depois que eu leio as variaveis altura e sexo, eu preciso escrever qualquer coisa no programa para ele indicar o peso ideal.. isso é porque eu não usei a variavel peso?

 

ficou assim, por exemplo:

 

Entre com o sexo<M/F>: M
Entre com a altura: 1.78

1 /* isso aqui eu tive que escrever no programa.. somente depois disso ele mostrou o peso ideal */
O seu peso ideal : 71.405998

 

 

Porque tive que fazer isso? Como posso resolver?

 

Edit²: deixa pra lá... fiz desse jeito aqui:

 

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

int main (void) {
   char sexo;
   float altura;

   printf("Entre com a altura: ");
   scanf("%f", &altura);
   printf("Entre com o sexo<M/F>: ");
   sexo=getch();
   printf("%c\n", sexo);
   switch (sexo) {

          case 'M': case 'm':
               printf("O peso ideal eh: %f\n", (72.7*altura)-58);
               break;

          case 'F': case 'f':
               printf("O peso ideal eh: %f\n", (62.1*altura)-44.7);
               break;

          default:
               printf("Sexo invalido\n");
   }
   system("PAUSE");
   return 0;
}

 

 

Edit³: DESCOBRI porque deu o errozinho lá.. foi por causa de um \n no scanf().

 

Valeu! Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Então sua dúvida foi resolvida?

 

 

Sugeira no buffer de entrada é quando ficam caracteres sobrando no buffer, esperando para serem pegados. Quando você usa scanf(), ele costuma deixar '\n' sobrando no buffer, e, então, quando você pega o caracter com getch() ou getchar(), ele pega o caracter errado - o '\n', ao invés de pegar o caracter que você digitar (e no cado do getch(), tem um comportamento que não conheço, pois não estudei ainda comportamento de api's específicas...).

 

Tem um tópico destacado na seção de "Artigos e laboratório de códigos fontes" que explica como remover a sujeira no buffer de entrada que o scanf() deixa. Dê uma olhada. E também sobre não usar o system("pause"). Use getchar() ao invés de system("pause"), ou até mesmo o getch() (que fica até melhor). Aí para mostrar a mensagem... é só printar ela antes ;D

 

 

Abraços :D

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.