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