本文共 13231 字,大约阅读时间需要 44 分钟。
再系统地过一次,夯实基础
功能描述:
功能描述:与用户的沟通界面
在管理类speechManager.h中添加成员函数 void show_Menu();
//展示菜单void show_Menu();//speechMangaer.cpp
void SpeechManager::show_Menu(){ cout << "**********************************" << endl; cout << "******** 欢迎参加演讲比赛 ********" << endl; cout << "******** 1.开始演讲比赛 ********" << endl; cout << "******** 2.查看往届记录 ********" << endl; cout << "******** 3.清空比赛记录 ********" << endl; cout << "******** 4.退出比赛程序 ********" << endl; cout << "**********************************" << endl; cout << endl;}
#includeusing namespace std;#include "speechManager.h"int main() { SpeechManager sm; sm.show_Menu(); system("pause"); return 0;}
功能描述:实现退出程序
#includeusing namespace std;#include "speechManager.h"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();
void SpeechManager::exitSystem(){ cout << "欢迎下次使用" << endl; system("pause"); exit(0);}
比赛流程分析:
抽签 -> 开始演讲比赛 -> 显示第一轮比赛结果 -> 抽签 -> 开始演讲比赛 -> 显示前三名结果 -> 保存分数#pragma once#includeusing namespace std;class Speaker { public: string m_Name;//姓名 double m_Score[2];// 分数 最多有两轮得分};
#pragma once#include#include #include
void initSpeech();
//初始化属性 void initSpeech();
void SpeechManager::initSpeech(){ //容器保证为空 this->v1.clear(); this->v2.clear(); this->vVictory.clear(); this->m_Speaker.clear(); //初始化比赛论述 this->m_Index = 1;}
void initSpeech();
SpeechManager::SpeechManager() { //初始化属性 this->initSpeech();}
createSpeaker();
//初始化创建12名选手 void createrSpeaker();
void SpeechManager::createrSpeaker(){ 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::SpeechManager() { //初始化属性 this->initSpeech(); //创建选手 this->createrSpeaker();}
//测试代码for (map::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;}
void startSpeech();
//开始比赛 - 比赛流程控制 void startSpeech();
void SpeechManager::startSpeech(){ //第一轮比赛 //1、抽签 //2、比赛 //3、显示晋级结果 //第二轮比赛 //1、抽签 //2、比赛 //3、显示最终结果 //4、保存分数}
功能描述:
void speechDraw();
//抽签 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 ::iterator it = v1.begin(); it != v1.end(); it++) { cout << *it << " "; } cout << endl; } else { random_shuffle(v2.begin(), v2.end()); for (vector ::iterator it = v2.begin(); it != v2.end(); it++) { cout << *it << " "; } cout << endl; } cout << "-----------------------------------------" << endl; system("pause"); cout << endl;}
void SpeechManager::startSpeech(){ //第一轮比赛 //1、抽签 this->speechDraw(); //2、比赛 //3、显示晋级结果 //第二轮比赛 //1、抽签 //2、比赛 //3、显示最终结果 //4、保存分数}
case 1://开始比赛 sm.startSpeech(); break;
void speechContest();
//比赛 void speechContest();
void SpeechManager::speechContest(){ cout << "------------- 第 << " << this->m_Index << " >> 轮比赛正式开始 -------------" << endl; //greater会按照降序自动排序 multimap > groupScore;//临时容器,保存key分数 value选手编号 int num = 0;//记录人员数,6个为一组 vector v_Src;//比赛的人员容器 if (this->m_Index == 1) { v_Src = v1; } else { v_Src = v2; } //遍历所有的参赛选手 for (vector ::iterator it = v_Src.begin(); it != v_Src.end(); it++) { num++; //评委打分 deque 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 ());//排序 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; //6个人一组,用临时容器保存 groupScore.insert(make_pair(avg, *it)); if (num % 6 == 0) { cout << "第" << num / 6 << "小组比赛名次: " << endl; for (multimap >::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 >::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::startSpeech(){ //第一轮比赛 //1、抽签 this->speechDraw(); //2、比赛 this->speechContest(); //3、显示晋级结果 //第二轮比赛 //1、抽签 //2、比赛 //3、显示最终结果 //4、保存分数}
void showScore();
//显示比赛结果 void showScore();
void SpeechManager::showScore(){ cout << "------------- 第 << " << this->m_Index << " >> 轮晋级选手信息如下: -------------" << endl; vector v; if (this->m_Index == 1) { v = v2; } else { v = vVictory; } for (vector ::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();}
void SpeechManager::startSpeech(){ //第一轮比赛 //1、抽签 this->speechDraw(); //2、比赛 this->speechContest(); //3、显示晋级结果 this->showScore(); //第二轮比赛 //1、抽签 //2、比赛 //3、显示最终结果 //4、保存分数}
第二轮比赛流程同第一轮,只是比赛的轮是+1,其余流程不变
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、保存分数}
功能描述:
功能实现:
void saveRecord();
//保存记录void saveRecord();
void SpeechManager::saveRecord(){ ofstream ofs; ofs.open("seepch.csv", ios::out | ios::app);//用输出的方式打开文件 --写文件 //将每个人数据写入到文件中 for (vector ::iterator it = vVictory.begin(); it != vVictory.end(); it++) { ofs << *it << "," << m_Speaker[*it].m_Score[1] << ","; } ofs << endl; //关闭文件 ofs.close(); cout << "记录已保存" << endl;}
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();}
void loadRecord();
bool fileIsEmpty;
map<int, vector<string>> m_Record;
其中m_Record中的key代表第几届,value记录具体信息
//读取记录 void loadRecord(); //文件为空的标志 bool fileIsEmpty; //往届记录 map> m_Record;
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; ifs.close(); return; } //文件不为空 this->fileIsEmpty = false; ifs.putback(ch);//读取的单个字符放回去 string data; int index = 0; while (ifs >> data) { vectorv; int pos = -1; int start = 0; while (true) { pos = data.find(",", start);//从0开始查找 逗号 if (pos == -1) { break;//找不到 break返回 } //找到逗号,进行分割 参数1 起始位置, 参数2 截取长度 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::SpeechManager() { //初始化属性 this->initSpeech(); //创建选手 this->createrSpeaker(); //获取记录 this->loadRecord();}
void showRecord();
//显示往届得分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");}
case 2://查看记录 sm.showRecord(); break;
目前程序中有基础Bug:
解决方式:在showRecord函数中,开始判断文件状态并加以判断
void SpeechManager::showRecord(){ if (this->fileIsEmpty) { cout << "文件不存在,或记录为空!" << endl; } 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");}
解决方式:saveRecord中更新文件为空的标志
void SpeechManager::saveRecord(){ ofstream ofs; ofs.open("seepch.csv", ios::out | ios::app);//用输出的方式打开文件 --写文件 //将每个人数据写入到文件中 for (vector ::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::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(); //创建选手 this->createrSpeaker(); //获取往届记录 this->loadRecord(); cout << "本届比赛完毕!" << endl; system("pause"); system("cls");}
解决方式:initSpeech中添加初始化记录容器
void SpeechManager::initSpeech(){ //容器保证为空 this->v1.clear(); this->v2.clear(); this->vVictory.clear(); this->m_Speaker.clear(); //初始化比赛轮数 this->m_Index = 1; //初始化记录容器 this->m_Record.clear();}
void clearRecord();
//清空记录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("seepch.csv", ios::trunc); ofs.close(); //初始化属性 this->initSpeech(); //创建选手 this->createrSpeaker(); //获取往届记录 this->loadRecord(); cout << "清空成功" << endl; } system("pause"); system("cls");}
在main函数分支3选项中,调用清空比赛记录的接口
case 3://清空记录 sm.clearRecord(); break;
1、github 啃STL简化项目,能够自己实现STL相关项目 2、做一个微信小程序,具体功能暂定
转载地址:http://quhwz.baihongyu.com/