本文主要是介绍用stl写一个自动打分比赛的案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我们要实现六名选手进行随机平均分为两组,先分别淘汰两组中的最后一名,
再决出第一名。
抽象选手
class player
{
public:string name;int score;
};
一个选手有名字和分数
首先我们需要vector容器保存选手的编号,便于后续的操作。
再用map容器保存选手的信息和编号。
// 保存选手编号,方便操作vector<int> v;vector<int> v1;vector<int>v2;// 保存选手信息map<int, player> players;
接下来由我们创建选手
void createplayers(vector<int>& v, map<int, player>& players)
{for (int i = 0; i < 6; i++){int id;//编号//创建一个选手player p;cin >> p.name;id = i + 1;v.push_back(id);p.score = 0;players.insert(make_pair(id, p));}
}
通过上述函数可以实现创建选手,把id送进v中,把id 和选手信息存进players中。
然后就可以开始第一轮比赛
我们先通过random_shuffle函数对v中的id进行打乱
void radomByGroups(vector<int>& v)
{random_shuffle(v.begin(),v.end());
}
一开始v中的id为1 2 3 4 5 6 通过random_shuffle函数实现随机
那么比赛中随机打分怎么实现呢,我们可以使用deque容器来求平均分
deque<int> s;for (int i = 0; i < 10; i++){int sco = rand() % 50 + 50;s.push_back(sco);}
sort(s.begin(), s.end());s.pop_back();s.pop_front();int sumscore = accumulate(s.begin(), s.end(), 0);int aver = sumscore / s.size();
我们去掉最高分和最低分再去求平均值
for (vector<int>::iterator it = v.begin(); it != v.end(); it++){// 打分deque<int> s;for (int i = 0; i < 10; i++){int sco = rand() % 50 + 50;s.push_back(sco);}sort(s.begin(), s.end());s.pop_back();s.pop_front();int sumscore = accumulate(s.begin(), s.end(), 0);int aver = sumscore / s.size();players[*it].score = aver;
这样一来可以把平均分存入players的score中
接下来我们还要实现去掉两组的最后一名,我们可以使用multimap容器,键值存分数,实值存编号,再让multimap容器对键值从大到小排序
multimap<int, int, greater<>> m; // 键值放分数,实值放编号
m.insert(make_pair(aver, *it));
再把aver,编号存入容器中,接下来就可以实现淘汰最后一名了。
if (m.size() == 3){int cnt = 0;for (multimap<int, int, greater<>>::iterator sit = m.begin(); cnt < 2 && sit != m.end(); sit++, cnt++){// 淘汰最后一个v1.push_back(sit->second);}m.clear();}
以下是比赛的完整代码
void competition(vector<int>& v, map<int, player>& players, vector<int>& v1)
{multimap<int, int, greater<>> m; // 键值放分数,实值放编号for (vector<int>::iterator it = v.begin(); it != v.end(); it++){// 打分deque<int> s;for (int i = 0; i < 10; i++){int sco = rand() % 50 + 50;s.push_back(sco);}sort(s.begin(), s.end());s.pop_back();s.pop_front();int sumscore = accumulate(s.begin(), s.end(), 0);int aver = sumscore / s.size();players[*it].score = aver;m.insert(make_pair(aver, *it));if (m.size() == 3){int cnt = 0;for (multimap<int, int, greater<>>::iterator sit = m.begin(); cnt < 2 && sit != m.end(); sit++, cnt++){// 淘汰最后一个v1.push_back(sit->second);}m.clear();}}
}
接下来决出第一名,操作与上述基本一致
void competition2(vector<int>& v1, map<int, player>& players, vector<int>& v2)
{multimap<int, int, greater<>>m;for (auto it = v1.begin(); it != v1.end(); it++){deque<int>q;for (int i = 0; i < 10; i++){int score = rand() % 50 + 50;q.push_back(score);}q.pop_back();q.pop_front();int sumscore = accumulate(q.begin(), q.end(), 0);int aver = sumscore / q.size();players[*it].score = aver;m.insert(make_pair(aver, *it));if (m.size() == 4){int cnt = 0;for (auto it = m.begin(); it != m.end() && cnt < 1; it++, cnt++){v2.push_back(it->second);}}}
}
打印选手信息的函数
void printplayeres(vector<int>& v, map<int, player>& players)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << "name: " << players[*it].name << " score: " << players[*it].score << endl;}
}
测试
void test()
{// 保存选手编号,方便操作vector<int> v;vector<int> v1;vector<int>v2;// 保存选手信息map<int, player> players;createplayers(v, players);printplayeres(v, players); // 打印比赛前的选手信息cout << "---------------" << endl;radomByGroups(v); // 随机分组competition(v, players, v1);//printplayeres(v1, players); // 打印比赛后的选手信息printplayeres(v1, players); // 打印比赛后的选手信息cout << "---------------" << endl;cout << "final winner:" << endl;competition2(v1, players, v2);printplayeres(v2, players);
}
结果
a b c d e f
name: a score: 0
name: b score: 0
name: c score: 0
name: d score: 0
name: e score: 0
name: f score: 0
---------------
name: b score: 79
name: d score: 77
name: f score: 81
name: c score: 74
---------------
final winner:
name: b score: 83
以上就是实现的案例
这篇关于用stl写一个自动打分比赛的案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!