STL演讲比赛流程管理系统

2024-02-11 05:04

本文主要是介绍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.55v.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;}//不用elsesystem("pause");system("cls"); 
}SpeechManager::~SpeechManager(){} 

main.cpp

#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演讲比赛流程管理系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698896

相关文章

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验