函数返回到上一个而不是递归(c)

时间:2014-12-04 22:29:39

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

我正在创建一个决策程序,但我想要一些我调用的函数能够返回到上一个函数。如何在不使用间接递归的情况下执行此操作?

我希望它做的一个例子是:

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

1 个答案:

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