c++学习笔记-STL案例-演讲比赛管理系统1

目录

1演讲比赛需求

1.1 比赛规则

1.2 程序功能

2.项目创建

2.1 创建新项目

2.2 添加文件

3.3 文件添加成功

3.创建管理类

3.1 功能描述

3.2 创建文件

 4  菜单功能

4.1 功能描述

4.2 添加成员函数

4.3 菜单功能实现 

4.4 main()函数中调用

 4.5 实现结果

5 退出系统功能

5.1 功能描述

5.2 添加成员函数

 5.3 退出功能实现

5.4 main()函数中调用

 5.5 实现结果

6 演讲比赛功能

 6.1 功能分析

6.2 创建选手类

6.3 比赛

6.3.1 成员属性添加

6.3.2 初始化属性

​编辑 6.3.3 创建选手

6.3.4 开始比赛成员函数添加

6.3.5 抽签

6.3.6 开始比赛

6.3.7 显示比赛分数

6.3.8 第二轮比赛

6.4 保存分数

7 查看记录 

7.1 读取分数记录

 7.2 解析文件中数据


1演讲比赛需求

1.1 比赛规则

  • 学校举行一场演讲比赛,共有12个人参加,比赛共两轮,第一轮为淘汰赛,第二轮为决赛。
  • 每名选手都有对应的编号,如10001~10012
  • 比赛方式:分组比赛,每组6个人
  • 第一轮为两个小组,整体按照选手编号进行抽签后顺序演讲
  • 十个评委分别给没名选手打分,去除最高分和最低分,求平均分为本轮选手的成绩
  • 当小组演讲完后,淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛
  • 第二轮为决赛,前三名胜出
  • 每轮比赛过后需要显示晋级选手的信息

1.2 程序功能

开始演讲比赛:完成整届比赛的流程,每个比赛阶段需要给用户一个提示,用户按任意键进入下一个比赛阶段

查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用.csv后缀保存

清空比赛记录:将文件中数据清空

退出比赛程序:可以退出当前程序

1.3 程序展示

1.开始比赛

(1)选择开始比赛

(2)第一轮比赛开始:抽签→打分→晋级名单 

(2)第二轮比赛开始:抽签→比赛打分→晋级选手(最后冠亚季) 

(3)保存第二轮比赛前三名 

2.查看往届记录

3. 清空比赛记录

 4.退出比赛程序:

2.项目创建

2.1 创建新项目

  • 打开visual Studio 2019 选择“创建新项目”

  • 选择“空项目”

  • 更改项目名称“基于STL的演讲比赛流程管理系统”

2.2 添加文件

1.“源文件”     “右键”    “添加”     “新建项”

2.更改文件名称为“演讲比赛流程管理系统”

3.3 文件添加成功

3.创建管理类

3.1 功能描述

  • 提供菜单界面与用户交互
  • 对演讲比赛流程进行控制
  • 与文件的读写交互

3.2 创建文件

  • 在头文件和源文件下分别创建speechManager.h和speechManager.cpp文件

 4  菜单功能

4.1 功能描述

  • 与用户的沟通界面

4.2 添加成员函数

在管理类speechManager.h中添加成员函数  void show_Menu();

4.3 菜单功能实现 

4.4 main()函数中调用

 4.5 实现结果

5 退出系统功能

5.1 功能描述

在main函数中提供分支选择,提供每个功能接口

5.2 添加成员函数

 5.3 退出功能实现

5.4 main()函数中调用

 5.5 实现结果

6 演讲比赛功能

 6.1 功能分析

比赛流程分析:

抽签→开始演讲比赛→显示第一轮比赛结果→

抽签→开始演讲比赛→显示前三名结果→保存比赛分数

6.2 创建选手类

speaker.h中创建Speaker类

6.3 比赛

6.3.1 成员属性添加

在speechManager.h头文件中添加成员属性、initSpeech()函数

6.3.2 初始化属性

1.speechManeger.cpp中初始化函数

2.构造函数中调用initSpeech() 

 6.3.3 创建选手

1.speechManager.h中创建speechManager类的creatSpeaker()函数

2.speechManager.cpp中实现creatSpeaker()函数,创建人员、两轮分数均置为0

3. 构造函数中调用creatSpeaker()函数 

4.测试

main()中写入测试代码:

测试结果:

6.3.4 开始比赛成员函数添加

在speechManager.h中提供开始比赛的成员函数void startSpeech(),该函数功能主要控制比赛流程

在speechManager.cpp中实现startSpeech()  ,此处使用了6.3.5的抽签函数

6.3.5 抽签

1.声明speechDraw()函数

2.实现speechDraw()函数

3.测试speechDraw()函数

case1的时候调用startSpeech()函数,startSpeech()函数中调用了抽取speechDraw()函数

 测试结果

6.3.6 开始比赛

1.声明speechContest()函数

2.增加头文件

  • deque用于打分存储队列,便于去除最高、最低分
  • functional用于map排序
  • numeric算数求和

 3.实现speechContest()函数

总结:

  • (1)multimap<double, int, greater<double>> groupScore
  • 小技巧 :groupScore的key是成绩,value是选手编号可以插入重复的成绩并从大到小排序,greater<double>是#include<functional>  内建函数实现从大到小排序,
  • (2)vector<int>v_Src;//比赛选手容器   
  • 小技巧:通过if条件判断是第一轮则v_Src=v1,第二轮v_Src=v2,可有效重复利用切换数据进行打分和分数计算
  • (3)if (num % 6 == 0) 
  • 小技巧:12个选手,分两组,所以除6余数为0则是一组,小组赛前三名需要进行第二轮比赛,所以小组前三取出存v2,v2的前三就是vVictory
void SpeechManager::speechContest()
{cout << "--------第<<" << this->m_Index << ">>轮比赛正式开始--------" << endl;//准备临时容器  存放小组成绩multimap<double, int, greater<double>> groupScore;int num = 0;// 记录人员个数vector<int>v_Src;//比赛选手容器if (m_Index == 1){v_Src = v1;}else{v_Src = v2;}//所有的选手进行比赛for (vector<int>::iterator it = v_Src.begin(); it != v_Src.end(); it++){num++;//评委打分deque<double>d;for (int i = 0; i < 10; i++){double score = (rand() % 401 + 600) / 10.f;   //600~1000//cout << score << "  ";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);   //分数求和double avg = sum / (double)d.size();    //平均分//打印平均分//cout << "编号: " << *it << "  姓名:" << this->m_Speaker[*it].m_Name << "  平均分" << avg;//将平均分放入map容器this->m_Speaker[*it].m_Score[this->m_Index - 1] = avg;//cout << endl;//将打分数据放入临时小组容器中groupScore.insert(make_pair(avg, *it));//key是得分,value是具体选手编号//六人取出前三名if (num % 6 == 0){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;}//取走前三名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");
}

 4.测试speechContest()函数 

测试结果:

6.3.7 显示比赛分数

1.声明showScore()函数

  • 在speechManager.h中添加保存记录的成员函数void showScore();

2.实现showScore()函数

  • 在speechManager.spp中实现的成员函数void showScore();

3.测试showScore()函数

6.3.8 第二轮比赛

6.4 保存分数

1.声明saveRecord()函数

  • #include<fstream  //添加头文件

  • 在speechManager.h中添加保存记录的成员函数void saveRecord();

 2.实现saveRecord()函数

  • 在speechManager.cpp中实现成员函数void saveRecord();

3.测试saveRecord()函数

测试结果: 

 

7 查看记录 

7.1 读取分数记录

1.声明成员函数loadRecord()、是否为空的标志fileIsEmpty、往届记录的容器map

  • 在speechManager.h中添加保存记录的成员函数void loadRecord();
  • 添加判断文件是否为空的标志 bool fileIsEmpty;
  • 添加往届记录的容器map<iny,vector<string>> m_Record;
  • 其中m_record中的key代表第几届,value记录具体的信息

2. 在speechManager.cpp中实现成员函数void loadRecord()

void SpeechManager::loadRecord()
{ifstream ifs("speech.csv", ios::in);//读文件if (!ifs.is_open()){this->fileIsEmpty = true;cout << "文件不存在" << endl;ifs.close();return;}//文件清空char ch;ifs >> ch;if (ifs.eof()){cout << "文件为空" << endl;this->fileIsEmpty = true;ifs.close();return;}//文件不为空this->fileIsEmpty = false;ifs.putback(ch);//将上面读取的单个字符再放回string data;while (ifs >> data){cout << data << endl;}ifs.close();
}

3.测试  loadRecord()

构造函数加载记录,测试结果有两条往届记录:

 7.2 解析文件中数据

while (ifs >> data){//cout << data << endl;//10002,86.375,10009,81,10010,78,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);//cout << temp << endl;v.push_back(temp);start = pos + 1;}this->m_Record.insert(make_pair(index, v));index++;}

通过“,”查找分割每个数据,数据为编号、得分、编号、得分、编号、得分,并将查找结果进行记录到v中,m_Recoed记录:届数index+每届前三名得分情况v,循环读入每节届的得分情况。

7.3 查看往届记录

1.speechManager.h中声明成员函数showRecord()

2.speechManager.cpp中实现成员函数showRecord()

3.测试showRecord()

测试结果:

7.4 bug解决

目前程序中有几处bug未解决:

1.查看往届记录,若文件不存在或者为空,并未提示:

解决方式:在showRecord()函数中,判断文件状态

2.若记录为空或不存在,比赛后依然提示记录为空

解决方式:saveRecord()中更新文件为空标志

3.比玩赛后查找不到本届比赛的记录,没有实时更新

解决方式:比赛完毕后,所有数据重置

4.在初始化时,没有初始化记录容器

解决方式:initSpeech()中添加  初始记录容器

5.每次记录都是一样的

解决方式:在main()函数一开始  添加随机数种子

结果显示:

8 清空记录

8.1 清空功能实现

1.在speeckManager.h中添加清空记录的成员函数void clearRecord();

2.在speeckManager.cpp中实现清空记录的成员函数void clearRecord();

8.2 清空功能测试

测试结果:

 

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

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

相关文章

C++力扣题目104--二叉树的最大深度

给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 返回它的最大深度 3 。 思路 看完本篇可以一起做了如下…

electron+vue编辑Office Word?

Electron 桌面应用是基于 Chromium 内核的&#xff0c;而谷歌Chrome取消了对PPAPI插件支持后&#xff0c;在线Office方案纷纷失效&#xff0c;只能更换国产浏览器在低版本浏览器苟延残喘&#xff0c;不能用于electronvue项目。 经过小编不断的寻找&#xff0c;终于找到一款至今…

redis主从复制、哨兵与集群

目录 一、概述 二、redis主从复制 1、概念 2、主从复制的作用 3、主从复制流程 4、搭建Redis 主从复制实验 ①在三台服务器上安装redis &#xff08;1&#xff09;关闭防火墙和安全机制 &#xff08;2&#xff09;修改内核参数 &#xff08;3&#xff09;安装redis …

自旋框的使用

1. 自旋框 实例化 //实例化单精度自旋框QSpinBox* spinBox new QSpinBox(this);//实例化双精度自旋框QDoubleSpinBox* doubleSpinBox new QDoubleSpinBox(this);1.1 单精度自旋框 QSpinBox 1.1.1 单精度自旋框的基本函数 QSpinBox_QDoubleSpinBox Dialog.cpp #include "…

网络安全保险发展起始阶段的挑战及应对措施

文章目录 前言一、网络安全保险的有序发展二、当前我国网络安全保险发展的初期态势&#xff08;一&#xff09;网络安全风险类型&#xff08;二&#xff09;网络安全保险的作用&#xff08;三&#xff09;与外国网络安全保费的规模对比 三、我国网络安全保险发展初期面临的挑战…

vue/vue3/js来动态修改我们的界面浏览器上面的文字和图标

前言&#xff1a; 整理vue/vue3项目中修改界面浏览器上面的文字和图标的方法。 效果&#xff1a; vue2/vue3: 默认修改 public/index.html index.html <!DOCTYPE html> <html lang"en"><head><link rel"icon" type"image/sv…

C++_vector类

目录 一、vector的模拟实现 1、vector的组成结构 2、vector尾插数据 2.1 析构函数 3、迭代器实现 4、resize 5、删除数据 5.1 迭代器失效 6、指定位置插入数据 6.1 迭代器失效 7、迭代器构造和resize构造 8、深浅拷贝 结语&#xff1a; 前言&#xff1a; vect…

vue前端开发自学demo-input标签数据双向绑定

vue前端开发自学demo-input标签数据双向绑定&#xff01;今天为大家 展示的内容是&#xff0c;前端开发常见的&#xff0c;form表单里面的&#xff0c;一些输入数据的元素&#xff0c;动态绑定数据的案例。比如input,以及checkbox的状态绑定案例。 首先&#xff0c;老规矩&…

【人工智能Ⅰ】实验11:支持向量机

实验11 支持向量机 一、实验目的 1&#xff1a;了解支持向量机的结构和原理。 2&#xff1a;应用支持向量机建立训练模型&#xff0c;对模型进行评估。 二、实验内容和要求 【实验内容】 选择支持向量机&#xff0c;对花卉图像或玉米果穗图像进行分类。花卉图像包括玫瑰&a…

关于LINUX操作系统异常宕机重启的分析思路

一、先搞清楚现状 当收到系统宕机告警或者故障反馈时&#xff0c;需要先对情况进行核实。比如检查系统启动时间&#xff0c;是不是真实发生了重启&#xff1f;如果重启了&#xff0c;什么时间点发生的重启&#xff1f;重启了几次&#xff1f;重启之前有无变更操作&#xff1f;…

PyTorch|构建自己的卷积神经网络——nn.Sequential()

之前在构建神经网络时&#xff0c;我们一般是采用这种方式&#xff0c;就像这样&#xff1a; class Network1(nn.Module): def __init__(self): super(Network1,self).__init__() self.conv1 nn.Conv2d(in_channels3, out_channels6, kernel_size5) …

【控制篇 / 策略】(7.4) ❀ 03. 地理地址对象在路由中的应用 ❀ FortiGate 防火墙

【简介】如何做到访问国内走Wan1&#xff0c;访问国际走Wan2 &#xff1f;当企业有多条宽带&#xff0c;特别是有国际专线的时候&#xff0c;这个需求就很普遍了。通过地理地址对象可以快速的解决这些问题。 策略路由 当我们有多条宽带的时候&#xff0c;我们有两种方法分流&am…

C++的虚基类

前言 本文介绍C的虚基类 先看一个问题 先看一段代码 #include <iostream> class A { public:int a 1; };class B1:public A { public:int b1 2; };class B2 :public A { public:int b2 3; };class C1:public B1,public B2 { public:int c1 4; };int main(int arg…

每日汇评:黄金多头能否在美国CPI数据发布后占有主动权?

黄金价格再次在2020美元附近找到支撑&#xff0c;因为所有人都在关注美国的通胀数据&#xff1b; 尽管最近美国国债收益率有所上升&#xff0c;但美元仍进一步下跌&#xff1b; 金价保持在21日移动均线和50日移动均线之间&#xff0c;等待区间突破&#xff1b; 在周四早盘的亚洲…

SIT1050ISO具有隔离功能,1Mbps,高速 CAN 总线收发器

➢ 完全兼容“ ISO 11898 ”标准&#xff1b; ➢ 内置过温保护&#xff1b; ➢ 100kV/s 瞬态抗扰度&#xff1b; ➢ 显性超时功能&#xff1b; ➢ -40V 至 40V 的总线故障保护&#xff1b; ➢ I/O 电压范围支持 3.3V 和 5V MCU &#xff1b; ➢ 低环路延迟…

解决原生微信小程序获取关联公众号的code(不是wx.login的code)来获取公众号的openId

解决步骤 以下是使用 web-view 并配配合微信公众号提供的 网页授权 来实现 1、在小程序中做一个web-view页面&#xff0c;页面中只需要写微信 网页授权的链接就行了&#xff0c;注意appid请自行替换&#xff08;公众号的&#xff09;。 onLoad() {this.setData({src: https://o…

Android SDK环境搭建[图解]; 解决问题Done. Nothing was installed.

安装SDK Android SDK环境搭建 依赖java环境,需要自备Java环境 (100%实操成功) 目录 1. 解压&#xff1a;解压到非中文无特殊字符的目录 2. 双击&#xff1a;SDK Manager.exe&#xff0c;不要选全部!不要选全部!不要选全部!(会下很久) 3. 然后勾选组件​ 4. 设置环境变量 …

UM2003A 一款200 ~ 960MHz ASK/OOK +18dBm 发射功率的单发射芯片

UM2003A 是一款工作于 200 ~ 960MHz 频段的单片集成、高性能、可独立运行的 OOK 发射器。内部集成的 OTP 方便用户对各种射频参数以及特色功能进行编程。该芯片以其高集成度和低功耗的设计&#xff0c;特别适用于低成本&#xff0c;低功耗&#xff0c;电池驱动的无线发射应用。…

【TypeScript】入门基础知识

目前在做项目的技术栈是 reacttypescript&#xff0c;之前只知道 ts 是 js 的扩展&#xff0c;增加了类型检查&#xff0c;但是没有仔细的学过&#xff0c;纯纯看别人代码上手 anyscript&#xff08;这很难评...&#xff09;。趁着最近空闲&#xff0c;就学习一下 ts 的基础知识…

章鱼网络 2023 年全回顾|暨12月进展报告

2023年&#xff0c;章鱼网络轻装上阵&#xff0c;身处加密行业的低谷中砥砺前行。 12月17日&#xff0c;经过整整1年时间的开发和打磨&#xff0c;章鱼网络在重磅上线 Octopus 2.0&#xff0c;即 $NEAR Restaking 和 NEAR-IBC&#xff0c;获得了社区和市场的一致认可&#xff…