1.1比赛规则
·学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛。
·每名选手都有对应的编号,如10001~10012
·比赛方式:分组比赛,每组6个人;
·第一轮分为两个小组,整体按照选手编号进行抽签后顺序演讲。
·十个评委分别给每名选手打分,去除最高分和最低分,求的平均分为本轮选手的成绩·当小组演讲完后,淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛。
·第二轮为决赛,前三名胜出
·每轮比赛过后需要显示晋级选手的信息
·开始演讲比赛:完成整届比赛的流程,每个比寒阶段需要给用户一个提,用户按任意键后继续下一个阶段
·查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用.csv后缀名保存
·清空比寒记录:将文件中数据清空。退出比赛程序:可以退出当前程序
初步顺序:
1.建立一个管理类的头文件和cpp文件
包括构造函数,析构函数,展示函数
2.建立主函数文件,测试管理文件中的函数
3.在主函数建立switch,在管理文件中写退出功能
4.建立一个选手的.h文件,里面包含选手类
5.在管理的文件中添加4个容器,分别存放比赛选手,第一轮晋级的选手,获胜的选手,以及最后带编号存放到文件excel中的选手。并写一个初始化函数对这些容器进行清零初始化,还要将轮数初始化为1,记得把初始化函数写到构造函数中
6.在管理中写一个创建选手的函数,添加选手姓名,分数,并且在第一个容器中插入12名选手的编号,在map容器中添加选手编号和类,最后在构造函数中调用这个接口,进行测试
7.在管理中写一个开始比赛的函数,在函数中依次 抽签–比赛–显示结果 抽签单独再设计一个函数,回头在比赛函数中调用
8.提示第几轮比赛的开始,创建容器,根据比赛轮数的不同将该容器指向v1或者v2,遍历该容器,并在遍历中创建双头数组容器deque,用于给选手打分–sort排序(难)–去掉最高分和最低分–accumulate获取总分–获取平均分–打印输出–将平均分放到map容器中(难)–创建一个按照降序排列的map容器,用来打印小组名次并取出前三名放到v2或者victory容器中,最后把它清空
9.最后记得加入暂停清空
演讲比赛系统主文件.cpp文件:
#include
using namespace std;
#include
#include"speakerManager.h"
#include"speaker.h"
#include
int main ()
{
srand((unsigned int)time(NULL));//!不要把time和null的顺序写错了!
speakerManager sp;
/*for(map::iterator it=sp.m_speaker.begin();it!=sp.m_speaker.end();it++)
{
cout<<"选手编号:"<first<<" "<<"选手姓名:"<second.name<<" "<<"选手分数"<second.score[1]<>choice;
switch(choice)
{
case 1://开始比赛
sp.startSpeech();
break;
case 2://查看比赛记录
sp.ShowRecord();
break;
case 3://清空比赛记录
sp.clearRecord();
break;
case 0:
sp.Exit();
break;
default:
system("cls");
break;
}
}
system("pause");
return 0;
}
speakerManager.h文件
#pragma once
#include
using namespace std;
#include"speaker.h"
#include
#include
speaker.h文件:
#pragma once
#include
using namespace std;
class speaker
{
public:
string name;
double score[2];
};
speakerManager.cpp文件
#include "speakerManager.h"
#include"speaker.h"
#include
#include
#include
#include
#include
#include
#include
speakerManager::speakerManager()//构造函数
{
//初始化容器
this->init();
//创建选手
this->createSpeaker();
//保存到文档中,加载往届记录
this->load_Record();//傻逼行为,竟然把函数放到这!!竟然真的放在这里!
}
void speakerManager::init()
{
this->v1.clear();//这里初始化学习一下
this->v2.clear();
this->victory.clear();
this->m_speaker.clear();
this->m_Record.clear();
this->index=1;
}
void speakerManager::createSpeaker()
{
string nameseed="ABCDEFGHIJKI";
for(int i=0;i <(int)nameseed.size();i++)//!注意不是name.size()!
{
string name = "选手";
speaker sp;
name+=nameseed[i];
sp.name = name;
for(int j=0;j<2;j++)//每一位选手都有两个分数
{
sp.score[j]=0;
}
this->v1.push_back(i+10001);
this->m_speaker.insert(make_pair(i+10001,sp));
}
}
void speakerManager::startSpeech()//比赛流程总框架
{
//抽签
this->speechDraw();
//比赛
this->speechcontent();
//显示晋级选手信息
this->ShowScore();
this->index++;
//第二轮比赛
//抽签
this->speechDraw();
//比赛
this->speechcontent();
//显示晋级选手信息
this->ShowScore();
//保存到文档中
this->SaveRecord();
//初始化容器
this->init();
//创建选手
this->createSpeaker();
//加载往届记录
this->load_Record();//!
//读取文档记录
//this->load_Record();
system("pause");
system("cls");
}
void speakerManager::speechcontent()//比赛的核心内容
{
cout<<"开始第<<"<index<<">>轮比赛"<v_agc;//这个容器用来存放不同轮数数据
multimap>groupScore;//!!创建一个分数,编号,降序排列的数组容器
//multimap相对于map可以保存重复的元素
int num =0;//!记录人员个数,方便后面分组!
if(this->index==1)
{
v_agc = v1;
}
else
{
v_agc = v2;
}
for(vector::iterator it = v_agc.begin();it!=v_agc.end();it++)//遍历该容器
{
num++;
dequede;//!double//用来存放评委评分
for(int i=0; i<10;i++)
{
double score = (rand()%401+600)/10.f;//40-100,带分数
// cout<());//降序排序
double sum = accumulate(de.begin(),de.end(),0.0f);//注意是0.0f
double ave = sum/(double)de.size();
this->m_speaker[*it].score[this->index-1] =ave;//!!this->m_speaker[*it]代表这个双头容器的第几个位置
groupScore.insert(make_pair(ave,*it));//将打分数据放到临时容器中,第一个是平均分,第二个是选手编号
if( num % 6 == 0)
{
int a = num / 6 ;
cout<<"第"<>::iterator it = groupScore.begin();it!=groupScore.end();it++)
{
cout<<"选手编号:"<second<<" "<<"选手姓名:"<m_speaker[it->second].name<<" "<<"选手平均分:"<first<>::iterator it = groupScore.begin();it!=groupScore.end() && count<3;it++,count++)
{
if(this->index==1)
{
v2.push_back(it->second);
}
else
{
victory.push_back(it->second);
}
//cout<<"选手编号:"<second<<"选手姓名:"<m_speaker[it->second].name<<"选手平均分:"<first<index<<"轮比赛结束----------------------"<index<<">>轮晋级选手的信息如下:----------------"<v;
if(this->index==1)
{
v = this->v2;
}
else
{
v = this->victory;
}
sort(v.begin(),v.end());
for(vector::iterator it = v.begin();it!=v.end();it++)//遍历该容器
{
cout<<"选手编号:"<<*it<<" "<<"选手姓名:"<m_speaker[*it].name<<" "<<"选手分数:"
<m_speaker[*it].score[this->index-1]<showMeu();//为了在第二轮的时候可以显示
}
void speakerManager::speechDraw()
{
cout<<"第<<"<index<<">>轮选手正在抽签..."<index==1)//!!
{
random_shuffle(v1.begin(),v1.end());
for(vector::iterator it=this->v1.begin();it!=this->v1.end();it++)
{
cout<<*it<<" ";
}
//this->index++;
cout<::iterator it=this->v2.begin();it!=this->v2.end();it++)
{
cout<<*it<<" ";
}
}
system("pause");
cout<::iterator it=this->victory.begin();it!=this->victory.end();it++)
{
ofs<<*it<< ","<m_speaker[*it].score[1]<<",";//不要写成score[this->index -1]
//!!!!打印时前面一定要是ofs,不能是cout!!!!
}
ofs<fileIsempty=false;
}
void speakerManager::load_Record()//解析文件数据,获取往届分数
{
ifstream ifs;
ifs.open("speech.csv",ios::in);
if(!ifs.is_open())
{
//cout<<"文件不存在!"<fileIsempty=true;
ifs.close();
return;
}
char ch;
ifs>>ch;
if(ifs.eof())
{
//cout<<"文件为空!"<fileIsempty=true;
ifs.close();
return;
}
//cout<<"文件已打开!"<fileIsempty=false;
ifs.putback(ch);//!!!将上面取出来的ch放回去!!!
//for(vector::iterator it=this->victory.begin();it!=this->victory.end();it++)
//{
// ofs<<*it<< ","<m_speaker[*it].score[1]<<",";//不要写成score[this->index -1]
// //!!!!打印时前面一定要是ofs,不能是cout!!!!
//}//根本不是这样读的
string data;
int index = 0;//用于将最下面将读取出来的数据放到容器中记录轮数
while(ifs>>data)
{
//cout<v;//存放读取出来的数据,注意这些数据有编号有分数
int pos=-1;
int start=0;//这两个不能把放到while循环里不然一下子就跳出了
while(true)
{
pos= data.find(",",start);
if(pos ==-1)
{
//cout<<"没有找到数据!"<m_Record.insert(make_pair(index,v));//记得加上.insert
index++;
}
ifs.close();//!位置放错导致出错!
//for(map>::iterator it =this->m_Record.begin(); it!=this->m_Record.end();it++ )
//{
// cout<<"演讲比赛第"<first+1<<"届"<<" "<<"冠军编号:"<second[0]<<" "<<"冠军分数:" << it->second[1] <fileIsempty)
{
cout<<"文件不存在或为空!"<>::iterator it =this->m_Record.begin(); it!=this->m_Record.end();it++ )
{
cout<<"第"<first+1<<"届演讲比赛"<second[0]<<" "<<"冠军分数:" << it->second[1] <second[2]<<" "<<"冠军分数:" << it->second[3] <second[4]<<" "<<"冠军分数:" << it->second[5] <fileIsempty)
{
cout<<"文件不存在或为空!"<>select;
if(select==1)
{
ofstream ofs("speech.csv",ios::trunc);
ofs.close();
//初始化容器
this->init();
//创建选手
this->createSpeaker();
//加载往届记录
this->load_Record();//!
cout<<"清空成功!完结撒花!"<