演讲比赛小程序
#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;
}
代码运行结果: