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

news2024/9/23 7:22:32

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

文章目录

  • 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.coloradmin.cn/o/181789.html

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

相关文章

若依框架基于@PreAuthorize注解的权限控制

目录 一、Java注解&#xff08;Annotation&#xff09; 1. 概述 2. Annotation通用定义 &#xff08;1&#xff09;interface &#xff08;2&#xff09;Documented &#xff08;3&#xff09;Target(ElementType.TYPE) &#xff08;4&#xff09;Retention(Ret…

IDEA插件

Lombok用注解的方式&#xff0c;简化了 JavaBean 的编写。注解下面介绍一下常用的几个注解&#xff1a;Setter 注解在类或字段&#xff0c;注解在类时为所有字段生成setter方法&#xff0c;注解在字段上时只为该字段生成setter方法。Getter 使用方法同上&#xff0c;区别在于生…

java基于ssm电梯服务管理信息系统的设计与实现源码+数据库

基于ssm电梯服务管理信息系统的设计与实现 技术支持 开发软件&#xff1a;Eclipse 项目类型&#xff1a;Webapp 数据库&#xff1a;MySQL 数据库连接池&#xff1a;druid 框架&#xff1a;SSM 数据库设计软件&#xff1a;PowerDesigner 前端界面开发&#xff1a;HTML/CSS…

Maven介绍

Maven介绍1、Maven的简单介绍2、Maven的优点3、Maven的基本知识3.1、Maven如何获取Jar包3.2、Maven仓库的分类4、Idea中的maven4.1、clean4.2、validate4.3、compile4.4、test&#xff08;不常用&#xff09;4.5、package4.6、verify&#xff08;不常用&#xff09;4.7、instal…

void*传数据,是不是像在黑洞里面拯救世界?

内核代码看到这样一个函数static inline void dev_set_drvdata(struct device *dev, void *data) {dev->driver_data data; }这个函数有什么用&#xff1f;看里面的代码含义大概就能知道&#xff0c;给 driver_data这个指针赋值&#xff0c;之后在其他地方就可以用这个指针…

《C语言高级》(二)------ 函数与指针 篇

目录 一、函数 1.1、创建和使用函数 1.2、全局变量与局部变量 1.3、函数的参数和返回 1.4、递归调用 1.5、斐波那契数列解法其三 1.6、汉诺塔 1.7、快速排序算法 二、指针 2.1、初识指针 2.2、指针与数组 2.3、多级指针 2.4、指针数组与数组指针 2.5、指针函数与函数指…

SpringCloud入门实战(五)-集成Ribbon

一、Ribbon简介 Spring Cloud Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。简单地说&#xff0c;就是在配置文件中列出Load Balancer(简称LB)后面所有…

python爬虫学习笔记-mongodb安装基本介绍pymongo使用

MongoDB数据存储 MongoDB是一个非关系型数据库(NoSQL). 非常适合超大数据集的存储, 由 C 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系…

Spring Cloud_OpenFeign服务接口调用

目录一、概述1.OpenFeign是什么2.能干嘛二、OpenFeign使用步骤1.接口注解2.新建Module3.POM4.YML5.主启动类6.业务类7.测试8.小总结三、OpenFeign超时控制1.超时设置&#xff0c;故意设置超时演示出错情况2.是什么3.YML中需要开启OpenFeign客户端超时控制四、OpenFeign日志打印…

论文投稿指南——中文核心期刊推荐(水路运输)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

Json的语法及使用

Json的语法及使用前言一、Json是什么&#xff1f;二、Json语法三、Json示例前言 在数据传输时用到Json格式&#xff0c;在此稍作记录。 一、Json是什么&#xff1f; JSON 指的是 JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09;JSON 是轻量级的文本…

零入门容器云网络实战-4->ip地址分类尝试

本篇文章主要用于收集、整理、总结关于IP地址相关知识点。 1、IP地址分类&#xff1f; IPv4地址是指IPv4协议使用的32位地址。 为了便于对IP地址进行管理&#xff0c; 根据IPv4地址的第一个字节&#xff0c;IPv4地址可以分为以下五类。 A类&#xff1a;0~127 B类&#xff1…

【Linux】Linux自动化构建工具make/makefile

文章目录&#x1f3aa; Linux自动化构建工具make/makefile&#x1f680; 1.Makefile文件格式⭐1.1 简单makefile例子⭐1.2 概述⭐1.3 目标(target)⭐1.4 前置条件(prerequisites)⭐1.5 命令(commands)&#x1f680; 2.Makefile文件语法⭐2.1 注释⭐2.2 回声⭐2.3 通配符⭐2.4 变…

4-异步:非阻塞IO

4-异步&#xff1a;非阻塞I_O 简介 什么是Node.js的非阻塞I/O I/O 即 Input/Output. 也就是一个系统的输入和输出阻塞I/O和非阻塞I/O的却别就在于系统接收输入再到输出期间&#xff0c;能不能接收其他输入 对于这两句话的理解&#xff0c;可以把系统比作服务员&#xff0c;…

React 实现自动上报 PV/Click 的埋点 Hooks

自定义 hooks 是基于 React Hooks 的一个拓展&#xff0c;我们可以根据业务需求制定满足业务需要的组合 hooks&#xff0c;更注重的是逻辑单元。怎样把一段逻辑封装起来&#xff0c;做到复用&#xff0c;这才是自定义 hooks 的初衷。 自定义 hooks 也可以说是 React Hooks 的聚…

【并发编程十三】c++原子操作

【并发编程十三】c原子操作一、改动序列1、改动序列2、预测执行二、原子操作及其类别1、原子操作2、非原子操作3、原子类型三、标准原子类型1、标准原子类型的两种实现方式2、原子操作的用途3、原子操作的宏四、操作std:atomic_flag1、简介2、使用说明3、使用std:atomic_flag实…

Kettle(16):Kitchen作业执行引擎

在Linux中对Kettle做Linux配置(和Windows相同,添加驱动jar包) 上传以后需要重启。 1 在Windows中开发作业 2 配置Start组件 3 配置转换组件 修改Kettle&

【HBase——陌陌海量存储案例】1.案例介绍与HBase表结构设计(上)

前言 本系列接【HBase入门】系列文章后实战案例的学习。 学习目标 能够掌握HBase表结构设计&#xff08;表设计、ROWKEY设计、预分区&#xff09; 能够安装部署Apache Phoenix 能够掌握Phoenix的基本操作 能够掌握使用Phoenix建立二级索引提升性能 能够基于Phoenix JDBC API编…

Ubuntu安装ROS(每个步骤图文详细)

Ubuntu安装ROS&#xff08;每个步骤图文详细&#xff09;前言&#xff08;推荐安装&#xff09;ROS对应的Ubuntu的版本换源安装ROS一、添加ROS软件源二、添加密钥三、安装ROS-melodic四、初始化rosdep可能出现的问题&#xff1a;一 、 **sudo: rosdep&#xff1a;找不到命令**二…

算法_位运算x(-x)和x(x-1)

最近在跟着y总学算法。 今天学到了两个很经典的位运算&#xff0c;x&(-x)和x&(x-1)&#xff1a; x&(-x)&#xff1a;保留二进制下最后出现的1的位置&#xff0c;其余位置置0&#xff08;即一个数中最大的2的n次幂的因数 x&(x-1)&#xff1a;消除二进制下最后…