gpt4 book ai didi

c - 函数返回前一个而不是递归 (c)

转载 作者:行者123 更新时间:2023-11-30 15:26:45 25 4
gpt4 key购买 nike

我正在创建一个决策程序,但我希望我调用的一些函数能够返回到前一个函数。在不使用间接递归的情况下如何做到这一点?

我想要它做的一个例子是:

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);
}

在 ejercicio27.h 中:

#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);

最佳答案

一种解决方案是重构代码,使顶级菜单成为 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 ) );
}

关于c - 函数返回前一个而不是递归 (c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27305417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com