C++练习---演讲比赛流程管理系统

目录

1-演讲比赛流程管理系统.cpp

2-Speaker.h

3-SpeechSpeaker.h

4-SpeechSpeaker.cpp


1-演讲比赛流程管理系统.cpp

#include <iostream>
using namespace std;
#include "SpeechManager.h"
#include <ctime>

//案例说明
/*
学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛。
每名选手都有对应的编号,如10001 ~10012
比赛方式:分组比赛,每组6个人;
第一轮分为两个小组,整体按照选手编号进行抽签后顺序演讲。
十个评委分别给每名选手打分,去除最高分和最低分,求的平均分为本轮选手的成绩当小组演讲完后,
淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛。
第二轮为决赛,前三名胜出
每轮比赛过后需要显示晋级选手的信息
*/

int main()
{
	srand((unsigned int)time(NULL));
	SpeechManager SM;
	测试
	//for(map<int,Speaker>::iterator it=SM.m_Speaker.begin();it!=SM.m_Speaker.end();it++)
	//{
	//	cout<<"选手编号:"<<it->first<<" 选手姓名:"<<it->second.m_Name<<" 选手成绩:"<<it->second.m_Score[0]<<endl;
	//}
	while(true)
	{
		int choice;
		SM.Menu();
		cout<<"请输入选择:"<<endl;
		cin>>choice;
		switch(choice)
		{
		case 1://开始比赛
			SM.StartSpeech();
			break;
		case 2://显示往届信息
			SM.LoadRecord();
			break;
		case 3://清空记录
			SM.clearRecord();
			break;
		case 0://退出系统
			SM.ExitSystem();
			break;
		default:
			break;
		}
		system("cls");
		
	}
	return 0;
}

2-Speaker.h

#pragma once
#include <iostream>
using namespace std;


//创建选手类--声明
class Speaker
{
public:
	string m_Name;//姓名
	double m_Score[2];//分数,两轮分数,有两个元素的一维数组
};

3-SpeechSpeaker.h

#pragma once//防止重复包含
#include <iostream>
using namespace std;
#include "Speaker.h"
#include <vector>
#include <map>
#include <string>
#include <algorithm>
#include <deque>
#include <numeric>
#include <functional>
#include <fstream>


//声明演讲比赛管理系统类
class SpeechManager
{
public:
	//构造函数
	SpeechManager();//声明即可

	//菜单函数
	void Menu();
	
	//初始化属性
	void InitSpeech();

	//创建选手
	void CreateSpeaker();

	//开始比赛
	void StartSpeech();

	//抽签
	void SpeechDraw();

	//比赛
	void SpeechContest();

	//显示晋级结果
	void ShowScore();

	//保存分数
	void SaveSpeech();

	//读取文件
	void LoadRecord();

	//清空记录
	void clearRecord();

	//退出系统函数
	void ExitSystem();

	//析构函数
	~SpeechManager();

//成员属性---容器
	//比赛选手容器-12人
	vector<int>v1;
	//第一轮晋级容器-6人
	vector<int>v2;
	//胜利前三名容器-3人
	vector<int>vVictory;
	//存放编号,以及对应的具体选手容器
	map<int,Speaker>m_Speaker;
	//记录比赛轮数
	int m_Index;
	//记录文件是否为空的标志
	bool IsEmpty;
	//往届记录
	map<int,vector<string>>m_Record;
};

4-SpeechSpeaker.cpp

#include "SpeechManager.h"

//实现SpeechManager管理类中的函数

//创建选手
void SpeechManager::CreateSpeaker()
{
	string NameSeed="ABCDEFGHIJKL";
	for(int i=0;i<int(NameSeed.size());i++)
	{
		Speaker sp;
		string name="选手";
		name+=NameSeed[i];
		sp.m_Name=name;
		for(int j=0;j<2;j++)
		{
			sp.m_Score[j]=0;
		}

		//编号
		this->v1.push_back(i+1000);
		//容器map放入
		this->m_Speaker.insert(make_pair(i+1000,sp));
	}
}

//初始化属性
void SpeechManager::InitSpeech()
{
	//容器清空
	this->v1.clear();
	this->v2.clear();
	this->vVictory.clear();
	this->m_Speaker.clear();
	this->m_Record.clear();
	//初始化比赛轮数
	this->m_Index=1;
}

//抽签
void SpeechManager::SpeechDraw()
{
	cout<<"第"<<this->m_Index<<"轮选手正在抽签:"<<endl;
	cout<<"----------抽签结果如下:-----------"<<endl;
	if(this->m_Index==1)//第一轮抽签
	{
		random_shuffle(this->v1.begin(),this->v1.end());
		for(vector<int>::iterator it=this->v1.begin();it!=this->v1.end();it++)
		{
			cout<<(*it)<<" ";
		}
		cout<<endl;
	}
	else
	{
		random_shuffle(this->v2.begin(),this->v2.end());
		for(vector<int>::iterator it=this->v2.begin();it!=this->v2.end();it++)
		{
			cout<<(*it)<<" ";
		}
		cout<<endl;
	}
	system("pause");
}

//比赛
void SpeechManager::SpeechContest()
{
	cout<<"-------第"<<this->m_Index<<"比赛正式开始--------"<<endl;
	//创建容器Vtemp
	vector<int>vTemp;
	if(this->m_Index==1)//第一轮
	{
		vTemp=this->v1;
	}
	else
	{
		vTemp=this->v2;
	}
	//创建小组临时容器,以分数为Key,实值为选手编号,指定为降序
	multimap<double,int,greater<double>>GroupScore;//使用内置的仿函数
	//打分
	int num=0;
	for(vector<int>::iterator it=vTemp.begin();it!=vTemp.end();it++)
	{
		num++;
		deque<double>d;
		for(int i=0;i<10;i++)//10个评委打分
		{
			d.push_back((rand()%401+600)/10.0f);
		}
		sort(d.begin(),d.end());//默认从小到大排序
		d.pop_back();//去除最高分
		d.pop_front();//去除最低分
		double score=accumulate(d.begin(),d.end(),0.00)/d.size();//求取平均分
		this->m_Speaker[*it].m_Score[this->m_Index-1]=score;//将分数放入Map总容器中
		//测试
		//cout<<"选手编号:"<<(*it)<<" 选手姓名:"<<this->m_Speaker[*it].m_Name<<" 选手成绩:"<<this->m_Speaker[*it].m_Score[this->m_Index-1]<<endl;;
		//map会根据键值自动插入排序,这里创建一个临时容器Multimap将分数作为key值,降序排序,Greater();
		GroupScore.insert(make_pair(score,*it));
		if(num%6==0)
		{
			cout<<"第"<<(num/6)<<"小组成绩排名如下:"<<endl;
			cout<<"-----------------------------------------"<<endl;
			for(multimap<double,int,greater<double>>::iterator mit=GroupScore.begin();mit!=GroupScore.end();mit++)
			{
				cout<<"选手编号:"<<mit->second<<" 选手姓名:"<<this->m_Speaker[mit->second].m_Name<<" 选手成绩"<<mit->first<<endl;
			}
			//取前三名存放
			int count=0;
			for(multimap<double,int,greater<double>>::iterator mit=GroupScore.begin();mit!=GroupScore.end() && count<3;mit++,count++)
			{
				if(this->m_Index==1)//第一轮
				{
					this->v2.push_back((*mit).second);
				}
				else//第二轮
				{
					this->vVictory.push_back((*mit).second);
				}
			}
			
			GroupScore.clear();
		}
	}
	system("pause");
}

//显示晋级结果
void SpeechManager::ShowScore()
{
	vector<int>v;
	if(this->m_Index==1)//第一轮比赛结果
	{
		v=this->v2;
	}
	else
	{
		v=this->vVictory;
	}
	cout<<"-----------------------------------------------"<<endl;
	cout<<"第"<<this->m_Index<<"轮比赛晋级结果如下:"<<endl;
	for(vector<int>::iterator it=v.begin();it!=v.end();it++)
	{
		cout<<"选手编号:"<<*it<<" 选手姓名:"<<this->m_Speaker[*it].m_Name<<" 选手成绩:"<<this->m_Speaker[*it].m_Score[this->m_Index-1]<<endl;
	}
	system("pause");
}

//保存分数
void SpeechManager::SaveSpeech()
{
	ofstream ofs;//创建文件流
	ofs.open("speech.csv",ios::out |ios::app);//输出写文件,以追加形式
	for(vector<int>::iterator it=vVictory.begin();it!=vVictory.end();it++)
	{
		ofs<<*it<<","<<this->m_Speaker[*it].m_Score[1]<<",";
	}
	ofs<<endl;
	ofs.close();//关闭文件
	cout<<"记录已经保存"<<endl;
}

//开始比赛
void SpeechManager::StartSpeech()
{
	//第一轮比赛;
	//1、抽签
	SpeechDraw();
	//2、比赛
	SpeechContest();
	//3、显示晋级结果
	ShowScore();
	//第二轮比赛
	this->m_Index++;
	//1、抽签
	SpeechDraw();
	//2、比赛
	SpeechContest();
	//3、显示最终结果
	ShowScore();
	//4、保存分数
	SaveSpeech();
	//!!!!!一定要初始化
	//初始化属性
	InitSpeech();

	//创建选手
	CreateSpeaker();
}


//读取文件
void SpeechManager::LoadRecord()
{
	ifstream ifs("speech.csv",ios::in);//创建流对象,读取文件
	//判断文件存在
	if(!ifs.is_open())
	{
		this->IsEmpty=true;
		cout<<"文件不存在!"<<endl;
		ifs.close();
		system("pause");
		return;
	}
	//判断文件是否为空
	char ch;
	ifs>>ch;
	if(ifs.eof())
	{
		cout<<"文件为空"<<endl;
		this->IsEmpty=true;
		ifs.close();
		system("pause");
		return;
	}
	//读取文件
	this->IsEmpty=false;
	ifs.putback(ch);//读取的单个字符返回去
	string data;//文件中读取的字符
	int index=1;//届数
	while(ifs>>data)
	{
		//cout<<data<<endl;//输出为1001,84.9755,1008,79.7059,1006,77.0098,
		//需要对此字符串进行信息截取,放入vector中
		//system("pause");
		vector<string>v;
		int pos=-1;
		int start=0;
		while(true)
		{
			pos=data.find(",",start);//start起始位置
			if(pos==-1)
			{
				break;
			}
			string tmp=data.substr(start,pos-start);//参数1起始位置,参数2截取长度
			v.push_back(tmp);
			start=pos+1;
		}
		this->m_Record.insert(make_pair(index,v));
		index++;
	}
	ifs.close();
	for(map<int,vector<string>>::iterator it=this->m_Record.begin();it!=this->m_Record.end();it++)
	{
		cout<<"第"<<it->first<<"届记录:"<<" 冠军编号:"<<it->second[0]<<" 分数:"<<it->second[1]
		<<" 亚军编号:"<<it->second[2]<<" 分数:"<<it->second[3]<<" 季军编号:"<<it->second[4]<<" 分数:"<<it->second[5]<<endl;
	}
	system("pause");
}

//清空记录
void SpeechManager::clearRecord()
{
	cout<<"确认清空?"<<endl;
	cout<<"1、清空;2、返回"<<endl;
	int select;
	cin>>select;
	if(select==1)
	{
		//打开模式,ios::trunc如果存在删除文件并重新创建
		ofstream ofs("speech.csv",ios::trunc);
		ofs.close();

		//初始化属性
		InitSpeech();

		//创建选手
		CreateSpeaker();
		cout<<"清空成功!"<<endl;
	}

}

//构造函数
SpeechManager::SpeechManager()
{
	//初始化属性
	InitSpeech();

	//创建选手
	CreateSpeaker();

}

//菜单函数
void SpeechManager::Menu()
{
	cout<<"************************************"<<endl;
	cout<<"********1、开始比赛*****************"<<endl;
	cout<<"********2、往届信息*****************"<<endl;
	cout<<"********3、清空信息*****************"<<endl;
	cout<<"********0、退出系统*****************"<<endl;
	cout<<"************************************"<<endl;
}

//退出系统函数
void SpeechManager::ExitSystem()
{
	cout<<"欢迎下次使用!"<<endl;
	exit(0);//退出系统
}

//析构函数
SpeechManager::~SpeechManager()
{
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值