C++演讲比赛项目

1.项目需求

1.1比赛规则

1.2程序功能

1.3程序效果图

2.项目创建

创建项目步骤如下:

  • 创建新项目

  • 添加文件

2.1创建项目

打开vs2017后,点击创建新项目,创建新的C++项目

如图:

3.创建管理类

3.1创建文件

4.菜单功能

  • 功能描述:与用户的沟通界面

4.1添加成员函数

4.2菜单功能实现

在管理类SpeechManager.cpp中实现show_Menu()函数

//菜单提示

void SpeechManager::show_Menu()

{

       cout << "****************************************" << endl;

       cout << "**************欢迎参加演讲比赛**********" << endl;

       cout << "***************1.开始演讲比赛**********" << endl;

       cout << "***************2.查找往届记录***********" << endl;

       cout << "***************3.清空比赛记录***********" << endl;

       cout << "***************0.退出比赛程序***********" << endl;

       cout << "****************************************" << endl;

       cout << endl;

}

4.3运行效果图

5.退出功能

功能描述:实现退出程序

5.1提供功能接口

在main函数中提供分支选择,提供每个功能接口

代码:

//退出系统

void SpeechManager::exitSystem()

{

       cout << "欢迎下次使用" << endl;

       system("pause");

       exit(0);

}

6.演讲比赛功能

6.1功能分析

比赛流程分析:

6.2创建选手类

  • 选手类中的属性包含:选手姓名、分数

  • 头文件中创建speaker.h文件,并添加代码

#pragma once

#include <iostream>

using namespace std;

class Speaker

{

public:

       string m_Name;       //姓名

       double m_Score[2];   //分数  最高有两轮得分

};

6.3比赛

6.3.1成员属性添加

  • 在speechManager.h中添加属性

6.3.4开始比赛成员函数添加


完整代码:

speechManger.cpp

#include "speechManger.h"

//构造函数

SpeechManager::SpeechManager() {

       //初始化容器和属性

       this->initSpeech();

       //创建12名选手

       this->createSpeaker();

       //加载往届记录

       this->loadRecord();

}

//菜单功能

void SpeechManager::show_Menu() {

       cout << "******************************************" << endl;

       cout << "************ 欢迎参加演讲比赛 ************" << endl;

       cout << "***********  1.开始演讲比赛   ************" << endl;

       cout << "***********  2.查看往届记录   ************" << endl;

       cout << "***********  3.清空比赛记录   ************" << endl;

       cout << "***********  0.退出比赛程序   ************" << endl;

       cout << "******************************************" << endl;

       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();

       //重置比赛,获取记录

       //初始化容器和属性

       this->initSpeech();

       //创建12名选手

       this->createSpeaker();

       //加载往届记录

       this->loadRecord();

       cout << "本届比赛已完毕!" << endl;

       system("pause");

       system("cls");

}

//抽签

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<int>::iterator it = v1.begin(); it != v1.end(); it++) {

                     cout << *it << " ";

              }

              cout << endl;

       }

       else {

              //第二轮比赛

              random_shuffle(v2.begin(), v2.end());

              for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++) {

                     cout << *it << " ";

              }

              cout << endl;

       }

       cout << "--------------------------" << endl;

       system("pause");

       cout << endl;

}

//比赛

void SpeechManager::speechContest() {

       cout << "第 << " << this->m_Index << " >> 轮比赛正式开始 ---------------" <<  endl;

       cout << "--------------------------" << endl;

       //准备临时容器 存放 小组成绩

       multimap<double, int, greater<double>> groupScore;

       int num = 0; //用于记录人员 的个数 6 人一组

       vector<int> v_Src;//比赛选手容器

       if (this->m_Index == 1) {

              v_Src = v1;

       }

       else {

              v_Src = v2;

       }

       //遍历所有选手进行比赛

       for (vector<int>::iterator it = v_Src.begin(); it != v_Src.end(); it++) {

              num++;

              //评委打分

              deque<double> d;

              for (int i = 0; i < 10; i++) {

                     double score = (rand() % 401 + 600) / 10.f; // 随机数出来是600  ~ 1000 除以 10.f 得出最终分数

                     //cout << score << " ";

                     d.push_back(score);

              }

              //cout << endl;

              sort(d.begin(), d.end(), greater<double>()); //排序     降序

              d.pop_front(); //去除最高分

              d.pop_back(); //去除最低分

              double sum = accumulate(d.begin(), d.end(), 0.0f); //总分

              double avg = sum / (double)d.size(); //平均分

              //打印平均分

              //cout << "编号: " << " 姓名: " << this->m_Speaker[*it].m_Name << "  平均分: " << avg << endl;

              //将平均分放入到 map容器中

              this->m_Speaker[*it].m_Score[this->m_Index - 1] = avg;

              //将打分的数据 放入到临时小组中

              groupScore.insert(make_pair(avg, *it)); //key是得分, value是具体选手编号

              //每6人取出前三名

              if (num % 6 == 0) {

                     cout << "第" << num / 6 << "小组比赛名次: " << endl;

                     for (multimap<double, int, greater<double>>::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<double, int, greater<double>>::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::showScore() {

       cout << "---------------------第" << this->m_Index << "轮晋级选手如下:---------------" << endl;

       vector<int> v;

       if (this->m_Index == 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->m_Index - 1] << endl;

       }

       cout << endl;

       system("pause");

       system("cls");

       this->show_Menu();

}

//保存记录

void SpeechManager::saveRecord() {

       ofstream ofs;

       ofs.open("speech.csv", ios::out | ios::app); //用追加的方式写文件

       //将每个选手数据,写入到文件中

       for (vector<int>::iterator it = vVictory.begin(); it != vVictory.end();  it++) {

              ofs << *it << "," << this->m_Speaker[*it].m_Score[1] << ",";

       }

       ofs << endl;

       //关闭

       ofs.close();

       cout << "记录已保存" << endl;

       //有记录了 , 文件不为空

       this->fileIsEmpty = false;

}

//读取记录

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;

       while (ifs >> data) {

              //cout << data << endl;

              vector<string> v; //存放6个string字符串

              int pos = -1; //查到","位置的变量

              int start = 0;

              while (true) {

                     pos = data.find(",", start);

                     if (pos == -1) {

                           //没有找到情况

                           break;

                     }

                     string temp = data.substr(start, pos - start);

                     //cout << temp << endl;

                     v.push_back(temp);

                     start = pos + 1;

              }

              this->m_Record.insert(make_pair(index, v));

              index++;

       }

       ifs.close();

       /*for (map<int, vector<string>>::iterator it = m_Record.begin(); it !=  m_Record.end(); it++) {

              cout << it->first << "冠军编号: " << it->second[0] << " 分数: " <<  it->second[1] << endl;

       }*/

}

//显示往届记录

void SpeechManager::showRecord() {

       if (this->fileIsEmpty) {

              cout << "文件不存在,或记录为空!" << endl;

       }

       else {

              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");

}

//清空记录

void SpeechManager::clearRecord() {

       cout << "是否确定清空记录?" << endl;

       cout << "1.确定" << endl;

       cout << "2.取消" << endl;

       int select = 0;

       cin >> select;

       if (select == 1) {

              //确认清空

              ofstream ofs("speech.csv", ios::trunc);

              ofs.close();

              //初始化容器和属性

              this->initSpeech();

              //创建12名选手

              this->createSpeaker();

              //加载往届记录

              this->loadRecord();

              cout << "清空成功!" << endl;

       }

       system("pause");

       system("cls");

}

//退出系统

void SpeechManager::exitSystem() {

       cout << "欢迎下次使用!" << endl;

       system("pause");

       exit(0);

}

//初始化容器和属性

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 SpeechManager::createSpeaker() {

       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;

              }

              //创建选手编号 并且放入到v1容器中

              this->v1.push_back(i + 10001);

              //选手编号以及对应的选手放入map容器中

              this->m_Speaker.insert(make_pair(i + 10001, sp));

       }

}

//析构函数

SpeechManager::~SpeechManager()

{

}



基于STL的演讲流程管理系统.cpp

#include <iostream>

using namespace std;

#include "speechManger.h"

#include <string>

#include <ctime>

int main()

{

       //随机数种子

       srand((unsigned int)time(NULL));

       //创建管理类对象

       SpeechManager sm;

       //测试12名选手创建

       //for (map<int, Speaker>::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;

       //}

       int choice = 0;      //用于存储用户输入

       while (true)

       {

              sm.show_Menu();

              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;

              }

       }

       system("pause");

       return 0;

}

speechManger.h

#pragma once

#include <iostream>

#include <vector>

#include <map>

#include "speaker.h"

#include <algorithm>

#include <deque>

#include <functional>

#include <numeric>

#include <string>

#include <fstream>

using namespace std;

//设计演讲管理类

class SpeechManager {

public:

       //构造函数

       SpeechManager();

       //开始比赛 比赛整个流程控制函数

       void startSpeech();

       //抽签

       void speechDraw();

       //比赛

       void speechContest();

       //显示比赛结果

       void showScore();

       //保存记录

       void saveRecord();

       //读取记录

       void loadRecord();

       //判断文件是否为空

       bool fileIsEmpty;

       //存放往届记录的容器

       map<int, vector<string>> m_Record;

       //显示往届记录

       void showRecord();

       //清空记录

       void clearRecord();

       //菜单功能

       void show_Menu();

       //退出系统

       void exitSystem();

       //析构函数

       ~SpeechManager();

       //初始化容器和属性

       void initSpeech();

       //创建12名选手

       void createSpeaker();

       //成员属性

       //保存第一轮比赛选手编号容器

       vector<int> v1;

       //第一轮晋级选手编号容器

       vector<int> v2;

       //胜出前三名选手编号容器

       vector<int> vVictory;

       //存放编号以及对应具体选手容器

       map<int, Speaker> m_Speaker;

       //存放比赛轮数

       int m_Index;

};

speaker.h

#pragma once

#include <iostream>

using namespace std;

class Speaker

{

public:

       string m_Name;       //姓名

       double m_Score[2];   //分数  最高有两轮得分

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑马金牌编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值