You need to enable JavaScript to run this app. C语言餐厅计费系统循环内switch多输入异常问题排查
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 13:45:08