我正在创建一个决策程序,但我想要一些我调用的函数能够返回到上一个函数。如何在不使用间接递归的情况下执行此操作?
我希望它做的一个例子是:
Introduce la contrasena:
15
Bienvenido!
Menu principal, Elegir una opcion:
1: Comprar
2: Atencion al Cliente
0: Salir
>>>>2
Menu atencion al cliente. Elegir una opcion:
a: Devolver
b: Cambiar
c: Volver al menu principal
>>>>c
Opcion volver al menu anterior
Menu principal, Elegir una opcion:
1: Comprar
2: Atencion al Cliente
0: Salir
>>>>0
Presione cualquier tecla para salir:
>>>>
这就是它实际做的事情:
Introduce la contrasena:
15
Bienvenido!
Menu principal, Elegir una opcion:
1: Comprar
2: Atencion al Cliente
0: Salir
>>>>2
Menu atencion al cliente. Elegir una opcion:
a: Devolver
b: Cambiar
c: Volver al menu principal
>>>>c
Opcion volver al menu anterior
为了让它在不使用间接递归的情况下工作,我需要添加什么?
谢谢!
这是我的c程序: 在主要:
#include "Ejercicio27.h"
main()
{
int contrasena = 0;
printf("Introduce la contrasena: \n");
scanf("%i", &contrasena);
bonito(contrasena);
if (bonito(contrasena) == 0)
{
printf("La contrasenia es incorrecta, presiona cualquier tecla para continuar:\n>>>>");
getchar();
getchar();
exit(1);
}
else
printf("Bienvenido!\n");
menu();
}
在funciones.c中:
#include "Ejercicio27.h"
bonito(int numero)
{
if ((numero % 2 == 0 || numero % 3 == 0) && numero % 5 == 0)
return numero;
else
return 0;
}
void comprar(void)
{
printf("Hola comprar\n");
// menu();
}
atencion(void)
{
//getchar();
char opcion;
do{
printf("Menu atencion al cliente. Elegir una opcion: \na: Devolver\nb: Cambiar\nc: Volver al menu principal\n>>>>");
scanf("%c", &opcion);
getchar();
switch (opcion)
{
case 'a':
case 'A':
printf("Opcion devolver\n");
break;
case 'b':
case 'B':
printf("Opcion cambiar\n");
break;
case 'c':
case 'C':
printf("Opcion volver al menu anterior\n");
break;
default:
break;
}
}while (opcion !='a' && opcion != 'A' && opcion != 'b' && opcion != 'B' && opcion != 'c' && opcion != 'B');
//menu();
}
salir(void)
{
printf("Presione cualquier tecla para salir: \n>>>>");
getchar();
return;//exit(1);
}
menu(void)
{
int opcion = 3;
do{
printf("Menu principal, Elegir una opcion:\n1: Comprar\n2: Atencion al Cliente\n0: Salir\n>>>>");
scanf("%i", &opcion);
getchar();
switch (opcion)
{
case 1:
comprar();
return;
break;
case 2:
atencion();
return;
break;
case 0:
salir();
return;
break;
default:
break;
}
getchar();
}while (opcion != 0 && opcion != 1 && opcion != 2);
}
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#include <stdlib.h>
//int opcion = 0;
int bonito(int);
void comprar(void);
void atencion(void);
void salir(void);
void menu(void);
答案 0 :(得分:1)
一种解决方案是重构代码,使得顶级菜单是main
中的无限循环,子菜单是子程序中的无限循环。子菜单完成后,只需break
循环,然后返回main
。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
// forward declarations
void comprar( void );
void atencion(void);
void salir( void );
int menuMain( void );
int menuAtencion( void );
// infinite loop for the main menu
int main( void )
{
int opcion;
for (;;)
{
opcion = menuMain();
if ( opcion == 1 )
comprar();
else if ( opcion == 2 )
atencion();
else
salir();
}
}
// handlers for main menu
void comprar( void )
{
printf( "comprar\n" );
}
void salir( void )
{
printf( "adios\n" );
exit( 0 );
}
// infinite loop for the submenu
void atencion(void)
{
int opcion;
for (;;)
{
opcion = menuAtencion();
if ( opcion == 'a' )
printf( "Opcion devolver\n" );
else if ( opcion == 'b' )
printf( "Opcion cambiar\n" );
else
break;
}
printf( "Opcion volver al menu anterior\n" );
}
// display the main menu to the user
int menuMain( void )
{
int opcion;
do
{
printf("Menu principal, Elegir una opcion:\n1: Comprar\n2: Atencion al Cliente\n0: Salir\n>>>>");
scanf( "%i", &opcion );
getchar();
} while ( opcion != 0 && opcion != 1 && opcion != 2 );
return( opcion );
}
// display the submenu to the user
int menuAtencion( void )
{
char opcion;
do
{
printf("Menu atencion al cliente. Elegir una opcion: \na: Devolver\nb: Cambiar\nc: Volver al menu principal\n>>>>");
scanf( "%c", &opcion );
getchar();
} while ( opcion !='a' && opcion != 'A' && opcion != 'b' && opcion != 'B' && opcion != 'c' && opcion != 'B' );
return( tolower( opcion ) );
}