Ir ao conteúdo
  • Cadastre-se
nanquinote

Menu com submenu

Recommended Posts

Boa tarde, estou trabalhando num programinha bem simples, mas no meio me enrolei com a necessidade de criar um submenu que ou seguia pra outra tela, ou voltada pro menu inicial. Refiz da forma como está abaixo (esse código é tipo uma casca, o código original está muito grande e confuso). Queria ajuda pra saber: Está forma está correta? Existe alguma forma melhor? Achei que demorou mais que o normal a compilar (7.14s), algo no código justifica essa demora?

Obrigada

Obs.: Anexei também o primeiro código, que eu fiz usando um do...while aninhado, mas não conseguia voltar pro menu inicial desta forma...

#include <iostream>
using namespace std;

void mainMenu();
void subMenu();

int main(){
	mainMenu();
}

void mainMenu(){
	int op = 0;
	do{
		cout << "1 - Primeira" << endl;
		cout << "2 - Segunda" << endl;
		cout << "3 - Encerrar conta (Submenu)" << endl;
		cin >> op;
		
		switch(op){
			case 1:
				cout << "...primeiro" << endl;
				break;
			case 2:
				cout << "...segundo" << endl;
				break;	
			case 3:
				subMenu();
				break;		
			default:
				cout << "invalido";
				break;				
		}
	}while(op != 3);
}

void subMenu(){
	int op = 0;
	do{
		cout << "1 - Primeiro Sub" << endl;
		cout << "2 - Voltar Menu Principal" << endl;
		cin >> op;
		switch(op){
			case 1:
				cout << "...primeiro" << endl;
				break;
			case 2:
				mainMenu();
				break;	
			default:
				cout << "invalido";
				break;
		}
}while(op != 2);
}

 

menuDowhileAninhado.cpp

Compartilhar este post


Link para o post
Compartilhar em outros sites

@nanquinote Nunca gostei de fazer menu com switch, eu prefiro utilizar um while/dowhile com ifs, exemplo:

#include <iostream>
using namespace std;

void mainMenu();
void subMenu();

int main() {
  mainMenu();
}

void mainMenu() {
  int op = 0;
  do {
    cout << "1 - Primeira" << endl;
    cout << "2 - Segunda" << endl;
    cout << "3 - Submenu" << endl;
    cout << "4 - Encerrar programa" << endl;
    cin >> op;

    if(op == 1)
      cout << "...primeiro" << endl;
    else if(op == 2)
      cout << "...segundo" << endl;
    else if(op == 3)
      subMenu();
    else if (op > 4 || op < 1)
      cout << "Opcao invalida!" << endl;

  } while(op != 4);
}

void subMenu() {
  int op = 0;
  do {
    cout << "1 - Primeiro Sub" << endl;
    cout << "2 - Voltar Menu Principal" << endl;
    cin >> op;

    if(op == 1)
      cout << "...Primeiro Sub" << endl;

  } while(op != 2);
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dica: para não precisar criar uma função a mais para cada submenu e menu, você poderia utilizar uma função recursiva, sendo que você pode usar outras funções para executar as opções do menu.

Exemplo:

#include <stdio.h>

#define MENU_INICIAL 0
#define MENU_A 1
#define MENU_A_SUB1 2

#define _RETORNAR_ 98 // Comando de retorno
#define _SAIR_ 99 // Comando de saida

int showmenu(int);// Funcao mostrar menus

int main(){
	showmenu(MENU_INICIAL);
	return 0;
}


//Funcao recursiva - recebe as opções do menu e mostra o menu.
int showmenu(int option){
	int out = 0;
	
	switch(option){
		case MENU_INICIAL:
			while(out != _SAIR_){//Enquanto nao for para sair
				
				fflush(stdin);//Limpar entrada
				
				//Log
				printf("\n- Menu inicial - \n");
				printf(" 1 Menu a\n 99 Sair\n ");
				
				scanf("%d",&out);
				
				//Escolher opções dos menus
				if(out == 1)out = showmenu(MENU_A);//Chamar opcao MENU_A e receber saida
				
			}
			break;
		
		case MENU_A:
			while(out != _SAIR_ && out != _RETORNAR_){//Enquanto nao for para sair/retornar
			
				fflush(stdin);//Limpar entrada
				
				//Log
				printf("\n- Menu A - \n");
				printf(" 1 Submenu-1\n 98 Retornar\n 99 Sair\n ");
				
				scanf("%d",&out);
				
				//Escolher opções dos menus e retorno
				if(out == 1){
					out = showmenu(MENU_A_SUB1);//Chamar opcao MENU_A_SUB1 e receber saida
					out = out == _SAIR_ ? _SAIR_:0;//Filtrar retorno de MENU_A_SUB1
				}
			
			}
			break;
			
		case MENU_A_SUB1:
			while(out != _SAIR_ && out != _RETORNAR_){//Enquanto nao for para sair - retornar
			
				fflush(stdin);//Limpar entrada
				
				//Log
				printf("\n- Menu A - Submenu 1 \n");
				printf(" 98 Retornar\n 99 Sair\n ");
			
				scanf("%d",&out);
			
			}
			break;
		default:
			break;
	}
	return out;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite, 

O uso repedito do menu usando esta solução (recursividade) vai criar varias cópias do menu na memória, conclusão seu código vai gerar um programa instável. Se notou isso ignore o meu aviso.

 

void subMenu(){
	int op = 0;
	do{
		cout << "1 - Primeiro Sub" << endl;
		cout << "2 - Voltar Menu Principal" << endl;
		cin >> op;
		switch(op){
			case 1:
				cout << "...primeiro" << endl;
				break;
			case 2:
				// mainMenu(); neste caso para finalizar a função basta colar
          		return;	//com o return a função será finalizada.
			default:
				cout << "invalido";
				break;
		}
}while(op != 2);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nos meus exercício aqui faço assim:

#include <stdio.h>

int get_option(void);
void main_menu(void);
void sub_menu(void);

int main(void)
{
    main_menu();
    return 0;
}
void main_menu(void)
{
    printf("**** Menu Main ****\n");
    for(;;)
    {
        printf("\nOPCOES DO MENU PRINCIPAL\n"
               "1.: MENU A 2.: MENU B 3.: MENU C e 0.: SAIR\n");
        switch(get_option())
        {
        case 1: sub_menu(); break;
        case 0: return;
        default: printf("ESTA OPCAO NAO EXISTE!\n\n");
        }
    }
}
void sub_menu(void)
{
    printf("\n**** Sub Menu ****\n");
    for(;;)
    {
        printf("opções DO SUB MENU\n"
               "1- MENU ABOBORA 2- MENU ABACAXI 3- MENU ABACATE e 0- SAIR\n");
        switch(get_option())
        {
        case 1: printf("ABOBORA OU JERIMUM, FRUTO DA ABOBEIRA...\n\n"); break;
        case 0: return;
        default: printf("ESTA OPCAO NAO EXISTE!\n\n");
        }
    }
}
int get_option(void)
{
    int option_menu = 0;
        printf("ENTRE COM OPCAO$ ");
        if (!scanf(" %d", &option_menu)) option_menu = -1;
        while('\n' != getchar()) continue;
        return option_menu;
}

 

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

×