如何避免void函数中累计总额runningTotal重置为0?
解决餐厅菜单程序累计总额的问题
核心问题分析
你之前遇到的问题本质是参数传递方式不对:
- 把
runningTotal放在cost()内部:每次调用函数都会重新创建并初始化这个变量,自然每次都是0,无法累计。 - 把
runningTotal放在main()里然后值传递给cost():C语言的默认参数传递是值传递,函数里拿到的是原变量的副本,修改副本不会影响main()里的原变量,所以累计操作等于白做。
两种可行解决方案(符合void函数要求)
方案1:使用指针传递参数(推荐)
通过指针让cost()直接操作main()里的runningTotal变量,具体步骤:
- 在
main()中初始化runningTotal为0(比如double runningTotal = 0.0;)。 - 修改
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; // 其他菜品逻辑... } } - 在
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
相关产品推荐
相关产品推荐

