STL演讲比赛流程管理系统

这篇具有很好参考价值的文章主要介绍了STL演讲比赛流程管理系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

speaker.h

#pragma once//防止头文件重复包含 
#include<iostream>
using namespace std;

//设计选手类 
class Speaker{
	public:
	string m_Name;//姓名 
	double m_Score[2];//double带了浮点,防止重复   2代表可能有人是两轮 
};

speechManager.h

#pragma once
#include<iostream>
#include<vector>
#include<map>
#include"speaker.h"
#include<algorithm>
#include<deque>
#include<functional>
#include<numeric>
#include<string>
#include<fstream>
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<int,vector<string>>m_Record; 
		 
		
		//成员属性
		//保存第一轮比赛选手编号容器 
		vector<int>v1;
		
		//第一轮晋级选手编号容器
		vector<int>v2;
		//胜出前三名选手编号容器
		vector<int>vVictory;
		
		//存放编号以及对应具体选手容器
		map<int,Speaker>m_Speaker; //map的意思是每人都有固定编号  不会重复 
		
		//存放比赛轮数
		int m_Index; 
}; 

speechManager.cpp

#include"speechManager.h"


	SpeechManager::SpeechManager()
	{
		//调用一下,在构造函数中初始化容器和属性 
		this->initSpeech() ;//自动 
		
		//初始化调用,	创建12名选手
		this->createSpeaker(); //需要构造函数自动先创建选手 
		
		//加载往届记录
		this->loadRecord(); 
	}
	void SpeechManager::show_Menu(){
		cout<<"*******************************************"<<endl;
		cout<<"********* 欢迎参与演讲比赛*****************"<<endl;
		cout<<"********* 1  开始演讲比赛******************"<<endl;
		cout<<"********* 2  查看往届记录******************"<<endl;
		cout<<"**********3  清空比赛记录******************"<<endl;
		cout<<"**********0  退出比赛程序******************"<<endl;
		cout<<"*******************************************"<<endl;
	}
	void SpeechManager::exitSysem(){
		cout<<"欢迎下次使用"<<endl;
		system("pause");
		exit(0);//退出系统 
	}
	void SpeechManager::initSpeech(){
		//保证.h中容器都置空
		this->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;i<nameSeed.size();i++){
			string name="选手";
			name+=nameSeed[i]; 
			
			//创建了具体选手 
			Speaker sp;
			sp.m_Name=name;
			
			for(int j=0;j<2;j++){
				sp.m_Score[j]=0;//将两轮得分都赋为0 
			}
			
			//创建选手编号 并且放到v1容器中
			this->v1.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<<"本届比赛完毕"<<endl;
	system("pause");
	system("cls");
	
}

//抽签
void SpeechManager::speechDraw(){
	cout<<"第"<<this->m_Index<<"轮比赛选手正在抽签"<<endl;
	cout<<"--------------------------------------------"<<endl;
	cout<<"抽签后的演讲顺序如下:"<<endl;
	
	if(this->m_Index==1){
		//第一轮比赛 
		random_shuffle(v1.begin(),v1.end());
		for(vector<int>::iterator it=v1.begin();it!=v1.end();it++){
			cout<<*it<<" ";
		}
		cout<<endl;
	}
	else{
		//第二轮比赛 
		random_shuffle(v2.begin(),v2.end());
		for(vector<int>::iterator it=v2.begin();it!=v2.end();it++){
			cout<<*it<<" ";
		}
		cout<<endl;
	}
	cout<<"-------------------------------"<<endl;
	system("pause");//按任意键进行下一个环节 
	cout<<endl;
}
		//比赛
void SpeechManager::speechContest(){
	cout<<"----------第"<<this->m_Index<<"轮比赛正式开始-----------"<<endl;
	
	//准备一个临时的容器	存放小组成绩
	multimap<double,int,greater<double>>groupScore;//大到小 
	
	int num=0;//记录人员个数6人一组 
	 
	vector<int>v_Src;//比赛选手的容器
	if(this->m_Index==1){
		v_Src=v1;//v1的人比赛 
	} 
	else{
		v_Src=v2;
	}
	
	//遍历所有选手进行比赛
	for(vector<int>::iterator it=v_Src.begin();it!=v_Src.end();it++){
		//it从10001开始 
		num++;
		
		//评委打分
		deque<double>d;
		for(int i=0;i<10;i++){
			double score=(rand()%401+600)/10.f;//600~1000点几 
//			测试的输出 
//			cout<<score<<" ";//10个评委打分具体分 
			d.push_back(score);
		} 
//		cout<<endl;
		
		sort(d.begin(),d.end(),greater<double>());//降序排列
		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<<"姓名" <<this->m_Speaker[*it].m_Name<<"获取平均分数"<<avg<<endl;
//		将平均分放入map容器中
		this->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<<"第"<<num/6<<"小组比赛名次:"<<endl;
	for(multimap<double,int,greater<double>>::iterator it=groupScore.begin();it!=groupScore.end();it++){
		cout<<"  编号  "<<it->second<<"  姓名  "<<this->m_Speaker[it->second].m_Name<<"  成绩  "<<
		this->m_Speaker[it->second].m_Score[this->m_Index-1]<<endl;//it->second是编号 
				
			}
			//取走前三名
	int count=0;
	for(multimap<double,int,greater<double>>::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<<endl;
		} 
	} 
	cout<<"--------------------第"<<this->m_Index<<"轮比赛完毕-----------------"<<endl;
	system("pause");
}
	//显示得分
void SpeechManager::showScore(){
	cout<<"---------第"<<this->m_Index<<"轮晋级选手信息如下----------"<<endl;
	vector<int>v;
	if(this->m_Index==1)//第一轮 
	{
		v=v2;
	}
	else{
		v=vVictory;
	}
	for(vector<int>::iterator it=v.begin();it!=v.end();it++){
		cout<<"选手编号:"<<*it<<"姓名"<<this->m_Speaker[*it].m_Name//通过key找value 
		<<" 得分:"<< this->m_Speaker[*it].m_Score[this->m_Index-1]<<endl;
		
	}
	cout<<endl;
	system("pause");
	system("cls");
	this->show_Menu();
}

//保存记录 
void SpeechManager::saveRecord(){
	ofstream ofs;
	ofs.open("speech.csv",ios::out|ios::app);//  |用追加的方式写文件   app为叠加	
	
	//将每个选手数据写入到文件中
	for(vector<int>::iterator it=vVictory.begin();it!=vVictory.end();it++){
		ofs<<*it<<","<<this->m_Speaker[*it].m_Score[1]<<",";//逗号分割	
		//冠军亚军季军写在一行	 
	} //begin开始为一号位 
	ofs<<endl;//换行 
	
	//关闭
	ofs.close();
	cout<<"记录已经保存"<<endl; 
	
	//若记录为空或不存在,比赛完后查询提示依然为空
	//有记录了,文件不为空
	this->fileIsEmpty=false; 
}

	//读取记录
void SpeechManager::loadRecord(){
	ifstream ifs("speech.csv",ios::in);//读取文件   ios::in读文件
	if(!ifs.is_open())//打开失败 
	{
		this->fileIsEmpty=true;
//		cout<<"文件不存在"<<endl;
		ifs.close();
		return ;
	} 
	
	//文件清空情况
	char ch;
	ifs>>ch;
	if(ifs.eof())//为真 读到文件尾 
//	用来判断文件是否为空,如果为1,那就是空的
	 {
//		cout<<"文件为空"<<endl;
		this->fileIsEmpty=true;
		ifs.close();
		return ;
	}
	
	//前两种情况排除后,只剩一种情况了,不为空的
	//文件不为空
	this->fileIsEmpty=false;
	ifs.putback(ch);//将上面读取的单个字符  放回来
	
	string data;//字符串读入 
	int index=0;//默认第0届 
	
	while(ifs>>data)//读到data里面 
	{
//		cout<<data<<endl;
		//结果:10002,86.675,10009,81.3,10007,78.55,
		
		vector<string>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<<temp<<endl;//测试代码
		//将每个值截取成功 
//		成功遍历输出 
//		10002
//		86.675
//		10009
//		81.3
//		10007
//		78.55
		v.push_back(temp);//放入设置好的容器
		 
		start=pos+1 ;
		}
		this->m_Record.insert(make_pair(index,v));//写入容器中 
		index++;
	} 
	ifs.close();
	
//	测试代码    迭代器方式 
//	for(map<int,vector<string>>::iterator it=m_Record.begin();it!=m_Record.end();it++){
//		cout<<it->first<<"冠军编号:"<<it->second[0]<<"分数:"<<it->second[1]<<endl;
//	}//it->first指的是第几届 
}
	//显示往届记录
void SpeechManager::showRecord()//数组方式遍历 
{
	if(this->fileIsEmpty){
		cout<<"文件为空或者文件不存在"<<endl;
	}
	else{
		for(int i=0;i<this->m_Record.size();i++){
		cout<<"第"<<i+1<<"届"
		<<"冠军编号"<<this->m_Record[i][0]<<"得分"<<this->m_Record[i][1]<<" "
		<<"亚军编号"<<this->m_Record[i][2]<<"得分"<<this->m_Record[i][3]<<" "
		<<"季军编号"<<this->m_Record[i][4]<<"得分"<<this->m_Record[i][5]<<endl;
	}
	}

	system("pause");
	system("cls");
}
	//清空文件
void SpeechManager::clearRecord(){
	cout<<"是否确定清空文件?"<<endl;
	cout<<"1  是"<<endl;
	cout<<"2  否"<<endl;
	
	int select=0;
	cin>>select;
	if(select==1){
		//确认清空
		ofstream ofs("speech.csv",ios::trunc);// ios::trunc文件若是存在就删除,然后重新创建一个空文件
		ofs.close();
		
		//然后状态也要做一个清空    将构造函数中三行代码复制过来 
		
		
		//调用一下,在构造函数中初始化容器和属性 
		this->initSpeech() ;//自动 
		
		//初始化调用,	创建12名选手
		this->createSpeaker(); //需要构造函数自动先创建选手 
		
		//加载往届记录
		this->loadRecord(); 
		
		cout<<"清空成功"<<endl;
	}
	//不用else
	system("pause");
	system("cls"); 
}
	SpeechManager::~SpeechManager()
	{
		
	 } 

main.cpp文章来源地址https://www.toymoban.com/news/detail-830117.html

#include<iostream>
using namespace std;
#include"speechManager.h"
#include<string>
#include<ctime>
int main(){
	//创建随机数种子
	srand((unsigned int)time(NULL)); //这样每次得分冠亚军都不一样了 
	//创建管理类的对象
	SpeechManager sm;
//	sm.show_Menu();

	//测试12名选手创建    可注释了 
//	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;
//		
//	} 

	int choice=0;//用于存储用户输入 
	while(true){
		sm.show_Menu();
		cout<<"请输入您的选择"<<endl;
		cin>>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; 
}

到了这里,关于STL演讲比赛流程管理系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++学习笔记-STL案例-机房预约系统4-管理员模块

    前言 衔接上一篇“c++学习笔记-STL案例-机房预约系统3-登录模块”,本文主要设计管理员模块,从管理员登录和注销、添加账号、显示账号、查看机房、清空预约五个功能进行分析和实现。 目录 7 管理员模块 7.1 管理员登录和注销 7.1.1 构造函数 ​编辑7.1.2 管理员子菜单 7.1.

    2024年01月19日
    浏览(42)
  • 基于Java+SpringBoot+Vue+Uniapp小程序前后端分离租房管理系统设计与实现(支持支付宝支付、有需求解析文档50页、演示视频)

    博主介绍: ✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品: 《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-

    2024年02月06日
    浏览(41)
  • Linux系统启动流程和内核管理详细介绍

    Linux系统启动流程和内核管理详细介绍 博客主要包含CentOS5 和 CentOS6的启动流程介绍、相关的系统服务管理、Grub启 动引导管理、自定义满足基本使用需求的Linux系统、Centos系统启动故障排错、源码 编译安装linux内核、BusyBox 介绍、Centos 7启动流程介绍、Centos 7 Unit介绍 Centos 7 服

    2024年02月13日
    浏览(39)
  • 生产制造企业用的ERP系统——流程管理

    ERP的含义是企业资源计划,主要是对企业所拥有各种资源进行综合规划和优化管理,用以降低成本,提高效率,增加利润。 作为一个低代码开发平台,百数在办公领域已有10年历史,为企业信息化发展提供丰富的功能模块,使用者无需代码基础即可搭建出个性化管理应用,即

    2024年02月06日
    浏览(82)
  • 二维码智慧门牌管理系统升级,打造高效事件处理流程

    随着城市化的不断推进,城市管理面临越来越多的挑战。为了更好地解决这些问题,许多城市已经开始采用二维码智慧门牌管理系统。这个系统不仅可以提高城市管理的效率,还可以让市民更加方便快捷地了解城市的相关信息。然而,随着城市管理需求的不断增加,这个系统

    2024年02月07日
    浏览(42)
  • Java版本企业招投标采购管理系统源码 一站式全流程采购招标系统

        一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编辑,驳回的立项编辑,在途流程查看。 二、项目

    2024年02月08日
    浏览(56)
  • Android 12系统源码_窗口管理(一)WindowManagerService的启动流程

    WindowManagerService是Android系统中重要的服务,它是WindowManager的管理者,WindowManagerService无论对于应用开发还是Framework开发都是重要的知识点,究其原因是因为WindowManagerService有很多职责,每个职责都会涉及重要且复杂的系统,这使得WindowManagerService就像一个十字路口的交通灯一样

    2024年02月11日
    浏览(43)
  • 宿舍管理系统--前后端分离式项目架构流程复盘(三万字详解)

    本篇博客主要以巩固前后端分离式项目架构流程,通过开发一个宿舍管理系统为例,系统地梳理所学知识以及提高业务逻辑能力,欢迎大家来交流经验🐒 这个是创建完成后的样子 执行npm run serve命令,按回车进入浏览器,生成此页面,说明项目创建完成· 1.直接删掉components文

    2024年02月13日
    浏览(45)
  • 基于若依的ruoyi-nbcio流程管理系统增加仿钉钉流程设计(六)

    更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统       这节主要讲条件节点与并发节点的有效性检查,主要是增加这两个节点的子节点检查,因为这两个节点需要增加审批人的子节点才能有效,否

    2024年02月05日
    浏览(40)
  • 基于若依的ruoyi-nbcio流程管理系统增加仿钉钉流程设计(二)

    更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 接上一文章 1、配置文件需要修改,增加相应的内容,如下: 2、NodeFactory函数修改如下,主要增加并行分支的处理 3、nodes 节点需要增加我们自己添加

    2024年02月06日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包