(c++)STL学校演讲比赛综合案例

(c++)STL学校演讲比赛综合案例

问题描述

1)某市举行一场演讲比赛( speech_contest ),共有 24 个人参加。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。
2)比赛方式:分组比赛,每组 6 个人;选手每次要随机分组,进行比赛;
         第一轮分为 4 个小组,每组 6 个人。比如 100-105 为一组,106-111 为第二组,依次类
推,
         每人分别按照抽签(draw)顺序演讲。当小组演讲完后,淘汰组内排名最后的三个选手,
然后继续下一个小组的比赛。
         第二轮分为 2 个小组,每组 6 人。比赛完毕,淘汰组内排名最后的三个选手,然后继续
下一个小组的比赛。
         第三轮只剩下 6 个人,本轮为决赛,选出前三名。
4)比赛评分:10 个评委打分,去除最低、最高分,求平均分
         每个选手演讲完由 10 个评委分别打分。该选手的最终得分是去掉一个最高分和一个最
低分,求得剩下的 8 个成绩的平均分。
         选手的名次按得分降序排列,若得分一样,按参赛号升序排名。用 STL 编程,求解这个问题
1) 请打印出所有选手的名字与参赛号,并以参赛号的升序排列。
2) 打印每一轮比赛后,小组比赛成绩和小组晋级名单
3) 打印决赛前三名,选手名称、成绩。

实现思路

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

实现细节

void main()
{
//定义数据结构 所有选手放到容器中
map<int, Speaker> mapSpeaker;vector<int> v1; //第 1 轮演讲比赛 名单
vector<int> v2; //第 2 轮演讲比赛 名单
vector<int> v3; //第 3 轮演讲比赛 名单
vector<int> v4; //最后 演讲比赛 名单
//产生选手
GenSpeaker(mapSpeaker, v1);
//第 1 轮 选手抽签 选手比赛 查看比赛结果(晋级名单 得分情况)
cout << "\n\n\n 任意键,开始第一轮比赛" << endl;
cin.get();
speech_contest_draw(v1);
speech_contest(0, v1, mapSpeaker, v2);
speech_contest_print(0, v2, mapSpeaker);
//第 2 轮 选手抽签 选手比赛 查看比赛结果
cout << "\n\n\n 任意键,开始第二轮比赛" << endl;
cin.get();
speech_contest_draw(v2);
speech_contest(1, v2, mapSpeaker, v3);
speech_contest_print(1, v3, mapSpeaker);
//第 3 轮 选手抽签 选手比赛 查看比赛结果
cout << "\n\n\n 任意键,开始第三轮比赛" << endl;
cin.get();
speech_contest_draw(v3);
speech_contest(2, v3, mapSpeaker, v4);
speech_contest_print(2, v4, mapSpeaker);
system("pause");
}
//产生选手
int GenSpeaker(map<int, Speaker> &mapSpeaker, vector<int> &v1)
//选手抽签
int speech_contest_draw(vector<int> &v)
//选手比赛
int speech_contest(int index, vector<int> &v1, map<int, Speaker> &mapSpeaker, vector<int>
&v2)
//打印选手比赛晋级名单
int speech_contest_print(int index, vector<int> v, map<int, Speaker> & mapSpeaker)

源代码.cpp

#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<time.h>
#include<stdlib.h>
#include<deque>
#include<algorithm>
using namespace std;

class Speaker
{
public:
	Speaker()
	{
	}
	Speaker(string name,int score)
	{
		this->mName = name;
		this->mScore = score;
	}
	~Speaker()
	{

	}
	string mName;
	int    mScore;
private:
};

//产生选手
int GenSpeaker(map<int, Speaker>& mapSpeaker, vector<int>& v1)
{
	string seedName = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	for (int i = 0; i < 24; i++)
	{
		Speaker mspeaker;
		mspeaker.mName = "选手";
		mspeaker.mName += seedName[i];

		mspeaker.mScore = 0;

		mapSpeaker.insert(make_pair(i + 1, mspeaker));
		v1.push_back(i + 1);
	}

	cout << "-----------参赛选手名单--------------" << endl;

	for (map<int, Speaker>::iterator it = mapSpeaker.begin(); it != mapSpeaker.end(); it++)
	{
		cout << "编号:" << (*it).first << "  " << "姓名:" << (*it).second.mName << endl;
	}

	return 0;
}
//选手抽签
int speech_contest_draw(vector<int>& v)
{
	srand(time(NULL));
	vector<int> vin = v;
	int temp = vin.size() / 6;
	if (vin.size() > 0)
	{
		multimap<int, int> SpeakerGroup;

		for (vector<int>::iterator it = vin.begin(); it != vin.end(); it++)
		{
			int Group = rand() % temp + 1;
			switch (Group)
			{
			case 1:
				if (SpeakerGroup.count(1) == 6)
				{
					it--;
					break;
				}
				else
				{
					SpeakerGroup.insert(make_pair(1, *it));
					break;
				}
			case 2:
				if (SpeakerGroup.count(2) == 6)
				{
					it--;
					break;
				}
				else
				{
					SpeakerGroup.insert(make_pair(2, *it));
					break;
				}
			case 3:
				if (SpeakerGroup.count(3) == 6)
				{
					it--;
					break;
				}
				else
				{
					SpeakerGroup.insert(make_pair(3, *it));
					break;
				}
			case 4:
				if (SpeakerGroup.count(4) == 6)
				{
					it--;
					break;
				}
				else
				{
					SpeakerGroup.insert(make_pair(4, *it));
					break;
				}
			default:
				break;
			}

		}
		vin.clear();
		cout << endl;
		cout << "----------------分组名单-------------------" << endl;
		for (multimap<int, int>::iterator it = SpeakerGroup.begin(); it != SpeakerGroup.end(); it++)
		{
			cout << "第" << (*it).first << "组" << " 成员编号:" << (*it).second << endl;
			vin.push_back((*it).second);
			
		}
		v = vin;
	}
	return 0;
}
bool cmp(const pair<int, Speaker>& p1, const pair<int, Speaker>& p2)
{
	if (p1.second.mScore == p2.second.mScore)
	{
		return p1.first < p2.first;
	}
	else 
	{
		return p1.second.mScore > p2.second.mScore;
	}
}
//选手比赛
//index比赛轮次,v1参赛名单,mapSpeaker选手信息,v2晋级下一轮的名单
int speech_contest(int index, vector<int>& v1, map<int, Speaker>& mapSpeaker, vector<int>& v2)
{
	//cout << index << endl;
	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		deque<int> dscore;
		for (int i = 0; i < 10; i++)
		{
			int score = rand() % 41 + 60;
			dscore.push_back(score);
		}
		{
			int score = rand() % 41 + 60;
			dscore.push_back(score);
		}

		//默认排序从小到大
		sort(dscore.begin(), dscore.end());

		dscore.pop_back();
		dscore.pop_front();

		int totalScore = 0;
		for (deque<int>::iterator it = dscore.begin(); it != dscore.end(); it++)
		{
			totalScore += (*it);
		}

		int avgScore = totalScore / dscore.size();

		map<int, Speaker>::iterator player = mapSpeaker.find(*it);
		(*player).second.mScore = avgScore;

	}

	int groupnub = 0;
	switch (index)
	{
		case 0:
			groupnub = 4;
			break;
		case 1:
			groupnub = 2;
			break;
		case 2:
			groupnub = 1;
			break;
	default:
		break;
	}

	map<int, Speaker> temp1;

	//cout << groupnub << endl;

	for (int j = 0; j < groupnub; j++)
	{
		vector<int> temp;
		temp.assign(v1.begin()+j*6, v1.begin() + (j+1)*6);

		cout << "-------------第" << j + 1 << "小组比赛成绩------------" << endl;
		for (vector<int>::iterator it = temp.begin(); it != temp.end(); it++)
		{
			//cout << *it << " ";
			map<int, Speaker>::iterator gmember = mapSpeaker.find(*it);
			temp1.insert(make_pair((*gmember).first, (*gmember).second));

		}
		cout << endl;

		//map为红黑树内部带有自定义的顺序,无法用sort排序,可以用vector容器进行过渡排序
		vector<pair<int, Speaker>> vpi(temp1.begin(), temp1.end());
		sort(vpi.begin(), vpi.end(), cmp);

		//v2.clear();
		int i = 0;
		for (vector<pair<int, Speaker>>::iterator it = vpi.begin(); it != vpi.end(); it++, i++)
		{
			cout << "ID:" << (*it).first << " 性名:" << (*it).second.mName << " 成绩:" << (*it).second.mScore << endl;

			if (i < 3)
			{
				v2.push_back((*it).first);
			}
		}
		i = 0;
		temp.clear();
		temp1.clear();
		vpi.clear();
	}
		return 0;
}
//打印选手比赛晋级名单
int speech_contest_print(int index, vector<int> v, map<int, Speaker>& mapSpeaker)
{
	int j = (index+1) * 6;
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		map<int, Speaker>::iterator winer = mapSpeaker.find(*it);
		cout << "编号:" << (*winer).first << " 姓名:" << (*winer).second.mName <<"成绩:" << (*winer).second.mScore<<endl;

	}
	return 0;
}
int main()
{
	map<int, Speaker > mapSpeaker;
    vector<int> v1;
	vector<int> v2;
	vector<int> v3;
	vector<int> v4;

	//产生选手
	GenSpeaker(mapSpeaker, v1);
	//第 1 轮 选手抽签 选手比赛 查看比赛结果(晋级名单 得分情况)
	cout << "\n\n\n 任意键,开始第一轮比赛" << endl;
	cin.get();
	cout << "------------第一轮比赛-----------------" << endl;
	speech_contest_draw(v1);
	speech_contest(0, v1, mapSpeaker, v2);
	cout << "-----------晋级名单----------------" << endl;
	speech_contest_print(0, v2, mapSpeaker);
	//第 2 轮 选手抽签 选手比赛 查看比赛结果
	cout << "\n\n\n 任意键,开始第二轮比赛" << endl;
	cin.get();
	cout << "------------第二轮比赛-----------------" << endl;
	speech_contest_draw(v2);
	speech_contest(1, v2, mapSpeaker, v3);
	cout << "-------------晋级名单---------------" << endl;
	speech_contest_print(1, v3, mapSpeaker);
	//第 3 轮 选手抽签 选手比赛 查看比赛结果
	cout << "\n\n\n 任意键,开始第三轮比赛" << endl;
	cin.get();
	cout << "---------------第三轮比赛---------------" << endl;
	speech_contest_draw(v3);
	speech_contest(2, v3, mapSpeaker, v4);
	cout << "--------------比赛前三名-----------------" << endl;
	speech_contest_print(2, v4, mapSpeaker);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值