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;
}
上一篇: Photoshop基础教程:模拟凉席
下一篇: Photoshop打造一颗晶莹通透的水珠