实现学生类(学生姓名,学号)、选课记录类(课程号,学生号,成绩)、课程类(课程号,课程名), 实现一个某个学校的学校学生成绩单类(学校名称,多学生,多课程,多人成绩) 1自行初始化学校学生成绩单; 2根据输入的学生姓名 可以得到 该学生的所选的课程; 3 根据输入的课程名称可以得到选该课的学生 4 根据输入的课程名称每一门课程的平均分 5 根据输入的学号,输出该学生的的平均分 6 可以使用 vector模板 find模板函数 7 学生的的平均分大于60的所有学生

时间: 2024-02-19 18:57:43 浏览: 38
RAR

courseselect.rar_数据库 学生选课_数据库课程设计_选课 数据库

好的,我来实现这个需求。 首先是学生类、选课记录类和课程类的实现: ```cpp #include <string> #include <vector> class Student { public: Student(std::string name, std::string id) : name_(name), id_(id) {} const std::string& name() const { return name_; } const std::string& id() const { return id_; } private: std::string name_; std::string id_; }; class CourseRecord { public: CourseRecord(std::string course_id, std::string student_id, int score) : course_id_(course_id), student_id_(student_id), score_(score) {} const std::string& course_id() const { return course_id_; } const std::string& student_id() const { return student_id_; } int score() const { return score_; } private: std::string course_id_; std::string student_id_; int score_; }; class Course { public: Course(std::string id, std::string name) : id_(id), name_(name) {} const std::string& id() const { return id_; } const std::string& name() const { return name_; } private: std::string id_; std::string name_; }; ``` 接下来是学校学生成绩单类的实现: ```cpp #include <string> #include <vector> #include <algorithm> #include <numeric> class SchoolGradeReport { public: SchoolGradeReport(std::string school_name, const std::vector<Student>& students, const std::vector<Course>& courses, const std::vector<CourseRecord>& course_records) : school_name_(school_name), students_(students), courses_(courses), course_records_(course_records) {} const std::string& school_name() const { return school_name_; } const std::vector<Student>& students() const { return students_; } const std::vector<Course>& courses() const { return courses_; } const std::vector<CourseRecord>& course_records() const { return course_records_; } std::vector<CourseRecord> course_records_of_student(const std::string& student_name) const { auto student_it = std::find_if(students_.begin(), students_.end(), [&](const Student& student) { return student.name() == student_name; }); if (student_it == students_.end()) { return {}; } std::vector<CourseRecord> result; std::copy_if(course_records_.begin(), course_records_.end(), std::back_inserter(result), [&](const CourseRecord& course_record) { return course_record.student_id() == student_it->id(); }); return result; } std::vector<Student> students_of_course(const std::string& course_name) const { auto course_it = std::find_if(courses_.begin(), courses_.end(), [&](const Course& course) { return course.name() == course_name; }); if (course_it == courses_.end()) { return {}; } std::vector<Student> result; for (const auto& course_record : course_records_) { if (course_record.course_id() == course_it->id()) { auto student_it = std::find_if(students_.begin(), students_.end(), [&](const Student& student) { return student.id() == course_record.student_id(); }); if (student_it != students_.end()) { result.push_back(*student_it); } } } return result; } float average_score_of_course(const std::string& course_name) const { auto course_it = std::find_if(courses_.begin(), courses_.end(), [&](const Course& course) { return course.name() == course_name; }); if (course_it == courses_.end()) { return 0.0f; } std::vector<int> scores; for (const auto& course_record : course_records_) { if (course_record.course_id() == course_it->id()) { scores.push_back(course_record.score()); } } if (scores.empty()) { return 0.0f; } else { return static_cast<float>(std::accumulate(scores.begin(), scores.end(), 0)) / scores.size(); } } float average_score_of_student(const std::string& student_name) const { auto student_it = std::find_if(students_.begin(), students_.end(), [&](const Student& student) { return student.name() == student_name; }); if (student_it == students_.end()) { return 0.0f; } std::vector<int> scores; for (const auto& course_record : course_records_) { if (course_record.student_id() == student_it->id()) { scores.push_back(course_record.score()); } } if (scores.empty()) { return 0.0f; } else { return static_cast<float>(std::accumulate(scores.begin(), scores.end(), 0)) / scores.size(); } } std::vector<Student> students_with_average_score_above(float threshold) const { std::vector<Student> result; for (const auto& student : students_) { if (average_score_of_student(student.name()) > threshold) { result.push_back(student); } } return result; } private: std::string school_name_; std::vector<Student> students_; std::vector<Course> courses_; std::vector<CourseRecord> course_records_; }; ``` 这个类的构造函数需要传入学校名称、学生列表、课程列表和选课记录列表。接下来可以使用这个类来实现各种需求。 1. 自行初始化学校学生成绩单 ```cpp std::vector<Student> students = { {"Alice", "001"}, {"Bob", "002"}, {"Charlie", "003"} }; std::vector<Course> courses = { {"101", "Math"}, {"102", "English"}, {"103", "Science"} }; std::vector<CourseRecord> course_records = { {"101", "001", 90}, {"101", "002", 85}, {"102", "001", 80}, {"102", "003", 92}, {"103", "002", 88}, {"103", "003", 95} }; SchoolGradeReport report("School Name", students, courses, course_records); ``` 2. 根据输入的学生姓名可以得到该学生的所选的课程 ```cpp std::vector<CourseRecord> records = report.course_records_of_student("Alice"); for (const auto& record : records) { const auto& course = std::find_if(courses.begin(), courses.end(), [&](const Course& course) { return course.id() == record.course_id(); }); if (course != courses.end()) { std::cout << course->name() << std::endl; } } ``` 3. 根据输入的课程名称可以得到选该课的学生 ```cpp std::vector<Student> students = report.students_of_course("Math"); for (const auto& student : students) { std::cout << student.name() << std::endl; } ``` 4. 根据输入的课程名称每一门课程的平均分 ```cpp float avg_score = report.average_score_of_course("Math"); std::cout << "Math: " << avg_score << std::endl; ``` 5. 根据输入的学号,输出该学生的的平均分 ```cpp float avg_score = report.average_score_of_student("Alice"); std::cout << "Alice: " << avg_score << std::endl; ``` 6. 可以使用 vector模板 find模板函数 上面的代码已经演示了如何使用 `std::find_if` 函数查找学生和课程。 7. 学生的的平均分大于60的所有学生 ```cpp std::vector<Student> students = report.students_with_average_score_above(60.0f); for (const auto& student : students) { std::cout << student.name() << std::endl; } ```
阅读全文

相关推荐

最新推荐

recommend-type

【java课设】学生选课系统.pdf

学生信息包括学号、姓名、性别、年龄、系别、班级和联系方式等,而课程信息则涵盖开课教师、课程代码、课程名称、课程性质、总学时、学分、开课学期等。选课系统需要有一个专门的管理类来处理选课操作,确保数据的...
recommend-type

C语言实现简单学生选课管理系统

student结构体用于存储学生信息,包括姓名、学号、学院和班级、总学分、已选课总学分、学生登陆密码、选课总数和记录选课课程的编号。course结构体用于存储课程信息,包括课程编号、课程名称、课程性质、开课学期、...
recommend-type

数据库系统课程设计报告-教学管理系统

系统应包含各类用户的基本信息,如姓名、学号、联系方式等,还需管理课程信息、考试安排、成绩记录等。 2.3 **处理要求** 系统需要提供数据录入、修改、查询、删除等基本操作,并能根据用户权限进行相应的功能限制...
recommend-type

数据库课程设计题目 VC++ MFC

- 选课功能:允许学生选择课程,管理班级选课情况。 - 成绩管理:录入、修改、删除成绩,更新学生成绩单。 - 成绩统计/排名:计算平均分、排名,为教学评估提供数据。 - 特殊情况处理:如留级、休学等,更新学生...
recommend-type

Java应用开发期末考试.docx

本资源为 Java 应用开发期末考试项目,旨在实现一个窗口模式的学生选课系统。该系统有三类用户:教师、学生和管理员,每类用户都有其特定的功能和权限。 ER 图 ER 图是一种常用的数据库设计方法,用于描述实体之间...
recommend-type

SSM动力电池数据管理系统源码及数据库详解

资源摘要信息:"SSM动力电池数据管理系统(源码+数据库)301559" 该动力电池数据管理系统是一个完整的项目,基于Java的SSM(Spring, SpringMVC, Mybatis)框架开发,集成了前端技术Vue.js,并使用Redis作为数据缓存,适用于电动汽车电池状态的在线监控和管理。 1. 系统架构设计: - **Spring框架**:作为整个系统的依赖注入容器,负责管理整个系统的对象生命周期和业务逻辑的组织。 - **SpringMVC框架**:处理前端发送的HTTP请求,并将请求分发到对应的处理器进行处理,同时也负责返回响应到前端。 - **Mybatis框架**:用于数据持久化操作,主要负责与数据库的交互,包括数据的CRUD(创建、读取、更新、删除)操作。 2. 数据库管理: - 系统中包含数据库设计,用于存储动力电池的数据,这些数据可以包括电池的电压、电流、温度、充放电状态等。 - 提供了动力电池数据格式的设置功能,可以灵活定义电池数据存储的格式,满足不同数据采集系统的要求。 3. 数据操作: - **数据批量导入**:为了高效处理大量电池数据,系统支持批量导入功能,可以将数据以文件形式上传至服务器,然后由系统自动解析并存储到数据库中。 - **数据查询**:实现了对动力电池数据的查询功能,可以根据不同的条件和时间段对电池数据进行检索,以图表和报表的形式展示。 - **数据报警**:系统能够根据预设的报警规则,对特定的电池数据异常状态进行监控,并及时发出报警信息。 4. 技术栈和工具: - **Java**:使用Java作为后端开发语言,具有良好的跨平台性和强大的生态支持。 - **Vue.js**:作为前端框架,用于构建用户界面,通过与后端进行数据交互,实现动态网页的渲染和用户交互逻辑。 - **Redis**:作为内存中的数据结构存储系统,可以作为数据库、缓存和消息中间件,用于减轻数据库压力和提高系统响应速度。 - **Idea**:指的可能是IntelliJ IDEA,作为Java开发的主要集成开发环境(IDE),提供了代码自动完成、重构、代码质量检查等功能。 5. 文件名称解释: - **CS741960_***:这是压缩包子文件的名称,根据命名规则,它可能是某个版本的代码快照或者备份,具体的时间戳表明了文件创建的日期和时间。 这个项目为动力电池的数据管理提供了一个高效、可靠和可视化的平台,能够帮助相关企业或个人更好地监控和管理电动汽车电池的状态,及时发现并处理潜在的问题,以保障电池的安全运行和延长其使用寿命。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MapReduce分区机制揭秘:作业效率提升的关键所在

![MapReduce分区机制揭秘:作业效率提升的关键所在](http://www.uml.org.cn/bigdata/images/20180511413.png) # 1. MapReduce分区机制概述 MapReduce是大数据处理领域的一个核心概念,而分区机制作为其关键组成部分,对于数据处理效率和质量起着决定性作用。在本章中,我们将深入探讨MapReduce分区机制的工作原理以及它在数据处理流程中的基础作用,为后续章节中对分区策略分类、负载均衡、以及分区故障排查等内容的讨论打下坚实的基础。 MapReduce的分区操作是将Map任务的输出结果根据一定规则分发给不同的Reduce
recommend-type

在电子商务平台上,如何通过CRM系统优化客户信息管理和行为分析?请结合DELL的CRM策略给出建议。

构建电商平台的CRM系统是一项复杂的任务,需要综合考虑客户信息管理、行为分析以及与客户的多渠道互动。DELL公司的CRM策略提供了一个绝佳的案例,通过它我们可以得到构建电商平台CRM系统的几点启示。 参考资源链接:[提升电商客户体验:DELL案例下的CRM策略](https://wenku.csdn.net/doc/55o3g08ifj?spm=1055.2569.3001.10343) 首先,CRM系统的核心在于以客户为中心,这意味着所有的功能和服务都应该围绕如何提升客户体验来设计。DELL通过其直接销售模式和个性化服务成功地与客户建立起了长期的稳定关系,这提示我们在设计CRM系统时要重
recommend-type

R语言桑基图绘制与SCI图输入文件代码分析

资源摘要信息:"桑基图_R语言绘制SCI图的输入文件及代码" 知识点: 1.桑基图概念及其应用 桑基图(Sankey Diagram)是一种特定类型的流程图,以直观的方式展示流经系统的能量、物料或成本等的数量。其特点是通过流量的宽度来表示数量大小,非常适合用于展示在不同步骤或阶段中数据量的变化。桑基图常用于能源转换、工业生产过程分析、金融资金流向、交通物流等领域。 2.R语言简介 R语言是一种用于统计分析、图形表示和报告的语言和环境。它特别适合于数据挖掘和数据分析,具有丰富的统计函数库和图形包,可以用于创建高质量的图表和复杂的数据模型。R语言在学术界和工业界都得到了广泛的应用,尤其是在生物信息学、金融分析、医学统计等领域。 3.绘制桑基图在R语言中的实现 在R语言中,可以利用一些特定的包(package)来绘制桑基图。比较流行的包有“ggplot2”结合“ggalluvial”,以及“plotly”。这些包提供了创建桑基图的函数和接口,用户可以通过编程的方式绘制出美观实用的桑基图。 4.输入文件在绘制桑基图中的作用 在使用R语言绘制桑基图时,通常需要准备输入文件。输入文件主要包含了桑基图所需的数据,如流量的起点、终点以及流量的大小等信息。这些数据必须以一定的结构组织起来,例如表格形式。R语言可以读取包括CSV、Excel、数据库等不同格式的数据文件,然后将这些数据加载到R环境中,为桑基图的绘制提供数据支持。 5.压缩文件的处理及文件名称解析 在本资源中,给定的压缩文件名称为"27桑基图",暗示了该压缩包中包含了与桑基图相关的R语言输入文件及代码。此压缩文件可能包含了以下几个关键部分: a. 示例数据文件:可能是一个或多个CSV或Excel文件,包含了桑基图需要展示的数据。 b. R脚本文件:包含了一系列用R语言编写的代码,用于读取输入文件中的数据,并使用特定的包和函数绘制桑基图。 c. 说明文档:可能是一个Markdown或PDF文件,描述了如何使用这些输入文件和代码,以及如何操作R语言来生成桑基图。 6.如何在R语言中使用桑基图包 在R环境中,用户需要先安装和加载相应的包,然后编写脚本来定义桑基图的数据结构和视觉样式。脚本中会包括数据的读取、处理,以及使用包中的绘图函数来生成桑基图。通常涉及到的操作有:设定数据框(data frame)、映射变量、调整颜色和宽度参数等。 7.利用R语言绘制桑基图的实例 假设有一个数据文件记录了从不同能源转换到不同产品的能量流动,用户可以使用R语言的绘图包来展示这一流动过程。首先,将数据读入R,然后使用特定函数将数据映射到桑基图中,通过调整参数来优化图表的美观度和可读性,最终生成展示能源流动情况的桑基图。 总结:在本资源中,我们获得了关于如何在R语言中绘制桑基图的知识,包括了桑基图的概念、R语言的基础、如何准备和处理输入文件,以及通过R脚本绘制桑基图的方法。这些内容对于数据分析师和数据科学家来说是非常有价值的技能,尤其在需要可视化复杂数据流动和转换过程的场合。