首页 > 解决方案 > 如何从另一个函数返回值

问题描述

我正在尝试创建一个 ATM 银行系统,该系统具有存款、取款、检查余额等选项。起初我保持了一个固定的余额值。然后使该余额通过提款,存款功能。但是当我检查我的余额时,它最初显示的是相同的固定值,它没有更新。当我尝试退出该函数时,我首先使用 mainmenu(),但如果我用返回余额替换它。我的代码无法正常工作。我的错误在哪里,我能做些什么来解决它。这是我的代码:

void mainmenu()

{

    int option, choose, balance = 10000;

    printf("PRESS < 1 >  CHECK BALANCE\n");
    printf("PRESS < 2 >  DEPOSIT\n");
    printf("PRESS < 3 >  WITHDRAW\n");
    printf("PRESS < 4 >  SEMESTER FEE\n");
    printf("CHOOSE AN OPTION: ");
    scanf("%d", &option);


    switch (option)
    {
        case 1:
            checkBalance(balance);
            break;

        case 2:
            moneyDeposit(balance);
            break;

        case 3:
            moneyWithdraw(balance);
            break;

        default:
        printf("WRONG INPUT. PLEASE PRESS ANY KEY AND ENTER TO TRY AGAIN....");
        char option[10];
        scanf("%s", &option);
        mainmenu();
    }

 
    void checkBalance(float balance)
    {
        printf("YOU CHOOSE TO SEE YOUR BALANCE\n");
        printf("****YOUR AVAILABLE BALANCE IS:   $%.2f\n", balance);
    }

    float moneyDeposit(float balance)
    {
        system("cls");

        float deposit;
        gotoxy(28, 2);
        printf("YOU CHOOSE TO DEPOSIT MONEY\n");
        gotoxy(22, 4);
        printf("$$$$YOUR BALANCE IS: $%.2f\n\n", balance); 
        gotoxy(22, 7);
        printf("****ENTER YOUR AMOUNT TO DEPOSIT: ");
        scanf("%f", &deposit);

    balance += deposit;
    printf("****YOUR NEW BALANCE IS:   $%.2f\n\n", balance);
    printf("WOULD YOU LIKE TO DO ANOTHER TRANSACTION:\n");
    gotoxy(17, 14);
    printf("< 1 > YES\n");
    gotoxy(17, 16);
    printf("< 2 > NO\n");
    int option;

    do
    {
        gotoxy(10, 18);
        printf("PLEASE CHOOSE YOUR OPTIONS...");
        scanf("%d", &option);
        if (option == 1)
            {
                mainmenu;
            }
        else if(option == 2)
            {
                menuExit();
            }
        else
            {
                printf("INVALID INPUT. PLEASE PRESS ANY KEY AND ENTER TO TRY AGAIN");
                char choose[10];
                scanf("%s", &choose);
            }
    } while (option > 2);
    }
    loat moneyWithdraw(float balance)
    {

    float withdraw;

gotoxy(28, 2);
printf("YOU CHOOSE TO WITHDRAW MONEY\n");
gotoxy(22, 4);
printf("$$$$YOUR BALANCE IS: $%.2f\n\n", balance);
gotoxy(22, 6);
printf("ENTER YOUR AMOUNT TO WITHDRAW:");
scanf("%f", &withdraw);


if (withdraw <= balance)
    {
        balance -= withdraw;
        gotoxy(28, 9);
        printf("$$$$YOUR WITHDRAWING MONEY IS:  $%.2f\n", withdraw);
        gotoxy(28, 11);
        printf("****YOUR NEW BALANCE IS:   $%.2f\n\n", balance);


    }

else
    {
        gotoxy(28, 9);
        printf("+++YOU DON'T HAVE ENOUGH MONEY+++\n");
        gotoxy(28, 11);
        printf("****YOUR CURRENT BALANCE IS:   $%.2f\n\n", balance);
        gotoxy(28, 13);
        printf("PLEASE DEPOSIT MONEY\n");

    }

gotoxy(17, 16);
printf("WOULD YOU LIKE TO DO ANOTHER TRANSACTION:\n");
gotoxy(17, 18);
printf("< 1 > YES\n");
gotoxy(17, 20);
printf("< 2 > NO\n");
int option;

    do
        {
            gotoxy(10, 22);
            printf("PLEASE CHOOSE YOUR OPTIONS...");
            scanf("%d", &option);
            if (option == 1)
                {
                    mainmenu();
                }
            else if(option == 2)
                {
                    menuExit();
                }
            else
                {
                    printf("INVALID INPUT. PLEASE PRESS ANY KEY AND ENTER TO TRY AGAIN");
                    char choose[10];
                    scanf("%s", &choose);
                }
        } while (option > 2);


}

标签: cfunctionreturn

解决方案


当您将变量作为参数传递给函数时,该变量被复制,因此您对变量的副本进行操作,balance您从函数返回时,该副本被释放。

要解决这个问题,您需要将指针传递给变量:

void moneyDeposit(float *balance){ // `*` indicates it is a pointer to a float
    ...
    *balance += deposit; // with `*` you refer to a value under the pointer rather than to the pointer itself (equivalent of `balance[0]`)
}
moneyDeposit(&balance); // `&` gets an address of the variable

...或返回更改后的值并将其分配回变量:

float moneyDeposit(float balance){
    ...
    return balance + deposit;
}
balance = moneyDeposit(balance);

推荐阅读