项目案例
one、stl容器类案例
演讲比赛案例
// dem1_演讲比赛.cpp : 定義主控台應用程式的進入點。
//
/****************************
分析需求
搭建逻辑框架
函数实现
*************************/
#include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <deque>
#include <algorithm>
#include <numeric>
#include <functional>
using namespace std;
//定义选手类
class Speaker{
public:
string name;
int score[3];
};
//创建选手,取引用
void Creat_Speaker(map<int, Speaker> & mapSpeaker, vector<int> &v1)
{
string nameseed = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (int i=0; i < 24;i++)
{
Speaker speaker;
speaker.name = "选手";
speaker.name += nameseed[i];
speaker.score[0] = 0;
speaker.score[1] = 1;
speaker.score[2] = 1;
//创建选手唯一的参赛编号
int SpeakerID = 100 + i;
mapSpeaker.insert(make_pair(SpeakerID, speaker));//保存选手信息
v1.push_back(SpeakerID);
}
}
//选手抽签
void Random_SpeakerID(vector<int> v1)
{
random_shuffle(v1.begin(), v1.end());//打乱
}
//选手比赛
void Match_Speaker(int index, vector<int>& v1, map<int, Speaker> & mapSpeaker,vector<int>& v2)
{
multimap<int, int,greater<int>> mapGroup;
int indexTemp = 0;
int indexGroup = 0;
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
indexTemp++;
deque<int> dscore;//保存评委十次得分
for (int i = 0; i < 10; i++){
int score = 50 + rand() % 50;
dscore.push_back(score);
}
//排序
sort(dscore.begin(), dscore.end());//默认从小到大排序
dscore.pop_back();//拿掉尾部,去掉最高分
dscore.pop_front();//拿掉头部,去掉最低分
//求和求平均分
int totalscore = accumulate(dscore.begin(), dscore.end(), 0);
int scoreavg = totalscore / dscore.size();
mapSpeaker[*it].score[index - 1] = scoreavg;//保存当前选手得分
mapGroup.insert(make_pair(scoreavg, *it));//保存分组信息
//判断六个人一组
if (indexTemp % 6 == 0)
{
int highIndex = 0;
indexGroup++;
printf("第%d轮比赛第%d组比赛成绩:\n", index, indexGroup);
for (multimap<int, int, greater<int>>::iterator it = mapGroup.begin(); it != mapGroup.end(); it++)
{
highIndex++;
if (highIndex <= 3){
v2.push_back(it->second);
}
cout << "姓名" << mapSpeaker[it->second].name << "分数:" << mapSpeaker[it->first].score[index - 1]<<endl;
}
//取出当前分组的前三名放进v2
mapGroup.clear();//清空map
}
}
}
//查看比赛结果
void ShowMatchResult(int index, vector<int>& v2, map<int, Speaker>& mapSpeaker)
{
printf("第%d轮比赛晋级名单:\n", index);
for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++)
{
cout << "姓名:" << mapSpeaker[*it].name << "分数:" << mapSpeaker[*it].score[index - 1]<<endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
map<int, Speaker> mapSpeaker; //保存选手信息
vector<int> v1;//保存第一轮参赛编号
vector<int> v2; //第一轮比赛的晋级编号
vector<int> v3;//保存第二轮比赛晋级名单
vector<int> v4;//保存最终的前三名编号
//创建选手24名
Creat_Speaker(mapSpeaker, v1);
//第一轮比赛
Random_SpeakerID(v1);//选手抽签
Match_Speaker(1, v1, mapSpeaker,v2);//选手比赛
ShowMatchResult(1, v2, mapSpeaker);//查看比赛结果
//第二轮比赛
Random_SpeakerID(v2);//选手抽签
Match_Speaker(2, v2, mapSpeaker, v3);//选手比赛
ShowMatchResult(2, v3, mapSpeaker);//查看比赛结果
//第二轮比赛
Random_SpeakerID(v2);//选手抽签
Match_Speaker(3, v3, mapSpeaker, v4);//选手比赛
ShowMatchResult(3, v4, mapSpeaker);//查看比赛结果
return 0;
}


