You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免void函数中累计总额runningTotal重置为0?

解决餐厅菜单程序累计总额的问题

核心问题分析

你之前遇到的问题本质是参数传递方式不对:

  • 把runningTotal放在cost()内部:每次调用函数都会重新创建并初始化这个变量,自然每次都是0,无法累计。
  • 把runningTotal放在main()里然后值传递给cost():C语言的默认参数传递是值传递,函数里拿到的是原变量的副本,修改副本不会影响main()里的原变量,所以累计操作等于白做。

两种可行解决方案(符合void函数要求)

方案1:使用指针传递参数(推荐)

通过指针让cost()直接操作main()里的runningTotal变量,具体步骤:

  1. 在main()中初始化runningTotal为0(比如double runningTotal = 0.0;)。
  2. 修改cost()的函数定义,把参数改成指针类型:
    void cost(int choice, double *runningTotal) {
        // 根据用户选择的菜品,计算对应价格并累加到*runningTotal
        switch(choice) {
            case 1:
                *runningTotal += 15.99; // 示例菜品价格
                break;
            case 2:
                *runningTotal += 22.50;
                break;
            case 3:
                *runningTotal += 8.99;
                break;
            // 其他菜品逻辑...
        }
    }
    
  3. 在main()里调用cost()时,传递runningTotal的地址:
    int userChoice;
    do {
        showMenu(); // 你的显示菜单函数
        scanf("%d", &userChoice);
        if(userChoice >=1 && userChoice <=3) {
            cost(userChoice, &runningTotal); // 传地址
        }
    } while(userChoice !=4);
    // 结账时显示总额
    printf("账单总额:%.2f\n", runningTotal);
    

这样cost()里的*runningTotal就是直接操作main()里的原变量,每次点餐的金额都会正确累计。

方案2:使用全局变量(不推荐但可行)

把runningTotal声明在所有函数的外面(全局作用域),这样main()和cost()都能直接访问和修改它,不需要传参数:

#include <stdio.h>

double runningTotal = 0.0; // 全局变量,初始化在全局

void showMenu() {
    printf("1. 汉堡 - 15.99\n");
    printf("2. 牛排 - 22.50\n");
    printf("3. 沙拉 - 8.99\n");
    printf("4. 结账\n");
}

void cost(int choice) {
    switch(choice) {
        case 1:
            runningTotal +=15.99;
            break;
        case 2:
            runningTotal +=22.50;
            break;
        case 3:
            runningTotal +=8.99;
            break;
    }
}

int main() {
    int userChoice;
    do {
        showMenu();
        scanf("%d", &userChoice);
        if(userChoice >=1 && userChoice <=3) {
            cost(userChoice);
        }
    } while(userChoice !=4);
    printf("账单总额:%.2f\n", runningTotal);
    return 0;
}

注意:全局变量会增加代码耦合性,不利于后续维护,除非作业没有限制,否则优先用指针方案。

内容的提问来源于stack exchange,提问作者Loading Screen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:05:08