《类与对象》实验
《类与对象》实验任务书
一、实验要求
本次《类与对象》实验,是基于 “高级程序设计”和“高级程序设计实验”课程学习内容的重要实践环节,实验目的是通过综合性实验,培养学生面向对象程序设计思想,掌握类和对象相关概念和编程技能,培养和提高学生的独立分析问题、解决实际问题的能力和计算机语言编程能力。要求学生独立完成相关设计题所规定的任务。进度安排建议如下: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;
}
今天的内容就分享这么多
求三连!!!
求关注!!!