《黑马程序员》演讲比赛管理系统实战

代码如下:

#pragma once

#include

using namespace std;

//演讲管理类

class SpeechManager

{

public:

//构造函数

SpeechManager();

//析构函数

~SpeechManager();

};

3.3 源文件实现

在speechManager.cpp中将构造和析构函数空实现补全

#include “speechManager.h”

SpeechManager::SpeechManager()

{

}

SpeechManager::~SpeechManager()

{

}

  • 至此演讲管理类以创建完毕

4、 菜单功能


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

4.1 添加成员函数

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

在这里插入图片描述

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 测试菜单功能

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

代码:

#include

using namespace std;

#include “speechManager.h”

int main() {

SpeechManager sm;

sm.show_Menu();

system(“pause”);

return 0;

}

  • 运行效果如图:

在这里插入图片描述

  • 菜单界面搭建完毕

5、 退出功能


5.1 提供功能接口

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

代码:

int main() {

SpeechManager sm;

int choice = 0; //用来存储用户的选项

while (true)

{

sm.show_Menu();

cout << "请输入您的选择: " << endl;

cin >> choice; // 接受用户的选项

switch (choice)

{

case 1: //开始比赛

break;

case 2: //查看记录

break;

case 3: //清空记录

break;

case 0: //退出系统

break;

default:

system(“cls”); //清屏

break;

}

}

system(“pause”);

return 0;

}

5.2 实现退出功能

在speechManager.h中提供退出系统的成员函数 void exitSystem();

在speechManager.cpp中提供具体的功能实现

void SpeechManager::exitSystem()

{

cout << “欢迎下次使用” << endl;

system(“pause”);

exit(0);

}

5.3测试功能

在main函数分支 0 选项中,调用退出程序的接口

在这里插入图片描述

运行测试效果如图:

在这里插入图片描述

6、演讲比赛功能


6.1 功能分析

比赛流程分析:

抽签 → 开始演讲比赛 → 显示第一轮比赛结果 →

抽签 → 开始演讲比赛 → 显示前三名结果 → 保存分数

6.2 创建选手类

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

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

#pragma once

#include

using namespace std;

class Speaker

{

public:

string m_Name; //姓名

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

};

6.3 比赛

6.3.1 成员属性添加
  • 在speechManager.h中添加属性

//比赛选手 容器 12人

vectorv1;

//第一轮晋级容器 6人

vectorv2;

//胜利前三名容器 3人

vectorvVictory;

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

map<int, Speaker> m_Speaker;

6.3.2 初始化属性
  • 在speechManager.h中提供开始比赛的的成员函数 void initSpeech();

//初始化属性

void initSpeech();

  • 在speechManager.cpp中实现void initSpeech();

void SpeechManager::initSpeech()

{

//容器保证为空

this->v1.clear();

this->v2.clear();

this->vVictory.clear();

this->m_Speaker.clear();

//初始化比赛轮数

this->m_Index = 1;

}

  • SpeechManager构造函数中调用void initSpeech();

SpeechManager::SpeechManager()

{

//初始化属性

this->initSpeech();

}

6.3.3 创建选手
  • 在speechManager.h中提供开始比赛的的成员函数 void createSpeaker();

//初始化创建12名选手

void createSpeaker();

  • 在speechManager.cpp中实现void createSpeaker();

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;

}

//12名选手编号

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

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

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

}

}

  • SpeechManager类的 构造函数中调用void createSpeaker();

SpeechManager::SpeechManager()

{

//初始化属性

this->initSpeech();

//创建选手

this->createSpeaker();

}

  • 测试 在main函数中,可以在创建完管理对象后,使用下列代码测试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;

}

在这里插入图片描述

  • 测试效果如图:

在这里插入图片描述

  • 测试完毕后,可以将测试代码删除或注释。
6.3.4 开始比赛成员函数添加
  • 在speechManager.h中提供开始比赛的的成员函数 void startSpeech();

  • 该函数功能是主要控制比赛的流程

//开始比赛 - 比赛流程控制

void startSpeech();

  • 在speechManager.cpp中将startSpeech的空实现先写入

  • 我们可以先将整个比赛的流程 写到函数中

//开始比赛

void SpeechManager::startSpeech()

{

//第一轮比赛

//1、抽签

//2、比赛

//3、显示晋级结果

//第二轮比赛

//1、抽签

//2、比赛

//3、显示最终结果

//4、保存分数

}

6.3.5 抽签

功能描述:

  • 正式比赛前,所有选手的比赛顺序需要打乱,我们只需要将存放选手编号的容器 打乱次序即可

  • 在speechManager.h中提供抽签的的成员函数 void speechDraw();

//抽签

void speechDraw();

  • 在speechManager.cpp中实现成员函数 void speechDraw();

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

{

cout << *it << " ";

}

cout << endl;

}

else

{

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

for (vector::iterator it = v2.begin(); it != v2.end(); it++)

{

cout << *it << " ";

}

cout << endl;

}

cout << “---------------------” << endl;

system(“pause”);

cout << endl;

}

  • 在startSpeech比赛流程控制的函数中,调用抽签函数

在这里插入图片描述

  • 在main函数中,分支1选项中,调用开始比赛的接口

在这里插入图片描述

  • 测试

在这里插入图片描述

6.3.6 开始比赛
  • 在speechManager.h中提供比赛的的成员函数 void speechContest();

//比赛

void speechContest();

  • 在speechManager.cpp中实现成员函数 void speechContest();

void SpeechManager::speechContest()

{

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

multimap<double, int, greater> groupScore; //临时容器,保存key分数 value 选手编号

int num = 0; //记录人员数,6个为1组

vector v_Src; //比赛的人员容器

if (this->m_Index == 1)

{

v_Src = v1;

}

else

{

v_Src = v2;

}

//遍历所有参赛选手

for (vector::iterator it = v_Src.begin(); it != v_Src.end(); it++)

{

num++;

//评委打分

dequed;

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()); //排序

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; //打印分数

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

//6个人一组,用临时容器保存

groupScore.insert(make_pair(avg, *it));

if (num % 6 == 0)

{

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

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

}

  • 在startSpeech比赛流程控制的函数中,调用比赛函数

在这里插入图片描述

  • 再次运行代码,测试比赛

在这里插入图片描述

6.3.7 显示比赛分数
  • 在speechManager.h中提供比赛的的成员函数 void showScore();

//显示比赛结果

void showScore();

  • 在speechManager.cpp中实现成员函数 void showScore();

void SpeechManager::showScore()

{

cout << “---------第” << this->m_Index << “轮晋级选手信息如下:-----------” << endl;

vectorv;

if (this->m_Index == 1)

{

v = v2;

}

else

{

v = vVictory;

}

for (vector::iterator it = v.begin(); it != v.end(); it++)

{

cout << “选手编号:” << *it << " 姓名: " << m_Speaker[*it].m_Name << " 得分: " << m_Speaker[*it].m_Score[this->m_Index - 1] << endl;

}

cout << endl;

system(“pause”);

system(“cls”);

this->show_Menu();

}

  • 在startSpeech比赛流程控制的函数中,调用显示比赛分数函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gYEym12k-1622104504753)(assets/1548146903960.png)]

  • 运行代码,测试效果

在这里插入图片描述

6.3.8 第二轮比赛

第二轮比赛流程同第一轮,只是比赛的轮是+1,其余流程不变

  • 在startSpeech比赛流程控制的函数中,加入第二轮的流程

在这里插入图片描述

测试,将整个比赛流程都跑通

在这里插入图片描述

6.4 保存分数

功能描述:

  • 将每次演讲比赛的得分记录到文件中

功能实现:

  • 在speechManager.h中添加保存记录的成员函数 void saveRecord();

//保存记录

void saveRecord();

  • 在speechManager.cpp中实现成员函数 void saveRecord();

void SpeechManager::saveRecord()

{

ofstream ofs;

ofs.open(“speech.csv”, ios::out | ios::app); // 用输出的方式打开文件 – 写文件

//将每个人数据写入到文件中

for (vector::iterator it = vVictory.begin(); it != vVictory.end(); it++)

{

ofs << *it << “,”

<< m_Speaker[*it].m_Score[1] << “,”;

}

ofs << endl;

//关闭文件

ofs.close();

cout << “记录已经保存” << endl;

}

  • 在startSpeech比赛流程控制的函数中,最后调用保存记录分数函数

在这里插入图片描述

  • 测试,整个比赛完毕后记录保存情况

在这里插入图片描述

利用记事本打开文件 speech.csv,里面保存了前三名选手的编号以及得分

在这里插入图片描述

至此,整个演讲比赛功能制作完毕!

7、 查看记录


7.1 读取记录分数

  • 在speechManager.h中添加保存记录的成员函数 void loadRecord();

  • 添加判断文件是否为空的标志 bool fileIsEmpty;

  • 添加往届记录的容器map<int, vector<string>> m_Record;

其中m_Record 中的key代表第几届,value记录具体的信息

//读取记录

void loadRecord();

//文件为空的标志

bool fileIsEmpty;

//往届记录

map<int, vector> m_Record;

  • 在speechManager.cpp中实现成员函数 void loadRecord();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
是否为空的标志 bool fileIsEmpty;

  • 添加往届记录的容器map<int, vector<string>> m_Record;

其中m_Record 中的key代表第几届,value记录具体的信息

//读取记录

void loadRecord();

//文件为空的标志

bool fileIsEmpty;

//往届记录

map<int, vector> m_Record;

  • 在speechManager.cpp中实现成员函数 void loadRecord();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-YkesfQyK-1713517859726)]

[外链图片转存中…(img-gKzDNsnJ-1713517859727)]

[外链图片转存中…(img-ZHGXxzgj-1713517859728)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-NrzlIsrr-1713517859729)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值