【C++】从0到1入门C++编程学习笔记 - 实战篇:演讲比赛流程管理系统
文章目录
- 一、演讲比赛程序需求
- 1.1 比赛规则
- 1.2 程序功能
- 1.3 程序效果图:
- 二、项目创建
- 2.1 创建项目
- 2.2 添加文件
- 三、创建管理类
- 3.1创建文件
- 3.2 头文件实现
- 3.3 源文件实现
- 四、菜单功能
- 4.1 添加成员函数
- 4.2 菜单功能实现
- 4.3 测试菜单功能
- 五、退出功能
- 5.1 提供功能接口
- 5.2 实现退出功能
- 5.3测试功能
- 六、演讲比赛功能
- 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.1 读取记录分数
- 7.2 查看记录功能
- 7.3 测试功能
- 7.4 bug解决
- 八、清空记录
- 8.1 清空记录功能实现
- 8.2 测试清空
一、演讲比赛程序需求
1.1 比赛规则
- 学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛。
- 比赛方式:分组比赛,每组6个人;选手每次要随机分组,进行比赛
- 每名选手都有对应的编号,如 10001 ~ 10012
- 第一轮分为两个小组,每组6个人。 整体按照选手编号进行抽签后顺序演讲。
- 当小组演讲完后,淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛。
- 第二轮为决赛,前三名胜出
- 每轮比赛过后需要显示晋级选手的信息
1.2 程序功能
- 开始演讲比赛:完成整届比赛的流程,每个比赛阶段需要给用户一个提示,用户按任意键后继续下一个阶段
- 查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用.csv后缀名保存
- 清空比赛记录:将文件中数据清空
- 退出比赛程序:可以退出当前程序
1.3 程序效果图:

二、项目创建
创建项目步骤如下:
- 创建新项目
- 添加文件
2.1 创建项目
- 打开vs2017后,点击创建新项目,创建新的C++项目
如图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ldURR8kj-1676297946943)(assets/1548121881969.png)]](https://img-blog.csdnimg.cn/f34c11407beb48b4b2119abfebb99da4.png)
- 填写项目名称以及选取项目路径,点击确定生成项目
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HwAWXj8s-1676297946943)(assets/1548122271773.png)]](https://img-blog.csdnimg.cn/25e1b9fdf0674f7db90f48af5ca30ba1.png)
2.2 添加文件
- 右键源文件,进行添加文件操作
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-glhjs1Wg-1676297946944)(assets/1548122420253.png)]](https://img-blog.csdnimg.cn/c23c605eeb9f44ebafb6b78ff8a494c2.png)
- 填写文件名称,点击添加
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3YC17RKW-1676297946944)(assets/1548122510869.png)]](https://img-blog.csdnimg.cn/100545cc1f3f44de9d3c615a1494c3de.png)
- 生成文件成功,效果如下图

- 至此,项目已创建完毕
三、创建管理类
功能描述:
- 提供菜单界面与用户交互
- 对演讲比赛流程进行控制
- 与文件的读写交互
3.1创建文件
- 在头文件和源文件的文件夹下分别创建speechManager.h 和 speechManager.cpp文件

3.2 头文件实现
在speechManager.h中设计管理类
代码如下:
#pragma once
#include<iostream>
using namespace std;//演讲管理类
class SpeechManager
{
public://构造函数SpeechManager();//析构函数~SpeechManager();
};
3.3 源文件实现
在speechManager.cpp中将构造和析构函数空实现补全
#include "speechManager.h"SpeechManager::SpeechManager()
{
}SpeechManager::~SpeechManager()
{
}
- 至此演讲管理类以创建完毕
四、菜单功能
功能描述:与用户的沟通界面
4.1 添加成员函数
在管理类speechManager.h中添加成员函数 void show_Menu();
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Mwapc6f-1676297946945)(assets/1548123942072.png)]](https://img-blog.csdnimg.cn/e0b48286335b4ed0b86881046d3293d0.png)
4.2 菜单功能实现
- 在管理类speechManager.cpp中实现 show_Menu()函数
void SpeechManager::show_Menu()
{cout << "********************************************" << endl;cout << "************* 欢迎参加演讲比赛 ************" << endl;cout << "************* 1.开始演讲比赛 *************" << endl;cout << "************* 2.查看往届记录 *************" << endl;cout << "************* 3.清空比赛记录 *************" << endl;cout << "************* 0.退出比赛程序 *************" << endl;cout << "********************************************" << endl;cout << endl;
}
4.3 测试菜单功能
- 在演讲比赛流程管理系统.cpp中测试菜单功能
代码:
#include<iostream>
using namespace std;
#include "speechManager.h"int main() {SpeechManager sm;sm.show_Menu();system("pause");return 0;
}
- 运行效果如图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L4sQCkk4-1676297946945)(assets/1548124599641.png)]](https://img-blog.csdnimg.cn/6d89420a3891463bab4149a141c39c06.png)
- 菜单界面搭建完毕
五、退出功能
5.1 提供功能接口
- 在main函数中提供分支选择,提供每个功能接口
代码:
int main() {SpeechManager sm;int choice = 0; //用来存储用户的选项while (true){sm.show_Menu();cout << "请输入您的选择: " << endl;cin >> choice; // 接受用户的选项switch (choice){case 1: //开始比赛break;case 2: //查看记录break;case 3: //清空记录break;case 0: //退出系统break;default:system("cls"); //清屏break;}}system("pause");return 0;
}
5.2 实现退出功能
在speechManager.h中提供退出系统的成员函数 void exitSystem();
在speechManager.cpp中提供具体的功能实现
void SpeechManager::exitSystem()
{cout << "欢迎下次使用" << endl;system("pause");exit(0);
}
5.3测试功能
在main函数分支 0 选项中,调用退出程序的接口
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SskbWrUS-1676297946945)(assets/1548124853576.png)]](https://img-blog.csdnimg.cn/87178b3d10ed4e799f2919dbb4916daa.png)
运行测试效果如图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uLq4DLCY-1676297946945)(assets/1548124888578.png)]](https://img-blog.csdnimg.cn/107d3c7735ef44cb9f194ac3d52c4b86.png)
六、演讲比赛功能
6.1 功能分析
比赛流程分析:
抽签 → 开始演讲比赛 → 显示第一轮比赛结果 →
抽签 → 开始演讲比赛 → 显示前三名结果 → 保存分数
6.2 创建选手类
- 选手类中的属性包含:选手姓名、分数
- 头文件中创建 speaker.h文件,并添加代码:
#pragma once
#include<iostream>
using namespace std;class Speaker
{
public:string m_Name; //姓名double m_Score[2]; //分数 最多有两轮得分
};
6.3 比赛
6.3.1 成员属性添加
- 在speechManager.h中添加属性
//比赛选手 容器 12人vector<int>v1;//第一轮晋级容器 6人vector<int>v2;//胜利前三名容器 3人vector<int>vVictory;//存放编号 以及对应的 具体选手 容器map<int, Speaker> m_Speaker;
6.3.2 初始化属性
- 在speechManager.h中提供开始比赛的的成员函数
void initSpeech();
//初始化属性void initSpeech();
- 在speechManager.cpp中实现
void initSpeech();
void SpeechManager::initSpeech()
{//容器保证为空this->v1.clear(); this->v2.clear();this->vVictory.clear();this->m_Speaker.clear();//初始化比赛轮数this->m_Index = 1;
}
- SpeechManager构造函数中调用
void initSpeech();
SpeechManager::SpeechManager()
{//初始化属性this->initSpeech();
}
6.3.3 创建选手
- 在speechManager.h中提供开始比赛的的成员函数
void createSpeaker();
//初始化创建12名选手void createSpeaker();
- 在speechManager.cpp中实现
void createSpeaker();
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 i = 0; i < 2; i++){sp.m_Score[i] = 0;}//12名选手编号this->v1.push_back(i + 10001);//选手编号 以及对应的选手 存放到map容器中this->m_Speaker.insert(make_pair(i + 10001, sp));}
}
- SpeechManager类的 构造函数中调用
void createSpeaker();
SpeechManager::SpeechManager()
{//初始化属性this->initSpeech();//创建选手this->createSpeaker();
}
- 测试 在main函数中,可以在创建完管理对象后,使用下列代码测试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;
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U2k9bhfK-1676297946945)(assets/1548141605742.png)]](https://img-blog.csdnimg.cn/31da0d6850d24651a494f600e80cca1f.png)
- 测试效果如图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t7EXffFm-1676297946946)(assets/1548141560164.png)]](https://img-blog.csdnimg.cn/b9e095efeef349d5ab1f9aea48656a04.png)
- 测试完毕后,可以将测试代码删除或注释。
6.3.4 开始比赛成员函数添加
- 在speechManager.h中提供开始比赛的的成员函数
void startSpeech(); - 该函数功能是主要控制比赛的流程
//开始比赛 - 比赛流程控制void startSpeech();
- 在speechManager.cpp中将startSpeech的空实现先写入
- 我们可以先将整个比赛的流程 写到函数中
//开始比赛
void SpeechManager::startSpeech()
{//第一轮比赛//1、抽签//2、比赛//3、显示晋级结果//第二轮比赛//1、抽签//2、比赛//3、显示最终结果//4、保存分数
}
6.3.5 抽签
功能描述:
-
正式比赛前,所有选手的比赛顺序需要打乱,我们只需要将存放选手编号的容器 打乱次序即可
-
在speechManager.h中提供抽签的的成员函数
void speechDraw();
//抽签void speechDraw();
- 在speechManager.cpp中实现成员函数
void speechDraw();
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;
}
- 在startSpeech比赛流程控制的函数中,调用抽签函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PEJSpKtj-1676297946946)(assets/1548143871202.png)]](https://img-blog.csdnimg.cn/4eaec2eab57a47e4b5d50b5b747ad53d.png)
- 在main函数中,分支1选项中,调用开始比赛的接口
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IAosQi61-1676297946946)(assets/1548143543475.png)]](https://img-blog.csdnimg.cn/ec2a1451d2ad42f78695c73234f24559.png)
- 测试
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-upv9x9Xe-1676297946946)(assets/1548143610682.png)]](https://img-blog.csdnimg.cn/f0a2f174354d42ad8ef9b1ff18a835be.png)
6.3.6 开始比赛
- 在speechManager.h中提供比赛的的成员函数
void speechContest();
//比赛void speechContest();
- 在speechManager.cpp中实现成员函数
void speechContest();
void SpeechManager::speechContest()
{cout << "------------- 第"<< this->m_Index << "轮正式比赛开始:------------- " << endl;multimap<double, int, greater<int>> groupScore; //临时容器,保存key分数 value 选手编号int num = 0; //记录人员数,6个为1组vector <int>v_Src; //比赛的人员容器if (this->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);}sort(d.begin(), d.end(), greater<double>()); //排序d.pop_front(); //去掉最高分d.pop_back(); //去掉最低分double sum = accumulate(d.begin(), d.end(), 0.0f); //获取总分double avg = sum / (double)d.size(); //获取平均分//每个人平均分//cout << "编号: " << *it << " 选手: " << this->m_Speaker[*it].m_Name << " 获取平均分为: " << avg << endl; //打印分数this->m_Speaker[*it].m_Score[this->m_Index - 1] = avg;//6个人一组,用临时容器保存groupScore.insert(make_pair(avg, *it));if (num % 6 == 0){cout << "第" << num / 6 << "小组比赛名次:" << endl;for (multimap<double, int, greater<int>>::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<int>>::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");
}
- 在startSpeech比赛流程控制的函数中,调用比赛函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5z8dMQrF-1676297946949)(assets/1548144491984.png)]](https://img-blog.csdnimg.cn/0829f20ec57343cc80830d9d259fc68f.png)
- 再次运行代码,测试比赛
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rGeHYOsD-1676297946950)(assets/1548144765146.png)]](https://img-blog.csdnimg.cn/e327c2da6aca45d88eaaecec54556a4b.png)
6.3.7 显示比赛分数
- 在speechManager.h中提供比赛的的成员函数
void showScore();
//显示比赛结果void showScore();
- 在speechManager.cpp中实现成员函数
void showScore();
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 << " 姓名: " << m_Speaker[*it].m_Name << " 得分: " << m_Speaker[*it].m_Score[this->m_Index - 1] << endl;}cout << endl;system("pause");system("cls");this->show_Menu();
}
- 在startSpeech比赛流程控制的函数中,调用显示比赛分数函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-etrvrlOu-1676297946950)(assets/1548146903960.png)]](https://img-blog.csdnimg.cn/786462de5b7a464d842bac9c4eef1087.png)
- 运行代码,测试效果
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MopB5d5Z-1676297946950)(assets/1548146961550.png)]](https://img-blog.csdnimg.cn/f7492d31c68945c288ef77f6a79ffdda.png)
6.3.8 第二轮比赛
第二轮比赛流程同第一轮,只是比赛的轮是+1,其余流程不变
- 在startSpeech比赛流程控制的函数中,加入第二轮的流程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rqn6HnlH-1676297946950)(assets/1548148593215.png)]](https://img-blog.csdnimg.cn/ccc854afc5534b98be871dd088e45d5a.png)
测试,将整个比赛流程都跑通
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CoPevsfG-1676297946950)(assets/1548148536395.png)]](https://img-blog.csdnimg.cn/a585b7dcdd2e4b7f91217070411d8bc7.png)
6.4 保存分数
功能描述:
- 将每次演讲比赛的得分记录到文件中
功能实现:
- 在speechManager.h中添加保存记录的成员函数
void saveRecord();
//保存记录void saveRecord();
- 在speechManager.cpp中实现成员函数
void saveRecord();
void SpeechManager::saveRecord()
{ofstream ofs;ofs.open("speech.csv", ios::out | ios::app); // 用输出的方式打开文件 -- 写文件//将每个人数据写入到文件中for (vector<int>::iterator it = vVictory.begin(); it != vVictory.end(); it++){ofs << *it << ","<< m_Speaker[*it].m_Score[1] << ",";}ofs << endl;//关闭文件ofs.close();cout << "记录已经保存" << endl;
}
- 在startSpeech比赛流程控制的函数中,最后调用保存记录分数函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LIqW1kMR-1676297946951)(assets/1548149937860.png)]](https://img-blog.csdnimg.cn/4a76f8598e9e42f7a067c42b9be64d0c.png)
- 测试,整个比赛完毕后记录保存情况
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TLelrxyq-1676297946951)(assets/1548149912863.png)]](https://img-blog.csdnimg.cn/372cd7f73f4543f4b9a94001c539a0c0.png)
利用记事本打开文件 speech.csv,里面保存了前三名选手的编号以及得分
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pVvond4P-1676297946951)(assets/1548150047975.png)]](https://img-blog.csdnimg.cn/d436a16842074a489a3b86ce60f2b476.png)
至此,整个演讲比赛功能制作完毕!
七、查看记录
7.1 读取记录分数
- 在speechManager.h中添加保存记录的成员函数
void loadRecord(); - 添加判断文件是否为空的标志
bool fileIsEmpty; - 添加往届记录的容器
map<int, vector<string>> m_Record;
其中m_Record 中的key代表第几届,value记录具体的信息
//读取记录void loadRecord();//文件为空的标志bool fileIsEmpty;//往届记录map<int, vector<string>> m_Record;
- 在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;int index = 0;while (ifs >> data){//cout << data << endl;vector<string>v;int pos = -1;int start = 0;while (true){pos = data.find(",", start); //从0开始查找 ','if (pos == -1){break; //找不到break返回}string tmp = data.substr(start, pos - start); //找到了,进行分割 参数1 起始位置,参数2 截取长度v.push_back(tmp);start = pos + 1;}this->m_Record.insert(make_pair(index, v));index++;}ifs.close();
}
- 在SpeechManager构造函数中调用获取往届记录函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mw7CIe4H-1676297946951)(assets/1548151977242.png)]](https://img-blog.csdnimg.cn/92e301262a864d5fa99870021786c996.png)
7.2 查看记录功能
- 在speechManager.h中添加保存记录的成员函数
void showRecord();
//显示往届得分void showRecord();
- 在speechManager.cpp中实现成员函数
void showRecord();
void SpeechManager::showRecord()
{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");
}
7.3 测试功能
在main函数分支 2 选项中,调用查看记录的接口
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jyrUgEu6-1676297946951)(assets/1548152359604.png)]](https://img-blog.csdnimg.cn/8f27de9ca6254a1c97cf53c5118b9cee.png)
显示效果如图:(本次测试添加了4条记录)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D5V7x3Nf-1676297946952)(assets/1548152394715.png)]](https://img-blog.csdnimg.cn/8177735d8da04679a77fb14f2f8ad5c4.png)
7.4 bug解决
目前程序中有几处bug未解决:
- 查看往届记录,若文件不存在或为空,并未提示
解决方式:在showRecord函数中,开始判断文件状态并加以判断
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ISd14Iui-1676297946952)(assets/1548152803116.png)]](https://img-blog.csdnimg.cn/46fc848743064f0f8ff3a91d193661d2.png)
- 若记录为空或不存在,比完赛后依然提示记录为空
解决方式:saveRecord中更新文件为空的标志
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xrfqd4OX-1676297946952)(assets/1548153005042.png)]](https://img-blog.csdnimg.cn/e3b9be33fb6340279aec19b74d139726.png)
- 比完赛后查不到本届比赛的记录,没有实时更新
解决方式:比赛完毕后,所有数据重置
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Grs1NGw-1676297946952)(assets/1548153319587.png)]](https://img-blog.csdnimg.cn/0009ea9b186c46a0a05663b9acdee471.png)
- 在初始化时,没有初始化记录容器
解决方式:initSpeech中添加 初始化记录容器
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QC2izrJN-1676297946952)(assets/1548154340974.png)]](https://img-blog.csdnimg.cn/c8fe31f4ea8c450aa915e31a4425296a.png)
- 每次记录都是一样的
解决方式:在main函数一开始 添加随机数种子
srand((unsigned int)time(NULL));
所有bug解决后 测试:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-79wrMeWm-1676297946953)(assets/1548153571603.png)]](https://img-blog.csdnimg.cn/e0555d7986f0446d9486dc052746e6a2.png)
八、清空记录
8.1 清空记录功能实现
- 在speechManager.h中添加保存记录的成员函数
void clearRecord();
//清空记录void clearRecord();
- 在speechManager.cpp中实现成员函数
void clearRecord();
void SpeechManager::clearRecord()
{cout << "确认清空?" << endl;cout << "1、确认" << endl;cout << "2、返回" << endl;int select = 0;cin >> select;if (select == 1){//打开模式 ios::trunc 如果存在删除文件并重新创建ofstream ofs("speech.csv", ios::trunc);ofs.close();//初始化属性this->initSpeech();//创建选手this->createSpeaker();//获取往届记录this->loadRecord();cout << "清空成功!" << endl;}system("pause");system("cls");
}
8.2 测试清空
在main函数分支 3 选项中,调用清空比赛记录的接口
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sT3QVDRb-1676297946953)(assets/1548154674242.png)]](https://img-blog.csdnimg.cn/c27c8668456f41a6ae66e73f44f71142.png)
运行程序,测试清空记录:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3uKgDg9H-1676297946953)(assets/1548154004738.png)]](https://img-blog.csdnimg.cn/5e2b95dbea0a4794a5e816af9f9602e2.png)
speech.csv中记录也为空
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yKXBlqg0-1676297946953)(assets/1548154508831.png)]](https://img-blog.csdnimg.cn/d2819bd5494e48c9a977f92b654d08a6.png)
- 至此本案例结束!
^_^
相关文章:
【C++】从0到1入门C++编程学习笔记 - 实战篇:演讲比赛流程管理系统
文章目录一、演讲比赛程序需求1.1 比赛规则1.2 程序功能1.3 程序效果图:二、项目创建2.1 创建项目2.2 添加文件三、创建管理类3.1创建文件3.2 头文件实现3.3 源文件实现四、菜单功能4.1 添加成员函数4.2 菜单功能实现4.3 测试菜单功能五、退出功能5.1 提供功能接口5…...
04 OpenCV位平面分解
1 基本概念 位平面分解的核心思想是将图像的每一个像素分解为多个二进制位,分别存储在不同的位平面上。例如,如果一个图像是8位深度的,则可以分解为8个位平面,每个位平面上存储一个二进制位。 位平面分解在图像压缩中有着重要的…...
Onvif协议如何判断摄像机支持 —— 筑梦之路
有人就问什么是Onvif协议呢? 全称为:Open Network Video Interface Forum.缩写成Onvif。 翻译过来是:开放型网络视频接口论坛,目的是确保不同安防厂商的视频产品能够具有互通性,这样对整体安防行业才是良性发展。 现…...
情人节new一个对象给你
今天情人节,有没对象的吗?假设你不知道new怎么用,每个人都有两种身份,一种没对象的人,这个时候new一个对象给你,一种是有对象的人,这个delete对象。等你学完这个new和delete知识点,无…...
linux篇【15】:应用层-网络https协议
目录 一.HTTPS介绍 1.HTTPS 定义 2.HTTP与HTTPS (1)端口不同,是两套服务 (2)HTTP效率更高,HTTPS更安全 3.加密,解密,密钥 概念 4.为什么要加密? 5.常见的加密方式…...
索引-性能分析-explain
explain 执行计划 explain 执行计划各字段含义 1)id 就是代表 sql 的执行顺序或者表的执行顺序;id相同从上往下执行,id不同,id值越大越先执行;(注:有子查询时就会出现sql执行顺序)…...
mbedtls加密组件使用示例
1 mbedtls aes组件的使用 1.1 AES ECB加解密接口使用 int main(int argc, char *argv[]) {char key[256];char *inbuf calloc(1, 257);char *outbuf calloc(1, 257);char *buf calloc(1,257);char *tmp_outbuf outbuf;char *tmp_buf buf;mbedtls_aes_context aes_ctx;mb…...
如何量测太阳光模拟器的光谱致合度?
太阳模拟器是根据国际法规JIS、IEC60904、美国材料试验协会开发设计的AAA级太阳模拟器。对于100毫米100毫米和200毫米200毫米的光斑尺寸,光斑强度的输出功率范围可以从0.1到1太阳光强度。此外,还提供了灵活的出光方向,以满足用户的研究需求&a…...
网络安全领域中CISP证书八大类都有什么
CISP注册信息安全专业人员 注册信息安全专业人员(Certified Information Security Professional),是经中国信息安全产品测评认证中心实施的国家认证,对信息安全人员执业资质的认可。该证书是面向信息安全企业、信息安全咨询服务…...
17- 梯度提升回归树GBRT (集成算法) (算法)
梯度提升回归树: 梯度提升回归树是区别于随机森林的另一种集成方法,它的特点在于纠正与加强,通过合并多个决策树来构建一个更为强大的模型。该模型即可以用于分类问题,也可以用于回归问题中。在该模型中,有三个重要参数分别为 n_…...
05 OpenCV色彩空间处理
色彩空间(Color Space)是一种用于描述颜色的数学模型,它将颜色表示为多维向量或坐标,通常由三个或四个独立的分量来表示。不同的色彩空间在颜色的表示方式、可表达颜色的范围、计算速度和应用场景等方面存在差异,不同的…...
【CS224图机器学习】task1 图机器学习导论
前言:本期学习是由datawhale(公众号)组织,由子豪兄讲解的202302期CS224图机器学习的学习笔记。本次学习主要针对图机器学习导论做学习总结。1.什么是图机器学习?通过图这种数据结构,对跨模态数据进行整理。…...
Powershell Install SQL Server 2022
前言 SQL Server 2022 (16.x) 在早期版本的基础上构建,旨在将 SQL Server 发展成一个平台,以提供开发语言、数据类型、本地或云环境以及操作系统选项。 SQL Server Management Studio (SSMS) 是一种集成环境,用于管理从 SQL Server 到 Azure SQL 数据库的任何 SQL 基础结构…...
Jetson NX2 装机过程
1.固态硬盘安装完成后,系统配置 df -h 查看硬盘使用情况 2.查看Jetson NX的IP地址,以下两个都行 ifconfig ip address show 3.Jetson NX2安装arm64的annaconda3,安装有问题报错illegal instruction,未解决。 4.VNC远程登录 …...
初始C++(四):内联函数
文章目录一.内联函数概念二.内联函数用法三.内联函数的特性四.内联函数和宏一.内联函数概念 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。 二.内联函…...
九、初识卷积
文章目录1、通过边缘检测认识卷积2、Padding3、Strid Convelution4、RGB图像的卷积THE END1、通过边缘检测认识卷积 \qquad在使用神经网络进行图像识别时,神经网络的前几层需要完成对图像的边缘检测任务,所谓的边缘检测就是让计算机识别出一张图片的垂直…...
【Linux】【编译】编译调试过程中如何打印出实际的编译命令
🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏:Linux技术&…...
linux安装jdk
step1 下载jdk 到下面的网站下载需要的jdk安装包版本。 Java Downloads | Oracle step2 复制到opt目录 其中user_name对应自己的home目录的用户文件夹 sudo cp /home/user_name//home/czh/Downloads/jdk-17_linux-x64_bin.tar.gz /opt/ step3 到opt目录解压安装包…...
迅为iTOP-3A5000龙芯开发板安装UOS操作系统
3A5000板卡采用全国产龙芯3A5000处理器,基于龙芯自主指令系统(LoongArch),市面上龙芯3A5000主板价格都在上万元,可以说是非常贵了, 迅为全新推出了款千元内的iTOP-3A5000开发板,这款板卡各方面的配置也是第…...
Firefox 110, Chrome 110, Chromium 110 官网离线下载 (macOS, Linux, Windows)
Mozilla Firefox, Google Chrome, Chromium, Apple Safari 请访问原文链接:https://sysin.org/blog/chrome-firefox-download/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 天下只剩三种(主流&am…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
