路漫漫其修远兮,吾将上下而求索
文章目录
- 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)