Ir ao conteúdo
  • Cadastre-se
Beatriz Castro

C Menu de 4 pratos

Recommended Posts

Boa noite amigos, estou tentando fazer um programa, sou nova e estou tendo dificuldades, podem me ajudar? Faça um programa que imprima um menu de 4 pratos na tela e uma quinta opção para sair do programa. O programa deve imprimir o prato solicitado. O programa deve terminar quando for escolhido a quinta opção. Somente usando estruturas de repetição. PS: Quando executo, digito a opção de prato e fica repetindo o menu.

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

// Menu 
main (){
	
	char m, A, B, C, D, S;
	
	do{
		printf("MENU");
		printf("\n\n - Prato A: R$ 30,00");
		printf("\n\n - Prato B: R$ 40,00");
		printf("\n\n - Prato C: R$ 50,00");
		printf("\n\n - Prato D: R$ 60,00");
		printf("\n\n - Opcao S: Sair do MENU\n\n"); 
		
		scanf("%c", &m);
		
		switch (m) {
		case 'A':
			printf("\n - Prato A: R$ 30,00");
			break;
			
		case 'B':
			printf("\n - Prato B: R$ 40,00");
			break;
			
		case 'C':
			printf("\n - Prato C: R$ 50,00");
			break;
			
		case 'D':
			printf("\n - Prato D: R$ 60,00");
			break;
			
		case 'S':
			printf("\n - Opcao S: Sair do MENU");
			break;
			
		default:
			printf("\n - Opcao Invalida");
	
		}
		}
		
	while (m);
	return 0;
	}
	

 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando você digita 1 letra e dá Enter, você está digitando 2 caracteres no terminal cmd, a letra e o caractere nova linha '\n'. O caractere nova linha é inserido quando você aperta o Enter.

 

Seu scanf no entanto está pegando apenas 1 caractere, o que resulta que deixa o caractere nova linha na entrada padrão. Então na próxima vez que o ciclo do while rodar o caractere nova linha já estará lá, logo o scanf vai tentar ler imediatamente passando direto por ele.

 

Para descartar um dado lido pelo scanf (ou seja, ler mas não guardar numa variável) usa-se * após o % do especificador de tipo. Nesse caso queremos descartar 1 caractere, então podemos usar %*c para ler e descartar 1 caractere.

 

Logo, o scanf fica assim:

scanf("%c%*c", &m);

 

OBS: Note que ainda tem muitas possibilidades para o usuário digitar algo inválido, como se ele digitar vários caracteres, aí teria que usar algo para descartar todos os caracteres digitados além do primeiro, como isso:

scanf("%c", &m);
while( (c=getchar()) != '\n' && c != EOF );

Mas no caso do seu programa podemos assumir que o usuário é bem comportado e sempre digita apenas 1 letra.

 

 

Outro problema no seu programa é que a condição do while deveria ser m != 'S', para continuar rodando o ciclo apenas enquanto m for diferente de 'S', que é a opção para sair do programa.

} while (m != 'S');

Também pode ser interessante colocar um getchar(); ou system("pause"); na última linha dentro do ciclo para o programa pausar após imprimir a opção escolhida, e esperar você digitar Enter para continuar.

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Beatriz Castro   faça como o @isrnick   disse que está certo,   e você poderia colocar  a função toupper  da biblioteca ctype :

#include <ctype.h>

para que o programa aceite  letras minúsculas ou maiúscula   facilitando assim na hora de digitar a escolha,  então no switch você coloca assim  :

switch (toupper(m)) {
case 'A':

e coloca também no while  :

 }while(toupper(m)!='S');

 

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu gente! Corrigi e ficou assim: 

PS: Só não coloquei a biblioteca #include <ctype.h>, mas irei melhorar e colocar, obrigada!

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

// Menu 
main (){
	
	char m, A, B, C, D, S;
	
		printf("MENU");
		printf("\n\n - Prato A: R$ 30,00");
		printf("\n\n - Prato B: R$ 40,00");
		printf("\n\n - Prato C: R$ 50,00");
		printf("\n\n - Prato D: R$ 60,00");
		printf("\n\n - Opcao S: Sair do MENU\n\n"); 
	do{
	
		printf("\nEscolha uma opcao:");
		scanf("%c", &m);
		
		switch (m) {
		case 'A':
			printf("\n - Prato A: R$ 30,00");
			break;
			
		case 'B':
			printf("\n - Prato B: R$ 40,00");
			break;
			
		case 'C':
			printf("\n - Prato C: R$ 50,00");
			break;
			
		case 'D':
			printf("\n - Prato D: R$ 60,00");
			break;
			
		case 'S':
			printf("\n - Opcao S: Sair do MENU");
			break;
	
	
	
		}
			
		}
		
	while (m!='S');
	return 0;
	}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×