C++学生信息成绩系统修复:均值、标准差及等级计算问题求助
学生成绩管理完整C++实现
#include <iostream> #include <string> #include <cmath> #include <iomanip> using namespace std; // 定义学生结构体 struct Student { string regno; // 学号 string courseid; // 课程ID int unitsRegistered; // 注册科目数量 int unitsmarks[10]; // 各科目成绩(假设最多10门) double mean; // 个人平均成绩 char grade; // 成绩等级 }; // 输入单个学生信息 void getData(Student &s) { cout << "输入学号: "; cin >> s.regno; cout << "输入课程ID: "; cin >> s.courseid; cout << "输入注册科目数量: "; cin >> s.unitsRegistered; // 输入每门科目成绩 cout << "输入各科目成绩: "; for (int i = 0; i < s.unitsRegistered; ++i) { cin >> s.unitsmarks[i]; } } // 计算个人平均成绩 void computeMean(Student &s) { int total = 0; for (int i = 0; i < s.unitsRegistered; ++i) { total += s.unitsmarks[i]; } s.mean = static_cast<double>(total) / s.unitsRegistered; } // 根据平均成绩计算等级 void computeGrade(Student &s) { if (s.mean >= 90) { s.grade = 'A'; } else if (s.mean >= 80) { s.grade = 'B'; } else if (s.mean >= 70) { s.grade = 'C'; } else if (s.mean >= 60) { s.grade = 'D'; } else { s.grade = 'F'; } } // 打印单个学生信息 void printStudent(const Student &s) { cout << "\n=== 学生信息 ===" << endl; cout << "学号: " << s.regno << endl; cout << "课程ID: " << s.courseid << endl; cout << "注册科目数: " << s.unitsRegistered << endl; cout << "科目成绩: "; for (int i = 0; i < s.unitsRegistered; ++i) { cout << s.unitsmarks[i] << " "; } cout << endl; cout << fixed << setprecision(2); cout << "平均成绩: " << s.mean << endl; cout << "成绩等级: " << s.grade << endl; } int main() { const int STUDENT_COUNT = 10; Student students[STUDENT_COUNT]; // 输入所有学生信息并计算均值、等级 for (int i = 0; i < STUDENT_COUNT; ++i) { cout << "\n输入第 " << i+1 << " 名学生信息:" << endl; getData(students[i]); computeMean(students[i]); computeGrade(students[i]); } // 打印所有学生信息 cout << "\n==================== 所有学生信息 ====================" << endl; for (int i = 0; i < STUDENT_COUNT; ++i) { printStudent(students[i]); } // 计算班级统计数据 double classTotal = 0; double highestMean = students[0].mean; double lowestMean = students[0].mean; for (int i = 0; i < STUDENT_COUNT; ++i) { classTotal += students[i].mean; if (students[i].mean > highestMean) { highestMean = students[i].mean; } if (students[i].mean < lowestMean) { lowestMean = students[i].mean; } } double classMean = classTotal / STUDENT_COUNT; // 计算标准差 double sumSquaredDiff = 0; for (int i = 0; i < STUDENT_COUNT; ++i) { double diff = students[i].mean - classMean; sumSquaredDiff += diff * diff; } double stdDeviation = sqrt(sumSquaredDiff / STUDENT_COUNT); // 打印班级统计结果 cout << "\n==================== 班级统计数据 ====================" << endl; cout << fixed << setprecision(2); cout << "班级平均成绩: " << classMean << endl; cout << "班级成绩标准差: " << stdDeviation << endl; cout << "班级最高平均成绩: " << highestMean << endl; cout << "班级最低平均成绩: " << lowestMean << endl; return 0; }
代码说明
结构体设计
Student结构体包含需求所有核心字段,额外添加mean和grade存储计算后的个人均值与等级,避免重复计算。
核心函数实现
- getData:收集单个学生基础信息,包括学号、课程ID、注册科目数及对应成绩,输入逻辑直接清晰。
- computeMean:遍历学生所有科目成绩求和,除以科目数得到平均成绩,用
static_cast<double>保证浮点数结果。 - computeGrade:根据均值区间划分等级,区间规则可按需调整(当前为90+A、80-89B、70-79C、60-69D、低于60F)。
- printStudent:格式化输出学生全部信息,包含原始成绩、均值和等级,提升可读性。
班级统计逻辑
完成10名学生数据录入后,通过遍历数组:
- 累加所有学生均值得到班级总分,计算班级均值;
- 实时更新最高/最低均值;
- 计算每个学生均值与班级均值的差的平方和,开平方得到总体标准差。
内容的提问来源于stack exchange,提问作者Peaches Njenga
相关产品推荐
相关产品推荐

