尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

黑马C++ 演讲比赛流程管理系统

黑马C++ 演讲比赛流程管理系统
📅 发布时间:2026/6/18 21:20:58
C++实现的演讲比赛流程管理系统

main.cpp

#include <iostream>
using namespace std;
#include "speechManager.h"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.showRecord();break;case 3:sm.clearRecord();break;case 0:sm.exitSystem();break;default:system("cls");break;}}//    system("pause");return 0;
}

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>
#include <map>using namespace std;
#include <vector>
#include <algorithm>
#include <deque>
#include <functional>
#include <numeric>
#include <fstream>
#include <ctime>
#include <random>
#include <iterator>
#include <string>#include "speaker.h"// 演讲管理类
class SpeechManager {
public:// 构造函数SpeechManager();// 展示菜单void Show_Menu();void exitSystem();// 比赛选手 容器 12 人vector<int> v1;// 第一轮晋级容器 6人vector<int> v2;// 胜利前三名容器 3vector<int> vVictory;// 存放编号,以及对应的具体选手 容器map<int, Speaker> m_Speaker;// 初始化属性void initSpeech();// 比赛轮数int m_Index;// 初始化创建12名选手void createSpeaker();// 开始比赛 - 比赛流程控制void startSpeech();// 抽签void speechDraw();// 比赛void speechContest();// 显示比赛结果void showScore();// 保存记录void saveRecord();// 读取记录void loadRecord();// 判断文件是否为空的标志bool fileIsEmpty;// 添加往届记录的容器map<int, vector<string>> m_Record;// 显示往届得分void showRecord();// 清空记录void clearRecord();// 析构函数~SpeechManager();
};

speechManager.cpp

#include "speechManager.h"SpeechManager::SpeechManager() {// 初始化属性this->initSpeech();// 创建选手this->createSpeaker();// 获取往届记录this->loadRecord();
}SpeechManager::~SpeechManager() {}// 展示菜单
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);
}// 初始化
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;}// 12名选手编号this->v1.push_back(i + 10001);// 选手编号,以及对应的选手,存放到map容器中this->m_Speaker.insert(make_pair(i + 10001, sp));}
}// 抽签
void SpeechManager::speechDraw() {cout << "第 << " << this->m_Index << " >> 轮比赛选手正在抽签" << endl;cout << "---------------------------------------" << endl;cout << "抽签后演讲顺序如下:" << endl;random_device rd; // 非确定性随机数mt19937 g(rd()); // 梅森旋转算法引擎if (this->m_Index == 1) {
//        random_shuffle(v1.begin(), v1.end()); // random_shuffle 自C++17起被弃用shuffle(v1.begin(), v1.end(), g);for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++) {cout << *it << " ";}cout << endl;} else {shuffle(v2.begin(), v2.end(), g);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;multimap<double, int, greater<int>> groupScore; // 临时容器,保存key分数 value 选手编号int num = 0; // 记录人员数,6个人为1组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; // 打印分数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<int>>::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 cnt = 0;// 取前三名for (multimap<double, int, greater<int>>::iterator it = groupScore.begin(); it != groupScore.end() && cnt < 3; it++, cnt++) {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 << " 姓名:" << m_Speaker[*it].m_Name << " 得分:" << 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 << "," << m_Speaker[*it].m_Score[1] << ",";}ofs << endl;// 关闭文件ofs.close();cout << "记录已经保存" << endl;// 有记录了,文件不为空this->fileIsEmpty = false;
}// 开始比赛
void SpeechManager::startSpeech() {// 第一轮比赛// 1、抽签speechDraw();// 2、比赛speechContest();// 3、显示晋级结果showScore();// 第二轮比赛this->m_Index++;// 1、抽签speechDraw();// 2、比赛speechContest();// 3、显示最终结果showScore();// 4、保存分数saveRecord();// 重置比赛// 初始化属性this->initSpeech();// 创建选手this->createSpeaker();// 获取往届记录this->loadRecord();cout << "本届比赛完毕!" << endl;system("pause");system("cls");
}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;size_t pos = -1;size_t start = 0;while (true) {pos = data.find(",", start); // 从0 开始查找 ','if (pos == -1) {break; // 找不到,break返回}string tmp = data.substr(start, pos - start); // 找到了,进行分割v.push_back(tmp);start = pos + 1;}this->m_Record.insert(make_pair(index, v));index++;}ifs.close();
}// 查看记录
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 << "确认清空? 1、确认 2、返回" << endl;int select = 0;cin >> select;if (select == 1) {// 打开模式 ios::trunc 如果存在删除文件并重新创建ofstream ofs("speech.csv", ios::trunc);ofs.close();// 初始化属性this->initSpeech();// 创建选手this->createSpeaker();// 获取往届记录this->loadRecord();cout << "清空成功!" << endl;}system("pause");system("cls");
}

相关新闻

  • 宝宝身体乳挑选指南:10款权威检测产品盘点,告别泛红干痒
  • 益生菌选购攻略:按肠道问题精准匹配 新手也能不踩雷
  • 2025年五大知名度高的智能留样柜服务公司排行榜,国企智能留

最新新闻

  • 东坑镇Shopee店铺优化:提升店铺转化率的10个技巧 - 东莞选校指南
  • 济南奢侈品手表回收哪家靠谱?5家主流奢品回收机构实测对比 - 奢品小当家
  • 闲置黄金别落灰,哈尔滨黄金回收一键预约快速回血,就在合扬 - 奢侈品交易观察员
  • 有据可查!南宁黄金回收公信力榜单出炉,变现直接对照选店 - 沉迷学习28
  • 离婚财产分割律所:5家精通复杂资产分割的团队评测 - 品牌2026
  • 如何用OandBackup打造你的安卓数据安全堡垒?终极备份解决方案深度解析

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号