演讲比赛流程管理项目c++
对于一个基本项目,先分析基本的东西有哪些
1.类
演讲管理类:用于编写比赛流程用的功能
演讲者类:包含姓名,分数
创建比赛流程:创建选手12个人,分为两组,6人一组,每组进行两轮比赛,每次选则一半人晋级,最后选出三个人
展示菜单->用户选择功能->退出。
功能
1.展示菜单
2.评委打分
3.退出程序
4.开始比赛功能(展示比赛流程)
5.查看往届记录
6.保存每次比赛记录
7.创建选手功能。
8.初始化
开始编写项目
1.两个类
class SpeaKer
{public:string m_name;double m_score;};
//多文件调用
#include"Speaker.h"
#include<map>
#include<vector>
using namespace std;
//设计演讲比赛管理类
//1.创建基本步骤。
//2.实现基本功能,成员函数实现(在头文件声明,在源文件实现)//功能一.菜单功能
class SpeechManager
{//构造函数和析构函数的创建public://无参构造器SpeechManager();//菜单功能void show_Meun();//初始化,保证每次询问清除以前的数据void initSpeech();//创建选手void createSpeaker();//退出功能void exitSystem();//创建比赛流程功能,控制整个流程。void startSpeech();//抽签功能void speechDraw();//演讲比赛功能// 比赛流程分析抽签-开始演讲比赛-显示2第一轮比赛结果-抽签-开始演讲比赛-显示前三名结果-保存分数//析构函数//比赛功能void speechContest();//展示比赛结果void showScore();//保存比赛结果void saveRecord();//查看记录分数void loadRecord();//显示往届得分void showRecord();//清空记录功能实现void clearRecord();~SpeechManager();//成员属性//比赛选手容器vector<int> v1;//第一轮晋级的选手vector<int> v2;//胜利前三名vector<int> win;//存放编号以及对应的具体选手容器map<int, SpeaKer> m_speaker;//记录比赛轮次int m_index;//文件为空的标致bool fileIsEmpty;//往届记录map<int, vector<string>> m_Record;
};
现在分析要写的功能有哪些
1.首先找到需要的成员
比赛分为两轮需要两个容器存放比赛顺序 vectoe<int> v1; vector<int> v2;
最后前三名的 vector<int> win;
存放演讲者和编号map<int, SpeaKer> m_speaker;
记录比赛的轮次int m_index;
保存往届记录的容器
map<int, vector<string>> m_Record;
需要的功能
1.首先就是初始化,保证比赛流程不会收以前的记录影响
//初始化,保证每次询问清除以前的数据
void initSpeech();
void SpeechManager::initSpeech()
{//保证容器为空this->v1.clear();this->v2.clear();this->win.clear();this->m_speaker.clear();this->m_index = 1;//初始化记录容器this->m_Record.clear();
}
2.第二就是创建选手
void createSpeaker();//创建选手
void SpeechManager::createSpeaker()
{//一共12个人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));}
}
3.补充一个菜单功能
void show_Meun();void SpeechManager::show_Meun()
{cout << "**********************************************" << endl;cout << "************* 欢迎参加演讲比赛 *************" << endl;cout << "************* 1.开始演讲比赛 *************" << endl;cout << "************* 2.查看往届记录 *************" << endl;cout << "************* 3.清空比赛记录 *************" << endl;cout << "************* 4.退出比赛程序 *************" << endl;cout << "**********************************************" << endl;cout << endl;}
4.退出功能
void exitSystem();//退出功能
void SpeechManager::exitSystem()
{cout << "欢迎下次使用";system("pause");exit(0);//exit(0)表示程序正常退出;除了0之外,其他参数均代表程序异常退出,如:exit(1),exit(-1)。
}
5.选手抽签功能
void SpeechManager::speechDraw() {//第一轮比赛cout << "第" << this->m_index << "轮比赛选手正在抽签" << endl;cout << "--------------------------------------" << endl;cout << "抽签后演讲顺序如下:";//1.抽签if (this->m_index == 1)//判断第几轮{random_shuffle(v1.begin(), v1.end());//随机打乱容器的顺序for (auto it : v1){cout << it << " ";}}else{random_shuffle(v2.begin(), v2.end());for (auto it : v2){cout << it << " ";}cout << endl;}cout << "-------------------------------------" << endl;system("pause");cout << endl;//按任意键继续}
6.比赛开始功能
void SpeechManager::speechContest(){cout <<"--------------------- "<<"第" << m_index << "轮比赛正式开始"<<"-----------------"<<endl;cout << "成绩如下" << endl;//准备零时容器存放小组成绩multimap<double, int, greater<double>> gourpScore;int num = 0;//记录人数6人一组vector<int> v_src;//比赛容器//判断第几轮if (m_index == 1){v_src = v1;}else{v_src = v2;}//遍历所有选手比赛for (auto it : v_src){num++;//评委打分deque<double> d;//双端队列for (int i = 0; i < 10; i++){double score = (rand() % 401 + 600) / 10.f;//随机生成分数//cout << score << " ";d.push_back(score);}//cout << endl;//降序排列sort(d.begin(), d.end(), greater<double>());//去除最高分去除最低分d.pop_back();d.pop_front();//累加总分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;//将打分数据存到临时数据里面gourpScore.insert(make_pair(avg, it));//每6个人取出前三名if (num % 6 == 0){cout << "第" << num / 6 << "小组比赛名次:" << endl;for (auto a : gourpScore){cout << "编号:" << a.second << "姓名:" << this->m_speaker[a.second].m_name << " 成绩:" << this->m_speaker[a.second].m_score[this->m_index - 1] << endl;}//取出前三名晋级刀第二轮int count = 0;for (auto i : gourpScore){if (count >=3) break;if (this->m_index == 1){v2.push_back(i.second);}else{win.push_back(i.second);}count++;}gourpScore.clear();}}cout << "-----------------------" <<"第"<< this->m_index << "轮比赛完毕" << "-----------------------" << endl;system("pause");}
7.显示比赛结果功能
void SpeechManager::showScore(){cout << "-------------------第" << this->m_index << "轮晋级选手信息如下:-------------------" << endl;vector<int> v;if (this->m_index == 1){v = v2;}else{v = win;}for (auto i : v){cout << "选手:" << i << "姓名:" << this->m_speaker[i].m_name << "得分:" << m_speaker[i].m_score[this->m_index - 1] << endl;}cout << endl;system("pause");system("cls");//this->show_Meun();}
8.保存分数功能,保存到文件
//1.保存分数void SpeechManager::saveRecord(){ofstream ofs;////文件名ofs.open("speech.csv", ios::out | ios::app);//用追加的方式写文件//将每个人数据写入到文件中for (auto it : win){ofs << it << "," << this->m_speaker[it].m_score[1]<< ",";}ofs << endl;ofs.close();cout << "记录已经保存" << endl;//只要里面有记录了,就应该告诉showRecord,防止因为存放记录文件名被修改出现问题this->fileIsEmpty = false;}
9.从文件中处理到最后答案容器
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;//表示第几届比赛//将字符读到data字符中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;}string tmp = data.substr(start, pos - start);//找到了截取//cout << tmp << endl;v.push_back(tmp);start = pos + 1;}this->m_Record.insert(make_pair(index, v));index++;}ifs.close();/*for (auto it : m_Record){cout << it.first<<"编号 " << it.second[0] <<"分数" << it.second[1] << endl;}*/}
10.展示结果
}void SpeechManager::showRecord(){if (this->fileIsEmpty == true){cout << "文件不存在" << endl;}else{for (int i = 0; i < this->m_Record.size(); i++){cout << "第" << i + 1 << "届" << endl;cout << "冠军编号:" << this->m_Record[i][0] << "得分:" << this->m_Record[i][1] << " " << endl;cout << "亚军编号:" << this->m_Record[i][2] << "得分:" << this->m_Record[i][3] << " " << endl;cout << "季军编号:" << this->m_Record[i][4] << "得分:" << this->m_Record[i][5] << " " << endl;}}system("pause");system("cls");}
11.清空记录
void SpeechManager::clearRecord(){cout << "确认清空?" << endl;cout << "1-确认 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");}
13。最创建一个流程管理功能。
//在菜单上我们看到有开始演讲比赛,查看往届记录,两个功能,所以我们在用功能的时候必须要先初始化好,我们在无参构造器里面初始化SpeechManager::SpeechManager()
{//初始化容器this->initSpeech();//创建选手this->createSpeaker();//加载往届记录this->loadRecord();
}void SpeechManager::startSpeech()
{//因为要进行两轮比赛所以循环两次//第一轮开始比赛while (this->m_index <= 2){//首先选手抽签this->speechDraw();//开始比赛this->speechContest();//展示比赛结果this->showScore();//下一轮this->m_index++;}//比赛完存储数据,到文件this->saveRecord();//在每次比赛完以后要重置比赛容器,比如第一届比赛完了以后,进行第二届比赛,肯定要先处理以前比赛的记录,保证容器里面是空的。//初始化//为什么还有再写,因为创建对象只初始化一次,我们在每次调用比赛流程功能都要初始化this->initSpeech();//创建选手this->createSpeaker();//加载往届记录this->loadRecord();//初始记录容器cout << "本届比赛完毕!" << endl;system("pause");system("cls");
}
#include<bits/stdc++.h>
#include"speechManager.h"
using namespace std;
int main()
{
//创建对象SpeechManager sm;//随机数srand((unsigned int)time(NULL));//你的选择int choice = 0;while (true){//展示菜单sm.show_Meun();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;}}cout << "hello world" << endl;system("pause");return 0;
}