3.1.6 练习 基于GPA排名计算本专业保研名单

C++自学精简教程 目录(必读)

GPA概念回顾

平均学分绩点GPA(Grade Point Average)是对一个学生大学学习成绩的综合的衡量指标。

在前面的文章 本科生学分绩点GPA计算 中,我们知道了什么是平均学分绩点GPA,以及如何计算它。

基于GPA给学生排名

现在我们使用GPA数值作为考研名额的评判标准。

按照GPA数值从高到低,取3个名额作为保研名额。

题目描述

已知,某专业有10名同学,这10名同学的信息如下:

每一行记录表示一个学生的信息:学号, {10门课的成绩}, {10门课对应的学分}, "姓名"

学号, {10门课的成绩}, {10门课对应的学分}, "姓名"
111, { 88, 86, 87, 82, 82, 86, 83, 86, 80, 89 }, { 3, 3, 1, 1, 2, 1, 3, 2, 3, 3 } , "杜特尔特"
112, { 92, 80, 81, 75, 93, 80, 81, 89, 84, 85 }, { 3, 2, 3, 1, 2, 2, 2, 1, 1, 1 } , "文在寅" 
113, { 88, 92, 93, 86, 84, 81, 81, 80, 81, 89 }, { 3, 2, 1, 2, 1, 3, 3, 3, 2, 3 } , "佐科"
114, { 94, 81, 89, 89, 80, 71, 88, 89, 89, 88 }, { 1, 3, 3, 2, 1, 1, 3, 1, 3, 3 } , "莱希"
115, { 83, 85, 84, 82, 63, 81, 83, 64, 81, 83 }, { 1, 2, 1, 3, 1, 3, 1, 1, 1, 2 } , "雅各布"
116, { 90, 81, 84, 91, 85, 88, 84, 72, 94, 87 }, { 2, 2, 2, 1, 2, 2, 1, 1, 2, 3 } , "卢卡申科"
117, { 89, 81, 86, 88, 81, 91, 84, 75, 90, 88 }, { 2, 2, 2, 2, 1, 3, 3, 2, 2, 3 } , "马克龙"
118, { 82, 80, 82, 94, 87, 80, 94, 80, 71, 92 }, { 1, 2, 3, 3, 1, 2, 3, 3, 2, 1 } , "萨科奇"
119, { 89, 91, 80, 90, 85, 87, 87, 94, 81, 70 }, { 2, 3, 3, 2, 3, 2, 2, 3, 1, 3 } , "默克尔"
120, { 88, 95, 84, 89, 92, 79, 80, 96, 83, 80 }, { 3, 4, 1, 3, 3, 2, 2, 4, 3, 3 } , "金正恩"

根据本科生学分绩点GPA计算 文章中的内容,我们就可以计算出每个学生的GPA。

现在需要取GPA从高到低排序,前三名作为保研名额。

请你求出哪三个人会被保研。

分析设计

一、整体流程

首先,我们需要求出每个学生的GPA。

而要求GPA,就需要拿到学生的数据。

学生的数据如何存放,决定了我们计算的是否方便。

我们的整体流程大致如下:

(1)合理的组织学生的数据,放到合适的容器里

(2)计算每个学生的GPA

(3)对学生的GPA排序

(4)根据排序结果输出哪些学生可以保研

二、具体设计

1 学生类

首先,我们需要一个学生类来描述和保存一个学生的数据。

根据题目中给出的数据格式,我们可以得出学生类应该像下面这样:

struct Student //学生类
{
    int id;//学号
    vector<int> score_list;//修的所有课程的成绩列表
    vector<int> credit_hour_list;//修的所有课程对应的学分列表
    double GPA;//注意GPA应该是浮点数,不能是整数
    string name;//姓名
};

2 GPA计算

现在,我们把每个学生的考试成绩和各门课的学分都放在了学生类的内部存储。

我们给学生类增加了两个成员函数:

    double get_GPA(void) const { return GPA; }
    void set_GPA(void);

3 学生数据的存放

我们把全部学生信息放到一个容器container1里。

后面我们对每个学生计算出对应的GPA,也存在学生信息里。

同时,我们需要从这个容器里查询某个学生的GPA数值,所以这个容器要求可以根据学生的ID来查询学生的信息。

存放学生对象的容器container1

所以,container1应该是:

map<id, student> student_map;

这个时候我们需要,遍历容器student_map ,把GPA数据拿出来,同时保留GPA和学生的对应关系。

这样我们就可以对GPA排序,同时知道GPA和学生的对应关系。

所以我们需要另一个容器container2。

key为GPA,value为student id的容器container2

这个容器可以支持用GPA作为key排序,这让我们再次想到了map。

也就是大致像这样:

map<GPA, student> gpa_order;

而map自动会对key进行排序,只需要不断的往里面插入元素即可。

所以,我们得到的container2像下面这样:

实际上的gpa_order

最后是输出谁被保研了。

此时只需要按照顺序遍历container2,就会得到GPA从高到低的顺序。

container2提供顺序,container1提供学生信息,这样就可以对学生按照GPA排序了:

两个容器即可完成对学生,按照GPA排序

4 程序整体结构

解决了数据结构,剩下的就是整体流程分析的思路实现完整的程序了。

程序框架见后面的启动代码。

启动代码

#include <iostream>
#include <vector> //存放学生的课程和学分
#include <string> //存放学生的名字
#include <iomanip> //格式控制:小数部分2位小数
#include <map> //存放学生数据,排序数据
using namespace std;

struct Student
{
    double get_GPA(void) const { return GPA; }
    void set_GPA(void);//计算学生的GPA数值,存到学生的GPA成员变量中

    int id;//学号
    vector<int> score_list;//修的所有课程的成绩列表
    vector<int> credit_hour_list;//修的所有课程对应的学分列表
    double GPA;
    string name;//姓名
};
void Student::set_GPA(void)
{
    //累加课程学分绩点=课程学分绩点1+课程学分绩点2+...+课程学分绩点n
    double total_credit_hour_point = 0;

    for (int i = 0; i < score_list.size(); i++)
    {
        //课程绩点=课程成绩/10 -5
        double grade_point = score_list[i] / 10.0 - 5;//注意这里整数通过除以浮点数结果转换成了浮点数
        //课程学分绩点
        double credit_hour_point = credit_hour_list[i] * grade_point;
        //累加课程学分绩点
        total_credit_hour_point += credit_hour_point;
    }

    //平均学分绩点
    //各门课学分之和sum_credit_hour 
    int sum_credit_hour = 0;
    for (int i = 0; i < score_list.size(); i++)
    {
        sum_credit_hour += credit_hour_list[i];//累加
    }

    //平均学分绩点= 累加课程学分绩点/各门课学分之和
    GPA = total_credit_hour_point / sum_credit_hour;
}
void init_student_data(map<int, Student>& student_map)
{
    student_map[111] = { 111, { 88, 86, 87, 82, 82, 86, 83, 86, 80, 89 }, { 3, 3, 1, 1, 2, 1, 3, 2, 3, 3 } , 0.0, "杜特尔特" };
    student_map[112] = { 112, { 92, 80, 81, 75, 93, 80, 81, 89, 84, 85 }, { 3, 2, 3, 1, 2, 2, 2, 1, 1, 1 } , 0.0, "文在寅" };
    student_map[113] = { 113, { 88, 92, 93, 86, 84, 81, 81, 80, 81, 89 }, { 3, 2, 1, 2, 1, 3, 3, 3, 2, 3 } , 0.0, "佐科" };
    student_map[114] = { 114, { 94, 81, 89, 89, 80, 71, 88, 89, 89, 88 }, { 1, 3, 3, 2, 1, 1, 3, 1, 3, 3 } , 0.0, "莱希" };
    student_map[115] = { 115, { 83, 85, 84, 82, 63, 81, 83, 64, 81, 83 }, { 1, 2, 1, 3, 1, 3, 1, 1, 1, 2 } , 0.0, "雅各布" };
    student_map[116] = { 116, { 90, 81, 84, 91, 85, 88, 84, 72, 94, 87 }, { 2, 2, 2, 1, 2, 2, 1, 1, 2, 3 } , 0.0, "卢卡申科" };
    student_map[117] = { 117, { 89, 81, 86, 88, 81, 91, 84, 75, 90, 88 }, { 2, 2, 2, 2, 1, 3, 3, 2, 2, 3 } , 0.0, "马克龙" };
    student_map[118] = { 118, { 82, 80, 82, 94, 87, 80, 94, 80, 71, 92 }, { 1, 2, 3, 3, 1, 2, 3, 3, 2, 1 } , 0.0, "萨科奇" };
    student_map[119] = { 119, { 89, 91, 80, 90, 85, 87, 87, 94, 81, 70 }, { 2, 3, 3, 2, 3, 2, 2, 3, 1, 3 } , 0.0, "默克尔" };
    student_map[120] = { 120, { 88, 95, 84, 89, 92, 79, 80, 96, 83, 80 }, { 3, 4, 1, 3, 3, 2, 2, 4, 3, 3 } , 0.0, "金正恩" };
}
void set_student_gpa(map<int, Student>& student_map, map<double, int>& gpa_order)
{
    for (auto& student : student_map)
    {
        student.second.set_GPA();
        double gpa = student.second.get_GPA();
        //(1) your code
        
    }
}
void print_student_research_quota(map<double, int>& gpa_order, map<int, Student>& student_map)
{
    int pass_count = 3;
    int i = 0;
    //从后向前迭代容器:逆序迭代。因为map默认是从小到大排序,最小的元素放在最开始的位置
    for (auto itr = gpa_order.rbegin(); itr != gpa_order.rend(); ++itr)
    {
        auto& student = student_map[itr->second];
        cout << "GPA="
            //fixed使用小数计数法(而不是科学计数法)显示浮点数
            << fixed
            //setprecision(2) 小数部分保留2位,最后一位四舍五入
            << setprecision(2) << student.get_GPA()
            << ", id=" << student.id;
        if (i < pass_count)
        {
            cout << ", 保研";
        }
        else
        {
            cout << ", 不保";
        }
        //(2) your code

        cout << ", name=" << student.name << endl;
    }
}
int main()
{
    map<int, Student> student_map;
    init_student_data(student_map);

    map<double, int> gpa_order;
    //计算学生的GPA,并存放到gpa_order里
    set_student_gpa(student_map, gpa_order);

    //输出哪些学生被保研了,哪些没有
    print_student_research_quota(gpa_order, student_map);

    return 0;
}

正确结果

正确结果

答案在此

C++自学精简教程 全部答案

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OB Cloud助力泡泡玛特打造新一代分布式抽盒机系统

作为中国潮玩行业的领先者&#xff0c;泡泡玛特凭借 MOLLY、DIMOO、SKULLPANDA 等爆款 IP&#xff0c;以及线上线下全渠道营销收获了千万年轻人的喜爱&#xff0c;会员数达到 2600 多万。2022 年&#xff0c;泡泡玛特实现 46.2 亿元营收&#xff0c;其中线上渠道营收占比 41.8%…

ArcGIS Maps SDK for JS(二):MapView简介----创建2D地图

文章目录 1 AMD 引用 ArcGIS Maps SDK for JavaScript2 加载相应模块3 创建地图4 创建 2D 视图 view5 确定页面内容6 CSS 样式7 完整代码 本教程使用 AMD 模块&#xff0c;指导您如何在二维地图视图中创建一个简单的地图。 1 AMD 引用 ArcGIS Maps SDK for JavaScript 在 <…

智慧电力方案:安防监控/视频分析/智能分析网关AI识别技术在电力领域中的应用

一、行业痛点 随着经济的飞速发展&#xff0c;电力已经是人们生活中必不可少的&#xff0c;无论是在生活还是工作中&#xff0c;电的存在都是不可或缺的。但电力的高效运维&#xff0c;一直是一个难题&#xff0c;当前普通的电力运维系统已无法满足人们的管理需求&#xff0c;…

宏基官网下载的驱动怎么安装(宏基笔记本如何安装系统)

本文为大家介绍宏基官网下载的驱动怎么安装宏基笔记本驱动(宏基笔记本如何安装系统)&#xff0c;下面和小编一起看看详细内容吧。 宏碁笔记本怎么一键更新驱动 1. 单击“开始”&#xff0c;然后选择“所有程序”。 2. 单击Acer&#xff0c;然后单击Acer eRecovery Management。…

Hive3第六章:更换引擎

系列文章目录 Hive3第一章&#xff1a;环境安装 Hive3第二章&#xff1a;简单交互 Hive3第三章&#xff1a;DML数据操作 Hive3第三章&#xff1a;DML数据操作(二) Hive3第四章&#xff1a;分区表和分桶表 Hive3第五章&#xff1a;函数 Hive3第六章&#xff1a;更换引擎 文章目…

stable diffusion实践操作-embedding(TEXTUAL INVERSION)

本文专门开一节写图生图相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 中文名为文本反转&#xff0c;可以理解为提示词的集合&#xff0c;提示词打包&#xff0c;可以省略大量的提示词。后缀safetensors&#xff0c;大小几十…

15000字、6个代码案例、5个原理图让你彻底搞懂Synchronized

Synchronized 本篇文章将围绕synchronized关键字&#xff0c;使用大量图片、案例深入浅出的描述CAS、synchronized Java层面和C层面的实现、锁升级的原理、源码等 大概观看时间17分钟 可以带着几个问题去查看本文&#xff0c;如果认真看完&#xff0c;问题都会迎刃而解&…

【CI/CD技术专题】「Docker实战系列」本地进行生成镜像以及标签Tag推送到DockerHub

背景介绍 Docker镜像构建成功后&#xff0c;只要有docker环境就可以使用&#xff0c;但必须将镜像推送到Docker Hub上去。创建的镜像最好要符合Docker Hub的tag要求&#xff0c;因为在Docker Hub注册的用户名是liboware&#xff0c;最后利用docker push命令推送镜像到公共仓库…

实现不同局域网间的文件共享和端口映射,使用Python自带的HTTP服务

文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有广泛的应用…

ITIL 4—创建、交付和支持—利用信息和技术创建、交付和支持服务

3.1 集成和数据共享 服务设计通常依赖于多个系统之间的集成&#xff08;integration&#xff09;&#xff0c;在这种情况下&#xff0c;理解集成建模的不同层次相当重要。例如&#xff1a; 应用程序级 应用程序之间是相互交互的。企业级 已集成的应用程序共同提供价值。业务…

无涯教程-JavaScript - GAMMADIST函数

GAMMADIST函数取代了Excel 2010中的GAMMA.DIST函数。 描述 该函数返回伽马分布。您可以使用此功能来研究可能具有偏斜分布的变量。伽马分布通常用于排队分析。 语法 GAMMADIST(x,alpha,beta,cumulative)争论 Argument描述Required/OptionalXThe value at which you want t…

手摸手2-springboot编写基础的增删改查

目录 手摸手2-springboot编写基础的增删改查创建controller层添加service层接口service层实现添加mapper层mapper层对应的sql添加扫描注解,对应sql文件的目录 手摸手2-springboot编写基础的增删改查 创建controller层 实现 test 表中的添加、修改、删除及列表查询接口&#x…

技术领导力实战笔记25

25&#xff5c;用心做好“鼓励式”管理 激发正能量 授权 分工作&#xff1a; 老人干新事&#xff0c;新人干老事&#xff0c;强者干难事&#xff0c;弱者干细事 新人干老事 所谓新人&#xff0c;是对业务产品不了解&#xff0c;对工作流程不清晰的岗位新人。对于新人来说&…

java八股文面试[多线程]——线程间通信方式

多个线程在并发执行的时候&#xff0c;他们在CPU中是随机切换执行的&#xff0c;这个时候我们想多个线程一起来完成一件任务&#xff0c;这个时候我们就需要线程之间的通信了&#xff0c;多个线程一起来完成一个任务&#xff0c;线程通信一般有4种方式&#xff1a; 通过 volat…

解决Linux Ubuntu上安装RabbitMQ服务后的公网远程访问问题,借助cpolar内网穿透技术

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

哈夫曼树与哈夫曼编码

哈夫曼树与哈夫曼编码 哈夫曼树 哈夫曼树又称最优二叉树&#xff0c;这种数据结构主要用于解决一些编码问题&#xff0c;与普通二叉树相比&#xff0c;哈夫曼树在特定场景下能够显著的提高效率。 相关概念 权值&#xff1a;指哈夫曼树叶子节点的权值&#xff0c;例如上图中哈…

07:STM32----ADC模数转化器

目录 1:简历 2:逐次逼近型ADC 3:ADC基本结构 4:输入通道 5:规则组的4种转换模式 1:单次转化,非扫描模式 2:连续转化,非扫描模式 3:单次转化,扫描模式 4:单次转化,扫描模式 6:触发控制 7:数据对齐 8:转化时间 9:校准 10:ADC的硬件电路 A: AD单通道 1:连接图 2:函…

计算机竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖&#xff0c;适合作为竞赛课…

【多线程案例】单例模式(懒汉模式和饿汉模式)

文章目录 1. 什么是单例模式&#xff1f;2. 立即加载/“饿汉模式”3. 延时加载/“懒汉模式”3.1 第一版3.2 第二版3.3 第三版3.4 第四版 1. 什么是单例模式&#xff1f; 提起单例模式&#xff0c;就必须介绍设计模式&#xff0c;而设计模式就是在软件设计中&#xff0c;针对特殊…

6路液体水位检测芯片VK36W6D SOP16 抗电源干扰及手机干扰特性好

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK36W6D 封装形式&#xff1a;SOP16/QFN16L 详细资料&#xff1a;13.5/5.474/4.703 概述 VK36W6D具有6个触摸检测通道&#xff0c;可用来检测6个点的水位。该芯片具有较高的集成度&#xff0c;仅需极少的外部组件便…