Ir ao conteúdo
  • Cadastre-se
Roberth Machado

C Menu com Switch em C

Posts recomendados

Preciso fazer um programa que tenha um menu onde após cadastrar as notas das escolas eu possa voltar para ele e selecionar a opção seguinte, mas quando faço isso parece que o que eu fiz no case 1 se apaga, e o case 2 n faz nada, o que pode ser?

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <conio.h>


int sair(){
	return 0;
}


typedef struct XCadastro{
	char nome[31]; 
	char responsavel[31];	
}Cadastro;


void erro(){
	printf("\n!!!ERRO, TENTE NOVAMENTE!!!\n");
}


int main(){
	setlocale(LC_ALL,"Portuguese");
	int menu, i, j, cont;
	char search[31];
	Cadastro c[10];
	
	
	printf("CARNAVAL RIO PARANAÍBA\n\n0.Sair\n1.Cadastrar escolas\n2.Pesquisa\n\n");
		printf("Digite uma opção: ");
		scanf("%d", &menu);
		fflush(stdin);
		
			switch(menu){
					case 0:
						sair();
						break;
				
					case 1:
						printf("\n\n ---------CADASTRAMENTO DE ESCOLAS---------\n");
					
						for(i = 0; i < 2; i++){           //i original = 10
							printf("Digite o nome da escola nº %d: ", i+1);
							gets(c[i].nome);
							fflush(stdin);
							cont = strlen(c[i].nome);
							printf("Escola %s\n", c[0].nome);
							
								while (cont < 8){
									erro();
										printf("Digite o nome da escola nº %d: ", i+1);
												gets(c[i].nome);
												cont = strlen(c[i].nome);		
								}
											printf("Digite o nome do responsavel pela escola: ");
													gets(c[i].responsavel);
													fflush(stdin);
								printf("--------------------------------------------------------------/\n\n");	
								
						}
							break;		
		
					case 2:
							printf("%s", c[0].nome);
							break;
							
							}
return main();
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um exemplo de como fazer menu baseado no meu código:

char op = '.';
    while(op != '0')
    {
        Mostrar();
        printf("1 - Adicionar elemento a pilha\n");
        printf("2 - Excluir elemento da pilha\n");
        printf("3 - Esvaziar pilha\n");
        printf("0 - Sair\n\n>: ");
        scanf(" %c", &op);

        switch(op)
        {
        case '1':
            Adicionar();
            break;
        case '2':
            Excluir();
            break;
        case '3':
            Esvaziar();
            break;
        }
    }

Aí não precisa retornar o próprio main.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Roberth Machado    creio que esse menu poderia ser assim :

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <conio.h>
int sair(){
    return 0;
}
typedef struct XCadastro{
    char nome[31];
    char responsavel[31];
}Cadastro;
void erro(){
    printf("\n!!!ERRO, TENTE NOVAMENTE!!!\n");
}
int main(){
    setlocale(LC_ALL,"Portuguese");
    int menu, i, j, cont;
    char search[31];
    Cadastro c[10];
    do{
        printf("CARNAVAL RIO PARANAÍBA\n\n0.Sair\n1.Cadastrar escolas\n2.Pesquisa\n\n");
        printf("Digite uma opção: ");
        scanf("%d", &menu);
        fflush(stdin);
        switch(menu){
        case 0:
            sair();
            break;
        case 1:
            printf("\n\n ---------CADASTRAMENTO DE ESCOLAS---------\n");
            for(i = 0; i < 2; i++){           //i original = 10
                do{
                    printf("Digite o nome da escola nº %d: ", i+1);
                    fflush(stdin);
                    gets(c[i].nome);
                    cont = strlen(c[i].nome);
                    if(cont<8)erro();
                }while (cont < 8);
                printf("Digite o nome do responsavel pela escola: ");
                fflush(stdin);/* melhor colocar o fflush antes de pegar os dados do teclado */
                gets(c[i].responsavel);
                printf("--------------------------------------------------------------/\n\n");
            }
            break;
        case 2:
            printf("%s", c[0].nome);
            break;
        }
    }while(menu!=0);
    printf("\n\n\n");
    return 0;/* retornar a main faz consumir memória demais , e reinicia as variáveis */
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Seu programa está um pouco estranho. Talvez tenha mudado coisas enquanto testava e não voltou atrás para arrumar, não sei...

 

Essa função sair() por exemplo não faz nada...

 

int sair(){
	return 0;
}

Se quer encerrar o programa use exit();

 

Na opção 2 não sei o que tentou fazer...

case 2:
    printf("%s", c[0].nome);
    break;

Está tentando imprimir o que seria o nome sempre da primeira escola, mas não escreve mais nada. Então se ela estiver em branco.... você não vai ver nada... Escreva ao menos uma letrinha para poder saber se não imprimiu nada ou se estava em branco...

 

Tente algo como essa listaEscolas() abaixo, que sempre vai imprimir algo...

//
// esta e a lista da opcao 2, bem simples, nao pesquisa na verdade nada ainda
//
int listaEscolas()
{
	switch (escolas)
	{
	case 0:
		printf("\nLista vazia\n");
		return 0;
		break;

	case 1:
		printf("\nUm única escola está cadastrada\n");
		break;

	default:
		printf(
			"\nTotal de %d escolas\n",
			escolas
		);
		break;
	}	// end switch

	printf("\n       |Escola                         |Responsavel                    |\n");
	printf(  "       |-------------------------------|-------------------------------|\n");
	for (int i = 0; i < escolas; i++)
	{
		printf(
			"%d de %d:|%-31s|%-31s|\n",
			(i + 1),
			escolas,
			c[i].nome,
			c[i].responsavel
		);
	}	// end for
	return 0;
}	// end listaEscolas()

É só um loop via for para imprimir, o switch antes serve para separar os óbvios casos de zero, uma ou mais escolas. Eis como imprime:
 

190602-opcoesC-01.png.7c9901c87fb76242eb89df03ae032801.png

 

Não tem nada de diferente, mas ao menos imprime lista vazia ou unica escola ou a lista de escolas. Talvez ache diferente a especificação do printf em

		printf(
			"%d de %d:|%-31s|%-31s|\n",
			(i + 1),
			escolas,
			c[i].nome,
			c[i].responsavel
		);

mas o %-31s apenas alinha o campo à esquerda e limita o tamanho se passar de 31... Assim fica alinhado com os hifens e barras, bem estilo anos 80 :D 


 

Como aparentemente o nome das escolas tem que ter um comprimento mínimo eu inseri uma opção de encerrar o programa ou parar de ler as escolas digitando F ou S porque assim fica mais fácil de testar afinal. Notei que você mudou de 8 para 2.

Usei constantes no início do programa para definir o número esperado de escolas e o tamanho mínimo do nome.

 

Só tenho agora o visual studio para testar. Note que o resultado "foi encerrado com código 1" abaixo vem de um exit(1). Se usa isso para poder informar sitações distintas de encerramento. Zero quer dizer ok, em geral... Se não está usando esse programa pode não ver esses códigos de retorno diretamente. No Linux vai estar em $? por exemplo

 

190602-opcoesC-02.png.7f401b4d28aae59c51cf593e2a0a5b1c.png

 

Veja o trecho do código:


				// 
				// se esta aqui entao o nome da escola tem menos de nDigitos
				// se tem uma letra so e for s ou S termina o programa
				// se tem uma letra so e for f ou F para de ler as escolas
				// se nao apenas tenta ler de novo
				//
				if (cont == 1)
				{
					if ((c[escolas].nome[0] == 's') || (c[escolas].nome[0] == 'S'))
					{
						printf("\nSaindo então...\n");
						exit(1);
					}
					else
					{
						if ((c[escolas].nome[0] == 'f') || (c[escolas].nome[0] == 'F'))
						{
							if (escolas == 0) exit(3);
							printf(
								"\nParando de ler escolas. Lidas %d de %d\n",
								(escolas + 1),
								nEscolas
							);
							break;
						}

Então se sair com código 0, 1 ou 3 você sabe onde foi. Entendeu?

 

O programinha  de teste que usei vou deixar aqui inteiro para você ler se achar útil. Roda normal em Visual Studio 15.9.12 em Windows 10, as versões mais recentes.

 

É longo porque tem muitos comentários.

Mas deve rodar até no freezer.

#include <stdio.h>
#include "memory.h"
#include <locale.h>
#include <string.h>
#include <conio.h>


const int nEscolas = 2;	// total de escolas para o teste
const int nLetras = 8;	// o nome da escola tem que ter ao menos 8 digitos

typedef struct XCadastro
{
	char nome[31];
	char responsavel[31];
}	Cadastro;

char	opcao[20];
int		escolas;	// numero de escolas
int		cont;		// contador do numero de letras do nome

Cadastro c[10];





int sair()
{
	return 0;	// sair() nao faz nada. so retorna. para encerrar use exit()
}





void erro()
{
	printf("\n!!!Erro: o nome da escola tem que ter ao menos %d letras\n", nLetras );
}




//
// esta e a lista da opcao 2, bem simples, nao pesquisa na verdade nada ainda
//
int listaEscolas()
{
	switch (escolas)
	{
	case 0:
		printf("\nLista vazia\n");
		return 0;
		break;

	case 1:
		printf("\nUm única escola está cadastrada\n");
		break;

	default:
		printf(
			"\nTotal de %d escolas\n",
			escolas
		);
		break;
	}	// end switch

	printf("\n       |Escola                         |Responsavel                    |\n");
	printf(  "       |-------------------------------|-------------------------------|\n");
	for (int i = 0; i < escolas; i++)
	{
		printf(
			"%d de %d:|%-31s|%-31s|\n",
			(i + 1),
			escolas,
			c[i].nome,
			c[i].responsavel
		);
	}	// end for
	return 0;
}	// end listaEscolas()






int main(int argc, char ** argv)
{
	setlocale(LC_ALL, "pr_br");
	printf("\n***** iniciando teste *****\n");

	//
	// so para voce ver que sair() nao sai. nao faz nada
	//
	printf("\n***** vai chamar sair() *****\n");
	sair();
	printf("***** ih! voltou *****\n");

	fflush(stdin);
	do
	{
		printf("\nCARNAVAL RIO PARANAÍBA\n\n0.Sair\n1.Cadastrar escolas\n2.Pesquisa\n\n");
		printf("Digite uma opção: ");
		gets(opcao);
		fflush(stdin);

		switch (opcao[0])
		{

		case '0':
			exit(0);
			break;


		case '1':
			printf("\n\n --------- CADASTRAMENTO DE ESCOLAS ---------\n");
			for (escolas = 0; escolas < nEscolas; )	// sem incremento no i
			{  
				// nome da escola. Tem que ter mais de nDigitos
				printf("\nDigite F para parar de ler escolas\n");
				printf("Digite S para sair do programa\n\n");
				printf("Ou Digite o nome da escola nº %d de %d: ", (escolas + 1), nEscolas);

				gets(c[escolas].nome);
				fflush(stdin);

				cont = strlen(c[escolas].nome);	// cont tem o numero de letras do nome da escola
				if (cont > nLetras)
				{
					printf("Escola %s\t[%d]\n", c[escolas].nome, cont);	// nao c[0]
					printf("\nDigite o nome do responsavel pela escola: ");
					gets(c[escolas].responsavel);
					fflush(stdin);
					printf("---------------------------------------------------------\n\n");
					escolas++;
					continue;	// vai ler a proxima escola
				}
				// 
				// se esta aqui entao o nome da escola tem menos de nDigitos
				// se tem uma letra so e for s ou S termina o programa
				// se tem uma letra so e for f ou F para de ler as escolas
				// se nao apenas tenta ler de novo
				//
				if (cont == 1)
				{
					if ((c[escolas].nome[0] == 's') || (c[escolas].nome[0] == 'S'))
					{
						printf("\nSaindo então...\n");
						exit(1);
					}
					else
					{
						if ((c[escolas].nome[0] == 'f') || (c[escolas].nome[0] == 'F'))
						{
							if (escolas == 0) exit(3);
							printf(
								"\nParando de ler escolas. Lidas %d de %d\n",
								(escolas + 1),
								nEscolas
							);
							break;
						}
						else
						{
							continue;
						}
					}	// end if
				}
				else
				{
					erro();
					continue;
				}	// end if
			}	// end for
			break;

		case '2':
			// pesquisa, apenas lista as escolas e reponsaveis na tela
			listaEscolas();
			break;

		}	// end switch()
	}
	while (opcao[0] != '0');

	return 12;
}// end main()

Espero que ajude

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

Um menu té básico em C :

#include <stdio.h>

int main() {

    int opcao;

    do {

        printf("CARNAVAL RIO PARANAÍBA\n\n1.Cadastrar escolas\n2.Pesquisa\n3.Sair\n\n");
        printf("Sua opcao: ");
        scanf("%d", &opcao);

        switch (opcao) {
        case 1:
            // cadastrar
            break;
        case 2:
            // pesquisar
            break;
        case 3:
            // aqui não é necessário colocar nada
            break;
        default:
            printf("\nOpcao invalida!\n");
            break;
        }

    } while (opcao != 3);

    return 0;
}

 

  • Curtir 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

×
×
  • Criar novo...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!