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

时间: 2024-02-19 19:57:43 浏览: 18
好的,我来实现这个需求。 首先是学生类、选课记录类和课程类的实现: ```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

(5)删除功能:主要实现对已添加的学生和课程记录进行删除。如果当前系统中没有相应的记录,则提示“记录为空!”并返回操作。 (6)统计功能:能根据多种参数进行统计。能统计学生人数、课程的门数。 (7)保存...
recommend-type

基于Java实现的明日知道系统.zip

基于Java实现的明日知道系统
recommend-type

NX二次开发uc1653 函数介绍

NX二次开发uc1653 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士,还是希望提高工作效率的普通用户,NX 二次开发 Ufun 都可以帮助您实现更高效的工作流程。函数覆盖了 NX 软件的各个方面,包括但不限于建模、装配、制图、编程、仿真等。这些 API 函数可以帮助用户轻松地实现自动化、定制化和扩展 NX 软件的功能。例如,用户可以通过 Ufun 编写脚本,自动化完成重复性的设计任务,提高设计效率;或者开发定制化的功能,满足特定的业务需求。语法简单易懂,易于学习和使用。用户可以快速上手并开发出符合自己需求的 NX 功能。本资源内容 提供了丰富的中英文帮助文档,可以帮助用户快速了解和使用 Ufun 的功能。用户可以通过资源中的提示,学习如何使用 Ufun 的 API 函数,以及如何实现特定的功能。
recommend-type

别墅图纸编号D020-三层-10.00&12.00米- 效果图.dwg

别墅图纸编号D020-三层-10.00&12.00米- 效果图.dwg
recommend-type

操作系统实验指导书(2024)单面打印(1).pdf

操作系统实验指导书(2024)单面打印(1).pdf
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

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

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

HSV转为RGB的计算公式

HSV (Hue, Saturation, Value) 和 RGB (Red, Green, Blue) 是两种表示颜色的方式。下面是将 HSV 转换为 RGB 的计算公式: 1. 将 HSV 中的 S 和 V 值除以 100,得到范围在 0~1 之间的值。 2. 计算色相 H 在 RGB 中的值。如果 H 的范围在 0~60 或者 300~360 之间,则 R = V,G = (H/60)×V,B = 0。如果 H 的范围在 60~120 之间,则 R = ((120-H)/60)×V,G = V,B = 0。如果 H 的范围在 120~180 之间,则 R = 0,G = V,B =
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。