如何正确使用while循环?C++成绩计算程序循环问题排查优化
问题原因
- 核心问题是代码执行顺序和循环范围设置错误:你把成绩录入、输入校验的全部逻辑都写在了
do-while循环之外,只有成绩计算、评级输出、是否重试的逻辑在循环体内。第一次运行时程序会正常执行录入逻辑,进入循环后计算输出结果,用户输入y触发循环继续时,程序只会重新执行do{}包裹的代码,不会再执行外部的录入、校验逻辑,一直复用第一次输入的P1/P2/P3成绩重复计算,所以就会反复输出平均分相关内容。
优化方案
1. 核心逻辑调整
将「成绩录入 → 输入校验 → 计算评级」的完整业务逻辑全部放到do-while循环体内,保证用户选择重试时,会重新走一遍完整流程。
2. 其他细节优化
- 重复的成绩录入、校验逻辑封装成独立函数,避免代码冗余
- 多分支判断改用
else if替代独立if,减少无效判断 - 调用
toupper需要引入<cctype>头文件,避免部分编译器报错 - 多余的未使用变量直接删除,减少冗余代码
3. 简化后的完整代码
#include <iostream> #include <string> #include <cctype> using std::cout, std::cin, std::string, std::endl; // 封装成绩录入和校验逻辑 double input_grade(const string& tip) { double grade; cout << tip; cin >> grade; while (grade > 100 || grade <= 0) { cout << "Error! number should be in range of (1 to 100)." << endl; cout << "Re-enter " << tip.substr(6); cin >> grade; } return grade; } int main() { char again{}; const string result_tip = "Your average grade is "; const string levels[] = {"Failed", "Study Harder", "Job well done", "Very good student", "Exceptional student"}; do { double p1 = input_grade("Enter your P1 grade: "); double p2 = input_grade("Enter your P2 grade: "); double p3 = input_grade("Enter your P3 grade: "); cout << "\n"; double result = p1 * 0.33 + p2 * 0.33 + p3 * 0.34; cout << result_tip << result << ", "; if (result <= 49) cout << levels[0] << endl; else if (result <= 70) cout << levels[1] << endl; else if (result <= 80) cout << levels[2] << endl; else if (result <= 90) cout << levels[3] << endl; else cout << levels[4] << endl; cout << "Would you like to average another set?(Y/N) "; cin >> again; cout << "\n"; } while (toupper(again) == 'Y'); return 0; }
内容的提问来源于stack exchange,提问作者Kanra
相关产品推荐
相关产品推荐

