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

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

基于Spring Boot 的小区人脸识别与出入记录管理系统功能

《基于SpringBoot的小区人脸识别与出入记录管理系统功能》文章介绍基于SpringBoot框架与百度AI人脸识别API的小区出入管理系统,实现自动识别、记录及查询功能,涵盖技术选型、数据模型... 目录系统功能概述技术栈选择核心依赖配置数据模型设计出入记录实体类出入记录查询表单出入记录 VO 类(用于

MySQL 升级到8.4版本的完整流程及操作方法

《MySQL升级到8.4版本的完整流程及操作方法》本文详细说明了MySQL升级至8.4的完整流程,涵盖升级前准备(备份、兼容性检查)、支持路径(原地、逻辑导出、复制)、关键变更(空间索引、保留关键字... 目录一、升级前准备 (3.1 Before You Begin)二、升级路径 (3.2 Upgrade

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶