【问题标题】:Function returning to previous without being recursive (c)函数返回前一个而不是递归的 (c)
【发布时间】:2014-12-04 22:29:39
【问题描述】:

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

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

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

【问题讨论】:

  • return 退出当前函数,在调用者调用它之后立即恢复执行
  • 好的,所以这给我留下了两个选择:或者使用替代品返回(退出),或者创建一个在退出菜单时调用菜单的循环。
  • 我建议使用状态机方法。
  • 谢谢,我会调查的。

标签: c function recursion switch-statement decision-tree


【解决方案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 ) );
}

【讨论】:

    猜你喜欢
    • 2022-07-21
    • 2014-01-22
    • 1970-01-01
    • 2023-03-24
    • 2021-08-03
    • 2013-10-15
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多