Ir ao conteúdo
  • Cadastre-se

Dúvida de menu com submenu em C


Blatzkovitz

Posts recomendados

Olá galera,

Estou fazendo um trabalho de faculdade em C q tá me deixando de cabelos brancos!:angry:

O problema é que eu preciso fazer um programa que contém menus e submenus, eu tô usando o comando switch mas não tá dando certo.

O problema realmente é apenas nas opções de voltar pro menu anterior. Em alguns menus eu escolho a opção de voltar e ele não volta! Já em outros ele volta para submenus q não tem nada a ver.

Segue aí um exemplo bem simplificado do trabalho, no meu programa tem muito mais menus, mas a estrutura é a mesma.

Valeu!

#include <stdio.h>

#include <stdlib.h>

int funcao_qualquer1() { puts("Função Qualquer 1\n"); }

int funcao_qualquer2() { puts("Função Qualquer 2\n"); }

int funcao_qualquer3() { puts("Função Qualquer 3\n"); }

int menu (void)

{

int op;

char *menu = "\nMENU PRINCIPAL\n"

"[1] - Funcao Qualquer 1\n"

"[2] - Submenu\n"

"[3] - Sair\n";

do {

puts (menu);

scanf ("%d", &op);

} while (op > 3 || op < 1);

return op;

}

int submenu (void)

{

int op;

char *menu = "\nSUBMENU\n"

"[1] - Funcao Qualquer 2\n"

"[2] - Sub-submenu\n"

"[3] - VOltar\n" ;

do {

puts (menu);

scanf ("%d", &op);

} while (op > 3 || op < 1);

return op;

}

int sub_submenu (void)

{

int op;

char *menu = "\nSUB-SUBMENU\n"

"[1]- Funcao Qualquer 3\n"

"[2] - Voltar\n";

do {

puts (menu);

scanf ("%d", &op);

} while (op > 2 || op < 1);

return op;

}

int main (void)

{

int op, opsub;

do {

op = menu ();

switch (op) {

case 1:

funcao_qualquer1();

break;

case 2:

do {

opsub = submenu();

switch (opsub) {

case 1:

funcao_qualquer2();

break;

case 2:

do {

opsub = sub_submenu();

switch (opsub) {

case 1:

funcao_qualquer3();

break;

}

}while (opsub != 1);

break;

}

} while (opsub != 3);

break;

}

} while (op != 3);

return 0;

}

Link para o comentário
Compartilhar em outros sites

O seu código está certinho. A única confusão foi no momento de validar o "while" quando chegasse no sub-submenu.


int main (void)
{

int op, opsub;

do
{
op = menu ();
switch (op)
{
case 1:
funcao_qualquer1();
break;

case 2:
do
{
opsub = submenu();
switch (opsub)
{
case 1:
funcao_qualquer2();
break;

case 2:
do
{
opsub = sub_submenu();
switch (opsub)
{
case 1:
funcao_qualquer3();
break;
}
}
while ( opsub != 2 );
}
}
while ( opsub != 3 );

}
}
while ( op != 3 );
return 0;
}

Link para o comentário
Compartilhar em outros sites

Meu caro ScreenBlack,

Desculpe, mas acho que me enganei, aparentemente o erro que estava no mini-código não era o mesmo do meu projeto.

Eu estou postando o código completo do meu trabalho caso você queira da uma olhada, para evitar erros no seu pc (ou de quem quiser ajudar...) eu precisei excluir todas as funções porque o programa possui várias bibliotecas do Proeikon (biblioteca de edição de imagens) e deixei mesmo só os submenus.

E pra tentar facilitar, eu coloquei comentários onde está ocorrendo os erros e escrevi "(SUBMENU)" nas opções q abrem, claro, os submenus.

O código é razoavelmente extenso, mas o problema é apenas no comando switch.

thanks

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



//********************************** FUNÇÕES ***********************************


//FUNÇÃO AND
void AND(){puts("Funcao em desenvolvimento.\n");}

//FUNÇÃO OR
int OR() {puts("Funcao em desenvolvimento.\n");}

//FUNÇÃO NOT
int NOT() {puts("Funcao em desenvolvimento.\n");}


//FUNÇÃO NEGATIVO
int negativo(){puts("Funcao em desenvolvimento.\n");}

//FUNÇÃO LOGARITMICA
int logaritimica() {
puts("Funcao em desenvolvimento.\n");
}


//FUNÇÃO MÉDIA TON DE CINZA

int media(){
puts("Funcao em desenvolvimento.\n");
}



//FUNÇÃO MEDIANA TON DE CINZA
int mediana() {puts("Funcao em desenvolvimento.\n");}



//FUNÇÃO PASSA-ALTA
int passa_alta() {puts("Funcao em desenvolvimento.\n");}


//FUNÇÃO HISTOGRAMA
int histograma() {puts("Funcao em desenvolvimento.\n");}


//FUNÇÃO ROBERTS
int roberts() {puts("Funcao em desenvolvimento.\n");}

//FUNÇÃO PREWITT
int prewitt() {puts("Funcao em desenvolvimento.\n");}

//FUNÇÃO SOBEL
int sobel() {puts("Funcao em desenvolvimento.\n");}


//FUNÇÃO LAPLACIANO
int laplaciano() {puts("Funcao em desenvolvimento.\n");}

//FUNÇÃO SEGMENTAÇÃO
int segmentacao() {puts("Funcao em desenvolvimento.\n");}

//FUNÇÃO GERAÇÃO DA 3 IMAGENS (RGB)
int img_RGB(){puts("Funcao em desenvolvimento.\n");}

//FUNÇÃO MÉDIA COR
int media_cor(){puts("Funcao em desenvolvimento.\n");}

//FUNÇÃO MEDIANA COR
int mediana_cor(){puts("Funcao em desenvolvimento.\n");}


//FUNÇÃO PASSA-ALTA COR
int passa_alta_cor(){puts("Funcao em desenvolvimento.\n");}


//************************** FIM DAS FUNÇÕES ***********************************




//*************************** MENU PRINCIPAL ***********************************
int menu_principal (void)
{
int op;
char *menu = "\t\t\t\tMENU PRINCIPAL\n\n"
"\t\t\t\t[1] - Imagens binarias (SUB MENU)\n"
"\t\t\t\t[2] - Imagens Tons de cinza (SUB MENU)\n"
"\t\t\t\t[3] - Imagens coloridas (SUB MENU)\n"
"\t\t\t\t[4] - Sair\n";


do {
puts (menu);
scanf ("%d", &op);
} while (op > 4 || op < 1);

return op;
}
//*************************** FIM MENU PRINCIPAL *******************************




//****************************** SUBMENUS **************************************

//SUBMENU IMAGENS BINÁRIAS
int submenu_img_bin (void)
{
int op;
printf("\n\t\t\t\t IMAGENS BINARIAS \n");
char *menu ="\t\t\t\t[1] - AND\n"
"\t\t\t\t[2] - OR\n"
"\t\t\t\t[3] - NOT\n"
"\t\t\t\t[4] - VOLTAR\n";

do {
puts (menu);
scanf ("%d", &op);
} while (op > 4 || op < 1);

return op;
}

//SUBMENU IMAGENS EM TONS DE CINZA
int submenu_img_cinza (void)
{
int op;
printf("\n\t\t\t\t IMAGENS EM TONS DE CINZA\n");
char *menu = "\t\t\t\t[1] - Operacoes pontuais (SUB MENU)\n"
"\t\t\t\t[2] - Filtros (SUB MENU)\n"
"\t\t\t\t[3] - Histograma\n"
"\t\t\t\t[4] - Deteccao de bordas (SUB MENU)\n"
"\t\t\t\t[5] - Segmentacao\n"
"\t\t\t\t[6] - Voltar\n";

do {
puts (menu);
scanf ("%d", &op);
} while (op > 6 || op < 1);

return op;
}



//SUBMENU OPERAÇÕES PONTUAIS
int submenu_opera_pont (void)
{
int op;
printf("\n\t\t\t\t OPERACOES PONTUAIS\n");
char *menu = "\t\t\t\t[1] - Negativo\n"
"\t\t\t\t[2] - Potencia\n"
"\t\t\t\t[3] - Logarítmica\n"
"\t\t\t\t[4] - Voltar";

do {
puts (menu);
scanf ("%d", &op);
} while (op > 4 || op < 1);

return op;
}


//SUBMENU FILTROS
int submenu_filtros (void)
{
int op;
printf("\n\t\t\t\t FILTROS\n");
char *menu = "\t\t\t\t[1] - Media\n"
"\t\t\t\t[2] - Mediana\n"
"\t\t\t\t[3] - Passa-alta\n"
"\t\t\t\t[4] - Voltar";

do {
puts (menu);
scanf ("%d", &op);
} while (op > 4 || op < 1);

return op;
}


//SUBMENU DETECÇÃO DE BORDAS
int submenu_detec_borda (void)
{
int op;
printf("\n DETECCAO DE BORDAS\n");
char *menu = "\t\t\t\t[1] - Roberts\n"
"\t\t\t\t[2] - Prewitt\n"
"\t\t\t\t[3] - Sobel\n"
"\t\t\t\t[4] - Laplaciano\n"
"\t\t\t\t[5] - Voltar\n";

do {
puts (menu);
scanf ("%d", &op);
} while (op > 5 || op < 1);

return op;
}


//SUBMENU IMAGENS COLORIDAS
int submenu_img_cor(void)
{
int op;
printf("\n\t\t\t\t IMAGENS COLORIDAS\n");
char *menu = "\t\t\t\t[1] - geração das 3 imagens (RGB)\n"
"\t\t\t\t[2] - Filtros (SUB MENU)\n"
"\t\t\t\t[3] - Voltar\n";

do {
puts (menu);
scanf ("%d", &op);
} while (op > 5 || op < 1);

return op;
}

//SUBMENU FILTROS IMAGENS COLORIDAS
int submenu_filtro_cor(void)
{
int op;
printf("\n\t\t\t\t FILTROS IMAGENS COLORIDAS\n");
char *menu = "\t\t\t\t[1] - Media\n"
"\t\t\t\t[2] - Mediana\n"
"\t\t\t\t[3] - Passa-alta\n"
"\t\t\t\t[4] - Voltar";

do {
puts (menu);
scanf ("%d", &op);
} while (op > 5 || op < 1);

return op;
}

//*************************** FIM SUBMENUS *************************************




//*************************** COMANDO SWITCH ***********************************
int main (void)
{
int op, opsub;
system("cls");
do {
op = menu_principal();
switch (op){
case 1:
system("cls");
do {
opsub = submenu_img_bin(); //abre o submenu IMAGENS BINARIAS
switch (opsub){
case 1:
AND();
break;
case 2:
OR();
break;
case 3:
NOT();
break;

}
} while (opsub != 4); // Aqui está indo para o submenu IMAGENS EM TONS de CINZA, e não pro menu principal

case 2:
system("cls");
do {
opsub = submenu_img_cinza(); //abre o submenu IMAGENS EM TONS DE CINZA
switch (opsub) {
case 1:
system("cls");
do {
opsub = submenu_opera_pont();
switch (opsub) {
case 1:
negativo();
break;
case 2:
/*potencia*/ negativo();
break;
case 3:
logaritimica();
break;
}
}while (opsub != 4); // Não está voltando para o MENU PRINCIPAL

case 2:
system("cls");
do {
opsub = submenu_filtros();
switch (opsub) {
case 1:
media();
break;
case 2:
mediana();
break;
case 3:
passa_alta();
break;
}
} while (opsub != 4);


case 3:
histograma();
break;


case 4:
system("cls");
do {
opsub = submenu_detec_borda();
switch (opsub) {
case 1:
roberts();
break;
case 2:
prewitt();
break;
case 3:
sobel();
break;
case 4:
laplaciano();
break;
}
} while (opsub != 5);

case 5:
segmentacao();
break;
}
} while (op != 6);

case 3:
system("cls");
do {
opsub = submenu_img_cor(); //esse é o único meu q está funcionando perfeitamente
switch (opsub){
case 1:
img_RGB();
break;
case 2:
system("cls");
do{
opsub = submenu_filtro_cor();
switch(opsub) {
case 1:
media_cor();
break;
case 2:
mediana_cor();
case 3:
passa_alta_cor();
break;
}
}while(opsub != 4);
system("cls");
break;
}
}while(opsub != 3);
system("cls");
break;
}
}while(op!=4);
system("cls");
return 0;
}



//************************* FIM COMANDO SWITCH *********************************

Link para o comentário
Compartilhar em outros sites

Eram apenas "break" faltando, e no loop do valor 6, ele estava validando com a variável "op", mas o valor lido ficava em "opsub".

Segue main():


int main (void)
{
int op, opsub;
system("clear");
do
{
op = menu_principal();
switch (op)
{
case 1:
system("clear");
do {
opsub = submenu_img_bin(); //abre o submenu IMAGENS BINARIAS
switch (opsub)
{
case 1:
AND();
break;
case 2:
OR();
break;
case 3:
NOT();
break;

}
}
while (opsub != 4); // Aqui está indo para o submenu IMAGENS EM TONS de CINZA, e não pro menu principal
break;
case 2:
system("clear");
do
{
opsub = submenu_img_cinza(); //abre o submenu IMAGENS EM TONS DE CINZA
switch (opsub)
{
case 1:
system("clear");
do
{
opsub = submenu_opera_pont();
switch (opsub)
{
case 1:
negativo();
break;
case 2:
negativo(); /*potencia*/
break;
case 3:
logaritimica();
break;
}
}
while (opsub != 4); // Não está voltando para o MENU PRINCIPAL
break;
case 2:
system("clear");
do
{
opsub = submenu_filtros();
switch (opsub)
{
case 1:
media();
break;
case 2:
mediana();
break;
case 3:
passa_alta();
break;
}
}
while (opsub != 4);
break;
case 3:
histograma();
break;
case 4:
system("clear");
do
{
opsub = submenu_detec_borda();
switch (opsub)
{
case 1:
roberts();
break;
case 2:
prewitt();
break;
case 3:
sobel();
break;
case 4:
laplaciano();
break;
}
}
while (opsub != 5);
break;
case 5:
segmentacao();
break;
}
}
while (opsub != 6);
break;
case 3:
system("clear");
do
{
opsub = submenu_img_cor(); //esse é o único meu q está funcionando perfeitamente
switch (opsub)
{
case 1:
img_RGB();
break;
case 2:
system("clear");
do
{
opsub = submenu_filtro_cor();
switch(opsub)
{
case 1:
media_cor();
break;
case 2:
mediana_cor();
break;
case 3:
passa_alta_cor();
break;
}
}
while(opsub != 4);
break;
}
}
while(opsub != 3);
break;
}
}
while(op!=4);

system("clear");
return 0;
}

Tem que trocar o system("clear") por system("cls").

Fiz a mudança porque uso Unix.

Link para o comentário
Compartilhar em outros sites

Arquivado

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

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!