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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/677978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字节跳动官方出品AI,白嫖使用GPT4!

关注我&#xff0c;紧跟本系列专栏文章&#xff0c;咱们下篇再续&#xff01; 作者简介&#xff1a;魔都技术专家兼架构&#xff0c;多家大厂后端一线研发经验&#xff0c;各大技术社区头部专家博主&#xff0c;编程严选网创始人。具有丰富的引领团队经验&#xff0c;深厚业务架…

《CSS 简易速速上手小册》第8章:CSS 性能优化和可访问性(2024 最新版)

文章目录 8.1 CSS 文件的组织和管理8.1.1 基础知识8.1.2 重点案例&#xff1a;项目样式表结构8.1.3 拓展案例 1&#xff1a;使用BEM命名规范8.1.4 拓展案例 2&#xff1a;利用 Sass 混入创建响应式工具类 8.2 提高网页加载速度的技巧8.2.1 基础知识8.2.2 重点案例&#xff1a;图…

alist基本用法@文档阅读@挂载网盘@网盘webdav挂载

文章目录 alist官网alist网站风格说明alist软件版本 安装和启动使用必看文档&#x1f47a;alist for android版本启动alist网页挂载阿里云盘open获取阿里云令牌 主页检查挂载情况 常用页面以配置挂载列表管理配置页面 FAQ可能遇到的错误检查服务重启前后alist的动作(自动挂载)a…

django中实现观察者模式

在Django中实现观察者模式&#xff0c;你可以利用Django的信号&#xff08;Signals&#xff09;系统。Django的信号提供了一种发布/订阅模型&#xff0c;允许解耦应用程序组件之间的交互。一个组件可以发送一个信号&#xff0c;而其他组件可以监听这个信号并响应它。 下面是如…

Google刚刚推出了图神经网络Tensorflow-GNN

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Vue源码系列讲解——虚拟DOM篇【四】(优化更新子节点)

目录 1. 前言 2. 优化策略介绍 3. 新前与旧前 4. 新后与旧后 5. 新后与旧前 6. 新前与旧后 7. 回到源码 8. 总结 1. 前言 在上一篇文章中&#xff0c;我们介绍了当新的VNode与旧的oldVNode都是元素节点并且都包含子节点时&#xff0c;Vue对子节点是 先外层循环newChil…

最佳视频转换器软件:2024年视频格式转换的选择

我们生活在一个充满数字视频的世界&#xff0c;但提供的内容远不止您最喜欢的流媒体服务目录。虽然我们深受喜爱的设备在播放各种自制和下载的视频文件方面变得越来越好&#xff0c;但在很多情况下您都需要从一种格式转换为另一种格式。 经过大量测试&#xff0c; 我们尝试过…

Tiny Http源码解析

相关概念 源码 HTTP CGI getsockname() 函数说明 accept_request: 处理从套接字上监听到的一个 HTTP 请求&#xff0c;在这里可以很大一部分地体现服务器处理请求流程。bad_request: 返回给客户端这是个错误请求&#xff0c;HTTP 状态吗 400 BAD REQUEST.cat: 读取服务器上某…

《CSS 简易速速上手小册》第5章:CSS 动画与过渡(2024 最新版)

文章目录 5.1 CSS 过渡基础&#xff1a;网页的微妙舞步5.1.1 基础知识5.1.2 重点案例&#xff1a;按钮悬停效果5.1.3 拓展案例 1&#xff1a;渐变显示导航菜单5.1.4 拓展案例 2&#xff1a;动态调整元素大小 5.2 关键帧动画&#xff1a;编排你的网页芭蕾5.2.1 基础知识5.2.2 重…

ctfshow-web21~28-WP

爆破(21-28) web21 题目给了一个zip文件,打开后解压是爆破的字典,我们抓包一下网址看看 发现账号和密码都被base64了,我们发送到intruder模块,给爆破的位置加上$符圈住 去base64解码一下看看格式

golang常用库之-操作数据库ORM:GORM 包介绍 | 一些 GORM 提示和注意事项

文章目录 golang操作数据库ORM&#xff1a;GORM 包介绍及实战一、什么是GORM 包二、GORM基本使用官方快速开始demo 一些 GORM 提示和注意事项 参考 golang操作数据库ORM&#xff1a;GORM 包介绍及实战 一、什么是GORM 包 官网&#xff1a;https://gorm.io/ github&#xff1a…

【PyQt】09-控件提示信息、Lable标签

文章目录 前言一、控件提示信息1.1 代码1.2 解释 < b >在HTML标签中的作用1.3 添加按键后的代码运行结果 二、QLabel控件介绍2.1 内容2.2 常用的事件2.3 代码结果展示 总结 前言 1、控件提示信息 2、QLabel控件介绍 一、控件提示信息 关键点在于 效果如图所示&#x…

VR和AR傻傻分不清,一句话给你讲明白。

不说废话&#xff0c;直接说结论&#xff0c;虚拟现实&#xff08;Virtual Reality&#xff0c;VR&#xff09;和增强现实&#xff08;Augmented Reality&#xff0c;AR&#xff09;。如果现实是A&#xff0c;虚拟是B&#xff0c;那么VRB&#xff0c;ARAB&#xff0c;就这简单&…

大模型实战营第二期——3. 基于 InternLM 和 LangChain 搭建你的知识库

github地址&#xff1a;InternLM/tutorial-书生浦语大模型实战营文档地址&#xff1a;基于 InternLM 和 LangChain 搭建你的知识库视频地址&#xff1a;基于 InternLM 和 LangChain 搭建你的知识库Intern Studio: https://studio.intern-ai.org.cn/console/instance动手学大模型…

2-8 单链表+双链表+模拟栈+模拟队列

今天给大家用数组来实现链表栈和队列 单链表&#xff1a; 首先要明白是如何用数组实现&#xff0c; 在这里需要用到几个数组&#xff0c;head表示头节点的下标&#xff0c;e[i]表示表示下标为i的值&#xff0c;ne[i]表示当前节点下一个节点的下标。idx表示当前已经用到那个点…

HTTP 协议在互联网中的作用是什么?

首先&#xff0c;HTTP 协议是互联网上应用最为广泛的一种网络协议。它被设计为无状态的&#xff0c;意味着服务器不会为每个请求保持状态。HTTP 协议的请求方法有 GET、POST、PUT、DELETE 等&#xff0c;分别对应着不同的操作。例如&#xff0c;GET 方法用于请求数据&#xff0…

Git的基础操作指令

目录 1 前言 2 指令 2.1 git init 2.2 touch xxx 2.3 git status 2.4 git add xxx 2.5 git commit -m xxxx 2.5 git log及git log --prettyoneline --all --graph --abbrev-commit 2.6 rm xxx 2.7 git reset --hard xxx(含小技巧) 2.8 git reflog 2.9 mv xxx yyy 1…

【BIAI】Lecture 14 - Sleep and Dreaming

Sleep and Dreaming 专业词汇 pons 延髓 parietal cortex 顶叶皮层 limbic system 边缘系统 temporal cortex 颞叶皮层 dorsolateral prefrontal cortex 背外侧前额叶皮层 pineal gland 松果体 Suprachiasmatic Nucleus 视交叉上核 课程大纲 Sleep stages awake无眼动睡眠&am…

【Python如何求出所有3位数的回文数】

回文数就是正向读和逆向读都相同的数&#xff0c;如66&#xff0c;626&#xff0c;72127 1、求出所有3位数的回文数python代码如下&#xff1a; # 输出所有3位数的回文数 for i in range(100, 1000): # 从100循环到999&#xff0c;不包含1000if str(i) str(i)[::-1]: # 如…

动态水印怎么加 怎么去除动态水印 视频剪辑软件 会声会影安激活序列号 会声会影怎么剪辑视频

为了防止白嫖或者增加美观效果&#xff0c;视频制作者可能会采用动态水印的方式&#xff0c;让其他人难以盗取视频使用。动态水印的添加&#xff0c;需要应用到运动路径功能。接下来&#xff0c;本文会教大家动态水印怎么加&#xff0c;怎么去除动态水印的相关内容。感兴趣的小…