黑马C++ 演讲比赛案例 超详细完整记录

1.执行主程序   11.cpp

#include<iostream>
using namespace std;
#include"speechmanager.h"
#include"speechmanager.cpp"
#include"speaker.h"
int main(){
    srand((unsigned int)time (NULL));
    speechmanager sm;                   //1.创建整个演讲比赛管理者 sm 
    sm.showmenu();                      //2.调用菜单
    sm.selectsystem();                  //3.调用选择系统
    system("pause");
    return 0;
} 

2.头文件程序1     speechmanager.h

#pragma once
#include<iostream>
using namespace std;
#include<vector>
#include<map>
#include<algorithm>
#include"speaker.h"
#include<deque>
#include<functional>
#include<numeric>
#include<fstream>
#include<ctime>
class speechmanager
{   
    
    public:
    speechmanager();       //构造函数

    void showmenu();       //1.菜单
    void selectsystem();   //2.用户选择界面系统
    void exitsystem();     //3.退出系统    
                           //4.创建选手类  有姓名和分数
    void initspeech();     //6.初始化内部参数
    void creatspeaker();   //7.创建12名选手
    void startspeech();    //8.开始比赛
        void speechdraw();     //8.1 抽签
        void speechdivi();     //8.2 分组
    void showspeaker();    //9.显示晋级选手信息
    void saverecord();     //10.保存比赛记录
    void loadrecord();     //11.读取记录
    bool fileisempty;      //12.判断文件是否为空

                           //13.解析记录

    void showrecord();     //14.显示往届记录
    void clearspeech();    //15.清空比赛记录


             //5.设置内部参数如下
    vector<int> v1;         //12名比赛选手编号容器
    vector<int> v2;         //第二轮 6名选手编号容器
    vector<int> vv;         //第二轮获得前3名编号选手容器
    map<int,speaker> m_speaker;      //存放编号及对应选手容器    

    map<int,vector<string>> m_record;//存放往届记录 


    int index;                       //记录比赛轮数       
};

3.头文件程序2   speaker.h

#pragma once
#include<iostream>
using namespace std;

class speaker
{
    public:
    string name;
    double score[2];  //分数是2个  所以直接构建数组   因为有2轮比赛
};

4.源文件  全部定义文件    speechmanager.cpp

#include"speechmanager.h"

speechmanager::speechmanager()//构造函数       
{
     this->initspeech();      //初始化参数 
     this->creatspeaker();    //创建选手
     this->loadrecord();      //加载往届记录
}
void speechmanager::showmenu()      //1.菜单
{
    cout<<"*********************************"<<endl;
    cout<<"***********欢迎参加演讲比赛*********"<<endl;
    cout<<"***********1.开始演讲比赛**********"<<endl;
    cout<<"***********2.查看往届记录**********"<<endl;
    cout<<"***********3.清空比赛记录**********"<<endl;
    cout<<"***********0.退出比赛程序**********"<<endl;
    cout<<"*********************************"<<endl;
                            
}                                                    
void speechmanager::selectsystem()  //2.用户选择界面系统            
{
     int choice=0;
     cout<<"请输入您的需求:"<<endl;
     cin>>choice;
     switch (choice)
     {
     case 1:                                //开始比赛
            this->startspeech();
        break;
     case 2:                                //查看往届记录
            this->showrecord();
        break;
     case 3:                                //清空比赛记录
            this->clearspeech();
        break;
     case 0:                                //退出比赛程序
            this->exitsystem();
        break;     
     default:
        break;
     }
}
void speechmanager::exitsystem()   //3.退出系统
{
    cout<<"欢迎您下次使用!"<<endl;
    system("read -p 'Press Enter to continue...' var"); //按任意建继续
    system("clear");                                    //清屏
}
void speechmanager::initspeech()  //6.初始化内部参数
{
   this->index=1;
   this->v1.clear();
   this->v2.clear();
   this->vv.clear();
   this->m_speaker.clear();

   this->m_record.clear();                      //记录容器也清空
}
void speechmanager::creatspeaker()  //7.创建12名选手
{
   string nameseed="ABCDEFGHIJKL";
   speaker sp;                      //先创建选手个体
   for (int i = 0; i < 12; i++)
   {
      sp.name=nameseed[i];          //再给个体名字和分数赋值
      sp.score[1]=0;

      this->v1.push_back(i+10001);  //选手编号放入v1容器
      this->m_speaker.insert(make_pair(i+10001,sp)); //再将编号及对应选手放入map容器
   }
}
void speechmanager::startspeech()    //8.开始比赛
{
                                     //第一轮比赛开始
      this->speechdraw();  //(1)抽签
      this->speechdivi();  // (2)分组比赛
      this->showspeaker(); // (3)显示晋级结果

      this->index++;                    //第二轮比赛开始
      this->speechdraw();  // (1)抽签
      this->speechdivi();  // (2)分组比赛
      this->showspeaker(); // (3)显示最终结果

      this->saverecord();               //10.保存比赛记录
      cout<<"本届比赛举办圆满成功!"<<endl;
      system("clear");

}
void speechmanager::speechdraw()     //8.1 抽签
{ 
      cout<<"*********************************"<<endl;
      cout<<"第 "<<this->index<<" 轮比赛抽签开始!"<<endl;
      cout<<"***********抽签顺序如下:***********"<<endl;

      int i=1;

      if (this->index==1)
      {
        random_shuffle(v1.begin(),v1.end());
        
        for(vector<int>::iterator it=v1.begin();it!=v1.end();it++,i++)
        {
            cout<<"("<<i<<")"<<*it<<" ";
        }
        cout<<endl;
      }
      else
      {  
        random_shuffle(v2.begin(),v2.end());
        for(vector<int>::iterator it=v2.begin();it!=v2.end();it++,i++)
        {
            cout<<"("<<i<<")"<<*it<<" ";
        }
        cout<<endl;
      }
      system("read -p 'Press Enter to continue...' var");
}
void speechmanager::speechdivi()  //8.2 分组比赛
{
    cout<<"第 "<<this->index<<" 轮比赛正式开始!"<<endl;
    multimap<double,int,greater<double>> groupscore;  //准备临时容器 存放小组成绩
    vector<int> src;                                  //比赛选手编号容器
    int num=0;                                        //num记录人员个数  6人一组
    if (this->index==1)
    {
        src=v1;
    }
    else{  src=v2;  }

    for(vector<int>::iterator it=src.begin();it!=src.end();it++) //遍历选手编号容器,每个选手10个评委打分
    {
        num++;
        deque<double> d;                               //将10个评委打分放入临时v4容器
        for (int  i = 0; i <10; i++)
        { 
          double score=rand()%41+60;                   //60~100分
          d.push_back(score);     
        }

        sort(d.begin(),d.end(),greater<double>());     //给deque容器的10个分 排序  然后去掉最高最低分
        d.pop_back();
        d.pop_front();
        double sum=accumulate(d.begin(),d.end(),0.0f);  //再算 总分accumulate   平均分
        double avg=sum/(double)d.size();

        this->m_speaker[*it].score[this->index-1]=avg;  //将平均分放入到map容器中
        groupscore.insert(make_pair(avg,*it));          //小组成绩  对应各选手的平均分

        if(num%6==0)
        {
            cout<<"----第 "<<num/6<<" 小组比赛名次为:-----"<<endl; //把2个小组的成绩分别遍历出来
            for(multimap<double,int,greater<double>>::iterator it=groupscore.begin();it!=groupscore.end();it++)
            {
                cout<<"编号"<<it->second<<" 姓名:"<<this->m_speaker[(*it).second].name
                <<"  分数:"<<this->m_speaker[it->second].score[this->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->index==1)                           //如果是第一轮的前三名  放入v2
                 {
                 v2.push_back(it->second);
                 }
                 else                                         //第二轮的  放入vv
                 {
                 vv.push_back(it->second);
                 }
           }
           groupscore.clear();                                //第一小组容器清空
        }}
    cout<<"---------------------第<<"<<this->index<<">>轮比赛完毕!-------------------"<<endl;
}

void speechmanager::showspeaker()             //9.显示晋级选手信息
{
      cout<<"第 "<<this->index<<" 轮晋级选手如下:"<<endl;
      vector<int> v;                                          //创建临时晋级选手容器
      if (this->index==1)
      {
        v=v2;
      }
      else
      { v=vv; }                                              //遍历该容器、打印输出
      for (vector<int>::iterator it=v.begin();it!=v.end();it++)
      {
          cout<<"编号:"<<*it<< "  姓名:"<<this->m_speaker[*it].name<<" 分数:"<<this->m_speaker[*it].score[this->index-1]<<endl;
      }
      cout<<endl;
      system("read -p 'Press Enter to continue...' var");
      this->showmenu();               
}
void speechmanager::saverecord()    //10.保存比赛记录
{
      ofstream ofs;
      ofs.open("比赛记录",ios::out| ios::app);        //将最后晋级的三位选手 写入文件 

      for (vector<int>::iterator it=vv.begin();it!=vv.end();it++)
      {
           ofs<<*it<<","<<this->m_speaker[*it].score[1]<<",";
      }
      ofs<<endl;
      ofs.close();
      cout<<"记录已保存!"<<endl;
      cout<<"本届比赛圆满结束!"<<endl;
      system("read -p 'Press Enter to continue...' var");
      
}
void speechmanager::loadrecord()    //11.读取记录
{
    ifstream ifs("比赛记录",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;                              //一行行读data

    vector<string> v6;                           //存放最后的6个字符串容器
    int index=0;                                 //计数这是第几届比赛
    while(ifs>>data)        
    {                             //解析此记录
        //cout<<data<<endl;
        int pos=-1;                           //查找“,” 位置的变量
        int start=0;
        while(true)
        {
           pos=data.find(",",start);
           if(pos==-1)
           {
            cout<<"文件不存在或为空!"<<endl;
            break;
           }
           else
           {
           string temp=data.substr(start,pos-start); //将写入文件的6个字符截取并传入v6容器
           //cout<<temp<<endl;
           v6.push_back(temp);              
           start=pos+1;
           }
        }
        this->m_record.insert(make_pair(index,v6));  //将v6和比赛届数传入 往届记录容器
        index++;
    }
    ifs.close();
}
void speechmanager::showrecord()   //14.显示往届记录
{   
    if (this->fileisempty)
    {
        cout<<"文件为空或在不存在!"<<endl;
    }
    else
    {
    for (size_t 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("read -p 'Press Enter to continue...' var");
    system("clear");
    
}
void speechmanager::clearspeech()  //15.清空比赛记录
{
    cout<<"确认清空?"<<endl;
    cout<<"1、确认"<<endl;
    cout<<"2、返回"<<endl;

    int select=0;
    cin>>select;
    if(select==1)
    {
        ofstream ofs("比赛记录",ios::trunc);       //打开模式 ios::trunc 如果存在 删除文件并重新创建
        ofs.close();

        this->initspeech();                       //初始化 参数 创建选手  获取往届记录

        this->creatspeaker();

        this->loadrecord();
        cout<<"清空成功!"<<endl;
    }
    system("read -p 'Press Enter to continue...' var");
    system("clear");
}

国际程序设计大赛的作品欣赏 1、 先来第一个: 一段纯 3D 的 DOS 动画,据说是获一等奖的作品。虽然它不是最精美的, 但是当你得知它只有 4K 时,会不会立刻疯死掉呢? 附件:3ddemo.com 2、 再来一个: 幽灵古堡 farb-rausche 64.0 KB (65,536 字节) 恰好 65536 字节,显然是参赛作品。它非常漂亮(利用了 Direct3D),更让人惊奇的是只有 64K!而更让人震惊的是,如果不压缩的话它的数据大小是 1.6G!再体会一次“奇迹”! 附件:castle.exe 3、 再来一个: 死亡阴影 64.0 KB (65,536 字节) 附件:death.exe 4、 火域幻境 73.0 KB (74,752 字节) 虽然大小过了 64K 的限制,但是它的效果可称为程序中的艺术品了! 附件:fire.exe 5、 fr-016 farb-rausche 16 字节 (16 字节) Let's rock hard!一个 DOS 里的小动画。看上去似乎没有什么特别,但是如果看到它的大小(16 字节),什么感觉????? 附件:fr-016.com 6、 第七天堂 Exceed 64.0 KB (65,536 字节) 由于参赛的要求是在 64K 之内即可,不少参赛者未免会有不到 65536 字节就有吃亏的感觉。 这是个 恰好 64K 的作品,可能利用了 DirectX 引擎,效果很好。 附件:heaven7.exe 7、 金属迷城 6.00 KB (6,144 字节) 考虑到它的大小时,你会不会体会到奇迹的含义 附件:metal.exe 8、 我要重点推荐的是这个作品fr-041_debris.exe(177K),效果是这所有作品之中最好的,一般的电脑无法流畅运行,我认为你买电脑时 可以把它带上运行一下作为一款测试工具。 附件:fr-041_debris.exe 9、 这个作品的效果和以上作品比都可名列前矛(64K),效果很好 附件:kkino64.exe 10、 这个就是传说中的25万倍压缩作品,prophecy《彗星撞地球》(63.5K)2000年时的最经典力作!画面看着挺舒服。 附件:prophecy《彗星撞地球》.exe 11、 爱之记忆 12、 3D裸女 13、 卡通 14、 光影 15、 FAiRLiGHT 这是在《三角洲3大地勇士》光碟版中带有的一个DEMO,发行组织FAiRLiGHT完全用原代码写出的自己组织的DEMO演示程序, 竟然才15K大小,画面也还行,对于他们的技术我们只能感到折服!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值