从C向C++18——演讲比赛流程管理系统
一.项目需求
1.比赛规则
- 学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛。
- 每名选手都有对应的编号,如 10001~ 10012
- 比赛方式:分组比赛,每组6个人;
- 第一轮分为两个小组, 整体按照选手编号进行抽签后顺序演讲.
- 十个评委分别给每名选手打分,**去除最高分和最低分,**求的平均分为本轮选手的成绩
- 当小组演讲完后,淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛
- 第二轮为决赛,前三名胜出
- 每轮比赛过后需要显示晋级选手的信息
2.程序功能
- 开始演讲比赛:完成整届比赛的流程,每个比赛阶段需要给用户一个提示,用户按任意键后继续下一个阶段
- 查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用
.csv
后缀名保存 - 清空比赛记录:将文件中数据清空
- 退出比赛程序:可以退出当前程序
二.界面实现
实际开发过程中,先写主界面,一些部分可以用伪代码注释,以后再慢慢实现:
#include <iostream>
#include <ctime>
#include "speechmanger.h"
using namespace std;int main()
{Speechmanger sm;int choice = 0;srand((unsigned int)time(NULL));while (true){sm.showmenu();cout << "请您输入您的选择:" << endl;cin >> choice;switch (choice){case 1:sm.startgame(); //开始比赛break;case 2:sm.showrecord(); //查看记录break;case 3:sm.clearfile(); //清空文件break;case 0:sm.exitsystem(); //退出系统break;default:system("cls");break;}}system("pause");return 0;
}
三.管理类头文件
speechmanger.h
头文件:
#pragma once
#include <iostream>
#include <string>
#include "speaker.h"
#include <vector>
#include <map>
#include <algorithm>
#include <deque>
#include <functional>
#include <numeric>
#include <fstream>
using namespace std;//演讲管理类
class Speechmanger
{
public:Speechmanger(); //构造函数~Speechmanger(); //析构函数void showmenu(); //显示菜单void exitsystem(); //退出系统void initspeech(); //初始化容器和属性void creatspeaker(); //创建选手void startgame(); //开始比赛void speechdraw(); //抽签void contest(); //比赛(打分)double avg_score(); //计算成绩void showscore(); //显示得分(1)void showhonor(); //显示决赛获奖名单void saverecord(); //保存本届决赛记录void loadrecord(); //读取比赛记录void showrecord(); //显示往届记录void clearfile(); //清空文件//成员属性vector<int> v1; //保存第一轮选手编号vector<int> v2; //保存第二轮选手编号,也就是第一轮晋级选手编号vector<int> v3; //保存最后胜出3名选手编号map<int, Speaker> m_s; //存放编号及其具体对应选手的容器int index; //记录当前比赛轮次bool fileempty; //文件空标志map<int, vector<string>> m_record; //存放往届记录的容器
};
像我这样,属性和方法分开写。
四.方法实现
speechmanger.cpp
源文件实现:
#include "speechmanger.h"Speechmanger::Speechmanger()
{this->initspeech();this->creatspeaker();this->loadrecord();
}Speechmanger::~Speechmanger()
{}//显示菜单
void Speechmanger::showmenu()
{cout << "********************************************" << endl;cout << "************* 欢迎参加演讲比赛 ************" << endl;cout << "************* 1.开始演讲比赛 *************" << endl;cout << "************* 2.查看往届记录 *************" << endl;cout << "************* 3.清空比赛记录 *************" << endl;cout << "************* 0.退出比赛程序 *************" << endl;cout << "********************************************" << endl;cout << endl;
}//退出系统
void Speechmanger::exitsystem()
{cout << "欢迎下次使用" << endl;exit(0);
}//初始化容器和属性
void Speechmanger::initspeech()
{//容器都置空this->v1.clear();this->v2.clear();this->v3.clear();this->m_s.clear();this->m_record.clear();//比赛轮次初始为1this->index = 1;}//创建12名选手
void Speechmanger::creatspeaker()
{string namesed = "ABCDEFGHILKL";for (int i = 0; i < namesed.size(); i++){string name = "选手";name += namesed[i];Speaker sp;sp.m_name = name;for (int j = 0; j < 2; j++){sp.m_score[j] = 0;}this->v1.push_back(i + 10001); //创建选手编号,放入v1容器中this->m_s.insert(make_pair(i + 10001, sp)); //记录编号和选手对应关系}
}//开始比赛
void Speechmanger::startgame()
{//第一轮开始比赛//1.抽签this->speechdraw();//2.比赛(打分)this->contest();//3.显示晋级名单this->showscore();//第二轮开始比赛this->index++;//1.抽签this->speechdraw();//2.比赛(打分)this->contest();//3.显示获奖名单this->showhonor();//4.结果保存到文件中this->saverecord();//重置环境this->initspeech();this->creatspeaker();this->loadrecord();cout << "本届比赛结束!" << endl;system("pause");system("cls");
}//抽签
void Speechmanger::speechdraw()
{cout << "第" << this->index << "轮选手正在抽签:" << endl;cout << "--------------------------------------" << endl;cout << "抽签后的结果如下:" << endl;if (this->index == 1){random_shuffle(v1.begin(), v1.end());for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++){cout << *it << " ";}cout << endl;}else if (this->index == 2){random_shuffle(v2.begin(), v2.end());for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++){cout << *it << " ";}cout << endl;}elsecout << "程序出现错误" << endl;cout << "--------------------------------------" << endl;system("pause");cout << endl;
}//比赛(打分)
void Speechmanger::contest()
{cout << "---第" << this->index << "轮比赛开始:---" << endl;vector<int> v_src; //比赛容器if (this->index == 1)v_src = v1;if (this->index == 2)v_src = v2;multimap<double, int, greater<double>> groupscore; //临时容器,存放小组成绩int num = 0; //记录人数,6个人一组//遍历所有选手开始打分for (vector<int>::iterator it = v_src.begin(); it != v_src.end(); it++){num++;double score = this->avg_score();this->m_s[*it].m_score[index - 1] = score; //第四种插入方式groupscore.insert(make_pair(score,*it));if (num % 6 == 0){cout << "第" << num / 6 << "小组的成绩如下:" << endl;for (multimap<double, int, greater<double>>::iterator dit = groupscore.begin(); dit != groupscore.end(); dit++){cout << "编号:" << dit->second << " 姓名:" << this->m_s[dit->second].m_name<< " 成绩:" << this->m_s[dit->second].m_score[this->index - 1] << endl;}//取走前3名int count = 0;for (multimap<double, int, greater<double>>::iterator fit = groupscore.begin(); fit != groupscore.end()&& count<3; fit++,count++){if (this->index == 1){v2.push_back((*fit).second);}elsev3.push_back((*fit).second);}groupscore.clear();cout << endl;}}cout << "---第" << this->index << "轮比赛结束---" << endl;system("pause");
}//计算成绩
double Speechmanger::avg_score()
{deque<double> d;for (int i = 0; i < 10; i++){double score = (rand() % 401 + 600) / 10.f;d.push_back(score);}sort(d.begin(), d.end(),greater<double>()); //降序排序//去除最高分和最低分d.pop_back();d.pop_front();double sum = accumulate(d.begin(), d.end(), 0.0f);double avg = sum / (double)d.size();return avg;
}//显示得分(1)
void Speechmanger::showscore()
{cout << "第一轮晋级决赛选手如下:" << endl;for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++){cout << "选手编号:" << *it << " 姓名:" << this->m_s[*it].m_name << " 得分:"<< this->m_s[*it].m_score[0]<<endl;}cout << endl;system("pause");system("cls");this->showmenu();
}//显示决赛获奖名单
void Speechmanger::showhonor()
{cout << "第二轮决赛获奖选手如下:" << endl;for (vector<int>::iterator it = v3.begin(); it != v3.end(); it++){cout << "选手编号:" << *it << " 姓名:" << this->m_s[*it].m_name << " 得分:"<< this->m_s[*it].m_score[this->index-1] << endl;}cout << endl;system("pause");system("cls");this->showmenu();
}//保存本届决赛记录
void Speechmanger::saverecord()
{ofstream ofs;ofs.open("speech.csv",ios::out | ios::app); //以追加方式写文件for (vector<int>::iterator it = v3.begin(); it != v3.end(); it++){ofs << *it << "," << this->m_s[*it].m_name << "," << this->m_s[*it].m_score[1] <<",";}ofs<<endl;ofs.close();cout << "记录保存完毕" << endl;this->fileempty = false;
}//读取比赛记录
void Speechmanger::loadrecord()
{ifstream ifs("speech.csv", ios::in); //读文件//文件不存在if(!ifs.is_open()){this->fileempty = true;return;}//文件存在但被清空char ch;ifs >> ch;if (ifs.eof()){this->fileempty = true;ifs.close();return;}//文件不为空this->fileempty = false;ifs.putback(ch);string data;int num = 0;while (ifs >> data){vector<string> v;int pos = -1; //查找","的位置int start = 0; //开始查找的位置while (true){pos = data.find(",", start);if (pos == -1){//没有找到的情况break;}string temp = data.substr(start, pos - start);v.push_back(temp);start = pos + 1;}this->m_record.insert(make_pair(num, v));num++;}ifs.close();
}//显示往届记录
void Speechmanger::showrecord()
{if (this->fileempty){cout << "文件为空或记录不存在!" << endl;}else {for (int i = 0; i < this->m_record.size(); i++){cout << "第" << i + 1 << "届信息:" << endl;cout << "冠军编号:" << this->m_record[i][0] << " 冠军姓名:" << this->m_record[i][1] << " 冠军得分:" << this->m_record[i][2] << endl;cout << "亚军编号:" << this->m_record[i][3] << " 亚军姓名:" << this->m_record[i][4] << " 亚军得分:" << this->m_record[i][5] << endl;cout << "季军编号:" << this->m_record[i][6] << " 季军姓名:" << this->m_record[i][7] << " 季军得分:" << this->m_record[i][8] << endl;}}system("pause");system("cls");
}//清空文件
void Speechmanger::clearfile()
{cout << "是否确定清空文件?" << endl;cout << "1、是 2、否" << endl;int select = 0;cin >> select;if (select == 1){ofstream ofs("speech.csv", ios::trunc);ofs.close();this->initspeech();this->creatspeaker();this->loadrecord();cout << "清空成功!" << endl;}system("pause");system("cls");
}
相关文章:
从C向C++18——演讲比赛流程管理系统
一.项目需求 1.比赛规则 学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛。每名选手都有对应的编号,如 10001~ 10012比赛方式:分组比赛,每组6个人;第一轮分为两…...
QThread和std::thread
在 Qt 中, 我们经常会用到多线程,这时候就需要纠结是使用 Qt 的 QThread 还是使用 C 标准库的 std::thread。 这里记录一下我自己的理解,先介绍一下 QThread 和 std::thread 的使用方法,对比一下他们的不同,最后说一下…...
LeetCode 算法:组合总和 c++
原题链接🔗:组合总和 难度:中等⭐️⭐️ 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 …...

【两大3D转换SDK对比】HOOPS Exchange VS. CAD Exchanger
在现代工业和工程设计领域,CAD数据转换工具是确保不同软件系统间数据互通的关键环节。HOOPS Exchange和CAD Exchanger是两款备受关注的工具,它们在功能、支持格式、性能和应用场景等方面有着显著差异。 本文将从背景、支持格式、功能和性能、应用场景等…...

Openerstry + lua + redis根据请求参数实现动态路由转发
文章目录 一、需求分析二、准备1、软件安装2、redis-lua封装优化 三、实现1、nginx.conf2、dynamic.lua注意 3、准备两个应用4、访问nginx 四、参数直接传要代理的地址端口 一、需求分析 根据用户访问url的参数,将请求转发到对应指定IP的服务器上。 二、准备 1、…...
数字名片-Pushmall 智能AI数字名片7月更新计划
[数字名片]-商务营销推广助手7月更新计划 数字名片-商务营销推广助手7月更新计划 **2024年 6月完成模块开发优化****实现SaaS框架业务 1、智能名片:创建个人名片、企业名片、商机管理。 2、人脉商圈:附近人脉、就近群脉、好友名片。 3、企微社群&…...
21. Python代码快速查看数组分布
1. 前言 当你已经具备一段可用于快速查看数组分布的Python代码时,你拥有了一项强大的工具来分析和理解你的数据集。这种类型的代码通常会使用可视化库,例如Matplotlib和Seaborn,以直观的方式展示数据分布。这些库允许你创建直方图以观察数据集中的频率分布,以及核密度估计…...

记录些Redis题集(3)
分布式锁 分布式锁是一种用于在分布式系统中实现互斥访问的机制,它可以确保在多个节点、或进程同时访问共享资源。如果没有适当的锁机制,就可能导致数据不一致或并发冲突的问题。 分布式锁需要的介质 需要一个多个微服务节点都能访问的存储介质&#…...
OracleLinux6.9升级UEK内核
方法一: [root@localhost ~]# uname -r 4.1.12-61.1.28.el6uek.x86_64 [root@localhost ~]# rpm -qa | grep kernel-uek kernel-uek-firmware-4.1.12-61.1.28.el6uek.noarch kernel-uek-4.1.12-61.1.28.el6uek.x86_64 [root@localhost ~]# yum list kernel-uek Loaded plug…...

React学习笔记03-----手动创建和运行
一、项目创建与运行【手动】 react-scripts集成了webpack、bable、提供测试服务器 1.目录结构 public是静态目录,提供可以供外部直接访问的文件,存放不需要webpack打包的文件,比如静态图片、CSS、JS src存放源码 (1)…...

ubantu22.04安装OceanBase 数据库
1、管理员启动cmd,运行 sudo bash -c "$(curl -s https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/service/installer.sh)" 2、提示如下代表安装完成 3、修改数据库配置文件的密码 sudo vim /etc/oceanbase.cnf 然后保存退…...
【linux】【深度学习】fairseq框架安装踩坑
直接pip install fairseq发现跑代码时候老是容易崩,所以选择用源码编译安装。 python环境选择3.8以上都行,我选择3.10 首先安装torch, 我选择安装pip install torch1.13.1 torchaudio0.13.1以及cuda 11.7 (具体cuda根据个人显卡进…...

【Python爬虫教程】第7篇-requests模块的cookies保存和使用
文章目录 为什么要保存cookiesrequests.utils工具类保存cookies到本地文件从本地文件解析cookies使用使用实践 为什么要保存cookies 保存cookies是避免每次都登录获取权限,一遍权限是有过期时间的,不需要每次重复登录,可以将cookies保存起来…...
微信小程序开发基础知识6----使用npm包
一、小程序对npm的支持与限制 目前,小程序中已经支持使用 npm 安装第三方包,从而来提高小程序的开发效率。但是,在小程序中使用npm 包有如下3个限制: ① 不支持依赖于 Node.js 内置库的包 ② 不支持依赖于浏览器内置对象的包 ③ 不支持依赖于…...
如何在element中table的 v-for中 使用slot-scope?
有时候我们需要通过数据库来动态控制表格的列,这样做的好处就是系统中如果有太多的表格项的话,直接这套代码就能通用了,其他的数据库里控制就行,不要太方便了,特别是一些ERP或者供应链的表格,动不动就是几十上百个字段,这时候不要太轻松了,废话不多说,直接上代码: &…...

企业网络实验dhcp-snooping、ip source check,防非法dhcp服务器、自动获取ip(虚拟机充当DHCP服务器)、禁手动修改IP
文章目录 需求相关配置互通性配置配置vmware虚拟机(dhcp)分配IP服务配置dhcp relay(dhcp中继)配置dhcp-snooping(防非法dhcp服务器)配置ip source check(禁手动修改IP)DHCP中继&…...
20. Python读取.mat格式文件通用函数
1. 前言 在科研和工程领域,MATLAB的.mat文件是一种常见的数据存储格式,用于保存复杂的数组和结构体。Python作为一种强大的编程语言,提供了多种库来读取和处理.mat文件。本文将介绍一个通用的Python函数,用于读取.mat格式文件,并将其内容转换为Python数据结构,以便进一步…...

Cypress UI自动化之安装环境
注:macOS系统 一、git环境 略 二、node环境 1、安装nvm 前提:有装过Homebrew,参考adb使用方法文档 1、安装nvm:首先要保证之前没有安装过node,如果之前安装过,先 brew uninstall node brew install n…...
SpringApplication.java类
Tips: 以下内容根据源码中的注解翻译 SpringApplication SpringApplication可用来从一个Java main方法引导和启动一个Spring应用。默认情况下,SpringApplication按照以下步骤引导你的应用: 创建一个合适的ApplicationContext(依赖于你的cl…...
智能招聘系统的AI功能解析
一、引言 随着科技的飞速发展,人工智能(AI)技术正逐步渗透到各个领域,为企业带来前所未有的变革。在人力资源管理领域,智能招聘系统的出现,不仅大大提高了招聘效率,还为企业带来了更精准、更科…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...