1.执行主程序 11.cpp
#include<iostream>
using namespace std;
#include"speechmanager.h"
#include"speechmanager.cpp"
#include"speaker.h"
int main(){
srand((unsigned int)time (NULL));
speechmanager sm; //1.创建整个演讲比赛管理者 sm
sm.showmenu(); //2.调用菜单
sm.selectsystem(); //3.调用选择系统
system("pause");
return 0;
}
2.头文件程序1 speechmanager.h
#pragma once
#include<iostream>
using namespace std;
#include<vector>
#include<map>
#include<algorithm>
#include"speaker.h"
#include<deque>
#include<functional>
#include<numeric>
#include<fstream>
#include<ctime>
class speechmanager
{
public:
speechmanager(); //构造函数
void showmenu(); //1.菜单
void selectsystem(); //2.用户选择界面系统
void exitsystem(); //3.退出系统
//4.创建选手类 有姓名和分数
void initspeech(); //6.初始化内部参数
void creatspeaker(); //7.创建12名选手
void startspeech(); //8.开始比赛
void speechdraw(); //8.1 抽签
void speechdivi(); //8.2 分组
void showspeaker(); //9.显示晋级选手信息
void saverecord(); //10.保存比赛记录
void loadrecord(); //11.读取记录
bool fileisempty; //12.判断文件是否为空
//13.解析记录
void showrecord(); //14.显示往届记录
void clearspeech(); //15.清空比赛记录
//5.设置内部参数如下
vector<int> v1; //12名比赛选手编号容器
vector<int> v2; //第二轮 6名选手编号容器
vector<int> vv; //第二轮获得前3名编号选手容器
map<int,speaker> m_speaker; //存放编号及对应选手容器
map<int,vector<string>> m_record;//存放往届记录
int index; //记录比赛轮数
};
3.头文件程序2 speaker.h
#pragma once
#include<iostream>
using namespace std;
class speaker
{
public:
string name;
double score[2]; //分数是2个 所以直接构建数组 因为有2轮比赛
};
4.源文件 全部定义文件 speechmanager.cpp
#include"speechmanager.h"
speechmanager::speechmanager()//构造函数
{
this->initspeech(); //初始化参数
this->creatspeaker(); //创建选手
this->loadrecord(); //加载往届记录
}
void speechmanager::showmenu() //1.菜单
{
cout<<"*********************************"<<endl;
cout<<"***********欢迎参加演讲比赛*********"<<endl;
cout<<"***********1.开始演讲比赛**********"<<endl;
cout<<"***********2.查看往届记录**********"<<endl;
cout<<"***********3.清空比赛记录**********"<<endl;
cout<<"***********0.退出比赛程序**********"<<endl;
cout<<"*********************************"<<endl;
}
void speechmanager::selectsystem() //2.用户选择界面系统
{
int choice=0;
cout<<"请输入您的需求:"<<endl;
cin>>choice;
switch (choice)
{
case 1: //开始比赛
this->startspeech();
break;
case 2: //查看往届记录
this->showrecord();
break;
case 3: //清空比赛记录
this->clearspeech();
break;
case 0: //退出比赛程序
this->exitsystem();
break;
default:
break;
}
}
void speechmanager::exitsystem() //3.退出系统
{
cout<<"欢迎您下次使用!"<<endl;
system("read -p 'Press Enter to continue...' var"); //按任意建继续
system("clear"); //清屏
}
void speechmanager::initspeech() //6.初始化内部参数
{
this->index=1;
this->v1.clear();
this->v2.clear();
this->vv.clear();
this->m_speaker.clear();
this->m_record.clear(); //记录容器也清空
}
void speechmanager::creatspeaker() //7.创建12名选手
{
string nameseed="ABCDEFGHIJKL";
speaker sp; //先创建选手个体
for (int i = 0; i < 12; i++)
{
sp.name=nameseed[i]; //再给个体名字和分数赋值
sp.score[1]=0;
this->v1.push_back(i+10001); //选手编号放入v1容器
this->m_speaker.insert(make_pair(i+10001,sp)); //再将编号及对应选手放入map容器
}
}
void speechmanager::startspeech() //8.开始比赛
{
//第一轮比赛开始
this->speechdraw(); //(1)抽签
this->speechdivi(); // (2)分组比赛
this->showspeaker(); // (3)显示晋级结果
this->index++; //第二轮比赛开始
this->speechdraw(); // (1)抽签
this->speechdivi(); // (2)分组比赛
this->showspeaker(); // (3)显示最终结果
this->saverecord(); //10.保存比赛记录
cout<<"本届比赛举办圆满成功!"<<endl;
system("clear");
}
void speechmanager::speechdraw() //8.1 抽签
{
cout<<"*********************************"<<endl;
cout<<"第 "<<this->index<<" 轮比赛抽签开始!"<<endl;
cout<<"***********抽签顺序如下:***********"<<endl;
int i=1;
if (this->index==1)
{
random_shuffle(v1.begin(),v1.end());
for(vector<int>::iterator it=v1.begin();it!=v1.end();it++,i++)
{
cout<<"("<<i<<")"<<*it<<" ";
}
cout<<endl;
}
else
{
random_shuffle(v2.begin(),v2.end());
for(vector<int>::iterator it=v2.begin();it!=v2.end();it++,i++)
{
cout<<"("<<i<<")"<<*it<<" ";
}
cout<<endl;
}
system("read -p 'Press Enter to continue...' var");
}
void speechmanager::speechdivi() //8.2 分组比赛
{
cout<<"第 "<<this->index<<" 轮比赛正式开始!"<<endl;
multimap<double,int,greater<double>> groupscore; //准备临时容器 存放小组成绩
vector<int> src; //比赛选手编号容器
int num=0; //num记录人员个数 6人一组
if (this->index==1)
{
src=v1;
}
else{ src=v2; }
for(vector<int>::iterator it=src.begin();it!=src.end();it++) //遍历选手编号容器,每个选手10个评委打分
{
num++;
deque<double> d; //将10个评委打分放入临时v4容器
for (int i = 0; i <10; i++)
{
double score=rand()%41+60; //60~100分
d.push_back(score);
}
sort(d.begin(),d.end(),greater<double>()); //给deque容器的10个分 排序 然后去掉最高最低分
d.pop_back();
d.pop_front();
double sum=accumulate(d.begin(),d.end(),0.0f); //再算 总分accumulate 平均分
double avg=sum/(double)d.size();
this->m_speaker[*it].score[this->index-1]=avg; //将平均分放入到map容器中
groupscore.insert(make_pair(avg,*it)); //小组成绩 对应各选手的平均分
if(num%6==0)
{
cout<<"----第 "<<num/6<<" 小组比赛名次为:-----"<<endl; //把2个小组的成绩分别遍历出来
for(multimap<double,int,greater<double>>::iterator it=groupscore.begin();it!=groupscore.end();it++)
{
cout<<"编号"<<it->second<<" 姓名:"<<this->m_speaker[(*it).second].name
<<" 分数:"<<this->m_speaker[it->second].score[this->index-1]<<endl;
}
int count=0; //取走前三名
for(multimap<double,int,greater<double>>::iterator it=groupscore.begin();it!=groupscore.end()&&count<3;it++,count++)
{
if(this->index==1) //如果是第一轮的前三名 放入v2
{
v2.push_back(it->second);
}
else //第二轮的 放入vv
{
vv.push_back(it->second);
}
}
groupscore.clear(); //第一小组容器清空
}}
cout<<"---------------------第<<"<<this->index<<">>轮比赛完毕!-------------------"<<endl;
}
void speechmanager::showspeaker() //9.显示晋级选手信息
{
cout<<"第 "<<this->index<<" 轮晋级选手如下:"<<endl;
vector<int> v; //创建临时晋级选手容器
if (this->index==1)
{
v=v2;
}
else
{ v=vv; } //遍历该容器、打印输出
for (vector<int>::iterator it=v.begin();it!=v.end();it++)
{
cout<<"编号:"<<*it<< " 姓名:"<<this->m_speaker[*it].name<<" 分数:"<<this->m_speaker[*it].score[this->index-1]<<endl;
}
cout<<endl;
system("read -p 'Press Enter to continue...' var");
this->showmenu();
}
void speechmanager::saverecord() //10.保存比赛记录
{
ofstream ofs;
ofs.open("比赛记录",ios::out| ios::app); //将最后晋级的三位选手 写入文件
for (vector<int>::iterator it=vv.begin();it!=vv.end();it++)
{
ofs<<*it<<","<<this->m_speaker[*it].score[1]<<",";
}
ofs<<endl;
ofs.close();
cout<<"记录已保存!"<<endl;
cout<<"本届比赛圆满结束!"<<endl;
system("read -p 'Press Enter to continue...' var");
}
void speechmanager::loadrecord() //11.读取记录
{
ifstream ifs("比赛记录",ios::in); //读文件
if(!ifs.is_open())
{
this->fileisempty=true;
//cout<<"文件不存在或为空!"<<endl;
ifs.close();
return ;
}
char ch; //文件清空清空
ifs>>ch; //准备个字符读一下 是否读到文件尾
if(ifs.eof())
{
//cout<<"文件为空"<<endl;
this->fileisempty=true;
ifs.close();
return ;
}
this->fileisempty=false; //文件不为空
ifs.putback(ch); //将上面读取的单个字符再放回来
string data; //一行行读data
vector<string> v6; //存放最后的6个字符串容器
int index=0; //计数这是第几届比赛
while(ifs>>data)
{ //解析此记录
//cout<<data<<endl;
int pos=-1; //查找“,” 位置的变量
int start=0;
while(true)
{
pos=data.find(",",start);
if(pos==-1)
{
cout<<"文件不存在或为空!"<<endl;
break;
}
else
{
string temp=data.substr(start,pos-start); //将写入文件的6个字符截取并传入v6容器
//cout<<temp<<endl;
v6.push_back(temp);
start=pos+1;
}
}
this->m_record.insert(make_pair(index,v6)); //将v6和比赛届数传入 往届记录容器
index++;
}
ifs.close();
}
void speechmanager::showrecord() //14.显示往届记录
{
if (this->fileisempty)
{
cout<<"文件为空或在不存在!"<<endl;
}
else
{
for (size_t i = 0; i < this->m_record.size(); i++)
{
cout<<"第 "<<i+1<<" 届"<<" 冠军编号:"<<this->m_record[i][0]<<" 得分:"<<this->m_record[i][1]
<<" 亚军编号:"<<this->m_record[i][2]<<" 得分:"<<this->m_record[i][3]
<<" 季军编号:"<<this->m_record[i][4]<<" 得分:"<<this->m_record[i][5]<<endl;
}}
system("read -p 'Press Enter to continue...' var");
system("clear");
}
void speechmanager::clearspeech() //15.清空比赛记录
{
cout<<"确认清空?"<<endl;
cout<<"1、确认"<<endl;
cout<<"2、返回"<<endl;
int select=0;
cin>>select;
if(select==1)
{
ofstream ofs("比赛记录",ios::trunc); //打开模式 ios::trunc 如果存在 删除文件并重新创建
ofs.close();
this->initspeech(); //初始化 参数 创建选手 获取往届记录
this->creatspeaker();
this->loadrecord();
cout<<"清空成功!"<<endl;
}
system("read -p 'Press Enter to continue...' var");
system("clear");
}