STL演讲比赛流程管理系统

很难,一边看视频,一边思考了好多天

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
#include"speaker.h"
#include
#include
#include
#include
#include
#include
using namespace std;
//设计演讲管理类
class SpeechManager{
	public:
		//构造函数  声明 
		SpeechManager();
		
		//菜单功能
		void show_Menu();
		
		//退出系统
		void exitSysem(); 
		//析构函数  声明 
		~SpeechManager();
		
		//初始化容器和属性
		void initSpeech(); 
		
		//创建12名选手
		void createSpeaker(); 
		
		//开始比赛  比赛整个流程控制函数
		void startSpeech(); 
		
		//抽签
		void speechDraw(); 
		
		//比赛
		void speechContest();
		
		//显示得分
		void showScore(); 
		
		//保存记录 
		void saveRecord();
		
		//读取记录
		void loadRecord();
		
		//显示往届记录
		void showRecord();
		
		//清空文件
		 void clearRecord();
		
		//判断文件是否为空
		bool fileIsEmpty;
		
		//存放往届记录的容器
		map>m_Record; 
		 
		
		//成员属性
		//保存第一轮比赛选手编号容器 
		vectorv1;
		
		//第一轮晋级选手编号容器
		vectorv2;
		//胜出前三名选手编号容器
		vectorvVictory;
		
		//存放编号以及对应具体选手容器
		mapm_Speaker; //map的意思是每人都有固定编号  不会重复 
		
		//存放比赛轮数
		int m_Index; 
}; 

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; 
}

你可能感兴趣的:(50,c++,开发语言)