当前位置: 首页 > news >正文

C++基于STL的演讲比赛流程管理系统

写在前面:⭐如果本篇博文对你有帮助,那就 点赞 + 关注 + 收藏 一下吧!

目录

1.演讲比赛程序需求

1.1比赛规则

1.2程序功能

1.3程序效果图

2.项目创建

3.创建管理类

3.1创建文件

3.2头文件实现

3.3源文件实现

4.菜单功能

4.1添加成员函数

4.2菜单功能实现

4.3测试菜单功能

5.退出功能

5.1提供功能接口

5.2实现退出功能

5.3测试功能

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查看记录功能

7.3测试功能

7.4bug解决

8.清空记录

8.1清空记录功能实现

8.2测试清空

9.完整代码

9.1 speaker.h

9.2 speechManager.cpp

9.3 speechManager.cpp

9.4 演讲比赛流程管理系统.cpp


1.演讲比赛程序需求

1.1比赛规则

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

1.2程序功能

●开始演讲比赛:完成整届比赛的流程,每个比赛阶段需要给用户一个提示,用户按任意键后继续下一个阶段
●查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用.csv后缀名保存
●清空比赛记录:将文件中数据清空
●退出比赛程序:可以退出当前程序

1.3程序效果图

2.项目创建

省略

3.创建管理类

功能描述:
●提供菜单界面与用户交互
●对演讲比赛流程进行控制
●与文件的读写交互

3.1创建文件

●在头文件和源文件的文件夹下分别创建speechManager.h和 speechManager.cpp文件

3.2头文件实现

在speechManager.h中设计管理类
代码如下:

#pragma once #include <iostream> using namespace std; //设计演讲管理类 class SpeechManager { public: //构造函数 SpeechManager(); //析构函数 ~SpeechManager(); };

3.3源文件实现

#include "SpeechManager.h" //构造函数 SpeechManager::SpeechManager() { } //析构函数 SpeechManager::~SpeechManager() { }

4.菜单功能

功能描述:与用户的沟通界面

4.1添加成员函数

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

4.2菜单功能实现

●在管理类speechManager.cpp中实现show_Menu()函数

4.3测试菜单功能

●在演讲比赛流程管理系统.cpp中测试菜单功能
代码:

#include <iostream> using namespace std; #include "speechManager.h" #include<windows.h> int main() { // 设置控制台编码为UTF-8,确保中文显示正常 SetConsoleOutputCP(65001); SetConsoleCP(65001); SpeechManager sm; sm.show_Menu(); return 0; }

●运行效果图

●菜单界面搭建完毕

5.退出功能

功能描述:实现退出程序

5.1提供功能接口

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

int main() { // 设置控制台编码为UTF-8,确保中文显示正常 SetConsoleOutputCP(65001); SetConsoleCP(65001); //创建管理类对象 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: //退出系统 sm.exitSystem(); break; default: system("cls"); //清屏 break; } } return 0; }

5.2实现退出功能

在speechManager.h中提供退出系统的成员函数void exitSystem();
在speechManager.cpp中提供具体的功能实现

//退出系统 void SpeechManager::exitSystem() { cout << "欢迎下次使用!" << endl; system("pause"); exit(0); }

5.3测试功能

在main函数分支0选项中,调用退出程序的接口

运行测试效果图:

6.演讲比赛功能

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中添加属性

//成员属性 //保存第一轮选手编号容器 vector<int>v1; //保存第二轮选手编号容器 vector<int>v2; //胜出前三名选手编号容器 vector<int>vVictory; //存放编号以及对应具体选手容器 map<int,Speaker>m_Speaker; //存放比赛轮数 int m_Index;
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中提供开始比赛的的成员函数voidcreateSpeaker();

//初始化创建12名选手 void createSpeaker();

●在speechManager.cpp中实现void createSpeaker();

//初始化创建12名选手 void SpeechManager::createSpeaker() { string nameSeed[12] = {"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; } //创建选手编号并且防入v1容器中 this->v1.push_back(i+10001); //选手编号以及选手放入到map容器中 this->m_Speaker.insert(make_pair(i+10001,sp)); } }

●SpeechManager类的构造函数中调用void createSpeaker();

//构造函数 SpeechManager::SpeechManager() { //初始化容器和属性 this->initSpeech(); //创建12名选手 this->createSpeaker(); }

●测试在main函数中,可以在创建完管理对象后,使用下列代码测试12名选手初始状态

//测试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; }

●测试效果(测试选手初始状态)如图:

●测试完毕后,可以将测试代码删除或注释。

6.3.4开始比赛成员函数添加

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

//开始比赛-比赛流程控制 void startSpeech();

●在speechManager.cpp中将startSpeech的空实现先写入


●我们可以先将整个比赛的流程写到函数中

6.3.5 抽签

●正式比赛前,所有选手的比赛顺序需要打乱,我们只需要将存放选手编号的容器打乱次序即可
●在speechManager.h中提供抽签的的成员函数void speechDraw();

//开始演讲比赛 比赛整个流程控制函数 void SpeechManager::startSpeech() { //第一轮开始比赛 //1.抽签 this->speechDraw(); //2.比赛 //3.显示晋级结果 //第二轮开始比赛 //1.抽签 //2.比赛 //3.显示最终结果 //4.保存分数到文件中 }

●在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比赛流程控制的函数中,调用抽签函数

●在main函数中,分支1选项中,调用开始比赛的接口

●测试

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<double>> groupScore; int num = 0; //记录小组人数 6人一组 vector<int> v_Src; //比赛选手容器 if (this->m_Index == 1) { v_Src = this->v1; } else { v_Src = this->v2; } //遍历所有选手进行比赛 for (vector<int>::iterator it = v_Src.begin(); it != v_Src.end(); it++) { //评委打分 deque<int> 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.0f); //总分 double avg = sum / (double)(d.size()); //平均分 //打印平均分 //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:具体选手编号 num ++; //每六人取前三名 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"); }

●在startSpeech比赛流程控制的函数中,调用比赛函数

●再次运行代码,测试比赛

6.3.7显示比赛分数

●在speechManager.h中提供显示分数的成员函数void showScore();

//显示比赛结果 vold 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 << " 姓名:" << this->m_Speaker[*it].m_Name << " 分数:" << this->m_Speaker[*it].m_Score[this->m_Index-1] << endl; } cout << endl; system("pause"); system("cls"); this->show_Menu(); }

●在startSpeech比赛流程控制的函数中,调用显示比赛分数函数

●运行代码,测试效果

6.3.8第二轮比赛

第二轮比塞流程同第一轮,只是比塞的轮数+1,其余流程不变
●在startSpeech比赛流程控制的函数中,加入第二轮的流程

●测试,将整个比寒流程都跑通

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比赛流程控制的函数中,最后调用保存记录分数函数

●测试,整个比赛完毕后记录保存情况

利用记事本打开文件speech.csv,里面保存了前三名选手的编号以及得分

至此,整个演讲比赛功能制作完毕!

7.查看记录

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(); } //文件清空情况 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(); }

●在SpeechManager构造函数中调用获取往届记录函数

7.2查看记录功能

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

//显示往届得分 void showRecord();

●在speechManager.cpp中实现成员函数voidshowRecord();

//显示往届得分 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测试功能

7.4bug解决

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

1.查看往届记录,若文件不存在或为空,并未提示
解决方式:在showRecord函数中,开始判断文件状态并加以判断

2.若记录为空或不存在,比完赛后依然提示记录为空
解决方式:saveRecord中更新文件为空的标志

3.比完赛后查不到本届比赛的记录,没有实时更新
解决方式:比赛完毕后,所有数据重置

4.在初始化时,没有初始化记录容器
解决方式:initSpeech中添加初始化记录容器

5.每次记录都是一样的
解决方式:在main函数一开始添加随机数种子

//添加随机数种子 srand((unsigned int)time(NULL));

所有bug解决后测试:

8.清空记录

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选项中,调用清空比赛记录的接口

运行程序,测试清空记录:

speech.csv中记录也为空:

9.完整代码

9.1 speaker.h

#pragma once #include <iostream> using namespace std; //选手类 class Speaker { public: string m_Name; //姓名 double m_Score[2]; //分数 最多有两轮得分 };

9.2 speechManager.cpp

#pragma once #include <iostream> using namespace std; #include <vector> #include "Speaker.h" #include <map> //设计演讲管理类 class SpeechManager { public: //构造函数 SpeechManager(); //菜单功能 void show_Menu(); //退出系统 void exitSystem(); //析构函数 ~SpeechManager(); //初始化容器和属性 void initSpeech(); //初始化创建12名选手 void createSpeaker(); //开始比赛 比赛整个流程控制函数 void startSpeech(); //抽签 void speechDraw(); //比赛 void speechContest(); //显示得分 void showScore(); //保存记录 void saveRecord(); //读取记录 void loadRecord(); //判断文件是否为空 bool fileIsEmpty; //存放往届记录容器 map<int,vector<string>>m_Record; //显示往届得分 void showRecord(); //清空文件记录 void clearRecord(); //成员属性 //保存第一轮选手编号容器 vector<int>v1; //保存第二轮选手编号容器 vector<int>v2; //胜出前三名选手编号容器 vector<int>vVictory; //存放编号以及对应具体选手容器 map<int,Speaker>m_Speaker; //存放比赛轮数 int m_Index; };

9.3 speechManager.cpp

#include "SpeechManager.h" #include "speaker.h" #include <algorithm> #include <deque> #include <functional> #include <numeric> #include <map> #include <fstream> //构造函数 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::exitSystem() { cout << "欢迎下次使用!" << endl; system("pause"); exit(0); } //初始化容器和属性 void SpeechManager::initSpeech() { //容器置空 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; } //创建选手编号并且防入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.抽签 this->speechDraw(); //2.比赛 this->speechContest(); //3.显示最终结果 this->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 = this->v1; } else { v_Src = this->v2; } //遍历所有选手进行比赛 for (vector<int>::iterator it = v_Src.begin(); it != v_Src.end(); it++) { //评委打分 deque<int> 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.0f); //总分 double avg = sum / (double)(d.size()); //平均分 //打印平均分 //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:具体选手编号 num ++; //每六人取前三名 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"); } //显示得分 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 << " 分数:" << 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); //用输出的方式打开文件 -- 用追加方式写文件 //将每个人数据写入到文件中 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; //有记录了,文件不为空,更改为不为空的状态 this -> fileIsEmpty = false; } //读取记录 void SpeechManager::loadRecord() { ifstream ifs("speech.csv",ios::in); //读文件 if(!ifs.is_open()) { this -> fileIsEmpty = true; //cout << "文件不存在!" << endl; ifs.close(); } //文件清空情况 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; //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++; } ifs.close(); // for (map<int,vector<string>>::iterator it = m_Record.begin(); it != m_Record.end(); it++) // { // cout << "第" << it->first + 1 << "届" << " 冠军编号:" << it->second[0] << " 冠军得分:" << it->second[1] << endl; // } } //显示往届得分 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) { //打开模式 ios::trunc 如果存在删除文件并重新创建 ofstream ofs("speech.csv",ios::trunc); ofs.close(); //初始化属性 this -> initSpeech(); //创建选手 this -> createSpeaker(); //获取往届记录 this -> loadRecord(); cout << "清空完毕!" << endl; } system("pause"); system("cls"); } //析构函数 SpeechManager::~SpeechManager() { }

9.4 演讲比赛流程管理系统.cpp

#include <iostream> using namespace std; #include "speechManager.h" #include<windows.h> #include<ctime> int main() { // 设置控制台编码为UTF-8,确保中文显示正常 SetConsoleOutputCP(65001); SetConsoleCP(65001); //添加随机数种子 srand((unsigned int)time(NULL)); //创建管理类对象 SpeechManager sm; // //测试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.exitSystem(); break; default: system("cls"); //清屏 break; } } return 0; }

写到后面:⭐如果本篇博文对你有帮助,那就 点赞 + 关注 + 收藏一下吧!

http://www.jsqmd.com/news/684309/

相关文章:

  • 将军令云码动态口令源码|纯算法实现,离线生成Token,免依赖免联网
  • 拆解 AI Agent Harness Engineering 核心架构:大脑、感知与工具使用的完美闭环
  • 5分钟终极指南:用智能激活脚本永久激活Windows和Office
  • Anthropic MCP 设计漏洞可导致 RCE,威胁 AI 供应链安全
  • 大模型RAG (二)
  • 创新项目实训记录(三)
  • 有时候要说“我们团队“,而不是“我“
  • 2026年阿里云快速教程:怎么搭建OpenClaw?Coding Plan配置及大模型API Key设置
  • 哈希表记录
  • 终极指南:如何在Windows上零配置使用Poppler PDF处理工具
  • 揭秘PyTorch forward函数:从隐式调用到自定义模型的核心
  • 第22届智能车缩微组别的赛题形式建议
  • AI安全:多模态推理攻击与防御技术解析
  • JavaSE学习——类加载器和注解
  • 解决STM32H723双CAN通信的MessageRAM冲突:FDCAN1与FDCAN2独立滤波与FIFO配置指南
  • SPE(单对以太网):重塑工业与汽车网络的轻量化连接方案
  • 技术深度解析:Beyond Compare 5 密钥生成机制与实战部署指南
  • TS-182快速打通Modbus干变温控箱与PROFINET PLC连---简化集成步骤 提升设备运行可靠性
  • nli-MiniLM2-L6-H768部署案例:国产昇腾910B平台适配与性能实测
  • 撕下“全能模型”的伪装:Anthropic 官方揭秘长周期 Agent 的“脚手架工程”与抗焦虑指南
  • 三步法高效配置WarcraftHelper:魔兽争霸III游戏优化与性能提升完整指南
  • 按键伤企频上热搜,我用这套舆情监测系统守住了公司品牌
  • Docker配置错误导致PLC通信中断?——工业现场紧急回滚的3个不可逆配置陷阱
  • Docker镜像层存储机制全解,从aufs到overlay2的演进真相及企业级迁移 checklist(含生产环境回滚预案)
  • Neo4j 超详细入门
  • 【路由原理与路由协议-BGP边界网关协议】
  • 阳澄湖大闸蟹礼卡怎么选怎么兑?避坑攻略看这里
  • 网络协议TCP-IP深入解析
  • 《识质存在(PRAGMATA)》v1.0 十二项修改器
  • 端侧AI爆发:让手机、电脑、汽车自己思考