C语言餐厅计费系统循环内switch多输入异常问题排查
C语言餐厅计费系统多菜品总价计算异常解决
问题表现
- 系统可正常实现单个菜品选择、订购数量录入、税费计算、最终账单输出的基础流程
- 核心故障:累计多道不同单价、不同订购数量的菜品金额时计算结果错误;仅当多道菜品单价相同时,哪怕订购数量存在差异,总价计算结果才正常
- 对应问题的原始核心代码如下:
#include<stdio.h> void main() { float food=0; // 餐饮消费累计总额 float p; // 菜品订购数量 int ch; // 菜品选择项 float vat,gst; // 税费金额 float total; // 最终账单总额 int w; // 循环控制变量 // 打印南印度特色早餐菜单 printf("\n ***菜单***\n 请从以下列表中选择餐品 \n ---Tiffins风味早餐--- \n 1. 原味多萨 = 50卢比 \n 2. 马萨拉多萨 = 70卢比 \n 3. 洋葱多萨 = 80卢比 \n 4. 伊德利蒸米糕 = 50卢比 \n 5. 乌塔帕姆蔬菜饼 = 90卢比 \n 6. 瓦达豆炸圈 = 60卢比 \n 7. 乌普马粗麦粥 = 65卢比 \n 8. 彭加尔粥 = 70卢比 \n 9. 普里炸饼 = 70卢比 \n "); // *问题核心:菜品选择输入写在循环外部 printf("\n 请输入您的订单选择: \n"); scanf("%d",&ch); do{ // 启动点餐循环 switch(ch) { case 1: printf("\n 请问您需要点几份?\n"); scanf("%f",&p); food = food+50*p; printf("\n当前累计消费: %.2f\n",food); break; // 其余2-9号菜品的计价逻辑与case1完全一致,匹配对应单价乘数量后累加到food总金额,此处省略 // ... default: printf("\nInvalid choice\n"); } printf("\nPress 0 to go to billing\n"); scanf("%d",&w); } while(w>0); // 税费计算:7%增值税 + 5%商品服务税 vat = (7*food)/100; gst = (5*food)/100; total = food+vat+gst; printf("\n ---TOTAL BILL--- \n Food Total = %.2f \n Vat(7%%) = %.2f \n GST(5%%) = %.2f \n Total amount = %.2f \n",food,vat,gst,total); getch(); }
故障根因
- 菜品选择的输入语句
scanf("%d",&ch);被放置在do-while点餐循环的外部 - 循环执行过程中,菜品选择变量
ch仅在循环启动前被赋值一次,后续多轮循环都不会重新读取用户输入的新菜品选项,ch会一直保留第一次输入的固定值 - 这就导致不管循环重复执行多少次,switch分支永远只会匹配第一次选的菜品对应的计价逻辑,其他单价的菜品分支完全不会触发,无法正确累计不同单价菜品的消费金额;只有当用户连续点选第一次选中的同单价菜品时,累计结果才会显示正常
修复方法
将菜品选择的输入语句移动到do-while循环内部,让每一轮循环都能接收新的菜品选择值,同时补充输入0直接跳转结账的优化逻辑,关键调整位置参考:
// 菜单打印保留在循环外,避免每轮循环重复打印 printf("\n ***菜单***\n 请从以下列表中选择餐品 \n ---Tiffins风味早餐--- \n 1. 原味多萨 = 50卢比 \n 2. 马萨拉多萨 = 70卢比 \n 3. 洋葱多萨 = 80卢比 \n 4. 伊德利蒸米糕 = 50卢比 \n 5. 乌塔帕姆蔬菜饼 = 90卢比 \n 6. 瓦达豆炸圈 = 60卢比 \n 7. 乌普马粗麦粥 = 65卢比 \n 8. 彭加尔粥 = 70卢比 \n 9. 普里炸饼 = 70卢比 \n "); do{ // 将菜品选择输入移入循环内部,每轮更新选择值 printf("\n 请输入您的订单选择,输入0可直接进入结账: \n"); scanf("%d",&ch); // 输入0时直接跳出循环进入结算流程 if(ch == 0) break; switch(ch) { // 原有各个case的菜品计价逻辑完全保留,无需修改 } printf("\n输入任意正整数继续点餐,输入0进入结账\n"); scanf("%d",&w); } while(w>0);
实用调整提示
- 原代码使用的
void main()写法不符合C语言标准语法,建议替换为标准的int main(),函数结尾补充return 0;语句,提升代码跨平台兼容性 - 代码中使用的
getch()是Windows平台特有的非标准库函数,跨环境编译运行时容易报错,可替换为getchar()实现程序暂停效果
该问题开发者已自行验证修复:仅需将菜品选择输入语句移动到循环内部,即可正常累计不同单价、不同数量菜品的总消费金额
内容的提问来源于stack exchange,提问作者MRJGAMER
相关产品推荐
相关产品推荐

