《类与对象》实验
《类与对象》实验任务书
一、实验要求
本次《类与对象》实验,是基于 “高级程序设计”和“高级程序设计实验”课程学习内容的重要实践环节,实验目的是通过综合性实验,培养学生面向对象程序设计思想,掌握类和对象相关概念和编程技能,培养和提高学生的独立分析问题、解决实际问题的能力和计算机语言编程能力。要求学生独立完成相关设计题所规定的任务。
进度安排建议如下:
1、阅读设计题目、任务内容,规划设计进度,并进行软件各相关功能模块的设计。
2、在编译环境下,用面向对象的程序设计思想进行软件设计、开发及调试。
3、整理实验,按cg上要求完成实验总结。
二、实验目的
能够使用面向对象程序设计思想构造灵活、具有一定弹性和扩展型的面向对象程序。通过程序调试加深对抽象、封装、类、对象等面向对象概念的理解,掌握方法重载、访问控制及构造函数等机制的实现方法。
三、实验任务
本次实验的任务为设计实现一个“小型学生成绩管理系统”,用于管理学生各科成绩信息,并能提供各种数据分析和处理功能。要求系统设计具有一定弹性和可扩展性,使得后续维护和扩展功能更容易,增加或修改系统功能变得更简单。
基本要求和功能如下:
1、管理的信息包括但不限于,学生姓名,学号,班级,专业,课程名称,课程编号,课程成绩等,课程成绩2到3门即可;
2、系统可以显示全部信息,可以增加、删除、修改和查询各种情况的学生信息;
3、系统可以统计和分析相关成绩,例如:平均成绩,最高分成绩,最低分成绩等;
四、成绩评定要素
本次实验成绩占期末总评成绩的20%,实验成绩百分制。
实验考核标准如下:
1. 程序设计:类的定义是否合理,封装是否完好等,程序的可用性,实用性,通用性,可扩充性(程序设计源代码)(40%)
2. 实验操作:调试程序的能力(30%)
3. 实验总结:总结的完成情况(30%)
源码如下:
#include <iostream> // 引入输入输出流库,用于控制台的输入输出操作
#include <string> // 引入字符串库,用于处理字符串
#include <vector> // 引入向量库,用于动态数组操作
#include <algorithm> // 引入算法库,用于排序、查找等算法操作
#include <cstdlib> // 引入标准库,包含一些常用的函数和宏定义
#include <map> // 引入映射库,用于键值对的存储
// 学生类定义
class Student
{
public:
std::string name; // 学生姓名
std::string id; // 学生学号
std::string className; // 学生所在班级
std::string major; // 学生所学专业
// 构造函数,用于创建Student对象时初始化成员变量
Student(const std::string &name, const std::string &id, const std::string &className, const std::string &major)
: name(name), id(id), className(className), major(major) {}
};
// 课程类定义
class Course
{
public:
std::string name; // 课程名称
std::string code; // 课程编号
// 构造函数,用于创建Course对象时初始化成员变量
Course(const std::string &name, const std::string &code)
: name(name), code(code) {}
};
// 成绩类定义
class Score
{
public:
std::string studentId; // 学生学号
std::string courseCode; // 课程编号
int grade; // 成绩
// 构造函数,用于创建Score对象时初始化成员变量
Score(const std::string &studentId, const std::string &courseCode, int grade)
: studentId(studentId), courseCode(courseCode), grade(grade) {}
};
// 学生成绩管理类
class StudentScoreManager
{
private:
// 存储学生信息的向量
std::vector<Student> students;
// 存储课程信息的向量
std::vector<Course> courses;
// 存储成绩信息的向量
std::vector<Score> scores;
public:
// 添加学生到学生信息向量中
void addStudent(const Student &student)
{
students.push_back(student);
}
// 添加课程到课程信息向量中
void addCourse(const Course &course)
{
courses.push_back(course);
}
// 添加成绩到成绩信息向量中
void addScore(const Score &score)
{
scores.push_back(score);
}
// 显示所有信息,包括学生、课程和成绩
void displayAll() const
{
// 遍历学生信息向量并打印
for (const auto &student : students)
{
std::cout << "姓名: " << student.name
<< "\n"
<< "ID: " << student.id << "\n"
<< "班级: " << student.className << "\n"
<< "专业: " << student.major << "\n"
<< std::endl;
}
// 遍历课程信息向量并打印
for (const auto &course : courses)
{
std::cout << "课程名称: " << course.name
<< ", 课程代码: " << course.code << std::endl;
}
// 遍历成绩信息向量并打印
for (const auto &score : scores)
{
std::cout << "学生ID: " << score.studentId
<< ", 课程代码: " << score.courseCode
<< ", 成绩: " << score.grade << std::endl;
}
// 暂停程序,等待用户按键(Windows系统)
system("pause");
// 清除控制台屏幕(Windows系统)
system("cls");
}
// 统计分析成绩(每个科目独立)
void analyzeScores() const
{
// 创建一个映射,键为课程代码,值为成绩向量
std::map<std::string, std::vector<int>> courseGrades;
// 遍历成绩向量,将成绩按课程代码分类存储
for (const auto &score : scores)
{
courseGrades[score.courseCode].push_back(score.grade);
}
// 如果没有成绩可以分析,则输出提示信息并退出函数
if (courseGrades.empty())
{
std::cout << "没有可以分析的成绩" << std::endl;
system("pause"); // 暂停程序,等待用户按键
system("cls"); // 清除控制台屏幕
return;
}
// 遍历映射,对每一门课程计算平均分、最高分和最低分
for (const auto &entry : courseGrades)
{
const std::string &courseCode = entry.first; // 获取课程代码
const std::vector<int> &grades = entry.second; // 获取成绩向量
int sum = 0;
for (int grade : grades)
{
sum += grade; // 计算成绩总和
}
double average = static_cast<double>(sum) / grades.size(); // 计算平均分
int maxGrade = *std::max_element(grades.begin(), grades.end()); // 获取最高分
int minGrade = *std::min_element(grades.begin(), grades.end()); // 获取最低分
// 输出课程代码、平均分、最高分和最低分
std::cout << "课程代码: " << courseCode << "\n";
std::cout << "平均分: " << average << "\n";
std::cout << "最高分: " << maxGrade << "\n";
std::cout << "最低分: " << minGrade << "\n\n";
}
system("pause"); // 暂停程序,等待用户按键
system("cls"); // 清除控制台屏幕
}
// 删除学生信息
void deleteStudent(const std::string &studentId)
{
// 使用remove_if算法查找并移除匹配给定学生ID的学生信息
auto it = std::remove_if(students.begin(), students.end(), [&studentId](const Student &student)
{ return student.id == studentId; });
// 移除从it到end()之间的元素,完成删除操作
students.erase(it, students.end());
}
// 修改学生信息
void modifyStudent(const std::string &studentId, const Student &newStudent)
{
// 遍历学生列表
for (auto &student : students)
{
// 如果找到ID匹配的学生
if (student.id == studentId)
{
// 使用新的学生信息替换旧的学生信息
student = newStudent;
// 修改成功,退出循环
return;
}
}
// 如果没有找到匹配的学生,则此函数不会输出任何信息,可能需要添加提示信息
}
// 查询学生信息
void queryStudent(const std::string &studentId)
{
// 遍历学生列表
for (const auto &student : students)
{
// 如果找到ID匹配的学生
if (student.id == studentId)
{
// 输出学生的信息
std::cout << "姓名: " << student.name
<< "\n"
<< "ID: " << student.id << "\n"
<< "班级: " << student.className << "\n"
<< "专业: " << student.major << "\n"
<< std::endl;
// 暂停程序,等待用户按键
system("pause");
// 清除控制台屏幕
system("cls");
// 查询成功,退出函数
return;
}
}
// 如果没有找到匹配的学生,输出提示信息
std::cout << "学生未找到." << std::endl;
// 暂停程序,等待用户按键
system("pause");
// 清除控制台屏幕
system("cls");
}
// 删除课程信息
void deleteCourse(const std::string &courseCode)
{
// 使用remove_if算法查找并移除匹配给定课程代码的课程信息
auto it = std::remove_if(courses.begin(), courses.end(), [&courseCode](const Course &course)
{ return course.code == courseCode; });
// 移除从it到end()之间的元素,完成删除操作
courses.erase(it, courses.end());
}
// 修改课程信息
void modifyCourse(const std::string &courseCode, const Course &newCourse)
{
// 遍历课程列表
for (auto &course : courses)
{
// 如果找到课程代码匹配的课程
if (course.code == courseCode)
{
// 使用新的课程信息替换旧的课程信息
course = newCourse;
// 修改成功,退出循环
return;
}
}
// 如果没有找到匹配的课程,则此函数不会输出任何信息,可能需要添加提示信息
}
// 查询课程信息
void queryCourse(const std::string &courseCode)
{
// 遍历课程列表
for (const auto &course : courses)
{
// 如果找到课程代码匹配的课程
if (course.code == courseCode)
{
// 输出课程名称和课程代码
std::cout << "课程名称: " << course.name
<< ", 课程代码: " << course.code << std::endl;
// 暂停程序,等待用户按键
system("pause");
// 清除控制台屏幕
system("cls");
// 查询成功,退出函数
return;
}
}
// 如果没有找到匹配的课程,输出提示信息
std::cout << "课程未找到." << std::endl;
// 暂停程序,等待用户按键
system("pause");
// 清除控制台屏幕
system("cls");
}
// 删除成绩信息
void deleteScore(const std::string &studentId, const std::string &courseCode)
{
// 使用remove_if算法查找并移除匹配给定学生ID和课程代码的成绩信息
auto it = std::remove_if(scores.begin(), scores.end(), [&studentId, &courseCode](const Score &score)
{ return score.studentId == studentId && score.courseCode == courseCode; });
// 移除从it到end()之间的元素,完成删除操作
scores.erase(it, scores.end());
}
// 修改成绩信息
void modifyScore(const std::string &studentId, const std::string &courseCode, int newGrade)
{
// 遍历成绩列表
for (auto &score : scores)
{
// 如果找到匹配的学生ID和课程代码的成绩
if (score.studentId == studentId && score.courseCode == courseCode)
{
// 使用新的成绩替换旧的成绩
score.grade = newGrade;
// 修改成功,退出循环
return;
}
}
// 如果没有找到匹配的成绩,则此函数不会输出任何信息,可能需要添加提示信息
}
// 查询成绩信息
void queryScore(const std::string &studentId, const std::string &courseCode)
{
// 遍历成绩列表
for (const auto &score : scores)
{
// 如果找到匹配的学生ID和课程代码的成绩
if (score.studentId == studentId && score.courseCode == courseCode)
{
// 输出学生ID、课程代码和成绩
std::cout << "学生ID: " << score.studentId
<< ", 课程代码: " << score.courseCode
<< ", 成绩: " << score.grade << std::endl;
// 暂停程序,等待用户按键
system("pause");
// 清除控制台屏幕
system("cls");
// 查询成功,退出函数
return;
}
}
// 如果没有找到匹配的成绩,输出提示信息
std::cout << "成绩未找到." << std::endl;
// 暂停程序,等待用户按键
system("pause");
// 清除控制台屏幕
system("cls");
}
};
int main()
{
StudentScoreManager manager;
int choice;
do
{
std::cout << "学生成绩管理系统" << std::endl;
std::cout << "请选择操作:" << std::endl;
std::cout << "1. 添加学生" << std::endl;
std::cout << "2. 添加课程" << std::endl;
std::cout << "3. 添加成绩" << std::endl;
std::cout << "4. 分析成绩" << std::endl;
std::cout << "5. 显示所有信息" << std::endl;
std::cout << "6. 删除学生信息" << std::endl;
std::cout << "7. 修改学生信息" << std::endl;
std::cout << "8. 查询学生信息" << std::endl;
std::cout << "9. 删除课程信息" << std::endl;
std::cout << "10. 修改课程信息" << std::endl;
std::cout << "11. 查询课程信息" << std::endl;
std::cout << "12. 删除成绩信息" << std::endl;
std::cout << "13. 修改成绩信息" << std::endl;
std::cout << "14. 查询成绩信息" << std::endl;
std::cout << "0. 退出" << std::endl;
std::cin >> choice;
switch (choice)
{
case 1:
{
system("cls");
std::string name, id, className, major;
std::cout << "请输入学生姓名: ";
std::cin >> name;
std::cout << "请输入学生ID: ";
std::cin >> id;
std::cout << "请输入学生班级: ";
std::cin >> className;
std::cout << "请输入学生专业: ";
std::cin >> major;
manager.addStudent(Student(name, id, className, major));
std::cout << "学生添加成功!" << std::endl;
system("pause");
system("cls");
break;
}
case 2:
// 添加课程逻辑
{
system("cls");
std::string courseName, courseCode;
std::cout << "请输入课程名称: ";
std::cin >> courseName;
std::cout << "请输入课程代码: ";
std::cin >> courseCode;
manager.addCourse(Course(courseName, courseCode));
std::cout << "课程添加成功!" << std::endl;
system("pause");
system("cls");
break;
}
case 3:
// 添加成绩
{
system("cls");
std::string studentId, courseCode;
int score;
std::cout << "请输入学生ID: ";
std::cin >> studentId;
std::cout << "请输入课程代码: ";
std::cin >> courseCode;
std::cout << "请输入成绩: ";
std::cin >> score;
manager.addScore(Score(studentId, courseCode, score));
std::cout << "成绩添加成功!" << std::endl;
system("pause");
system("cls");
break;
}
case 4:
{
// 分析成绩
system("cls");
manager.analyzeScores();
break;
}
case 5:
{
// 显示所有信息
system("cls");
manager.displayAll();
break;
}
case 6:
{
// 删除学生信息
system("cls");
std::string studentId;
std::cout << "请输入要删除的学生ID: ";
std::cin >> studentId;
manager.deleteStudent(studentId);
std::cout << "学生信息删除成功!" << std::endl;
system("pause");
system("cls");
break;
}
case 7:
{
// 修改学生信息
system("cls");
std::string studentId, newName, newClassName, newMajor;
std::cout << "请输入要修改的学生ID: ";
std::cin >> studentId;
std::cout << "请输入新的学生姓名: ";
std::cin >> newName;
std::cout << "请输入新的班级: ";
std::cin >> newClassName;
std::cout << "请输入新的专业: ";
std::cin >> newMajor;
manager.modifyStudent(studentId, Student(newName, studentId, newClassName, newMajor));
std::cout << "学生信息修改成功!" << std::endl;
system("pause");
break;
}
case 8:
{
// 查询学生信息
system("cls");
std::string studentId;
std::cout << "请输入要查询的学生ID: ";
std::cin >> studentId;
manager.queryStudent(studentId);
system("pause");
system("cls");
break;
}
case 9:
{
// 删除课程信息
system("cls");
std::string courseCode;
std::cout << "请输入要删除的课程代码: ";
std::cin >> courseCode;
manager.deleteCourse(courseCode);
std::cout << "课程信息删除成功!" << std::endl;
system("pause");
system("cls");
break;
}
case 10:
{
// 修改课程信息
system("cls");
std::string courseCode, newName;
std::cout << "请输入要修改的课程代码: ";
std::cin >> courseCode;
std::cout << "请输入新的课程名称: ";
std::cin >> newName;
manager.modifyCourse(courseCode, Course(newName, courseCode));
std::cout << "课程信息修改成功!" << std::endl;
system("pause");
system("cls");
break;
}
case 11:
{
// 查询课程信息
system("cls");
std::string courseCode;
std::cout << "请输入要查询的课程代码: ";
std::cin >> courseCode;
manager.queryCourse(courseCode);
system("pause");
system("cls");
break;
}
case 12:
{
// 删除成绩信息
system("cls");
std::string studentId, courseCode;
std::cout << "请输入要删除成绩的学生ID: ";
std::cin >> studentId;
std::cout << "请输入要删除成绩的课程代码: ";
std::cin >> courseCode;
manager.deleteScore(studentId, courseCode);
std::cout << "成绩信息删除成功!" << std::endl;
system("pause");
system("cls");
break;
}
case 13:
{
// 修改成绩信息
system("cls");
std::string studentId, courseCode;
int newGrade;
std::cout << "请输入要修改成绩的学生ID: ";
std::cin >> studentId;
std::cout << "请输入要修改成绩的课程代码: ";
std::cin >> courseCode;
std::cout << "请输入新的成绩: ";
std::cin >> newGrade;
manager.modifyScore(studentId, courseCode, newGrade);
std::cout << "成绩信息修改成功!" << std::endl;
system("pause");
system("cls");
break;
}
case 14:
{
// 查询成绩信息
system("cls");
std::string studentId, courseCode;
std::cout << "请输入要查询成绩的学生ID: ";
std::cin >> studentId;
std::cout << "请输入要查询成绩的课程代码: ";
std::cin >> courseCode;
manager.queryScore(studentId, courseCode);
system("pause");
system("cls");
break;
}
case 0:
{
// 退出程序
std::cout << "退出程序。" << std::endl;
break;
}
default:
{
system("cls");
std::cout << "无效的选择,请重新输入。" << std::endl;
system("pause");
system("cls");
break;
}
}
} while (choice != 0);
return 0;
}
今天的内容就分享这么多
求三连!!!
求关注!!!