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

《类与对象》实验


《类与对象》实验任务书

一、实验要求

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

     进度安排建议如下:

      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;
}

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

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-08 04:18:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-08 04:18:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-08 04:18:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-08 04:18:03       20 阅读

热门阅读

  1. 洛谷 P3512 [POI2010] PIL-Pilots

    2024-04-08 04:18:03       13 阅读
  2. 06-kafka配置

    2024-04-08 04:18:03       11 阅读
  3. 出国留学哪个国家好又便宜

    2024-04-08 04:18:03       52 阅读
  4. Redis

    Redis

    2024-04-08 04:18:03      18 阅读
  5. MySQL CASE 语句

    2024-04-08 04:18:03       16 阅读
  6. 机器学习入门实践-鸢尾花分类

    2024-04-08 04:18:03       16 阅读