演讲比赛程序需求
比赛规则
- 学校举行一场演讲比赛,共有12个人参加,比赛共两轮,第一轮为淘汰赛,第二轮为决赛
- 每名选手都有对应编号,如10001~10012
- 比赛方式:分组比赛,每组6个人
- 第一轮分为两个小组,整体按照选手编号进行抽签后顺序演讲
- 十个评委分别给每名选手打分,取出最高分和最低分,求的平均分为本轮选手的成绩
- 当小组演讲完后,淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛
- 第二轮为决赛,前三名胜出
- 每轮比赛过后需要显示晋级选手的信息
程序功能
- 开始演讲比赛:完成整届比赛的流程,每个比赛阶段需要给用户一个提示,用户按任意键后继续下一个阶段
- 查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用.csv后缀名保存
- 清空比赛记录:将文件中数据清空
- 退出比赛程序:可以退出当前程序
项目创建
创建项目步骤如下:
创建项目
- 打开Visual Studio后,点击创建新项目,创建新的C++项目
- 填写项目名称以及选取项目路径,点击确定生成项目
添加文件
- 右键源文件,进行添加文件操作
- 填写文件名称,点击添加
创建管理类
功能描述:
- 提供菜单界面与用户交互
- 对演讲比赛流程进行控制
- 与文件的读写交互
创建文件
在头文件和源文件的文件夹下分别创建speechManager.h
和speechManager.cpp
文件
头文件实现
在speechManager.h
中设计管理类
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12
| #pragma once #include<iostream> using namespace std;
class SpeechManager { public: SpeechManager(); ~SpeechManager(); };
|
源文件实现
在speechManager.cpp
中将构造和析构函数内容实现补全
代码如下:
1 2 3 4 5 6 7 8 9 10 11
| #include "speechManager.h"
SpeechManager::SpeechManager() {
}
SpeechManager::~SpeechManager() {
}
|
菜单功能
功能描述:与用户的沟通界面
添加成员函数
在管理类speechManager.h
中添加成员函数void show_Menu();
菜单功能实现
在管理类speechManager.cpp
中实现show_Menu()
函数
1 2 3 4 5 6 7 8 9 10 11
| void SpeechManager::show_Menu() { cout << "**************************************" << endl; cout << "********** 欢迎参加演讲比赛 **********" << endl; cout << "********** 1.开始演讲比赛 **********" << endl; cout << "********** 2.查看往届记录 **********" << endl; cout << "********** 3.清空比赛记录 **********" << endl; cout << "********** 0.退出比赛程序 **********" << endl; cout << "**************************************" << endl; cout << endl; }
|
测试菜单功能
在演讲比赛流程管理系统.cpp
中测试菜单功能
代码:
1 2 3 4 5 6 7 8 9 10 11
| #include<iostream> #include"speechManager.h" using namespace std; int main() { SpeechManager sm; sm.show_Menu(); system("pause"); return 0; }
|
运行结果:
1 2 3 4 5 6 7
| ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
|
菜单界面搭建完毕
退出功能
功能描述:实现退出程序
提供功能接口
在main函数中提供分支选择,提供每个功能接口
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include<iostream> #include"speechManager.h" using namespace std; 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; }
|
实现退出功能
在speechManager.h
中提供退出系统的成员函数void exitSystem();
在speechManager.cpp
中提供具体的功能实现
1 2 3 4 5 6
| void SpeechManager::exitSystem() { cout << "欢迎下次使用" << endl; system("pause"); exit(0); }
|
测试功能
在main函数分支0选项中,调用退出程序的接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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; } }
|
运行结果
1 2 3 4 5 6 7 8 9 10 11
| ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
请输入您的选择: 0 欢迎下次使用
|
演讲比赛功能
功能分析
比赛流程分析:
抽签->开始演讲比赛->显示第一轮比赛结果->
抽签->开始演讲比赛->显示前三名结果->保存分数
创建选手类
- 选手类中的属性包含:选手姓名、分数
- 头文件中创建
speaker.h
文件,并添加代码
1 2 3 4 5 6 7 8 9 10
| #pragma once #include<iostream> using namespace std;
class Speaker { public: string m_Name; double m_Score[2]; };
|
比赛
成员属性添加
在speechManager.h
中添加属性
1 2 3 4 5 6 7 8 9 10 11
|
vector<int>v1;
vector<int>v2;
vector<int>vVictory;
map<int, Speaker>m_Speaker;
int m_Index;
|
初始化属性
在speechManager.h
中提供开始比赛的成员函数void initSpeech();
在speechManager.cpp
中实现void initSpeech();
1 2 3 4 5 6 7 8 9 10
| void SpeechManager::initSpeech() { this->v1.clear(); this->v2.clear(); this->vVictory.clear(); this->m_Speaker.clear(); this->m_Index = 1; }
|
SpeechManeger
构造函数中调用void initSpeech();
1 2 3 4 5
| SpeechManager::SpeechManager() { this->initSpeech(); }
|
创建选手
在speechManager.h
中提供开始比赛的成员函数void createSpeaker();
在speechManager.cpp
中实现void createSpeaker();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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; } this->v1.push_back(i + 10001); this->m_Speaker.insert(make_pair(i + 10001, sp)); } }
|
SpeechManager
类的构造函数中调用void createrSpeaker();
1 2 3 4 5 6 7
| SpeechManager::SpeechManager() { this->initSpeech(); this->createSpeaker(); }
|
测试:在main函数中,可以在创建完管理对象后,使用下列代码测试12名选手初始状态
1 2 3 4 5
| 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; }
|
测试结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 选手编号:10001 姓名:选手A 分数:0 选手编号:10002 姓名:选手B 分数:0 选手编号:10003 姓名:选手C 分数:0 选手编号:10004 姓名:选手D 分数:0 选手编号:10005 姓名:选手E 分数:0 选手编号:10006 姓名:选手F 分数:0 选手编号:10007 姓名:选手G 分数:0 选手编号:10008 姓名:选手H 分数:0 选手编号:10009 姓名:选手I 分数:0 选手编号:10010 姓名:选手J 分数:0 选手编号:10011 姓名:选手K 分数:0 选手编号:10012 姓名:选手L 分数:0 ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
请输入您的选择: 0 欢迎下次使用
|
开始比赛成员函数添加
- 在
speechManager.h
中提供开始比赛的成员函数void starSpeech();
- 该函数功能主要控制比赛的流程
- 在
speechManager.cpp
中将startSpeech
的空实现先导入
- 我们可以先将整个比赛的流程写到函数中
1 2 3 4 5 6 7 8 9 10 11 12 13
| void SpeechManager::startSpeech() { }
|
抽签
功能描述:
- 正式比赛前,所有选手的比赛顺序需要打乱,我们只需要将存放选手编号的容器 打乱次序即可
- 在
speechManager.h
中提供抽签的成员函数void speechDraw();
- 在
speechManager.h
中提供抽签的成员函数void speechDraw();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| 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
比赛流程控制的函数中,调用抽签函数
1 2 3 4 5 6 7 8 9 10 11 12 13
| void SpeechManager::startSpeech() { this->speechDraw(); }
|
- 在main函数中,分支1选项中,调用开始比赛的接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| while (true) { sm.show_Menu(); cout << "请输入您的选择:" << endl; cin >> choice; switch (choice) { case 1: sm.startSpeech(); break; case 2: break; case 3: break; case 0: sm.exitSystem(); break; default: system("cls"); break; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
请输入您的选择: 1 第 << 1 >> 轮比赛选手正在抽签 ------------------------------ 抽签后演讲顺序如下: 10011 10002 10010 10003 10001 10012 10008 10004 10005 10007 10009 10006
|
开始比赛
- 在
speechManager.h
中提供比赛的成员函数void speechContest();
- 在
speechManager.cpp
中实现成员函数void speechContest();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
| #include "speechManager.h"
SpeechManager::SpeechManager() { this->initSpeech(); this->createSpeaker(); }
void SpeechManager::show_Menu() { cout << "**************************************" << endl; cout << "********** 欢迎参加演讲比赛 **********" << endl; cout << "********** 1.开始演讲比赛 **********" << endl; cout << "********** 2.查看往届记录 **********" << endl; cout << "********** 3.清空比赛记录 **********" << endl; cout << "********** 0.退出比赛程序 **********" << endl; cout << "**************************************" << 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; }
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; } this->v1.push_back(i + 10001); this->m_Speaker.insert(make_pair(i + 10001, sp)); } }
void SpeechManager::startSpeech() { this->speechDraw(); this->speechContest(); }
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; 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; 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(); this->m_Speaker[*it].m_Score[this->m_Index - 1] = avg; groupScore.insert(make_pair(avg, *it)); 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"); cout << endl; }
SpeechManager::~SpeechManager() {
}
|
- 在startSpeech比赛流程控制的函数中,调用比赛函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| void SpeechManager::startSpeech() { this->speechDraw(); this->speechContest(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
请输入您的选择: 1 第 << 1 >> 轮比赛选手正在抽签 ------------------------------ 抽签后演讲顺序如下: 10011 10002 10010 10003 10001 10012 10008 10004 10005 10007 10009 10006 ------------------------------ 请按任意键继续. . .
---------- 第1 轮比赛正式开始 ---------- 第1小组比赛名次: 编号:10001 姓名:选手A 成绩:87.2 编号:10010 姓名:选手J 成绩:82.9875 编号:10002 姓名:选手B 成绩:82.925 编号:10011 姓名:选手K 成绩:79.5 编号:10012 姓名:选手L 成绩:76.75 编号:10003 姓名:选手C 成绩:76.4625
第2小组比赛名次: 编号:10007 姓名:选手G 成绩:89.75 编号:10008 姓名:选手H 成绩:86.075 编号:10009 姓名:选手I 成绩:84.5375 编号:10004 姓名:选手D 成绩:80.775 编号:10006 姓名:选手F 成绩:80.4 编号:10005 姓名:选手E 成绩:74.95
---------- 第1轮比赛完毕 ----------
|
显示比赛分数
- 在
speechManager.h
中提供显示分数的成员函数void showScore();
- 在
speechManager.cpp
中实现成员函数void showScore();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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比赛流程控制的函数中,调用显示比赛分数函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| void SpeechManager::startSpeech() { this->speechDraw(); this->speechContest(); this->showScore(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
请输入您的选择: 1 第 << 1 >> 轮比赛选手正在抽签 ------------------------------ 抽签后演讲顺序如下: 10011 10002 10010 10003 10001 10012 10008 10004 10005 10007 10009 10006 ------------------------------ 请按任意键继续. . .
---------- 第1 轮比赛正式开始 ---------- 第1小组比赛名次: 编号:10001 姓名:选手A 成绩:87.2 编号:10010 姓名:选手J 成绩:82.9875 编号:10002 姓名:选手B 成绩:82.925 编号:10011 姓名:选手K 成绩:79.5 编号:10012 姓名:选手L 成绩:76.75 编号:10003 姓名:选手C 成绩:76.4625
第2小组比赛名次: 编号:10007 姓名:选手G 成绩:89.75 编号:10008 姓名:选手H 成绩:86.075 编号:10009 姓名:选手I 成绩:84.5375 编号:10004 姓名:选手D 成绩:80.775 编号:10006 姓名:选手F 成绩:80.4 编号:10005 姓名:选手E 成绩:74.95
---------- 第1轮比赛完毕 ---------- 请按任意键继续. . .
---------- 第1轮晋级选手信息如下:---------- 选手编号:10001 姓名:选手A 得分:87.2 选手编号:10010 姓名:选手J 得分:82.9875 选手编号:10002 姓名:选手B 得分:82.925 选手编号:10007 姓名:选手G 得分:89.75 选手编号:10008 姓名:选手H 得分:86.075 选手编号:10009 姓名:选手I 得分:84.5375
|
第二轮比赛
第二轮比赛流程同第一轮,只是比赛的轮数+1,其余流程不变
- 在
startSpeech
比赛流程控制的函数中,加入第二轮的流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| void SpeechManager::startSpeech() { this->speechDraw(); this->speechContest(); this->showScore(); this->m_Index++; this->speechDraw(); this->speechContest(); this->showScore(); }
|
测试,将整个比赛流程都跑通
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
第 << 2 >> 轮比赛选手正在抽签 ------------------------------ 抽签后演讲顺序如下: 10007 10008 10010 10002 10009 10001 ------------------------------ 请按任意键继续. . .
---------- 第2 轮比赛正式开始 ---------- 第1小组比赛名次: 编号:10002 姓名:选手B 成绩:86.675 编号:10009 姓名:选手I 成绩:81.3 编号:10007 姓名:选手G 成绩:78.55 编号:10010 姓名:选手J 成绩:78.5375 编号:10008 姓名:选手H 成绩:77.275 编号:10001 姓名:选手A 成绩:69.6875
---------- 第2轮比赛完毕 ---------- 请按任意键继续. . .
---------- 第2轮晋级选手信息如下:---------- 选手编号:10002 姓名:选手B 得分:86.675 选手编号:10009 姓名:选手I 得分:81.3 选手编号:10007 姓名:选手G 得分:78.55
|
保存分数
功能描述:将每次演讲比赛的得分记录到文件中
功能实现:
- 在
SpeechManager.h
中添加保存记录的成员函数void saveRecord();
- 在
speechManager.cpp
中实现成员函数void saveRecord();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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 << "," << this->m_Speaker[*it].m_Score[1] << ","; } ofs << endl; ofs.close(); cout << "记录已经保存" << endl; }
|
- 在startSpeech比赛流程控制的函数中,最后调用保存记录分数函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| void SpeechManager::startSpeech() { this->speechDraw(); this->speechContest(); this->showScore(); this->m_Index++; this->speechDraw(); this->speechContest(); this->showScore(); this->saveRecord(); cout << "本届比赛完毕" << endl; system("pause"); system("cls"); }
|
1 2 3 4 5 6 7 8 9 10
| ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
记录已经保存 本届比赛完毕
|
利用记事本打开文件speech.csv,里面保存了前三名选手的编号以及得分
1
| 10002,86.675,10009,81.3,10007,78.55,
|
至此,整个演讲比赛功能制作完毕
查看记录
读取记录分数
- 在
speechManager.h
中添加保存记录的成员函数void loadRecord();
- 添加判断文件是否为空的标志
bool fileIsEmpty;
- 添加往届记录的容器
map<int,vector<string>>m_Record;
其中m_Record中的key代表第几届,value记录具体的信息
1 2 3 4 5 6
| void loadRecord();
bool fileIsEmpty;
map<int, vector<string>>m_Record;
|
- 在
speechManager.cpp
中实现成员函数void loadRecord();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| 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) { 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(index, v)); index++; } ifs.close();
}
|
- 在SpeechManager构造函数中调用获取往届记录函数
1 2 3 4 5 6 7 8 9
| SpeechManager::SpeechManager() { this->initSpeech(); this->createSpeaker(); this->loadRecord(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 10002,86.675,10009,81.3,10007,78.55, ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
请输入您的选择: 2 10002,86.675,10009,81.3,10007,78.55, ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
|
查看记录功能
- 在
speechManager.h
中添加保存记录的成员函数void showRecord();
- 在
speechManager.cpp
中实现成员函数void showRecord();
1 2 3 4 5 6 7 8 9 10 11 12
| 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"); }
|
测试功能
在main函数分支2选项,调用查看记录的接口
1 2 3 4 5 6 7 8 9 10 11
| ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
请输入您的选择: 2 第1届 冠军编号:10002 得分:86.675 亚军编号:10009 得分:81.3 季军编号:10007 得分:78.55
|
bug解决
目前程序中有几处bug未解决
解决方式:在showRecord函数中,开始判断文件状态并加以判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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"); }
|
运行结果
1 2 3 4 5 6 7 8 9 10 11
| ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
请输入您的选择: 2 文件为空或者文件不存在!
|
解决方式:saveRecord中更新文件为空的标志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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 << "," << this->m_Speaker[*it].m_Score[1] << ","; } ofs << endl; ofs.close(); cout << "记录已经保存" << endl; this->fileIsEmpty = false; }
|
解决方式:比赛完毕后,所有数据重置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| void SpeechManager::startSpeech() { this->speechDraw(); this->speechContest(); this->showScore(); this->m_Index++; this->speechDraw(); this->speechContest(); this->showScore(); this->saveRecord(); this->initSpeech(); this->createSpeaker(); this->loadRecord(); cout << "本届比赛完毕" << endl; system("pause"); system("cls"); }
|
解决方式:initSpeech中添加初始化记录容器
1 2 3 4 5 6 7 8 9 10 11 12
| void SpeechManager::initSpeech() { this->v1.clear(); this->v2.clear(); this->vVictory.clear(); this->m_Speaker.clear(); this->m_Index = 1; this->m_Record.clear(); }
|
解决方式:在main函数一开始添加随机数种子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include<iostream> #include<ctime> #include"speechManager.h" using namespace std; int main() { srand((unsigned int)time(NULL)); SpeechManager sm; 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: break; case 0: sm.exitSystem(); break; default: system("cls"); break; } } system("pause"); return 0; }
|
所有bug解决后测试:
1 2 3 4 5 6 7 8 9 10 11 12 13
| ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
请输入您的选择: 2 第1届 冠军编号:10011 得分:88.375 亚军编号:10003 得分:82.8375 季军编号:10009 得分:82.225 第2届 冠军编号:10011 得分:84.5875 亚军编号:10004 得分:81.8 季军编号:10005 得分:80.5625 第3届 冠军编号:10009 得分:84.35 亚军编号:10006 得分:81.775 季军编号:10010 得分:79.3375
|
清空记录
清空记录功能实现
- 在
speechManager.h
中添加保存记录的成员函数void clearRecord();
- 在speechManager.cpp中实现成员函数
void clearRecord();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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); ofs.close(); this->initSpeech(); this->createSpeaker(); this->loadRecord(); cout << "清空成功!" << endl; } system("pause"); system("cls"); }
|
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| ************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
请输入您的选择: 3 是否确定清空文件? 1、是 2、否 1 清空成功!
************************************** ********** 欢迎参加演讲比赛 ********** ********** 1.开始演讲比赛 ********** ********** 2.查看往届记录 ********** ********** 3.清空比赛记录 ********** ********** 0.退出比赛程序 ********** **************************************
请输入您的选择: 2 文件为空或者文件不存在!
|