用 C++语言设计程序,设计实现学生成绩管理系统的应用程序,程序具 体要求如下: 通过二维数组构建学生的成绩单 学号 语文 数学 英语 物理 化学 生物 101 96 79 88 77 76 83 102 79 82 86 82 67 91 103 83 98 95 92 93 88 104 92 82 78 89 81 79 105 87 95 91 85 87 75 程序包含的功能: 1、 输入学号和科目名称(如语文、数学等)查询所有同学该科门科目的平 均成绩以及该生该门科目的排名。 2、 输入学号,输出所有同学根据总成绩的排名,并输出该学号的排名。 3、 输入学号、科目名称、修改的成绩分数对成绩单中成绩进行修改。 4、程序在最开始可以选择想执行的业务选项。 其它要求:除程序能够正确运行外,还要求程序具有友好的用户交互界面, 能够对错误输入进行处理(比如对输入金额验证,输入 id 的唯一性验证,输入 超长字符的验证),具备良好的性能,程序要求具有良好的注释和代码美观性。
时间: 2023-12-06 08:41:00 浏览: 59
基于C++的学生成绩管理系统设计与代码实现
以下是一个简单的学生成绩管理系统的 C++ 程序,满足上述要求:
```cpp
#include <iostream>
#include <string>
#include <iomanip>
#include <algorithm>
using namespace std;
const int MAX_STUDENTS = 5; // 最大学生数
const int MAX_SUBJECTS = 6; // 最大科目数
// 学生结构体
struct Student {
int id;
string name;
int scores[MAX_SUBJECTS];
int totalScore;
int rank;
};
// 科目名称数组
const string subjects[MAX_SUBJECTS] = {"语文", "数学", "英语", "物理", "化学", "生物"};
// 学生成绩单数组
Student students[MAX_STUDENTS] = {
{101, "张三", {96, 79, 88, 77, 76, 83}},
{102, "李四", {79, 82, 86, 82, 67, 91}},
{103, "王五", {83, 98, 95, 92, 93, 88}},
{104, "赵六", {92, 82, 78, 89, 81, 79}},
{105, "钱七", {87, 95, 91, 85, 87, 75}}
};
// 计算学生总成绩和排名
void calculateTotalScoreAndRank() {
// 计算每个学生的总成绩
for (int i = 0; i < MAX_STUDENTS; i++) {
int totalScore = 0;
for (int j = 0; j < MAX_SUBJECTS; j++) {
totalScore += students[i].scores[j];
}
students[i].totalScore = totalScore;
}
// 按总成绩排序,并计算排名
sort(students, students + MAX_STUDENTS, [](const Student& a, const Student& b) {
return a.totalScore > b.totalScore;
});
for (int i = 0; i < MAX_STUDENTS; i++) {
students[i].rank = i + 1;
}
}
// 根据学号和科目名称查询成绩并输出该科目平均成绩和该生排名
void querySubjectScore(int id, string subject) {
int subjectIndex = -1;
for (int i = 0; i < MAX_SUBJECTS; i++) {
if (subject == subjects[i]) {
subjectIndex = i;
break;
}
}
if (subjectIndex == -1) {
cout << "无效的科目名称" << endl;
return;
}
int index = -1;
for (int i = 0; i < MAX_STUDENTS; i++) {
if (students[i].id == id) {
index = i;
break;
}
}
if (index == -1) {
cout << "未找到该学生" << endl;
return;
}
int count = 0;
int sum = 0;
for (int i = 0; i < MAX_STUDENTS; i++) {
sum += students[i].scores[subjectIndex];
if (students[i].scores[subjectIndex] > students[index].scores[subjectIndex]) {
count++;
}
}
cout << "科目平均成绩:" << fixed << setprecision(2) << (double)sum / MAX_STUDENTS << endl;
cout << "该生排名:" << count + 1 << endl;
}
// 根据学号查询成绩并输出总成绩排名和该生排名
void queryTotalScore(int id) {
int index = -1;
for (int i = 0; i < MAX_STUDENTS; i++) {
if (students[i].id == id) {
index = i;
break;
}
}
if (index == -1) {
cout << "未找到该学生" << endl;
return;
}
cout << "总成绩排名:" << students[index].rank << endl;
cout << "该生排名:" << count_if(students, students + MAX_STUDENTS, [&](const Student& s) {
return s.totalScore > students[index].totalScore;
}) + 1 << endl;
}
// 根据学号和科目名称修改成绩
void modifyScore(int id, string subject, int score) {
int subjectIndex = -1;
for (int i = 0; i < MAX_SUBJECTS; i++) {
if (subject == subjects[i]) {
subjectIndex = i;
break;
}
}
if (subjectIndex == -1) {
cout << "无效的科目名称" << endl;
return;
}
int index = -1;
for (int i = 0; i < MAX_STUDENTS; i++) {
if (students[i].id == id) {
index = i;
break;
}
}
if (index == -1) {
cout << "未找到该学生" << endl;
return;
}
students[index].scores[subjectIndex] = score;
calculateTotalScoreAndRank();
}
int main() {
calculateTotalScoreAndRank();
while (true) {
cout << "请选择业务:" << endl;
cout << "1. 查询科目成绩" << endl;
cout << "2. 查询总成绩排名" << endl;
cout << "3. 修改成绩" << endl;
cout << "4. 退出程序" << endl;
int choice;
cin >> choice;
switch (choice) {
case 1: {
cout << "请输入学号和科目名称:" << endl;
int id;
string subject;
cin >> id >> subject;
querySubjectScore(id, subject);
break;
}
case 2: {
cout << "请输入学号:" << endl;
int id;
cin >> id;
queryTotalScore(id);
break;
}
case 3: {
cout << "请输入学号、科目名称和修改后的成绩:" << endl;
int id, score;
string subject;
cin >> id >> subject >> score;
modifyScore(id, subject, score);
break;
}
case 4: {
return 0;
}
default: {
cout << "无效的选项" << endl;
break;
}
}
cout << endl;
}
return 0;
}
```
这个程序使用了结构体来表示学生,使用了二维数组来存储成绩单,使用了 lambda 表达式来自定义排序函数,使用了 STL 的 count_if 函数来计算排名。在用户输入时,程序会对无效的输入进行验证和处理。
阅读全文