Day10 C++STL入门基础知识七——案例1【评委打分】

news/2024/11/1 15:18:07/

路漫漫其修远兮,吾将上下而求索

文章目录

  • 1. 承接上文
  • 1. 案例描述
  • 2. 实现思路
  • 3. 亿点点分析
    • 3.1 创建选手类
      • 3.1.1 具体思路
      • 3.1.2 代码展示
    • 3.2 创建5名选手并对其姓名、平均分进行初始化
      • 3.2.1 具体思路
        • ① 创建`vector`容器
        • ② 创建一个`creatPlayer()`函数
          • a.调用函数
          • b. 初始化选手的姓名
          • c. 初始化平均分为0
          • d. 创建出1名选手,将姓名、平均分存放到p类中
          • e. 将这名选手放入容器中
      • 3.2.2 代码展示
    • 3.3 测试是否传入
    • 3.4 给5名选手打分
      • 3.4.1 具体思路
        • ① 使用deque存放10个评分
        • ② 难道真的要一个个敲入数据么
        • ③ 打印输入的随机值
      • 3.4.2 代码展示
    • 3.5 sort排序,删最值,求平均并传回
    • 3.6 得分输出
  • 4. 代码展示
  • 5. 结果测试
  • 6. 明日计划
  • 7. 码文不易,感谢大家支持!!!😉😉😉

1. 承接上文

deque容器,出门直接右转即可👉👉👉Day09 C++STL入门基础知识六——deque容器 构造函数-赋值操作-大小操作-插入删除-数据存储-排序操作【全面深度剖析+例题代码展示】

1. 案例描述

有5名选手:选手ABCDE, 10个评委分别对每一名选手打分, 去除最高分,去除评委中最低分,取平均分。

2. 实现思路

  • 创建五名选手,放到vector中
  • 遍历vector容器,取出来每一个选手, 执行for循环,可以把10个评分打分存到deque容器中
  • sort算法对deque容器中分数排序,去除最高和最低分
  • deque容器遍历一遍,累加总分
  • 获取平均分

3. 亿点点分析

3.1 创建选手类

3.1.1 具体思路

  • 创建一个选手的类,属性为需要最后输出的姓名和平均分
  • 姓名string类型—需要追加头文件#include<string.h>

3.1.2 代码展示

//创建选手的类,属性为所要输出的姓名和平均分
class player {
public:player(string name, int avescore) {this->m_name = name;this->m_avescore = avescore;}
public:string m_name;int m_avescore;
};

3.2 创建5名选手并对其姓名、平均分进行初始化

3.2.1 具体思路

① 创建vector容器

  • vector容器用于存放选手的类,对5名选手进行初始化

② 创建一个creatPlayer()函数

a.调用函数
  • 调用函数时,传参过程要使用&符,否则实参根本无法传入,也就是主函数中的容器v无法调用到creatPlayer()函数中
    在这里插入图片描述
b. 初始化选手的姓名
  • 初始化选手姓名时有两种方式,可供参考

(1) 通过下标遍历初始化

string selectname = "ABCDE";for (int i = 0; i < 5; i++) {string name = "选手";name += selectname[i]; //先给定所有选手姓名代号,再通过下标遍历访问}

(2) 通过i值自增初始化

for (int i = 0; i < 5; i++) {	string name="选手";name += 'A' + i; //题过i的值增加改变选手姓名
}

在这里插入图片描述
在这里插入图片描述

c. 初始化平均分为0
int ave_score = 0;
d. 创建出1名选手,将姓名、平均分存放到p类中
Player p(name, ave_score);
e. 将这名选手放入容器中
v.push_back(p);

3.2.2 代码展示

//创建5名选手【初始化其姓名和平均分】
void creatPlayer(vector<Player>& v) { //实参和形参都要修改,所以要用&!!!for (int i = 0; i < 5; i++) {string name = "选手";name += 'A' + i; //题过i的值增加改变选手姓名int ave_score = 0;Player p(name, ave_score);v.push_back(p);}//或者如下//string selectname = "ABCDE";//for (int i = 0; i < 5; i++) {//	string name = "选手";//	name += selectname[i]; //先给定所有选手姓名代号,再通过下标遍历访问//	int ave_score = 0;//	Player p(name, ave_score);//v.push_back(p);//}
}

3.3 测试是否传入

  • 检测传参情况,可写可不写,主要是测试一下有没有报错
void show1Player(vector<Player>& v) {for (vector<Player>::iterator it = v.begin(); it != v.end(); it++) {cout << "姓名为: " << it->m_name << " 平均分为: " << it->m_avescore << endl;}
}
int main() {//创建5名选手vector<Player> v;	//存放选手容器creatPlayer(v);	   //创建5名选手,并将其放入容器show1Player(v);		//展示一下初始化的结果return 0;
}

在这里插入图片描述

发现没有报错,可以继续敲啦

3.4 给5名选手打分

3.4.1 具体思路

① 使用deque存放10个评分

原因是的deque是两端数组,头尾皆可对数据进行插入删除。而vector容器只能对尾部进行插删,本题要删除最大值和最小值,使用vector会极大影响运行效率,故使用deque容器。不明白的小伙伴们,详细内容见👉Day09 C++STL入门基础知识六——deque容器 构造函数-赋值操作-大小操作-插入删除-数据存储-排序操作【全面深度剖析+例题代码展示】

② 难道真的要一个个敲入数据么

答案是否定的,我们可以借助计算机自带的rand()函数来生成随机数,但随机随机,评分数据肯定也是要有范围的,怎么来限制随机数的范围呢???

我们知道当给a%b时,a的结果最大不会超过b。所以我们借助%运算的特性,使用rand()%x; 可以表示[0,
x)之间的数,rand()%x+y;就表示[y, x+y) 之间的数了。

所以我们要想随机输出60-100之间的数,只需要int score=rand()%41+60; 即可

③ 打印输入的随机值

  • 看下随机值情况,可写可不写,可以看一下随机数据的情况

3.4.2 代码展示

void show2score(deque<int>& d) {for (deque<int>::iterator it = d.begin(); it != d.end(); it++) {cout << (*it) << " ";}cout << endl;
}
void inputPlayer(vector<Player>& v) {//创建deque容器存放10个评委所打的分for (vector<Player>::iterator it = v.begin(); it != v.end(); it++) {deque<int> d;for (int i = 0; i < 10; i++) {int score = rand() % 41 + 60;d.push_back(score);}//展示评委打的随机值cout << "姓名为: " << it->m_name << " 打分为: ";show2score(d);}
}
int main() {//创建5名选手vector<Player> v;	//存放选手容器creatPlayer(v);	   //创建5名选手,并将其放入容器show1Player(v);		//展示一下初始化的结果inputPlayer(v);		//给5个人打分return 0;
}

在这里插入图片描述

3.5 sort排序,删最值,求平均并传回

  • 使用sort包含头文件#include<algorithm>
		//sort由小到大排序sort(d.begin(), d.end());//删去最值d.pop_back();	//删除最大值d.pop_front();  //删除最小值//先求和,再统计平均值int sum = 0;for (deque<int>::iterator it = d.begin(); it != d.end(); it++) {sum += (*it); //累加每个评委的打分}int size = d.size();int ave_score = sum / size;  //计算每个人的平均分it->m_avescore = ave_score;  //传入类中

3.6 得分输出

void show2Player(vector<Player>& v) {for (vector<Player>::iterator it = v.begin(); it != v.end(); it++) {cout << "姓名为: " << it->m_name << " 平均分为: " << it->m_avescore << endl;}
}int main() {//创建5名选手vector<Player> v;	//存放选手容器creatPlayer(v);	   //创建5名选手,并将其放入容器show1Player(v);		//展示一下初始化的结果inputPlayer(v);		//给5个人打分show2Player(v);	//展示5人平均分情况return 0;
}

4. 代码展示

#include<stdio.h>
#include<iostream>
#include<vector>
#include<deque>
#include<algorithm>
using namespace std;//创建选手的类,属性为所要输出的姓名和平均分
class Player {
public:Player(string name, int avescore) {this->m_name = name;this->m_avescore = avescore;}
public:string m_name;int m_avescore;
};//创建5名选手【初始化其姓名和平均分】
void creatPlayer(vector<Player>& v) { //实参和形参都要修改,所以要用&!!!for (int i = 0; i < 5; i++) {string name = "选手";name += 'A' + i; //题过i的值增加改变选手姓名int ave_score = 0;Player p(name, ave_score);v.push_back(p);}//或者如下//string selectname = "ABCDE";//for (int i = 0; i < 5; i++) {//	string name = "选手";//	name += selectname[i]; //先给定所有选手姓名代号,再通过下标遍历访问//	int ave_score = 0;//	Player p(name, ave_score);//v.push_back(p);//}
}void show1Player(vector<Player>& v) {for (vector<Player>::iterator it = v.begin(); it != v.end(); it++) {cout << "姓名为: " << it->m_name << " 平均分为: " << it->m_avescore << endl;}
}void show2score(deque<int>& d) {for (deque<int>::iterator it = d.begin(); it != d.end(); it++) {cout << (*it) << " ";}cout << endl;
}
void inputPlayer(vector<Player>& v) {//创建deque容器存放10个评委所打的分for (vector<Player>::iterator it = v.begin(); it != v.end(); it++) {deque<int> d;for (int i = 0; i < 10; i++) {int score = rand() % 41 + 60;d.push_back(score);}//展示评委打的随机值cout << "姓名为: " << it->m_name << " 打分为: ";show2score(d);//sort由小到大排序sort(d.begin(), d.end());//删去最值d.pop_back();	//删除最大值d.pop_front();  //删除最小值//先求和,再统计平均值int sum = 0;for (deque<int>::iterator it = d.begin(); it != d.end(); it++) {sum += (*it); //累加每个评委的打分}int size = d.size();int ave_score = sum / size;  //计算每个人的平均分it->m_avescore = ave_score;  //传入类中}
}void show2Player(vector<Player>& v) {for (vector<Player>::iterator it = v.begin(); it != v.end(); it++) {cout << "姓名为: " << it->m_name << " 平均分为: " << it->m_avescore << endl;}
}int main() {//创建5名选手vector<Player> v;	//存放选手容器creatPlayer(v);	   //创建5名选手,并将其放入容器show1Player(v);		//展示一下初始化的结果inputPlayer(v);		//给5个人打分show2Player(v);	//展示5人平均分情况return 0;
}

5. 结果测试

在这里插入图片描述

6. 明日计划

  • 线代 三1,2
  • 蓝桥杯*5
  • STL list容器
  • 高代 七1、2
  • 挑战杯第二次小组讨论
  • English (要备战四级了QAQ)

7. 码文不易,感谢大家支持!!!😉😉😉


http://www.ppmy.cn/news/20206.html

相关文章

二叉树简单解析(1)

&#x1f340;本人简介&#xff1a; 吉师大一最爱逃课的混子、 华为云享专家、阿里云专家博主、腾讯云自媒体分享计划博主、 华为MindSpore优秀开发者、迷雾安全团队核心成员&#xff0c;CSDN2022年运维与安全领域第15名 &#x1f341;本人制作小程序以及资源分享地址&#x…

语义分割------FCN、deeplab演变理论知识点

一、个人理解 语义分割,其实就是为图片中的每个像素打上相应的标签,即将其所代表的语义具现化,呈现出的视觉效果就是图片中不同的目标有不同的颜色. 目前语义分割主要针对的问题是以下几点: 1)如何恢复原有的分辨率 2)如何尽可能的增大感受野 3)如何处理多尺度问题 下面…

量能指标套装

一、量能副图指标 1、大智慧量能副图指标源码 LB:DYNAINFO(17); ddx1:“ddx.ddx1”;ddx3:“ddx.ddx3”;ddx:ddx1>ddx3; sh:STRFIND(MARKETLABEL,‘SH’,1)1; PJJ:DMA((((HIGH LOW) (CLOSE * 2)) / 4),0.9); JJ:REF(EMA(PJJ,3),1); QJJ:(VOL / (((HIGH - LOW) * 2) - ABS((…

MYSQL不存在插入 存在更新的解决方法和对比

设置主键id自增&#xff0c;name为唯一索引 一、避免重复插入 insert ignore into&#xff08;有唯一索引&#xff09; 关键字/句: insert ignore into&#xff0c;如果插入的数据会导致 UNIQUE索引 或 PRIMARY KEY 发生冲突/重复&#xff0c;则忽略此次操作/不插入数据&…

动态与静态函数库的的使用 和 区别 及 优缺点

这里写目录标题初识静态库与动态库静态函数库动态函数库初识静态库与动态库 静态函数库与动态函数库的使用中&#xff0c;有人也把他称为程序的静态链接及动态链接。 静态链接&#xff1a;指程序链接时使用静态库的链接方式&#xff0c;把所有需要的库函数加入&#xff08;拷贝…

爬楼梯(Python)

Python——动态规划——爬楼梯问题 爬楼梯问题 问题引入 【问题描述】 假设小明住在二楼,每次回家都需要经过一个有n层台阶的楼梯。小明每次可以选择一步走一级台阶或者一步走两级台阶。请计算一下小明从楼下到家一共有多少种走法? 【输入形式】 整数n,表示一共有几层台阶 …

信用卡数字识别

信用卡数字识别一、读入模板图像二、数字模板图像处理1、模板图像预处理1.1、转换为灰度图1.2、转换为二值化图像2、轮廓处理2.1、计算轮廓2.2、画出轮廓2.3、对轮廓从左到右排序并储存3、轮廓遍历3.1、获取轮廓参数3.2、计算轮廓外接矩形3.3、resize成合适大小3.4、存储外接矩…

后端校验(hibernate-validator)

目录一、介绍和依赖二、方法的 Model 参数校验三、方法的非 Model 参数校验四、常用注解五、快速失败六、自定义校验规则一、介绍和依赖 hibernate-validator 是 Java 中常用的后端校验框架 https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/【…