C语言do-while循环实现Y/N控制流程重复、选课总费用统计问题排查
核心问题定位
- 选Y后循环失效的根本原因:
scanf(" %c", join)调用时未对join变量取地址,不符合scanf需要传入变量内存地址的入参规则,用户输入的字符根本没有被写入join变量,join始终是栈上的随机初始值,循环条件判断完全失效 - 总费用统计功能缺失:定义的
totalFee变量未做初始化,也没有在每次选定课程后累加对应课程的费用,即使循环正常运行,也没有可用于输出的累计值 - 隐含的逻辑不一致问题:代码开头通过宏定义的各课程费用,和分支判断里硬编码的费用数值不匹配;D课程的打印语句中冗余输出了无意义的字符
D;存在Python拼写为Phyton的笔误
修正实现思路
- 修正scanf的入参错误,所有需要通过scanf写入值的字符变量前必须加取地址符
&,保证用户输入的Y/y/N/n能被正确读取,驱动循环正常运行 - 将
totalFee初始值设为0,在每个课程分支中累加对应课程的费用,统一使用开头定义的宏值替代硬编码的费用数,避免数值偏差 - 清理打印语句中的冗余字符和拼写错误,在do...while循环结束(用户选择N/n退出选课)后,统一输出累计的总选课费用
修正后完整可运行代码
#include <stdio.h> // 对齐原分支中展示的课程费用定义宏,减少硬编码 #define A 100 // C入门课费用 #define B 110 // C++入门课费用 #define C 120 // Java入门课费用 #define D 130 // Python入门课费用 #define E 140 // PHP课程费用 int main() { int totalFee = 0; // 总费用从0开始累加 char code, join; printf("\t\t Training Centre\n"); do { printf("\nEnter course code: "); scanf(" %c", &code); // 修正取地址缺失的问题 if(code == 'A') { printf("Course name: C for beginner\nFees: %d", A); totalFee += A; } else if(code == 'B') { printf("Course name: C++ for beginner\nFees: %d", B); totalFee += B; } else if(code == 'C') { printf("Course name: Java for beginner\nFees: %d", C); totalFee += C; } else if(code == 'D') { // 修正拼写错误,删除冗余打印的字符D printf("Course name: Python for beginner\nFees: %d", D); totalFee += D; } else { printf("Course name: PHP for beginner\nFees: %d", E); totalFee += E; } printf("\n\nDo you want to join other class? (Enter Y for 'Yes' / N for 'N'): "); scanf(" %c", &join); // 修正取地址缺失的问题 } while (join == 'Y' || join == 'y'); // 循环退出后输出累计总费用 printf("\nTotal accumulated course fee: %d\n", totalFee); return 0; }
内容的提问来源于stack exchange,提问作者myr
相关产品推荐
相关产品推荐

