练习STL容器

演讲比赛小程序

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <deque>
#include <numeric>
#include <ctime>

using namespace std;

/*
	演讲比赛
	总共3轮比赛
	总共有 ABCDEFGHIJKLMNOPQRSTUVWX 位选手 
	选手信息:
		编号 姓名 最终得分
	第1轮:抽签 选手比赛 显示结果 
	第2轮:抽签 选手比赛 显示结果
	第3轮:抽签 选手比赛 显示结果
	最终目标:
		选出前三名选手
	实现:
		1.创建出选手
		2.打乱顺序
		3.选手比赛 获取分数
		4.显示比赛结果
*/
//创建一个包含 选手姓名和得分的类
class Speecher
{
public:
	//声明选手的姓名 字符串类型
	string m_Name;
	//声明选手的得分 注意这里要进行三轮比赛,所以应该有三次得分
	int m_Score[3];

	//调用构造函数给类的成员初始化
	Speecher()
	{
		this->m_Name = ' ';
		//调用 memset给数组初始化成0
		memset(this->m_Score, 0, sizeof(this->m_Score));
	}
};
// 2.创建比赛选手
void createPlay(vector<int>& v, map<int, Speecher>& m)
{
	// 创建string 装 选手的姓名 ABCDEFGHIJKLMNOPQRSTUVWX
	string name = "ABCDEFGHIJKLMNOPQRSTUVWX";

	//循环将所有的选手全部创建出来
	for (unsigned int i = 0; i < name.size(); i++)
	{
		创建类对象
		Speecher sp;
		//给类的对象成员赋值
		sp.m_Name = name.at(i);

		//将选手的三轮比赛分数全部初始化成0
	/*	for (int j = 0; j < 3; j++)
		{
			sp.m_Score[j] = 0;
		}*/
		//将选手的分数初始化成0
		sp.m_Score[0] = 0;
		int num = i + 100;	//编号 100 开始

		m.insert(make_pair(num, sp));
		//将编号插入到容器vector中
		v.push_back(num);	
	}
}
// 3.选手抽签
void SpeecherDraw(vector<int>&v) //注意这里要加引用 &, 不加的话下面调用该函数是不会生效的
{
	//洗牌算法
	random_shuffle(v.begin(), v.end());
}

// 4.实现选手比赛
// index 第几轮比赛, v1 所有的参赛选手, m 参赛选手的具体信息 , v2 晋级的选手
void SpeecherContest(int index, vector<int>& v1, map<int, Speecher>& m, vector<int>& v2)
{
	//创建一个容器装分组的参赛选手
	multimap<int, int, greater<int>>groupMap;	//参数1 平均分, 参数2 选手 *it , 参数3 进行排序
	//定义一个变量用于计数
	int count = 0;
	// 比赛最终是为了获取分数
	//遍历所有的参赛选手
	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		//计数++
		count++;
		//创建一个容器装评委评的分数
		deque<int>d;
		//设置有10位评委进行打分
		for (int i = 0; i < 10; i++)
		{
			//随机获取分数60 ~ 100
			int score = rand() % 41 + 60;
			//将获取的分数插入到容器中
			d.push_back(score);
			
		}
		//将获取的10个分数进行排序
		sort(d.begin(), d.end());

		//将得到的10个分数 去除最大值 最小值 
		d.pop_front();	//删除头 最小值
		d.pop_back();	//删除尾 最大值

		//获取所有分数的总和
		int num_ = accumulate(d.begin(), d.end(), 0);
		//计算平均分
		int avg = num_ / d.size();
		
		// 将平均分赋给选手
		m[*it].m_Score[index - 1] = avg;
		//测试
		//cout << "选手编号:" << *it << "  姓名:" << m[*it].m_Name << "  得分:" << m[*it].m_Score[index - 1] << endl;

		//将平均分 和 编号设置给容器 mulitmap
		groupMap.insert(make_pair(avg, *it));
		
		//分组 每6人为一组进行比赛
		if (count % 6 == 0)
		{
			//测试
			/*cout << "参数选手分组比赛如下:" << endl;
			for (multimap<int, int, greater<int>>::iterator it = groupMap.begin(); it != groupMap.end(); it++)
			{
				cout << "选手编号:" << it->second << "  姓名:" << m[it->second].m_Name << "  得分:" << m[it->second].m_Score[index - 1] << endl;
			}*/
			//cout << "第" << index << "轮比赛  " << "小组比赛前三名如下:" << endl;
			int icount = 0;
			for (multimap<int, int, greater<int>>::iterator it = groupMap.begin(); it != groupMap.end(), icount < 3; it++, icount++)
			{
				//测试
				//cout << "选手编号:" << it->second << "  姓名:" << m[it->second].m_Name << "  得分:" << m[it->second].m_Score[index - 1] << endl;
				//每组的前三名选手为晋级选手 装进到容器对象v2中
				v2.push_back(it->second);
			}
			
			
			//清空容器
			groupMap.clear();
		}
	}
}
// 5.显示比赛结果
//index 第几轮比赛, v1 所有的参赛选手编号 ,m 所有参赛选手的具体信息, v2晋级的选手编号
void showResult(int index, vector<int>&v1, map<int, Speecher>&m, vector<int>&v2)
{
	//显示所以的参赛的选手
	cout << "第" << index << "轮 比赛所有参赛选手如下:" << endl;
	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		cout << "选手编号:" << *it << "  姓名:" << m[*it].m_Name << "  得分:" << m[*it].m_Score[index - 1] << endl;
	}
	//显示晋级的选手
	cout << "晋级的选手如下:" << endl;
	for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++)
	{
		/*cout << "选手编号:" << *it << "  姓名:" << m[*it].m_Name << "  得分:" << m[*it].m_Score[index - 1] << endl;*/
		cout << "选手编号:" << *it << endl;
	}
}

int main()
{
	//加一个随机函数种子,实现最后获取的前三名选手每次都不一样
	srand((unsigned int)time(NULL));
	// 1.定义一个容器装选手编号
	vector<int> v;
	// 定义一个容器装选手具体信息 包含编号 姓名 得分 将姓名+得分封装成一个类
	map<int, Speecher>m;
	// 2.创建比赛选手
	createPlay(v, m);	// 参数1:比赛选手编号 参数2:参赛选手的具体信息
	//显示所有的参赛选手
	cout << "所有的参赛选手如下:" << endl;
	for (map<int, Speecher>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "选手的编号:" << it->first << "  姓名:" << it->second.m_Name << "  得分:" << it->second.m_Score[0] << endl;
	}
	//第一轮比赛
	// 3.选手抽签
	SpeecherDraw(v);	//参数 所有参赛选手的编号
	//测试是否成功打乱顺序
	/*for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << "选手的编号:" << *it << endl;
	}*/
	// 4.比赛 获取最后得分
	//创建一个容器装第一轮晋级的选手	
	vector<int> v1;
	SpeecherContest(1, v, m, v1);	//参数1:比赛轮数,参数2:所有参赛选手的编号, 参数3:所有参数选手的具体信息,参数4:晋级选手
	// 5.显示比赛结果
	showResult(1, v, m, v1);
	//第二轮比赛
	SpeecherDraw(v1);	//抽签
	vector<int> v2;		//装晋级的选手编号
	SpeecherContest(2, v1, m, v2);	//选手比赛
	showResult(2, v1, m, v2);	//显示比赛结果
	//第三轮比赛
	SpeecherDraw(v2);	//抽签
	vector<int> v3;		//装晋级的选手编号
	SpeecherContest(3, v2, m, v3);	//选手比赛
	showResult(3, v2, m, v3);	//显示比赛结果

	system("pause>0");
	return 0;
}

 代码运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值