一个简易演讲比赛系统设计(C++详解)

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

class speakerManager
{
public:
	//四个容器
	vectorv1;
	vectorv2;
	vectorvictory;
	mapm_speaker;
	speakerManager();

	//比赛轮数
	int index;
	
	void init();
	void showMeu();
	void createSpeaker();
	void Exit();
	void startSpeech();//开始比赛及流程
	void speechDraw();//抽签
	void speechcontent();//得出分数并导入
	void ShowScore();//显示分数
	void SaveRecord();//保存到文件中
	void load_Record();//读取文件记录
	void ShowRecord();//显示往届记录
	void clearRecord();//清空文件
	bool fileIsempty;
	map>m_Record;//用来存放往届记录的容器

	~speakerManager();
	

};

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<<"清空成功!完结撒花!"<

你可能感兴趣的:(C++)