用stl写一个自动打分比赛的案例

 我们要实现六名选手进行随机平均分为两组,先分别淘汰两组中的最后一名,

再决出第一名。

抽象选手

class player
{
public:
	string name;
	int score;
};

一个选手有名字和分数

首先我们需要vector容器保存选手的编号,便于后续的操作。

再用map容器保存选手的信息和编号。

// 保存选手编号,方便操作
	vector v;
	vector v1;
	vectorv2;
	// 保存选手信息
	map players;

接下来由我们创建选手

void createplayers(vector& v, map& 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& v)
{
	random_shuffle(v.begin(),v.end());
}

一开始v中的id为1 2 3 4 5 6 通过random_shuffle函数实现随机

那么比赛中随机打分怎么实现呢,我们可以使用deque容器来求平均分

deque 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::iterator it = v.begin(); it != v.end(); it++)
	{
		
		// 打分
		deque 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> m; // 键值放分数,实值放编号
m.insert(make_pair(aver, *it));

再把aver,编号存入容器中,接下来就可以实现淘汰最后一名了。

if (m.size() == 3)
		{
			int cnt = 0;
			for (multimap>::iterator sit = m.begin(); cnt < 2 && sit != m.end(); sit++, cnt++)
			{
				// 淘汰最后一个
				v1.push_back(sit->second);
			}
			m.clear();
		}

以下是比赛的完整代码

void competition(vector& v, map& players, vector& v1)
{
	multimap> m; // 键值放分数,实值放编号
	for (vector::iterator it = v.begin(); it != v.end(); it++)
	{
		
		// 打分
		deque 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>::iterator sit = m.begin(); cnt < 2 && sit != m.end(); sit++, cnt++)
			{
				// 淘汰最后一个
				v1.push_back(sit->second);
			}
			m.clear();
		}
	}
}

接下来决出第一名,操作与上述基本一致

void competition2(vector& v1, map& players, vector& v2)
{
	multimap>m;
	for (auto it = v1.begin(); it != v1.end(); it++)
	{
		dequeq;
		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& v, map& players)
{
	for (vector::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << "name: " << players[*it].name << " score: " << players[*it].score << endl;
	}
}

测试 

void test()
{
	// 保存选手编号,方便操作
	vector v;
	vector v1;
	vectorv2;
	// 保存选手信息
	map 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

以上就是实现的案例

你可能感兴趣的:(c++,算法,开发语言)