很难,一边看视频,一边思考了好多天
speaker.h
#pragma once//防止头文件重复包含
#include
using namespace std;
//设计选手类
class Speaker{
public:
string m_Name;//姓名
double m_Score[2];//double带了浮点,防止重复 2代表可能有人是两轮
};
speechManager.h
#pragma once
#include
#include
#include
speechManager.cpp
#include"speechManager.h"
SpeechManager::SpeechManager()
{
//调用一下,在构造函数中初始化容器和属性
this->initSpeech() ;//自动
//初始化调用, 创建12名选手
this->createSpeaker(); //需要构造函数自动先创建选手
//加载往届记录
this->loadRecord();
}
void SpeechManager::show_Menu(){
cout<<"*******************************************"<v1.clear();
this->v2.clear();
this->vVictory.clear();
this->m_Speaker.clear();
//初始化比赛轮数
this->m_Index=1;
//初始化记录容器
this->m_Record.clear();//如果没有执行这一步,容器中永远都有数据 ,就算是执行了清空操作
}
//创建12名选手
void SpeechManager::createSpeaker(){
string nameSeed="ABCDEFGHIJKL";
for(int i=0;iv1.push_back(i+10001);
//选手编号以及对应选手姓名 放入到map容器中
this->m_Speaker.insert(make_pair(i+10001,sp));
}
}
//开始比赛 比赛整个流程控制函数
void SpeechManager::startSpeech(){
//第一轮开始比赛
//1抽签
this->speechDraw();
//2.比赛
this->speechContest();
//3.显示晋级结果
this->showScore();
//第二轮开始比赛
this->m_Index++;
//1.抽签
speechDraw();
//2.比赛
speechContest();
//3.显示最终结果
showScore();
//4.保存分数到文件中
this->saveRecord();
//比赛完后查不到本届比赛的记录,没有实时更新
//解决方法:比赛完毕后,所有数据重置(就是把构造函数中的三行代码赋值过来!!)
//调用一下,在构造函数中初始化容器和属性
this->initSpeech() ;//自动
//初始化调用, 创建12名选手
this->createSpeaker(); //需要构造函数自动先创建选手
//加载往届记录
this->loadRecord();
cout<<"本届比赛完毕"<m_Index<<"轮比赛选手正在抽签"<m_Index==1){
//第一轮比赛
random_shuffle(v1.begin(),v1.end());
for(vector::iterator it=v1.begin();it!=v1.end();it++){
cout<<*it<<" ";
}
cout<::iterator it=v2.begin();it!=v2.end();it++){
cout<<*it<<" ";
}
cout<m_Index<<"轮比赛正式开始-----------"<>groupScore;//大到小
int num=0;//记录人员个数6人一组
vectorv_Src;//比赛选手的容器
if(this->m_Index==1){
v_Src=v1;//v1的人比赛
}
else{
v_Src=v2;
}
//遍历所有选手进行比赛
for(vector::iterator it=v_Src.begin();it!=v_Src.end();it++){
//it从10001开始
num++;
//评委打分
dequed;
for(int i=0;i<10;i++){
double score=(rand()%401+600)/10.f;//600~1000点几
// 测试的输出
// cout<());//降序排列
d.pop_front();//去除最高分
d.pop_back();//去除最低分
/*总分*/double sum=accumulate(d.begin(),d.end(),0.0f);//从0开始
/*平均分*/double avg=sum/(double)d.size();//整数强转成double类型 因为浮点和整数相除是整数
//打印平均分测试
// cout<<"编号:"<<*it<<"姓名" <m_Speaker[*it].m_Name<<"获取平均分数"<m_Speaker[*it].m_Score[this->m_Index-1]=avg;//关键
//将打分的数据放入到临时小组容器中
groupScore.insert(make_pair(avg,*it));//key是得分 ,value是具体选手编号
//每6人取出前三名
if(num%6==0)//够6个人了,进行
{
cout<<"第"<>::iterator it=groupScore.begin();it!=groupScore.end();it++){
cout<<" 编号 "<second<<" 姓名 "<m_Speaker[it->second].m_Name<<" 成绩 "<<
this->m_Speaker[it->second].m_Score[this->m_Index-1]<second是编号
}
//取走前三名
int count=0;
for(multimap>::iterator it=groupScore.begin();it!=groupScore.end()&&count<3;it++,count++){
if(this->m_Index==1){
v2.push_back((*it).second);//编号
}
else{
vVictory.push_back((*it).second);
}
}
groupScore.clear();//上一个小组容器清空
cout<m_Index<<"轮比赛完毕-----------------"<m_Index<<"轮晋级选手信息如下----------"<v;
if(this->m_Index==1)//第一轮
{
v=v2;
}
else{
v=vVictory;
}
for(vector::iterator it=v.begin();it!=v.end();it++){
cout<<"选手编号:"<<*it<<"姓名"<m_Speaker[*it].m_Name//通过key找value
<<" 得分:"<< this->m_Speaker[*it].m_Score[this->m_Index-1]<show_Menu();
}
//保存记录
void SpeechManager::saveRecord(){
ofstream ofs;
ofs.open("speech.csv",ios::out|ios::app);// |用追加的方式写文件 app为叠加
//将每个选手数据写入到文件中
for(vector::iterator it=vVictory.begin();it!=vVictory.end();it++){
ofs<<*it<<","<m_Speaker[*it].m_Score[1]<<",";//逗号分割
//冠军亚军季军写在一行
} //begin开始为一号位
ofs<fileIsEmpty=false;
}
//读取记录
void SpeechManager::loadRecord(){
ifstream ifs("speech.csv",ios::in);//读取文件 ios::in读文件
if(!ifs.is_open())//打开失败
{
this->fileIsEmpty=true;
// cout<<"文件不存在"<>ch;
if(ifs.eof())//为真 读到文件尾
// 用来判断文件是否为空,如果为1,那就是空的
{
// cout<<"文件为空"<fileIsEmpty=true;
ifs.close();
return ;
}
//前两种情况排除后,只剩一种情况了,不为空的
//文件不为空
this->fileIsEmpty=false;
ifs.putback(ch);//将上面读取的单个字符 放回来
string data;//字符串读入
int index=0;//默认第0届
while(ifs>>data)//读到data里面
{
// cout<v;//为了存放6个string字符串
//截取
int pos=-1;//查到","位置的变量
int start=0;
while(true){
pos=data.find(",",start); //逗号也占位
if(pos==-1){
//没有找到情况
break;
}
string temp=data.substr(start,pos-start);//求出子串 截取的位置是pos-start temp为临时值接收
//start从XX开始获取 //10002成功截取
// cout<m_Record.insert(make_pair(index,v));//写入容器中
index++;
}
ifs.close();
// 测试代码 迭代器方式
// for(map>::iterator it=m_Record.begin();it!=m_Record.end();it++){
// cout<first<<"冠军编号:"<second[0]<<"分数:"<second[1]<first指的是第几届
}
//显示往届记录
void SpeechManager::showRecord()//数组方式遍历
{
if(this->fileIsEmpty){
cout<<"文件为空或者文件不存在"<m_Record.size();i++){
cout<<"第"<m_Record[i][0]<<"得分"<m_Record[i][1]<<" "
<<"亚军编号"<m_Record[i][2]<<"得分"<m_Record[i][3]<<" "
<<"季军编号"<m_Record[i][4]<<"得分"<m_Record[i][5]<>select;
if(select==1){
//确认清空
ofstream ofs("speech.csv",ios::trunc);// ios::trunc文件若是存在就删除,然后重新创建一个空文件
ofs.close();
//然后状态也要做一个清空 将构造函数中三行代码复制过来
//调用一下,在构造函数中初始化容器和属性
this->initSpeech() ;//自动
//初始化调用, 创建12名选手
this->createSpeaker(); //需要构造函数自动先创建选手
//加载往届记录
this->loadRecord();
cout<<"清空成功"<
main.cpp
#include
using namespace std;
#include"speechManager.h"
#include
#include
int main(){
//创建随机数种子
srand((unsigned int)time(NULL)); //这样每次得分冠亚军都不一样了
//创建管理类的对象
SpeechManager sm;
// sm.show_Menu();
//测试12名选手创建 可注释了
// for(map::iterator it=sm.m_Speaker.begin();it!=sm.m_Speaker.end();it++){
// cout<<"选手编号:"<first<<"姓名"<second.m_Name<<"分数:"<second.m_Score[0]<>choice;
switch(choice){
case 1://开始比赛
sm.startSpeech();
break;
case 2://查看往届比赛记录
sm.showRecord();
break;
case 3://清空比赛记录
sm.clearRecord();
break;
case 0://退出系统
sm.exitSysem();
break;
default:
system("cls");// 清屏
break;
}
}
// system("puase");
return 0;
}