Ir ao conteúdo

Posts recomendados

Postado

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
Postado

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
Postado

@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
Postado

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

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...