C++实现学生成绩管理系统攻略
系统功能介绍
学生成绩管理系统是一个用于管理学生信息和成绩的软件系统。它能够实现以下功能:
- 添加、删除、修改学生基本信息,如姓名、学号、性别等;
- 添加、删除、修改学生课程信息,如课程名称、成绩等;
- 查询学生基本信息和课程信息;
- 统计每个学生的成绩绩点、课程平均成绩等信息;
- 实现各种排序和筛选功能等。
实现步骤
1. 设计数据结构
首先需要确定学生信息和成绩的数据结构。在本系统中,我们将采用结构体来表示学生和课程信息:
struct Student {
string name; // 姓名
string id; // 学号
string gender; // 性别
vector<Course> courses; // 所修课程
};
struct Course {
string name; // 课程名称
double score; // 成绩
};
其中,Course
结构体表示一个学生所修的一门课程,包括课程名称和成绩。而Student
结构体则表示一个学生的基本信息和所修课程信息,包括姓名、学号、性别和所修课程。其中,courses
是一个存放Course
结构体的向量。
2. 实现功能模块
根据系统功能介绍,需要实现多个功能模块,包括学生信息管理、课程信息管理、查询、统计、排序和筛选等。下面简要介绍每个模块的实现方法:
学生信息管理
学生信息管理包括添加、删除和修改学生信息。其中,添加学生信息可以通过向一个存储学生信息的向量中添加一个Student
结构体实现:
void addStudent(vector<Student>& students, Student student) {
students.push_back(student);
}
删除和修改学生信息可以通过遍历向量并查找目标学生实现:
void deleteStudent(vector<Student>& students, string id) {
for (auto it = students.begin(); it != students.end(); it++) {
if (it->id == id) {
students.erase(it);
break;
}
}
}
void updateStudent(vector<Student>& students, string id, Student student) {
for (auto& s : students) {
if (s.id == id) {
s = student;
break;
}
}
}
课程信息管理
课程信息管理包括添加、删除和修改学生所修的课程信息。其中,添加课程信息可以通过向目标学生的courses
向量中添加一个Course
结构体实现:
void addCourse(vector<Student>& students, string id, Course course) {
for (auto& s : students) {
if (s.id == id) {
s.courses.push_back(course);
break;
}
}
}
删除和修改课程信息可以通过遍历目标学生所修课程信息的向量并查找目标课程实现:
void deleteCourse(vector<Student>& students, string id, string name) {
for (auto& s : students) {
if (s.id == id) {
for (auto it = s.courses.begin(); it != s.courses.end(); it++) {
if (it->name == name) {
s.courses.erase(it);
break;
}
}
break;
}
}
}
void updateCourse(vector<Student>& students, string id, string name, Course course) {
for (auto& s : students) {
if (s.id == id) {
for (auto& c : s.courses) {
if (c.name == name) {
c = course;
break;
}
}
break;
}
}
}
查询
查询模块可以实现按学号或姓名查询学生信息,以及查询指定学生所修的课程信息。其中,查询学生信息可以通过遍历向量并筛选目标学生信息实现:
vector<Student> searchStudent(vector<Student>& students, string keyword) {
vector<Student> result;
for (auto& s : students) {
if (s.id == keyword || s.name == keyword) {
result.push_back(s);
}
}
return result;
}
查询课程信息可以通过遍历目标学生所修课程信息的向量并查找目标课程实现:
vector<Course> searchCourse(vector<Student>& students, string id, string name) {
for (auto& s : students) {
if (s.id == id) {
for (auto& c : s.courses) {
if (c.name == name) {
return {c};
}
}
return {};
}
}
return {};
}
统计
统计模块可以实现统计所有学生的平均成绩、个人绩点和课程平均成绩等信息。其中,平均成绩和课程平均成绩可以通过遍历计算实现:
double getAverageScore(vector<Student>& students) {
double totalScore = 0.0;
int count = 0;
for (auto& s : students) {
for (auto& c : s.courses) {
totalScore += c.score;
count++;
}
}
return totalScore / count;
}
unordered_map<string, double> getAverageCourseScore(vector<Student>& students) {
unordered_map<string, double> result;
unordered_map<string, int> count;
for (auto& s : students) {
for (auto& c : s.courses) {
result[c.name] += c.score;
count[c.name]++;
}
}
for (auto& [name, score] : result) {
score /= count[name];
}
return result;
}
个人绩点可以通过将成绩转化为绩点进行计算实现:
double getGPA(double score) {
if (score >= 90.0) {
return 4.0;
} else if (score >= 80.0) {
return 3.0;
} else if (score >= 70.0) {
return 2.0;
} else if (score >= 60.0) {
return 1.0;
} else {
return 0.0;
}
}
double getPersonalGPA(vector<Course>& courses) {
double totalGPA = 0.0;
double totalCredit = 0.0;
for (auto& c : courses) {
double gpa = getGPA(c.score);
totalGPA += gpa * 1.0; // 1.0表示课程学分
totalCredit += 1.0;
}
return totalGPA / totalCredit;
}
排序和筛选
排序和筛选模块可以实现按成绩、绩点等信息排序和筛选学生信息。其中,排序可以通过调用STL算法库中的sort
函数实现。需要注意的是,如果要按照某个成员变量排序,需要自定义一个比较器(比如按照成绩从高到低排序的比较器代码如下所示):
bool cmpScore(const Student& a, const Student& b) {
double scoreA = 0.0;
double scoreB = 0.0;
for (auto& c : a.courses) {
scoreA += c.score;
}
for (auto& c : b.courses) {
scoreB += c.score;
}
return scoreA > scoreB;
}
void sortStudentByScore(vector<Student>& students) {
sort(students.begin(), students.end(), cmpScore);
}
筛选可以通过遍历向量并筛选满足条件的目标信息实现,如筛选成绩大于某个阈值的学生信息代码如下所示:
vector<Student> filterStudentByScore(vector<Student>& students, double threshold) {
vector<Student> result;
for (auto& s : students) {
double score = 0.0;
for (auto& c : s.courses) {
score += c.score;
}
if (score >= threshold) {
result.push_back(s);
}
}
return result;
}
3. 示例说明
下面以添加学生信息和添加课程信息为例,给出具体实现的示例说明。
示例1:添加学生信息
假设有一个名为students
的向量存储学生信息。要想向其中添加一个名为“张三”的学生信息,可以按照如下代码进行操作:
Student zhangsan;
zhangsan.name = "张三";
zhangsan.id = "20210001";
zhangsan.gender = "男";
addStudent(students, zhangsan);
其中,Student
结构体的成员变量分别为“姓名”、“学号”、“性别”,addStudent
函数用于将新的学生信息添加到students
向量中。
示例2:添加课程信息
假设有一个名为students
的向量存储学生信息,需要向其中添加一个学号为“20210001”、课程名为“计算机导论”、成绩为90.0的成绩信息。可以按照如下代码进行操作:
Course jisuanjidao;
jisuanjidao.name = "计算机导论";
jisuanjidao.score = 90.0;
addCourse(students, "20210001", jisuanjidao);
其中,Course
结构体的成员变量分别为“课程名称”、“成绩”,addCourse
函数用于将新的课程信息添加到目标学生的courses
向量中,目标学生的学号为“20210001”。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现学生成绩管理系统 - Python技术站