导航
1.总结
2.代码
——————————————————————————————————————
1.总结
花了半天多点时间去看的黑马程序员c++一个基于stl小实例
总结点:
用到了vector,deque,map,multimap容器
1.其中建立三个vector容器主要用于存放比赛人员的编号,第一次比赛,最后一次比赛和胜利的最后三人
2.deque容器用来存放10个评委打出来的分数,为什么用deque呢,因为这个容器是双端容器,对头尾好进行操作
3.map容器用来保存人员的类和他的编号
4.multimap容器主要是存放每个小组6人的排名并且取出来放入下一组比赛之中
大概过程见自己手写纸上
题目的要求:
—————————————————————————————————————使
使用工具:visual stdio 2012
两个头文件,两个源文件
speaker.h
#pragma once #include <iostream> using namespace std; //创建选手类 class Speaker { public: string m_name; double m_score[2]; //进行两轮比较,最多放两次 };
speechManager.h
#pragma once #include <iostream> using namespace std; #include <vector> #include <map> #include <deque> #include "speaker.h" #include <string> #include <algorithm> #include <functional> #include <numeric> //用于累加算法 #include <fstream> class speechManager { public: //构造函数 speechManager(); //菜单界面 void show_Menu(); //退出系统 void Exist_System(); //初始化容器 void init_speech(); //创建选手 void create_speaker(); //开始比赛 void start_speech(); //抽签 void speakerDraw(); //比赛函数 void speechContest(); //显示得分 void showScore(); //保存分数 void saveRecord(); //读取记录 void loadRecord(); //判断文件是否为空 bool fileIsEmpyt; //存放往届记录的容器 map<int,vector<string>> m_Record; //显示往届记录 void showRecord(); //清空记录 void clearRecord(); //析构函数 ~speechManager(); vector<int> v1; //用于存放初始的12个选手 vector<int> v2; //第一轮晋级的选手 vector<int> vvictory; //最后晋级三位选手 map<int,Speaker> m_speaker; //存放编号以及对应选手容器 int speech_num; //比赛的轮数 };
speechManager.cpp
#pragma once #include "speechManager.h" //构造函数 speechManager::speechManager() { //初始化容器 this->init_speech(); //创建选手 this->create_speaker(); //读取文件 this->loadRecord(); } //菜单界面 void speechManager::show_Menu() { cout<<"*************欢迎使用****************"<<endl; cout<<"**********1.开始演讲比赛*************"<<endl; cout<<"**********2.查看往届记录*************"<<endl; cout<<"**********3.清空比赛记录*************"<<endl; cout<<"**********4.退出比赛程序*************"<<endl; } //退出系统 void speechManager::Exist_System() { cout<<"欢迎再次使用"<<endl; system("pause"); exit(0); } //初始化容器 void speechManager::init_speech() { this->v1.clear(); this->v2.clear(); this->vvictory.clear(); this->m_speaker.clear(); //初始化轮数 this->speech_num = 1; //清空读取的容器 this->m_Record.clear(); } //创建选手 void speechManager::create_speaker() { string name = "ABCDEFGHIJKM"; //创建12个选手 for(int i=0;i<name.size();i++) { string nam = "选手"; nam += name[i]; //创建选手 Speaker sk; sk.m_name = nam; for(int j=0;j<2;j++) { sk.m_score[j] = 0; } //将选手放入容器中 this->v1.push_back(i+10001); //存入的是选手编号 //map容器中存入编号和创建的类 this->m_speaker.insert(make_pair(i+10001,sk)); } } //开始比赛 void speechManager::start_speech() { //第一轮比赛 //抽签 this->speakerDraw(); //比赛 this->speechContest(); //显示晋级结果 this->showScore(); //第二轮比赛 this->speech_num++; //抽签 this->speakerDraw(); //比赛 this->speechContest(); //显示最后结果 this->showScore(); //保存 this->saveRecord(); //重置比赛 //初始化容器,获取记录 this->init_speech(); //创建12名选手 this->create_speaker(); //加载往届记录 this->loadRecord(); cout<<"本届比赛正式结束"<<endl; system("pause"); system("cls"); } //抽签 void speechManager::speakerDraw() { cout<<"开始抽签"<<endl; cout<<"*************************"<<endl; cout<<"抽取顺序如下:"<<endl; //根据比赛轮数进行打乱 if(this->speech_num == 1) { random_shuffle(v1.begin(),v1.end()); //进行打乱 for(vector<int>::iterator it = v1.begin();it!=v1.end();it++) { cout<<*it<<" "; } } else { random_shuffle(v2.begin(),v2.end()); //进行打乱 for(vector<int>::iterator it = v2.begin();it!=v2.end();it++) { cout<<*it<<" "; } } cout<<endl<<"*************************"<<endl; system("pause"); //进行缓冲一下 } //比赛函数 void speechManager::speechContest() { cout<<"----------第"<<this->speech_num<<"轮比赛正式开始——————"<<endl; //准备临时容器 存放小组成绩 multimap<double,int,greater<double>> groupScore; //用于统计人员个数,6人一组 int num=0; vector<int>v_Scr; //比赛选手容器 //根据比赛的场次来进行容器赋值 if(this->speech_num == 1) { v_Scr = v1; } else { v_Scr = v2; } //遍历所有选手进行比赛 for(vector<int>::iterator it = v_Scr.begin();it!=v_Scr.end();it++) { num++; //评委打分 deque<double>d; //对于去掉最高分最低分使用deque更好 for(int i=0;i<10;i++) { double score = (rand()%401+600)/10.2f; //得到的数是小数 //cout<<score<<" "; d.push_back(score); } //cout<<endl; sort(d.begin(),d.end(),greater<double>()); //对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->speech_num-1] = avg; //将打分数据,放入到临时容器group中 groupScore.insert(make_pair(avg,(*it))); //key是得分,value是具体选手编号 //每6人取前三名 if(num%6 == 0) { cout<<"第"<<num/6<<"小组比赛名次:"<<endl; //打印6人中对应的信息 for(multimap<double,int,greater<double>>::iterator its = groupScore.begin();its!=groupScore.end();its++) cout<<"编号:"<<its->second<<" 姓名:"<<this->m_speaker[its->second].m_name<<" 成绩:"<<this->m_speaker[its->second].m_score[this->speech_num-1]<<endl; //取掉每组中的前三名 int count = 0; for(multimap<double,int,greater<double>>::iterator its = groupScore.begin();its!=groupScore.end();its++) { if(count<3) if(this->speech_num == 1) //如果是第一轮放入v2 { v2.push_back(its->second); } else //否则放入vvctory { vvictory.push_back(its->second); } count++; } //清空容器 groupScore.clear(); } } cout<<endl; cout<<"-------------第"<<this->speech_num<<"轮比赛结束-------------"<<endl; system("pause"); } //显示得分 void speechManager::showScore() { cout<<"-------------第"<<this->speech_num<<"轮晋级选手信息如下-------------"<<endl; vector<int> v; //作为临时容器,好下面直接遍历 if(this->speech_num == 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->speech_num-1]<<endl; } system("pause"); } //保存分数 void speechManager::saveRecord() { ofstream ofs; ofs.open("victoryPer.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(); system("pause"); system("cls"); cout<<"记录已保存"<<endl; this->fileIsEmpyt = false; } //读取记录 void speechManager::loadRecord() { ifstream ifs("victoryPer.csv",ios::in); //读文件 if(!ifs.is_open()) //直接判断文件是否存在 { this->fileIsEmpyt = true; //cout<<"文件不存在"<<endl; ifs.close(); return; } char ch; ifs>>ch; //读取一个字符 if(ifs.eof()) //判断文件为空的情况 { //cout<<"文件为空"<<endl; this->fileIsEmpyt = true; ifs.close(); return; } //文件不为空 this->fileIsEmpyt = false; ifs.putback(ch); //将上面读取的字符放回来 string data; int index = 0; while(ifs>>data) //读取文件 { vector<string> v; //存放6个string字符串 //cout<<data; //进行解析 int start = 0; int pos=-1; while(true) { pos = data.find(",",start); //从start位置开始查找 if(pos == -1) { break; } string str = data.substr(start,pos-start); //从start开始pos—start个位置 v.push_back(str); //将读取到的存入容器 start = pos + 1; } this->m_Record.insert(make_pair(index,v)); //存入第几届和对应的容器 index++; } ifs.close(); 循环遍历这个map容器 //for(map<int,vector<string>>::iterator it = m_Record.begin();it!=m_Record.end();it++) //{ // cout<<"第"<<it->first<<"届冠军编号:"<<it->second[0]<<" 成绩为:"<<it->second[1]\ // <<" 季军编号:"<<it->second[2]<<" 成绩为:"<<it->second[3]\ // <<" 亚军编号:"<<it->second[4]<<" 成绩为:"<<it->second[5]<<endl; //} } //显示往届记录 void speechManager::showRecord() { if(this->fileIsEmpyt) { cout<<"文件为空或不存在"<<endl; } else { 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]\ <<" 季军编号:"<<it->second[2]<<" 成绩为:"<<it->second[3]\ <<" 亚军编号:"<<it->second[4]<<" 成绩为:"<<it->second[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) { ofstream ofs("victoryPer.csv",ios::trunc); ofs.close(); //初始化容器 this->init_speech(); //创建选手 this->create_speaker(); //读取文件 this->loadRecord(); cout<<"清理成功"<<endl; } system("pause"); system("cls"); } //析构函数 speechManager::~speechManager() { }
演讲比赛管理.cpp
#include <iostream> using namespace std; #include "speechManager.h" #include <ctime> int main() { srand((unsigned int)time(NULL)); //创建随机种子 //创建管理类 speechManager m; int choice; //选项 测试是否创建12个选手,打印出编号 //for(map<int,Speaker>::iterator it = m.m_speaker.begin();it !=m.m_speaker.end();it++) //{ // cout<<"选手编号为:"<<it->first<<" 姓名为:"<<it->second.m_name<<" 初始成绩:"<<it->second.m_score[0]<<endl; //} while(true) { m.show_Menu(); cout<<"请输入您想要的选项"<<endl; cin>>choice; switch(choice) { case 1: //开始演讲比赛 m.start_speech(); break; case 2: //查看往届记录 //m.loadRecord(); m.showRecord(); break; case 3: //清空比赛记录 m.clearRecord(); break; case 4: //退出比赛程序 m.Exist_System(); break; default: system("cls"); break; } } system("pause"); return 0; }