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

news2024/12/24 11:17:21

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++自学精简教程 全部答案

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

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

相关文章

介绍几种使用工具

FileWatch&#xff0c;观测文件变化&#xff0c;源码地址&#xff1a;https://github.com/ThomasMonkman/filewatch nlohmann::json&#xff0c;json封装解析&#xff0c;源码地址&#xff1a;https://github.com/nlohmann/json optionparser&#xff0c;解析选项&#xff0c;源…

4.(Python数模)0-1规划

Python解决0-1规划问题 参考下面文章 源代码 import pulp # 导入 pulp 库# 主程序 def main():# 投资决策问题&#xff1a;# 公司现有 5个拟投资项目&#xff0c;根据投资额、投资收益和限制条件&#xff0c;问如何决策使收益最大。"""问题建模&#x…

9. 微积分 - 导数

文章目录 导数求导实例代码演示:迭代法求解二次函数最小值阶Hi, 大家好。我是茶桁。 我们终于结束了极限和连续的折磨,开启了新的篇章。 不过不要以为我们后面的就会很容易,只是相对来说, 没有那么绕而已。 那么,我们今天开始学习「导数」。 导数 在之前的导论,也就是…

【算法竞赛宝典】求分数精确值

【算法竞赛宝典】求分数精确值 题目描述思路讲解代码展示 题目描述 思路讲解 代码展示 //计算分数的精确值 #include<iostream>using namespace std; int remainder[101], quotient[101]; //remainder:存放除法的余数;quotient:依次存放商的每一位int main() {int m, n,…

[CISCN 2019初赛]Love Math

文章目录 前言考点解题过程 前言 感慨自己实力不够&#xff0c;心浮气躁根本做不来难题。难得这题对我还很有吸引力&#xff0c;也涉及很多知识。只能说我是受益匪浅&#xff0c;总的来说加油吧ctfer。 考点 利用php动态函数的特性利用php中的数学函数实现命令执行利用php7的特…

项目验收有哪些流程?

验收流程 科技计划项目验收/课题验收测试服务的被测对象是国家重大专项、科研课题的软件成果物&#xff0c;可以是一个模块、软件或系统等&#xff0c;也可以是软件套件或软件原型等。测试范围主要来源于课题的合同书/可行吧报告/申报书中的技术指标要求。所出具的科技项目验收…

中东 Shopify 如何使用 Bytebase 构建一站式数据库开发工作流

公司简介 Salla 是一家 2016 年成立&#xff0c;位于沙特麦加的自建站电商平台。 作为中东 Shopify&#xff0c;其最大的特点是支持阿拉伯语建站&#xff0c;并且提供更多适应中东地区特点的本地化服务。截止目前&#xff0c;已有 47,000 家店铺入驻 Salla&#xff0c;商品销售…

并发测试工具 apache-jmeter使用发送post请求JSON数据

目录 1 下载安装 2 汉化 3 创建高并发测试 配置线程组 创建web请求 创建监听器 结果树 汇总报告 为web请求添加token 添加Content-Type用于发送json 4 启动测试 5 查看结果 1 下载安装 官网Apache JMeter - Download Apache JMeter 解压运行 2 2 汉化 打开软件…

CS144环境配置问题

使用wsl来做CS144实验&#xff0c;可能会在编译的时候遇到以下问题&#xff0c;很明显是找不到LIBPCAP&#xff0c;参考链接 使用sudo apt-get install libpcap-dev命令下载该库即可。 CMake Error: The following variables are used in this project, but they are set to N…

什么是精益生产?企业如何实现精益生产?

国内的很多制造企业之所以对“精益生产”持怀疑甚至否度态度&#xff0c;大都经历过实施过程中的“水土不服”难题。抛砖引玉讲一下&#xff1a; 1、精益生产的最典型案例 1991年&#xff0c;在当时整个美国处于一种将被“日本人支配”的恐惧背景下&#xff0c;“精益生产”一…

【FPGA项目】第1个项目,来点个灯吧~

前言 你会FPGA吗&#xff1f;我会点灯&#xff01; 一、概述 作为一名点灯高手&#xff0c;今天就来实际操练一下。 如何点亮&#xff1f; 开发板上带有8个LED灯&#xff0c;我们只需要控制它对应的管脚电平输入即可。 1&#xff1a;灭&#xff1b;0&#xff1a;亮。 如何实…

大语言模型之七- Llama-2单GPU(T4 16G)微调(Fine-tune)

模型预训练colab脚本在github主页面。详见Finetuning_LLama_2_0_on_Colab_with_1_GPU.ipynb 在上一篇博客提到两种改进预训练模型性能的方法Retrieval-Augmented Generation (RAG) 或者 finetuning。本篇博客过一下模型微调。 微调&#xff1a;这是采用预训练的LLM并在较小的…

ESP8266+继电器+MQTT+VUE 实现远程开关灯

超详细教程 – ESP8266继电器MQTTVUE 实现远程开关灯 超详细教程 – ESP8266继电器MQTTVUE 实现远程开关灯 接线图 NC&#xff08;通常闭合&#xff09;与COM&#xff08;公共&#xff09;、NO&#xff08;通常开放&#xff09;与COM 是继电器引脚的不同配置&#xff0c;用于不…

JAVA实现SAP接口

JAVA实现SAP接口 环境spring-bootmaven 1.maven依赖 <dependency><groupId>com.github.virtualcry</groupId><artifactId>sapjco-spring-boot-starter</artifactId><version>3.1.4</version></dependency>2.配置文件 applic…

AI+认知行为疗法,治愈心灵的良药丨青源Workshop「AI+心理干预」观点集锦

当前&#xff0c;抑郁症、焦虑症等心理障碍成为社会关注的焦点&#xff0c;如何有效地缓解和治疗这些心理问题成为一个重要的研究方向。在这样的背景下&#xff0c;如何利用AI等先进技术手段来辅助心理疾病的治疗备受关注。例如&#xff0c;通过语音、脑部MRI辅助诊断器质性抑郁…

C++ 学习之 构造函数 和 析构函数

前言 总的来说&#xff0c;构造函数负责对象的初始化&#xff0c;而析构函数负责对象的清理和资源释放。它们是C面向对象编程中非常重要的概念&#xff0c;用于管理对象的生命周期&#xff0c;确保对象在创建和销毁时都能够正确地进行初始化和清理。 正文 看代码 class perso…

CRM如何提高销售效率?三个功能实现销售自动化

销售效率对企业的盈利能力有着至关重要的联系。提高销售效率&#xff0c;就是要提高销售人员的工作效率和销售转化率。那么&#xff0c;企业如何提高销售效率呢&#xff1f;CRM销售自动化功能可以帮助企业实现这一目标。 一、线索管理 线索是指有潜在购买意向的客户&#xff…

多目标应用:基于多目标人工蜂鸟算法(MOAHA)的微电网多目标优化调度MATLAB

一、微网系统运行优化模型 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标人工蜂鸟算法MOAHA 多目标人工蜂鸟算法&#xff08;multi-objective artificial hummingbird algorithm&…

微服务-gateway鉴权

文章目录 一、前言二、gateway鉴权1、依赖配置2、编写代码3、GlobalFilter详解3.1、GlobalFilter简介3.2、GlobalFilter自定义执行顺序3.2.1、实现Order接口实现自定义执行顺序 一、前言 网关是介于客户端和服务器端之间的中间层&#xff0c;所有的外部请求都会先经过 网关这一…

Solidity 小白教程:6. 引用类型, array, struct

Solidity 小白教程&#xff1a;6. 引用类型, array, struct 这一讲&#xff0c;我们将介绍solidity中的两个重要变量类型&#xff1a;数组&#xff08;array&#xff09;和结构体&#xff08;struct&#xff09;。 数组 array 数组&#xff08;Array&#xff09;是solidity常…