整数成绩加权平均分计算程序正确性咨询
课程成绩计算程序的正确性分析
我在CS课程中遇到一道编程题,虽看似简单但不确定理解是否正确。题目要求如下:
课程成绩计算规则:
- 第一次作业占总成绩的10%。
- 第二次作业占总成绩的20%。
- 第三次考试占总成绩的70%。
编写程序读取用户输入的三个成绩项,输出课程最终成绩。
我编写的代码:
#include <iostream> using std::cin; using std::cout; using std::endl; int main() { int num1, num2, num3; cin >> num1 >> num2 >> num3; int val1 = (num1 * 10) / 100; int val2 = (num2 * 20) / 100; int val3 = (num3 * 70) / 100; cout << "your total is: " << val1 + val2 + val3 << endl; return 0; }
请问这段代码是否正确?有没有遗漏的地方?希望得到相关建议,谢谢。
代码存在的问题
- 整数除法丢失精度:所有变量用
int存储,计算时的整数除法会直接舍去小数部分。比如第一次作业85分,85*10/100的实际值是8.5,但整数运算结果是8,直接丢了0.5分,最终总成绩会有误差。 - 无输入合法性校验:程序没检查输入的成绩是否在0-100的合理范围内,用户输入负数或超过100的数值时,计算结果完全不符合实际成绩逻辑。
- 输出精度不足:最终成绩用整数输出,实际加权计算后可能存在小数(比如89.5),用整数输出会变成89,无法准确反映真实成绩。
优化建议
- 改用浮点类型存储计算:把成绩变量和计算变量换成
double或float,保留小数精度,计算时直接用百分比系数(0.1、0.2、0.7)更直观:
#include <iostream> using std::cin; using std::cout; using std::endl; int main() { double num1, num2, num3; cin >> num1 >> num2 >> num3; double total = num1 * 0.1 + num2 * 0.2 + num3 * 0.7; cout << "your total is: " << total << endl; return 0; }
- 添加输入校验逻辑:读取输入后检查每个成绩是否在0-100之间,不符合则提示用户输入合法值:
#include <iostream> using std::cin; using std::cout; using std::endl; int main() { double num1, num2, num3; cin >> num1 >> num2 >> num3; if (num1 < 0 || num1 > 100 || num2 < 0 || num2 > 100 || num3 < 0 || num3 > 100) { cout << "请输入0-100之间的有效成绩" << endl; return 1; } double total = num1 * 0.1 + num2 * 0.2 + num3 * 0.7; cout << "your total is: " << total << endl; return 0; }
- 格式化输出精度:如果需要固定小数位数(比如保留1位或2位),可以引入
<iomanip>头文件,用std::fixed和std::setprecision控制输出:
#include <iostream> #include <iomanip> using std::cin; using std::cout; using std::endl; using std::fixed; using std::setprecision; int main() { double num1, num2, num3; cin >> num1 >> num2 >> num3; if (num1 < 0 || num1 > 100 || num2 < 0 || num2 > 100 || num3 < 0 || num3 > 100) { cout << "请输入0-100之间的有效成绩" << endl; return 1; } double total = num1 * 0.1 + num2 * 0.2 + num3 * 0.7; cout << "your total is: " << fixed << setprecision(1) << total << endl; return 0; }
内容的提问来源于stack exchange,提问作者Milad Bannourah
相关产品推荐
相关产品推荐

