最近在学c++就跟着b站up主黑马程序员写了一个演讲比赛的小项目,不得不说,确实很复杂,不过很锻炼你对c++知识点的熟练程度,做完还是很有成就感的
下面是需求和代码,感兴趣的同学也可以自己动手操作一下哈

演讲比赛流程管理系统

演讲比赛程序要求
1.1比赛规则

·学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛。
·每名选手都有对应的编号,如10001~10012
·比赛方式:分组比赛,每组6个人;
·第一轮分为两个小组,整体按照选手编号进行抽签后顺序演讲。
·十个评委分别给每名选手打分,去除最高分和最低分,求的平均分为本轮选手的成绩·当小组演讲完后,淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛。
·第二轮为赛,前三名胜出
·每轮比赛过后需要显示晋级选手的信息

1.2程序功能

·开始演讲比赛:完成整届比赛的流程,每个比赛阶段需要给用户一个提示,用户按任意键后继续下一个阶段·查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用.csv后缀名保存·清空比赛记录:将文件中数据清空·退出比赛程序:可以退出当前程序

1.3程序效果图

2、项目创建
visual studio2019
 
3、创建管理类
功能描述:
·提供菜单界面与用户交互
·对演讲比赛流程进行控制
·与文件的读写交互
 
3.1创建文件

在头文件和源文件的文件夹下分别创建speechManager.h和speechManager.cpp文件

4、菜单功能
功能描述:与用户的沟通界面

4.1、添加成员函数

在管理类speechManager.h中添加成员函数void show_Menu();

4.2菜单功能实现

在speechManager.cpp中实现show_Menu();函数

4.3测试菜单功能

在演讲比赛流程管理系统.cpp中测试菜单功能

5、实现退出功能

功能描述:实现退出程序

5.1提供功能接口

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

5.2实现退出功能

在speechManager.h中提供退出系统的成员函数void exitsystem()在speechManager.cpp中提供具体的功能实现

6、演讲比赛功能

6.1功能分析

比赛流程分析:
抽签一开始演讲比赛→显示第一轮比赛结果一抽签一开始演讲比赛→显示前三名结果一保存分数

6.2创建选手类

·选手类中的属性包含:选手姓名、分数
·头文件中创建 speaker.h文件,并添加代码:

6.3比赛
6.3.1成员属性添加

·在speechManager.h中添加属性利用vector容器存放演讲者信息

6.3.2初始化属性

·在speechManager.h中提供开始比赛的的成员函数void initspeech()在speechManager.cpp中实现 void initspeech();SpeechManager构造函数中调用void initspeech();

6.3.3创建选手

在speechManager.h中提供开始比赛的的成员函数 void createspeaker()在speechManager.cpp中实现void createspeaker();SpeechManager类的构造函数中调用void createspeaker();

6.3.4开始比赛

在speechManager.h中提供开始比赛的的成员函数void startspeech();该函数功能是主要控制比赛的流程在speechManager.cpp中将startSpeech的空实现先写入
我们可以先将整个比赛的流程写到函数中

6.3.5抽签

正式比赛前,所有选手的比赛顺序需要打乱,我们只需要将存放选手编号的容器打乱次序即可在speechManager.h中提供抽签的的成员函数void speechDrau();在speechManager.cpp中实现成员函数void speechoraw()在startSpeech比赛流程控制的函数中,调用抽签函数·在main函数中,分支1选项中,调用开始比赛的接口

6.3.6开始比赛

在speechManager.h中提供比赛的的成员函数void speechcontest()在speechManager.cpp中实现成员函数void speechContest();

6.3.7显示比赛分数

在speechManager.h中提供显示分数的成员函数void showscore();在speechManager.cpp中实现成员函数 void showscore();

6.3.8第二轮比赛

第二轮比赛流程同第一轮,只是比赛的轮是+1,其余流程不变·在startSpeech比赛流程控制的函数中,加入第二轮的流程

6.4保存分数

功能描述:·将每次演讲比赛的得分记录到文件中功能实现:·在speechManager.h中添加保存记录的成员函数void saveRecord();在speechManager.cpp中实现成员函数vold saveRecord();

7、查看记录
7.1读取记录分数

在speechManager.h中添加保存记录的成员函数void 1oadRecord();添加判断文件是否为空的标志 boolfilersEmpty;添加往届记录的容器map<int,vector>m_Record;其中m_Record 中的key代表第几届,value记录具体的信息·在speechManager.cpp中实现成员函数void loadRecord();

7.2查看记录功能

在speechManager.h中添加保存记录的成员函数void showRecord();在speechManager.cpp中实现成员函数void shouRecord();

8、清空记录

在speechManager.h中添加保存记录的成员函数void clearRecord();在speechManager.cpp中实现成员函数void clearRecord();

这个比赛的全部思路就是这些了,算是一个大纲,一个骨架,之后再往里面添加细节
下面是代码

在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"speaker.h"
#include<algorithm>
#include<deque>
#include<functional>
#include<numeric>
#include<string>
#include<fstream>//设计演讲管理类
class speechManager
{public://构造函数speechManager();//菜单功能void show_Menu();//初始化容器和属性void initSpeech();//清空文件void clearRecord();//开始比赛  比赛整个流程控制函数void startSpeech();//抽签void speechDraw();//显示得分void showScore();//成员属性//保存第一轮比赛选手编号容器vector<int>v1;//第一轮晋级选手编号容器vector<int>v2;//胜出前三名vector<int>vVictory;//保存记录void saveRecord();//读取记录void loadRecord();//判断文件是否为空bool fileIsEmpty;//存放往届记录的容器map<int, vector<string>>m_Record;//显示往届记录void showRecord();//存放编号以及对应选手信息容器map<int, Speaker>m_Speaker;//创建12名选手void createSpeaker();//比赛轮数int m_Index;//退出系统void exitSystem();//析构函数~speechManager();//比赛void speechContest();};

在speechManager.cpp里面

#include"speechManager.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::exitSystem()
{cout << "欢迎下次使用" << endl;system("pause");exit(0);
}//析构函数
speechManager::~speechManager()
{}//清空文件
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::initSpeech()
{//容器都置空this->v1.clear();this->v2.clear();this->vVictory.clear();//初始化比赛轮数this->m_Index = 1;//将记录的容器也清空this->m_Record.clear();
}
//创建12名选手
void speechManager::createSpeaker()
{string nameSeed = "ABCDEFGHIJKL";for (int i = 0; i < 12; i++){string name="选手";name += nameSeed[i];//创建具体选手Speaker sp;sp.m_Name = name;for (int j = 0; j < 2; j++){sp.m_Score[j] = 0;}//创建选手编号,并且放到v1容器中this->v1.push_back(i + 10001);this->m_Speaker.insert(make_pair(i + 10000, sp));}}//开始比赛     比赛整个流程控制函数
void speechManager::startSpeech()
{//第一轮开始比赛//1、抽签this->speechDraw();//2、比赛this->speechContest();//3、显示晋级结果this->showScore();//第二轮开始比赛this->m_Index++;//1、抽签this->speechDraw();//2、比赛this->speechContest();//3、显示最终结果this->showScore();//保存分数到文件中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 it2 = v2.begin(); it2 != v2.end(); it2++){cout << *it2 << "  ";}cout << endl;}cout << "---------------------" << endl;system("pause");cout << endl;
}
//比赛
void speechManager::speechContest()
{cout << "--------第" << this->m_Index << "轮比赛正式开始-----------" << 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//cout << score << " ";d.push_back(score);}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 << "编号:" << *it << "  姓名:" << this->m_Speaker[*it].m_Name << "   平均分:" << avg << endl;//将平均分放入map容器中this->m_Speaker[*it].m_Score[m_Index - 1] = avg;//将打分数据放入临时容器中//key是得分,value是具体编号groupScore.insert(make_pair(avg, *it));//每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[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);}}cout << endl;groupScore.clear();}}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[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 << date<<endl;//10001,86.675,10008,81.3,10006,78.55,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 < m_Record.size(); i++){cout << "第" << i + 1 << "届"<< "冠军编号:" << m_Record[i][0] << "得分:" << m_Record[i][1]<< "亚军编号:" << m_Record[i][2] << "得分:" << m_Record[i][3]<< "季军编号:" << m_Record[i][4] << "得分:" << m_Record[i][5]<< endl;}}system("pause");system("cls");
}

在演讲比赛.cpp里面

#include<iostream>
using namespace std;
#include"speechManager.h"
#include<string>
#include<ctime>
int main()
{srand((unsigned int)time(NULL));//创建管理类对象speechManager sm;//测试代码/*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.loadRecord();sm.showRecord();break;case 3://清空比赛记录sm.clearRecord();break;case 0://退出系统sm.exitSystem();break;default:system("cls");//清屏break;}}system("pause");return 0;
}

还需要创建一个

的表格

至此,这个小项目就已经结束了,是不是很有成就感?

c++项目-----演讲比赛--附详细过程相关推荐

  1. 基于Python的文件批量重命名(附详细过程解读)

    基于Python的文件批量重命名(附详细过程解读) 0.闲言碎语 hi ~ 欢迎关注公众号"壹贰叁言"! 啥都写,图一乐哈哈! 1.前因后果 前几日,我在用arcgis处理一些数据 ...

  2. Evosuite用maven构建(内附详细过程)

    Evosuite用maven构建 [参考来源]http://www.evosuite.org/documentation/tutorial-part-2/ !如果在照着做出现找不到文件的情况,请翻到本 ...

  3. Android studio项目中LitePal配置详细过程与使用

    学习<第一行代码android(第二版)>时遇到配置LitePal时android:name="org.litepal.LitePalApplication"报红的问题 ...

  4. steam/csgo游戏搬砖,适合个人/团队操作的创业项目(内附详细操作流程)

    不懂得小伙伴继续听我娓娓道来! 首先准备工作,需要用到的软件: 软件: 1.电脑(开网页不卡的就行) 2.ti子 3.谷歌浏览器(多开方便些,别的也可以) 4.桌面令牌 5.选品软件 6.利润计算公式 ...

  5. C++项目之演讲比赛模拟

    演讲系统(SpeechContext)小结 前记 最近把C++ 的知识点过了一遍,虽然说不能完全的了解C++语言的特性,但是也发现了它的美,后面想要学习C++的热情高涨,故完成了一个小项目,来达到温故 ...

  6. (史上最详细)C++实战-基于STL 演讲比赛流程管理系统

    项目需求 本案例来源于黑马 C++视频课程,以下内容为学习笔记 1.1 比赛规则 学校举行一场演讲比赛,共有12个人参加.比赛共两轮,第一轮为淘汰赛,第二轮为决赛. 比赛方式:分组比赛,每组6个人:选 ...

  7. 主题:成都市华西附二院妈妈分享建卡,产检详细过程、费用以及医院详细汇总

    http://www.babytree.com/chengdu/topic_983419 主题:成都市华西附二院妈妈分享建卡,产检详细过程.费用以及医院详细汇总 一.成都市华西附二院挂号: 1.产科的 ...

  8. C++实现演讲比赛小项目

    对于这个小项目,有两个只是盲区 1.定义了一个自定义数据类型的类之后,在后面创建的时候,自定义数据类型必须要有默认构造函数,如果在自定义的类里面定义了有参构造,就要自己定义一个默认构造函数. 2.自定 ...

  9. 用html实现抽奖大转盘,【项目实战】用CSS实现一个抽奖转盘(附详细代码+思路)...

    原标题:[项目实战]用CSS实现一个抽奖转盘(附详细代码+思路) 效果 基本是用CSS实现的,没有用图片,加一丢丢JS. 完全没有考虑兼容性. 首先画一个转盘 < htmllang= " ...

最新文章

  1. cisco 2811 安装HWIC-2FE卡 升级IOS 记录
  2. [Java] Web开发环境搭建 - MyEclipse 篇
  3. ngx_lua_API 指令详解(一)ngx.timer.at 指令
  4. NYOJ 275 队花的烦恼一
  5. C++ Heavy Light Decomposition重轻分解的实现算法(附完整源码)
  6. 使用nodejs代码在SAP C4C里创建Individual customer
  7. 网站页面HTML代码优化需要注意的问题
  8. Symbian编程VC开发环境设置
  9. 90-40-009-源码-CUBE-引擎为Spark写入Hbase本
  10. HBase完全分布式集群部署
  11. Web Components 系列(八)—— 自定义组件的样式设置
  12. 【CCCC】L3-006 迎风一刀斩 (30分),几何关系,找规律 (拼合多边形==斜边等价)
  13. Python3对IP进行查询
  14. hash表 C++的使用以及理解
  15. swper_swipe和swiper的区别
  16. 五种方法教你永久关闭win10自动更新
  17. ACE-LITE awakeup/axcache/axprot信号
  18. oracle 被锁问题集及解决方案
  19. DNS域名解析流程图(详细)
  20. 【知识分享】百度搜索技巧

热门文章

  1. 为什么有的人戒烟,说戒就能戒掉,而大部分人戒了多次戒不掉?
  2. 扎克伯格说了两句大实话!一句价值1300亿美元,另一句让美国人扎心了…
  3. JS实现新闻播报滚动效果
  4. 基业长青 -- 段永平总经理在企业文化培训课上的讲解
  5. 【python实现网络爬虫22】唯品会商品信息实战步骤详解
  6. 博客SQL-Server更新数据库UPDATE语法读书笔记[图]
  7. Pinterest 3.0 for iOS设计过程——升级iOS7设计思路详解
  8. Qt官方示例-计算器
  9. Magnify glass for EditText
  10. 戴森空气净化器php00使用,戴森空气净化器使用—戴森空气净化器使用方法