STL之演讲比赛案例

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<map>
#include<algorithm>
#include<functional>
#include"iterator" //输出迭代器的头文件
#include<numeric>

class Speaker
{
public:
	string name;
	int score[3];//三轮比赛得分
};

void printM(map<int,Speaker> M)
{
	for (map<int, Speaker>::iterator it = M.begin(); it != M.end(); ++it)
	{
		pair<int, Speaker> pr = *it;
		int iKey = pr.first;
		string strValue = pr.second.name;
		cout << iKey << "\t" << strValue << endl;
	}
}

//创建选手函数
void GenSpeaker(map<int,Speaker> &SpeakerList,vector<int> &v1)
{
	string SeedName = "ABCDEFGHIGKLMNOPQRSTUVWXYZ";
	for (int i = 0; i < 24; i++)
	{
		//姓名
		Speaker SP;
		SP.name = "选手";
		SP.name = SP.name + SeedName[i];
		for (int j = 0; j < 3; j++)
		{
			SP.score[j] = 0;
		}
		
		//编号
		int uID = 100 + i;
		//map插入选手编号和信息
		SpeakerList.insert(pair<int, Speaker>(uID, SP));
		//vector插入选手编号
		v1.push_back(uID);
	}
}

//随机抽签
void Set_Random(vector<int> &v1)
{
	random_shuffle(v1.begin(),v1.end());
}

//比赛打分
void Set_Score(int index, vector<int> &v1, map<int, Speaker> &SpeakerList, vector<int> &v2)
{
	int groupIndex = 0;
	map<int, int, greater<int>> mapGroup;//存放小组编号和成绩

	vector<int> ::iterator it;
	deque<int> Dscore;
	for (it = v1.begin(); it != v1.end(); it++)
	{
		//10个评委打分
		for (int j = 0; j < 10; j++)
		{
			int score = rand() % 40 + 60;
			Dscore.push_back(score);
		}
		//分数排序
		sort(Dscore.begin(), Dscore.end());
		Dscore.pop_back();
		Dscore.pop_front();//去掉最高分和最低分
		//求平均分
		int scoreSum = accumulate(Dscore.begin(), Dscore.end(), 0);
		int scoreAvg = scoreSum / Dscore.size();

		//选手得分存入容器中
		SpeakerList[*it].score[index-1] = scoreAvg;//第index轮得分
		mapGroup.insert(pair<int, int>(*it, scoreAvg));//编号和成绩

		groupIndex++;
		//处理分组
		if (groupIndex % 6 == 0)
		{
			cout << "第"<< groupIndex/6 <<"小组比赛成绩:" << endl;
			//编号 姓名 得分
			for (map<int, int,greater<int>>::iterator it = mapGroup.begin(); it != mapGroup.end(); it++)
			{
				cout << it->first << "\t" << SpeakerList[it->first].name << "\t" << it->second << endl;
			}
			//前三名晋级
			while (mapGroup.size() > 3)
			{
				map<int, int, greater<int>>::iterator it = mapGroup.begin();
				v2.push_back(it->first);//前三名编号放到v2
				mapGroup.erase(it);
			}
			mapGroup.clear();//清空本小组比赛成绩		
		}
	}
}

//晋级
void Show_Good(int index, vector<int> &v1, map<int, Speaker> &SpeakerList)
{
	cout << "第" << index << "轮晋级名单:" << endl;
	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		//编号 姓名 得分
		cout << *it << "\t" << SpeakerList[*it].name << "\t" << SpeakerList[*it].score[index-1] << endl;
	}
}

void main()
{
	//创建容器,存放选手信息
	map<int, Speaker> mapSpeaker;

	//第一轮比赛参赛列表24人晋级12人
	vector<int> v1;
	//第二轮比赛参赛列表12人晋级6人
	vector<int> v2;
	//第三轮比赛参赛列表6人晋级3人
	vector<int> v3;

	//最后前三名
	vector<int> v4;

	//创建选手,得到第一轮选手的比赛名单
	GenSpeaker(mapSpeaker, v1);
	//输出参赛选手信息
	cout << "参赛选手信息:" << endl;
	printM(mapSpeaker);
	
	/*第一轮比赛*/
	cout << "第一轮比赛:" << endl;
	//随机分配
	Set_Random(v1);
	//打分
	Set_Score(1, v1, mapSpeaker, v2);
	//晋级
	Show_Good(1, v2, mapSpeaker);

	/*第二轮比赛*/
	cout << "第二轮比赛:" << endl;
	//随机分配
	Set_Random(v2);
	//打分
	Set_Score(2, v2, mapSpeaker, v3);
	//晋级
	Show_Good(2, v3, mapSpeaker);

	/*第三轮比赛*/
	cout << "第三轮比赛:" << endl;
	//随机分配
	Set_Random(v3);
	//打分
	Set_Score(3, v3, mapSpeaker, v4);
	//晋级
	Show_Good(3, v4, mapSpeaker);

	system("pause");
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值