当前位置: 首页 > news >正文

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

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

文章目录

  • 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. 码文不易,感谢大家支持!!!😉😉😉

相关文章:

  • 计算机相关专业混体制的解决方案(考公务员)
  • OpenCV-PyQT项目实战(1)安装与环境配置
  • 【HTML | CSS】春节将至,为网页挂上精美的灯笼吧(附源码)程序员的浪漫
  • 字节青训前端笔记 | Next.js 入门
  • 下载Windows ISO镜像的方法 (超详细 适合新手入门)
  • OpenCV实战(8)——直方图详解
  • 这些低代码平台,你是否知悉?
  • TCP/IP网络编程——基于 TCP 的服务端/客户端(下)
  • 【高阶数据结构】海量数据如何处理? (位图 布隆过滤器)
  • ARP攻击和欺骗原理讲解
  • 人工智能原理复习 | 课程背景
  • Windows 安装 Android Studio
  • 一道编程劝退题,检测你是否适合干编程
  • Pytorch深度强化学习案例:基于DQN实现Flappy Bird游戏与分析
  • Spring Cloud Sentinel(限流、熔断、降级)、SpringBoot整合Sentinel、Sentinel的使用-60
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Electron入门介绍
  • JavaScript对象详解
  • 搭建gitbook 和 访问权限认证
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 码农张的Bug人生 - 初来乍到
  • 三分钟教你同步 Visual Studio Code 设置
  • 新手搭建网站的主要流程
  • 智能合约开发环境搭建及Hello World合约
  • 自动记录MySQL慢查询快照脚本
  • gunicorn工作原理
  • 如何正确理解,内页权重高于首页?
  • ​渐进式Web应用PWA的未来
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (2)Java 简介
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (70min)字节暑假实习二面(已挂)
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)memcache、redis缓存
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .aanva
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .net core 6 redis操作类
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net 生成二级域名
  • .net操作Excel出错解决
  • .Net多线程总结
  • [C++]类和对象【下】
  • [Gamma]阶段测试报告
  • [halcon案例2] 足球场的提取和射影变换
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [LVGL]:MACOS下使用LVGL模拟器
  • [mysql]游标和触发器
  • [Python] 什么是KMeans聚类算法以及scikit-learn中的KMeans使用案例