如何修复for循环使其在输入字符x时停止运行?
修复C语言点餐系统的循环逻辑:持续运行直到输入'x'
没问题,我来帮你把这个点餐系统的循环逻辑补全,让它能一直接受用户点餐,直到输入x(大小写都支持)才终止。先给你完整的可运行代码,再拆解关键部分的逻辑:
#include <stdio.h> #include <ctype.h> // 用于统一处理大小写输入 int main(void) { char combo; int quantity; int ketqn; char ketupat_choice; float total_spent = 0.0; const float combo_a_price = 40.00; const float combo_b_price = 52.00; const float ketupat_price = 2.50; // 可自行调整Ketupat单价 // 用do-while实现"先执行点餐,再判断是否退出"的逻辑 do { float order_total = 0.0; // 重置单次订单金额 // 打印完整菜单 printf("\n SATAY RESTAURANT \n"); printf("----------------------------------------------------------\n"); printf(" Combo Type | Item Description | Price (RM) \n"); printf("----------------------------------------------------------\n"); printf(" A | 25 Chicken Satay + 25 Beef Satay | 40.00 \n"); printf(" B | 30 Chicken Satay + 20 Mutton Satay | 52.00 \n"); printf("----------------------------------------------------------\n"); printf(" Enter combo type (A/B) or 'x' to exit: "); // 读取输入并自动跳过缓冲区的空白字符(比如换行) scanf(" %c", &combo); combo = toupper(combo); // 统一转为大写,兼容大小写输入 // 输入x/X直接终止循环 if (combo == 'X') { break; } // 处理套餐选择 switch(combo) { case 'A': printf(" Enter quantity for Combo A: "); scanf("%d", &quantity); order_total += quantity * combo_a_price; break; case 'B': printf(" Enter quantity for Combo B: "); scanf("%d", &quantity); order_total += quantity * combo_b_price; break; default: printf(" Invalid combo type! Please try again.\n"); continue; // 跳过后续逻辑,直接进入下一轮循环 } // 询问是否添加Ketupat printf(" Would you like to add Ketupat? (y/n): "); scanf(" %c", &ketupat_choice); ketupat_choice = toupper(ketupat_choice); if (ketupat_choice == 'Y') { printf(" Enter quantity of Ketupat: "); scanf("%d", &ketqn); order_total += ketqn * ketupat_price; } // 显示单次订单金额并累加总消费 printf(" Your order total: RM %.2f\n", order_total); total_spent += order_total; } while (1); // 无限循环,直到用户输入x触发break // 退出时展示总消费 printf("\n----------------------------------------------------------\n"); printf(" Total amount spent: RM %.2f\n", total_spent); printf(" Thank you for dining with us!\n"); return 0; }
核心逻辑说明:
- 循环实现:这里用
do-while(1)无限循环配合break终止的写法,比for循环更贴合"先点餐再判断是否退出"的场景。如果一定要用for循环,替换成for(;;)即可,逻辑完全一致。 - 输入优化:
scanf(" %c", &var)里的空格会自动跳过缓冲区的空白字符(比如用户回车留下的换行),避免程序读取到无效字符导致逻辑混乱。 - 兼容性处理:用
toupper()把输入转为大写,用户输入x/X、a/A都能被正确识别,提升体验。 - 错误处理:遇到无效套餐选择时,用
continue直接进入下一轮循环,让用户重新输入。
内容的提问来源于stack exchange,提问作者seph roth
相关产品推荐
相关产品推荐

