h有5名选手:选手ABCDE, 10个评委分别对每一名选手打分, 去除最高分,去除评委中最低分,取平均分。
1.创建五名选手,放到vector中
2.遍历vector容器,取出来每一个选手, 执行for循环,可以把10个评分打分存到deque容器中
3. sort算法对deque容器中分数排序,pop_ back pop. front去除最高和最低分
4. deque容器遍历一遍,累加分数,累加分数/d.size()
5. person.score =平均分
1、定义一个Person类存放选手
class Person
{
public:
string name;
int score;
Person() {};
Person(string name,int score)
{
this->name = name;
this->score = score;
}
};
void text11()
{
vector<Person>ob;
//定义一个插入函数
push(ob);
//比赛
much(ob);
//输出数据
peintob(ob);
}
2、//定义一个插入函数
push(ob);
对于这个名字主要设计了是:"选手+A","选手+B","选手+C","选手+D","选手+E","选手+F"。每次取一个Name中的元素,根据string的模板函数可知取字符可用运算符重载了的[]或者成员函数at();对于"+="STL中也有重载,每次调用push_back()尾插函数插入,刚开始把得分都初始化为0,在much()函数中对其赋值。
void push(vector<Person>& ob)
{
string Name = "ABCDE";
int i = 0;
for(i;i<5;i++)
{
string name = "选手";
name += Name[i];
ob.push_back(Person(0,name));
}
}
3、//比赛
much(ob);
对于随机种子理解:
rand()函数确实会给用户分配一个随机数,但是有弊端就是,这个随机数它不会变,主要原因还是随机种子确定后就没有再改变了,现在我们对随机种子srand(),对它传一个一直改变的参数,那么它产生的随机数就会一直改变了,我们肯定会想到时间函数,时间是一直改变了,就会导致随机种子一直改变,最终产生可变的随机数,时间函数time(NULL),头文件是#include<time.h>。
void much(vector<Person>& ob)
{
srand(time(NULL));
vector<Person>::iterator it = ob.begin();
//建立deque容器,将评委打的分数放入
deque<int>v;
for (; it != ob.end(); it++)
{
int i = 0;
for (i = 0; i < 10; i++)
{
//设置随机数,模拟评委打分
v.push_back(rand()%41+60);
}
sort(v.begin(), v.end());
//去掉最高分和最低分
v.pop_back();
v.pop_front();
//accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值
(*it).num = accumulate(v.begin(), v.end(),0)/v.size();
}
}
4、//输出数据
peintob(ob);
由于这个容器的数据是我们自定义类型,所以我们需要写一个输出函数或者重载函数运算符
void push(vector<Person>& ob)
{
string Name = "ABCDE";
int i = 0;
for(i;i<5;i++)
{
string name = "选手";
name += Name[i];
ob.push_back(Person(0,name));
}
}
下面附上完整代码:
#include <numeric>
#include<time.h>
class Person
{
public:
int num;
string name;
Person(){}
Person(int num,string name)
{
this->num = num;
this->name = name;
}
};
void push(vector<Person>& ob);
void peintob(vector<Person>& ob);
void much(vector<Person>& ob);
void text11()
{
vector<Person>ob;
//定义一个插入函数
push(ob);
//比赛
much(ob);
//输出数据
peintob(ob);
}
void push(vector<Person>& ob)
{
string Name = "ABCDE";
int i = 0;
for(i;i<5;i++)
{
string name = "选手";
name += Name[i];
ob.push_back(Person(0,name));
}
}
void peintob(vector<Person>& ob)
{
vector<Person>::iterator it = ob.begin();
for (; it != ob.end(); it++)
{
cout << (*it).name << " " << (*it).num << endl;
}
}
void much(vector<Person>& ob)
{
srand(time(NULL));
vector<Person>::iterator it = ob.begin();
//建立deque容器,将评委打的分数放入
deque<int>v;
for (; it != ob.end(); it++)
{
int i = 0;
for (i = 0; i < 10; i++)
{
//设置随机数,模拟评委打分
v.push_back(rand()%41+60);
}
sort(v.begin(), v.end());
//去掉最高分和最低分
v.pop_back();
v.pop_front();
//accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值
(*it).num = accumulate(v.begin(), v.end(),0)/v.size();
}
}
int main()
{
text11();
return 0;
}
以下就是最不重要的部分,那就是记录我的错误
写了几个小时代码,突然问了自己几个问题,都把自己问住了!!!!特别特别简单基础的问题
1、vector<Person>v;//这个v应该就算一个Person实例化的对象吧!!!EER
// //v的类型是vector<Person>,是是实例好一个向量,这个向量里面放Person
// //v是一个可以储存多个Person实例的容器实例
2、void insert(vector<Person>&v)
{
string Name = "ABCD";
v.name = "考生";//那为啥不能用这个类的数据//因为v不是Person实例化的对象,它是一个实例化的容器
用来存放Person实例化的对象
(*v.begin()).name = "考生";//*v.begin()这是容器的起始迭代器,对其取*就是拿到它的内容,也就是它保存的Person实例化的对象
for (int i = 0; i < 5; i++)
{
n += Name[i];
}
(*v.begin()).name = "考生";
卡了好一会不能理解的问题,就是如果我这样写它起始的vacter是个空
也就是begin()==end();现在给元素赋值必然会出现错误--------(*v.begin()).name = "考生";
3、刚开始把int i=0;放在外for循环外面,然后就会导致它直接跳出赋值那一内循环,每次去掉最高分和最低分会从10个数变到8个到6个到4个到2个到0个;