基于STL泛化编程的演讲比赛 小案例 c++

简介: 基于STL泛化编程的演讲比赛 小案例 c++

导航


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;
}


相关文章
|
1月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
95 10
|
1月前
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
236 65
|
1月前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
95 4
|
1月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
49 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
1月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
69 5
|
1月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
52 1
|
1月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
81 11
|
1月前
|
算法 安全 Linux
【C++STL简介】——我与C++的不解之缘(八)
【C++STL简介】——我与C++的不解之缘(八)
|
1月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
52 5
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
41 0
C++入门6——模板(泛型编程、函数模板、类模板)