目录
1-演讲比赛流程管理系统.cpp
#include <iostream>
using namespace std;
#include "SpeechManager.h"
#include <ctime>
//案例说明
/*
学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛。
每名选手都有对应的编号,如10001 ~10012
比赛方式:分组比赛,每组6个人;
第一轮分为两个小组,整体按照选手编号进行抽签后顺序演讲。
十个评委分别给每名选手打分,去除最高分和最低分,求的平均分为本轮选手的成绩当小组演讲完后,
淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛。
第二轮为决赛,前三名胜出
每轮比赛过后需要显示晋级选手的信息
*/
int main()
{
srand((unsigned int)time(NULL));
SpeechManager SM;
测试
//for(map<int,Speaker>::iterator it=SM.m_Speaker.begin();it!=SM.m_Speaker.end();it++)
//{
// cout<<"选手编号:"<<it->first<<" 选手姓名:"<<it->second.m_Name<<" 选手成绩:"<<it->second.m_Score[0]<<endl;
//}
while(true)
{
int choice;
SM.Menu();
cout<<"请输入选择:"<<endl;
cin>>choice;
switch(choice)
{
case 1://开始比赛
SM.StartSpeech();
break;
case 2://显示往届信息
SM.LoadRecord();
break;
case 3://清空记录
SM.clearRecord();
break;
case 0://退出系统
SM.ExitSystem();
break;
default:
break;
}
system("cls");
}
return 0;
}
2-Speaker.h
#pragma once
#include <iostream>
using namespace std;
//创建选手类--声明
class Speaker
{
public:
string m_Name;//姓名
double m_Score[2];//分数,两轮分数,有两个元素的一维数组
};
3-SpeechSpeaker.h
#pragma once//防止重复包含
#include <iostream>
using namespace std;
#include "Speaker.h"
#include <vector>
#include <map>
#include <string>
#include <algorithm>
#include <deque>
#include <numeric>
#include <functional>
#include <fstream>
//声明演讲比赛管理系统类
class SpeechManager
{
public:
//构造函数
SpeechManager();//声明即可
//菜单函数
void Menu();
//初始化属性
void InitSpeech();
//创建选手
void CreateSpeaker();
//开始比赛
void StartSpeech();
//抽签
void SpeechDraw();
//比赛
void SpeechContest();
//显示晋级结果
void ShowScore();
//保存分数
void SaveSpeech();
//读取文件
void LoadRecord();
//清空记录
void clearRecord();
//退出系统函数
void ExitSystem();
//析构函数
~SpeechManager();
//成员属性---容器
//比赛选手容器-12人
vector<int>v1;
//第一轮晋级容器-6人
vector<int>v2;
//胜利前三名容器-3人
vector<int>vVictory;
//存放编号,以及对应的具体选手容器
map<int,Speaker>m_Speaker;
//记录比赛轮数
int m_Index;
//记录文件是否为空的标志
bool IsEmpty;
//往届记录
map<int,vector<string>>m_Record;
};
4-SpeechSpeaker.cpp
#include "SpeechManager.h"
//实现SpeechManager管理类中的函数
//创建选手
void SpeechManager::CreateSpeaker()
{
string NameSeed="ABCDEFGHIJKL";
for(int i=0;i<int(NameSeed.size());i++)
{
Speaker sp;
string name="选手";
name+=NameSeed[i];
sp.m_Name=name;
for(int j=0;j<2;j++)
{
sp.m_Score[j]=0;
}
//编号
this->v1.push_back(i+1000);
//容器map放入
this->m_Speaker.insert(make_pair(i+1000,sp));
}
}
//初始化属性
void SpeechManager::InitSpeech()
{
//容器清空
this->v1.clear();
this->v2.clear();
this->vVictory.clear();
this->m_Speaker.clear();
this->m_Record.clear();
//初始化比赛轮数
this->m_Index=1;
}
//抽签
void SpeechManager::SpeechDraw()
{
cout<<"第"<<this->m_Index<<"轮选手正在抽签:"<<endl;
cout<<"----------抽签结果如下:-----------"<<endl;
if(this->m_Index==1)//第一轮抽签
{
random_shuffle(this->v1.begin(),this->v1.end());
for(vector<int>::iterator it=this->v1.begin();it!=this->v1.end();it++)
{
cout<<(*it)<<" ";
}
cout<<endl;
}
else
{
random_shuffle(this->v2.begin(),this->v2.end());
for(vector<int>::iterator it=this->v2.begin();it!=this->v2.end();it++)
{
cout<<(*it)<<" ";
}
cout<<endl;
}
system("pause");
}
//比赛
void SpeechManager::SpeechContest()
{
cout<<"-------第"<<this->m_Index<<"比赛正式开始--------"<<endl;
//创建容器Vtemp
vector<int>vTemp;
if(this->m_Index==1)//第一轮
{
vTemp=this->v1;
}
else
{
vTemp=this->v2;
}
//创建小组临时容器,以分数为Key,实值为选手编号,指定为降序
multimap<double,int,greater<double>>GroupScore;//使用内置的仿函数
//打分
int num=0;
for(vector<int>::iterator it=vTemp.begin();it!=vTemp.end();it++)
{
num++;
deque<double>d;
for(int i=0;i<10;i++)//10个评委打分
{
d.push_back((rand()%401+600)/10.0f);
}
sort(d.begin(),d.end());//默认从小到大排序
d.pop_back();//去除最高分
d.pop_front();//去除最低分
double score=accumulate(d.begin(),d.end(),0.00)/d.size();//求取平均分
this->m_Speaker[*it].m_Score[this->m_Index-1]=score;//将分数放入Map总容器中
//测试
//cout<<"选手编号:"<<(*it)<<" 选手姓名:"<<this->m_Speaker[*it].m_Name<<" 选手成绩:"<<this->m_Speaker[*it].m_Score[this->m_Index-1]<<endl;;
//map会根据键值自动插入排序,这里创建一个临时容器Multimap将分数作为key值,降序排序,Greater();
GroupScore.insert(make_pair(score,*it));
if(num%6==0)
{
cout<<"第"<<(num/6)<<"小组成绩排名如下:"<<endl;
cout<<"-----------------------------------------"<<endl;
for(multimap<double,int,greater<double>>::iterator mit=GroupScore.begin();mit!=GroupScore.end();mit++)
{
cout<<"选手编号:"<<mit->second<<" 选手姓名:"<<this->m_Speaker[mit->second].m_Name<<" 选手成绩"<<mit->first<<endl;
}
//取前三名存放
int count=0;
for(multimap<double,int,greater<double>>::iterator mit=GroupScore.begin();mit!=GroupScore.end() && count<3;mit++,count++)
{
if(this->m_Index==1)//第一轮
{
this->v2.push_back((*mit).second);
}
else//第二轮
{
this->vVictory.push_back((*mit).second);
}
}
GroupScore.clear();
}
}
system("pause");
}
//显示晋级结果
void SpeechManager::ShowScore()
{
vector<int>v;
if(this->m_Index==1)//第一轮比赛结果
{
v=this->v2;
}
else
{
v=this->vVictory;
}
cout<<"-----------------------------------------------"<<endl;
cout<<"第"<<this->m_Index<<"轮比赛晋级结果如下:"<<endl;
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
{
cout<<"选手编号:"<<*it<<" 选手姓名:"<<this->m_Speaker[*it].m_Name<<" 选手成绩:"<<this->m_Speaker[*it].m_Score[this->m_Index-1]<<endl;
}
system("pause");
}
//保存分数
void SpeechManager::SaveSpeech()
{
ofstream ofs;//创建文件流
ofs.open("speech.csv",ios::out |ios::app);//输出写文件,以追加形式
for(vector<int>::iterator it=vVictory.begin();it!=vVictory.end();it++)
{
ofs<<*it<<","<<this->m_Speaker[*it].m_Score[1]<<",";
}
ofs<<endl;
ofs.close();//关闭文件
cout<<"记录已经保存"<<endl;
}
//开始比赛
void SpeechManager::StartSpeech()
{
//第一轮比赛;
//1、抽签
SpeechDraw();
//2、比赛
SpeechContest();
//3、显示晋级结果
ShowScore();
//第二轮比赛
this->m_Index++;
//1、抽签
SpeechDraw();
//2、比赛
SpeechContest();
//3、显示最终结果
ShowScore();
//4、保存分数
SaveSpeech();
//!!!!!一定要初始化
//初始化属性
InitSpeech();
//创建选手
CreateSpeaker();
}
//读取文件
void SpeechManager::LoadRecord()
{
ifstream ifs("speech.csv",ios::in);//创建流对象,读取文件
//判断文件存在
if(!ifs.is_open())
{
this->IsEmpty=true;
cout<<"文件不存在!"<<endl;
ifs.close();
system("pause");
return;
}
//判断文件是否为空
char ch;
ifs>>ch;
if(ifs.eof())
{
cout<<"文件为空"<<endl;
this->IsEmpty=true;
ifs.close();
system("pause");
return;
}
//读取文件
this->IsEmpty=false;
ifs.putback(ch);//读取的单个字符返回去
string data;//文件中读取的字符
int index=1;//届数
while(ifs>>data)
{
//cout<<data<<endl;//输出为1001,84.9755,1008,79.7059,1006,77.0098,
//需要对此字符串进行信息截取,放入vector中
//system("pause");
vector<string>v;
int pos=-1;
int start=0;
while(true)
{
pos=data.find(",",start);//start起始位置
if(pos==-1)
{
break;
}
string tmp=data.substr(start,pos-start);//参数1起始位置,参数2截取长度
v.push_back(tmp);
start=pos+1;
}
this->m_Record.insert(make_pair(index,v));
index++;
}
ifs.close();
for(map<int,vector<string>>::iterator it=this->m_Record.begin();it!=this->m_Record.end();it++)
{
cout<<"第"<<it->first<<"届记录:"<<" 冠军编号:"<<it->second[0]<<" 分数:"<<it->second[1]
<<" 亚军编号:"<<it->second[2]<<" 分数:"<<it->second[3]<<" 季军编号:"<<it->second[4]<<" 分数:"<<it->second[5]<<endl;
}
system("pause");
}
//清空记录
void SpeechManager::clearRecord()
{
cout<<"确认清空?"<<endl;
cout<<"1、清空;2、返回"<<endl;
int select;
cin>>select;
if(select==1)
{
//打开模式,ios::trunc如果存在删除文件并重新创建
ofstream ofs("speech.csv",ios::trunc);
ofs.close();
//初始化属性
InitSpeech();
//创建选手
CreateSpeaker();
cout<<"清空成功!"<<endl;
}
}
//构造函数
SpeechManager::SpeechManager()
{
//初始化属性
InitSpeech();
//创建选手
CreateSpeaker();
}
//菜单函数
void SpeechManager::Menu()
{
cout<<"************************************"<<endl;
cout<<"********1、开始比赛*****************"<<endl;
cout<<"********2、往届信息*****************"<<endl;
cout<<"********3、清空信息*****************"<<endl;
cout<<"********0、退出系统*****************"<<endl;
cout<<"************************************"<<endl;
}
//退出系统函数
void SpeechManager::ExitSystem()
{
cout<<"欢迎下次使用!"<<endl;
exit(0);//退出系统
}
//析构函数
SpeechManager::~SpeechManager()
{
}