Ir para conteúdo

Arquivado

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

Pulse

Switch com erro

Recommended Posts

Criar um programa que informe a quantidade total de calorias de uma refeição a partir
do usuário que deverá informar o prato, a sobremesa e a bebida, em linguagem C.

Prato Calorias Sobremesa Calorias Bebida Calorias
Vegetariano 180 cal Abacaxi 75 cal Chá 20 cal
Peixe 230 cal Sorvete diet 110 cal Suco de laranja 70 cal
Frango 250 cal Mouse diet 170 cal Suco de melão 100 cal
Carne 350 cal Mouse chocolate 200 cal Refrigerante diet 65 cal
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main ()
{
int prato, sobremesa, bebida, calorias=0;
printf("Pratos:\n1-Vegetariano\n2-Peixe\n3-Frango\n4-Carne\n");
scanf("%d", &prato);
switch (prato)
{
case 1:
calorias += 180;
case 2:
calorias += 230;
case 3:
calorias += 250;
case 4:
calorias += 350;
default:
printf("Prato invalido");
system ("pause");
system ("exit");
}
system("cls");
printf("Sobremesas:\n1-Abacaxi\n2-Sorvete diet\n3-Mouse diet\n4-Mouse chocolate\n");
scanf("%d", &sobremesa);
switch (sobremesa)
{
case (1):
calorias += 75;
case (2):
calorias += 110;
case (3):
calorias += 170;
case (4):
calorias += 200;
default:
printf("Sobremesa invalida");
system ("pause");
system ("exit");
}
system("cls");
printf("Bebidas:\n1-Cha\n2-Suco de laranja\n3-Suco de melao\n4-Refrigerante diet\n");
scanf("%d", &bebida);
switch (bebida)
{
case 1:
calorias += 20;
case 2:
calorias += 70;
case 3:
calorias += 100;
case 4:
calorias += 65;
default:
printf("Bebida invalida");
system ("pause");
system ("exit");
}
printf("A quantidade de calorias da refeicao eh: %d", calorias);
system("pause");
system("cls");
}
Não sei o que tá acontecendo, o programa tá somando todos os casos possíveis, tipo as calorias 1, 2, 3 e 4 dos pratos, as calorias 1, 2, 3 e 4 das sobremesas e as calorias 1, 2, 3 e 4 das bebidas e no fim da exibindo o resultado total da soma. Além disso, ele tá mostrando a mensagem do default sempre quando digitamos qualquer número. O que há de errado?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

 

Oi Pulse olha peguei o seu código e fiz algumas alterações para rodar no linux, posto o código se for necessario!

 

Ate onde pude ver faltou o comando break; no final de cada opção.

case 1:
        calorias += 20;
        break;

Colocando no final de cada opção o programa rodou direitinho aqui ate onde pude testar!

 

Opção 2 + Opção 2 + Opção 2 + Opção 2 = 410 calorias, e aqui acho que resolveu tambem o problema de exibição da opção default:

 

 

Espero ter ajudado ! ! !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Felipe! Novamente salvando a minha vida, muito obrigado MESMO. A professora havia falado sobre o break; mas acabei esquecendo.

Obrigadão!!

 

 

Outra dúvida: o programa não fecha quando a entrada é um número inválido. Ele apenas mostra a mensagem do default e vai para a outra opção (tipo, se tá em prato vai pra sobremesa)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

 

Pulse não sei se eu entendi a sua duvida muito bem, você quer quer o programa pare e finalize as operações em qualquer parte do codigo se o mesmo receber uma opção invalida como 6 por exemplo?

 

Se é isto mesmo eu ainda não estou estudando Switch com afinco, mas no meu caso eu adicionei no final de cada printf do default exit(0);

default:
        printf("Bebida invalida");
        exit(0);

aqui no meu sistema o programa não fecha imediatamente, mas para de realizar as operações e espera eu apertar enter para sair, pois sem o exit(0); pelo que pude testar aqui o programa faz a somatoria apenas das calorias de opções valida e exclui o valor da opção invalida!

 

Bom só posso ir ate aqui com esta sua duvida, espero que funcione, e me desculpe eu não ter respondido ontem eu estava ocupado!

 

 

Espero ter Ajudado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O programa continua executando sequencialmente porque não há loop de entrada de dados caso o usuário forneça uma opção inválida. O system("pause") e system("exit") não funcionam p/ mim (Linux) -> por isso é recomendado que vc não utilize essas coisas (chamadas a comandos do sistema operacional), a não ser que vc seja bem específico nos requisitos do sistema.

 

(Removi a parte das bebidas p/ deixar mais curto, mas a ideia é a mesma)

#include <stdio.h>
 
void menu_pratos(void) {
   puts("******* Pratos *******");
   puts("1-Vegetariano");
   puts("2-Peixe");
   puts("3-Frango");
   puts("4-Carne");
}
 
void menu_sobremesas(void) {
   puts("1-Abacaxi");
   puts("2-Sorvete diet");
   puts("3-Mousse diet");
   puts("4-Mousse de chocolate");
}
 
int main (void) {
   int prato, sobremesa, calorias=0;
   do {
      menu_pratos(); 
      scanf("%d", &prato);
 
      switch (prato) {
         case 1:
            calorias += 180;
            break;
         case 2:
            calorias += 230;
            break;
         case 3:
            calorias += 250;
            break;
         case 4:
            calorias += 350;
            break;
         default:
            puts("Prato inválido");
       }
   } while (prato < 1 || prato > 4);
 
 
   do {
      menu_sobremesas();
      scanf("%d", &sobremesa);
 
      switch (sobremesa) {
         case (1):
            calorias += 75;
            break;
         case (2):
            calorias += 110;
            break;
         case (3):
            calorias += 170;
            break;
         case (4):
            calorias += 200;
            break;
         default:
            puts("Sobremesa inválida");
       }
   } while(sobremesa < 1 || sobremesa > 4);
 
   printf("A quantidade de calorias da refeicao eh: %d", calorias);
   return 0;
}

Mas não se acostume a usar "números mágicos" nos programas. Use algum mnemônico que faça sentido p/ humanos:
#include <stdio.h>
enum pratos {VEGETARIANO=1, PEIXE, FRANGO, CARNE};
enum sobremesas {ABACAXI=1, SORVETE_DIET, MOUSSE_DIET, MOUSSE_CHOCOLATE};
 

void menu_pratos(void) {
   puts("******* Pratos *******");
   puts("1-Vegetariano");
   puts("2-Peixe");
   puts("3-Frango");
   puts("4-Carne");
}
 
void menu_sobremesas(void) {
   puts("1-Abacaxi");
   puts("2-Sorvete diet");
   puts("3-Mousse diet");
   puts("4-Mousse de chocolate");
}

 
int main (void) {
   int prato, sobremesa, calorias=0;
 
   do {
      menu_pratos(); 
      scanf("%d", &prato);
 
      switch (prato) {
         case VEGETARIANO:
            calorias += 180;
            break;
         case PEIXE:
            calorias += 230;
            break;
         case FRANGO:
            calorias += 250;
            break;
         case CARNE:
            calorias += 350;
            break;
         default:
            puts("Prato inválido");
      }
   } while (prato < VEGETARIANO || prato > CARNE);
 
 
   do {
      menu_sobremesas();
      scanf("%d", &sobremesa);
 
      switch (sobremesa) {
         case (ABACAXI):
            calorias += 75;
            break;
         case (SORVETE_DIET):
            calorias += 110;
            break;
         case (MOUSSE_DIET):
            calorias += 170;
            break;
         case (MOUSSE_CHOCOLATE):
            calorias += 200;
            break;
         default:
            puts("Sobremesa inválida");
      }
   } while(sobremesa < ABACAXI || sobremesa > MOUSSE_CHOCOLATE);
 
   printf("A quantidade de calorias da refeicao eh: %d", calorias);
   return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

 

 

Valeu mesmo _Isis_, realmente como estamos no inicio de nossos estudos [eu] pelo menos, não cheguei a considerar fazer algo similar ao seu código, embora tenha considerado tentar criar algum mecanismo de loop para alguma opção invalida, mais uma grande dica que aprendi e que tenho certeza que vai ser de grande utilidade ! ! !

 

 

 

Obrigado !

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.