欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

stl演讲比赛案例

程序员文章站 2022-06-09 12:52:53
...
需求分析

产生选手 ( ABCDEFGHIJKLMNOPQRSTUVWXYZ ) 姓名、得分;选手编号
第1轮 选手抽签 选手比赛 查看比赛结果
第2轮 选手抽签 选手比赛 查看比赛结果
第3轮 选手抽签 选手比赛 查看比赛结果

实现思路

需要把选手信息、选手得分信息、选手比赛抽签信息、选手的晋级信息保存在容器中,需要涉及到各个容器的选型。(相当于信息的数据库E-R图设计)
选手可以设计一个类Speaker(姓名和得分)
所有选手编号和选手信息,可以放在容器内:map<int, Speaker>
所有选手的编号信息,可以放在容器:vecter v1中
第1轮晋级名单,可以放在容器vecter v2中
第2轮晋级名单,可以放在容器vecter v3中
第3轮前三名名单,可以放在容器vecter v4中

	每个小组的比赛得分信息,按照从小到大的顺序放在 

multimap<成绩, 编号, greater> multmapGroup
也就是:multimap<int, int, greater > multmapGroup;
每个选手的得分,可以放在容器deque dscore; 方便去除最低最高分

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <algorithm>
#include <numeric>
#include <functional>
#include <string>
#include <iterator>
using namespace std;

class Speaker
{
public:
	string		m_name;
	int			m_score[3];
};
// 产生选手
int GenSpeaker(map<int, Speaker> &mapSpeaker, vector<int> &v)
{
	string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	random_shuffle(str.begin(), str.end());
	for (int i = 0; i < 24; i++)
	{
		Speaker tmp;
		tmp.m_name = "选手";
		tmp.m_name = tmp.m_name + str[i];
		mapSpeaker.insert(pair<int, Speaker>(100 + i, tmp));

	}
	for (int i = 0; i < 24; i++)
	{
		v.push_back(100 + i);	// 参加比赛的名单
	}

	return 0;
}



// 选手抽签
int speach_const_draw(vector<int> &v)
{
	random_shuffle(v.begin(), v.end());
	return 0;
}

// 选手比赛
int speach_contest(int index, vector<int> &v1, map<int, Speaker> &mapSpeaker, vector<int> &v2)
{
	// 记录小组的比赛得分  需要求出前三名  和  后三名
	// 注意 得分 是有可能是相同的
	multimap<
		int,			// 得分
		int,			// 编号
		greater<int>	// 从大到小排序
	> multimapGroup;	// 小组成绩

	int tmpCount = 0;

	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		tmpCount++;
		// 打分
		{
			deque<int> dscore;
			for (int j = 0; j < 10; j++) // 是个评委打分
			{
				int score = 50 + rand() % 50;
				dscore.push_back(score);
			}
			sort(dscore.begin(), dscore.end());
			// 去除最高分
			dscore.pop_back();
			// 去除最低分
			dscore.pop_front();
			// 求平均分
			int scorsSum = accumulate(dscore.begin(), dscore.end(), 0);
			int scoreAvg = scorsSum / dscore.size();
			mapSpeaker[*it].m_score[index] = scoreAvg;	// 选手得分存入容器中
			multimapGroup.insert(pair<int, int>(scoreAvg, *it));
		}
		// 处理分组
		if (tmpCount % 6 == 0)
		{
			cout << "小组的比赛成绩" << endl;
			for (multimap<int, int, greater<int>>::iterator mit = multimapGroup.begin(); mit != multimapGroup.end(); mit++)
			{
				// 编号	姓名	得分
				cout << mit->second << '\t' << mapSpeaker[mit->second].m_name << '\t' << mit->first << endl;
			}
			// 前三名晋级
			while (multimapGroup.size() > 3)
			{
				multimap<int, int, greater<int>>::iterator it1 = multimapGroup.begin();
				v2.push_back(it1->second); // 把前三名放到v2晋级名单中
				multimapGroup.erase(it1);
			}
			// 清空本小组比赛数据
			multimapGroup.clear();
			// tmpCount = 0;
		}

	}
	return 0;
}

// 查看比赛结果
int speach_contest_print(int index, vector<int> &v, map<int, Speaker> &mapSpeaker)
{
	cout << "第" << index + 1 << "轮晋级名单:" << endl;
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << "参赛编号 : " << *it << '\t' << mapSpeaker[*it].m_name << '\t' << mapSpeaker[*it].m_score[index] << endl;
	}
	return 0;
}

int main()
{
	// 容器的设计
	map<int, Speaker>	mapSpeaker;	// 所有参加比赛的选手
	vector<int>			v1;	// 第一轮	演讲比赛	名单
	vector<int>			v2;	// 第二轮	演讲比赛	名单
	vector<int>			v3;	// 第三轮	演讲比赛	名单
	vector<int>			v4;	// 第四轮	演讲比赛	名单  -- 最后前三名

	// 产生选手	得带第一轮选手的比赛名单
	GenSpeaker(mapSpeaker, v1);
	// 第一轮  选手抽签  选手比赛	查看比赛结果
	cout << "\n\n 任意键,开始第一轮比赛" << endl;
	cin.get();
	speach_const_draw(v1);
	speach_contest(0, v1, mapSpeaker, v2);
	speach_contest_print(0, v2, mapSpeaker);
	// 第二轮  选手抽签  选手比赛	查看比赛结果
	cout << "\n\n 任意键,开始第二轮比赛" << endl;
	cin.get();
	speach_const_draw(v2);
	speach_contest(1, v2, mapSpeaker, v3);
	speach_contest_print(1, v3, mapSpeaker);
	// 第三轮  选手抽签  选手比赛	查看比赛结果
	cout << "\n\n 任意键,开始第三轮比赛" << endl;
	cin.get();
	speach_const_draw(v3);
	speach_contest(2, v3, mapSpeaker, v4);
	speach_contest_print(2, v4, mapSpeaker);



	system("pause");
	return 0;
}
相关标签: 案例