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

  • 任务

学校演讲比赛,12人,两轮,第一轮淘汰赛,第二轮决赛
选手编号 [ 10001 - 10012 ]
分组比赛 每组6人
10个评委 去除最高分 最低分,求平均分 为该轮成绩
每组淘汰后三名,前三名晋级决赛
决赛 前三名胜出
每轮 比赛过后 要显示晋级选手信息

(点击此处-下载源代码)

  • 功能

  1. 开始演讲比赛:完成 一整届比赛流程,每阶段给用户提示,任意键进入下一阶段
  2. 查看往届记录:查看比赛前三名结果,每次比赛都记录到文件中,用*.csv存储
  3. 清空记录:将文件中数据清空
  4. 退出程序:将文件中数据清空
  • 效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

speechManager.h

#pragma once
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <deque>
#include <functional>
#include <numeric>
#include <fstream>
#include"speaker.h"
using namespace std;
/*
	1.提供惨淡界面与用户交互
	2.对演讲比赛流程进行控制
	3.与文件读写交互
*/
class SpeechManager
{
public:
	vector<int> v1;				//比赛选手		12人 第一轮
	vector<int> v2;				//第一轮晋级		6人
	vector<int> vVectory;		//晋级			3人
	map<int, Speaker> m_Speaker;//编号,具体选手	map容器
	int m_Index;				//比赛轮数
	map<int, vector<string>> m_Record;		//存放往届记录
	bool fileIsEmpty;			//file是否为空


	SpeechManager();
	void show_Menu();
	void initSpeech();			//初始化容器属性
	void createSpeaker();		//创建12名选手
	void exit_Sys_0();
	void speechDraw();			//抽签
	void speechContest();		//竞赛
	void showScore();			//显示得分
	void saveRecord();			//Save 记录
	void startSpeech_1();			//开始整个流程
	void loadRecode();			//读取往届记录
	void showRecode_2();			//查看记录
	void clearRecode_3();
	

	~SpeechManager();
};


class printVectorInt{
public:
	void operator()(int val) {
		cout << val << " ; ";
	}
};

speaker.h

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

class Speaker
{
public:
	void setSpeakerName(string name);
	void setSpeakerS1(double a);
	void setSpeakerS2(double a);
	string getName();
	double* getScore();

private:
	string m_Name;
	double* m_Score = new double[2];		//两轮得分,数组
};

SpeechCompetition_Sys.cpp

#include<iostream>
#include<string>
#include <ctime>
#include"speechManager.h"
#include"speaker.h"

using namespace std;

int main() {
	srand((unsigned int)time(NULL));
	SpeechManager sm;
//test:
	//for (map<int, Speaker>::iterator it = sm.m_Speaker.begin(); it != sm.m_Speaker.end(); ++it) {
	//	double* arr = it->second.getScore();
	//	cout << "Test ID: " << it->first
	//		<< "\t Name: " << it->second.getName()
	//		<< "\t Score: " << arr[0] << endl;
	//}
	
	int inputChoice = -1;
	while (1) {
		sm.show_Menu();
		cout << "Please input Your Choice :" << endl;
		cin >> inputChoice;
		switch (inputChoice) {
		case 1:		//开始比赛
			sm.startSpeech_1();
			break;
		case 2:		//往届记录
			sm.showRecode_2();
			break;
		case 3:		//清空记录
			sm.clearRecode_3();
			break;
		case 0:		//退出
			sm.exit_Sys_0();
			break;
		default:
			system("cls");
			break;
		}
	}
	system("pause");
	return 0;
}

speaker.cpp

#include"speaker.h"
#include<string>
using namespace std;

void Speaker::setSpeakerName(string name) {
	this->m_Name = name;
}

void Speaker::setSpeakerS1(double a) {
	this->m_Score[0] = a;
}

void Speaker::setSpeakerS2(double a) {
	this->m_Score[1] = a;
}

string Speaker::getName() {
	return m_Name;
}
double* Speaker::getScore() {
	return this->m_Score;
/*
	Speaker s;
		string name = "GodOuO";
		double score[2] = { 12,34.5 };
		s.setSpeaker(name, score);
		double* arr = s.getScore();
		cout << arr[0] << arr[1];
		delete[] arr;
*/
}

speechManager.cpp

#include"speechManager.h"

SpeechManager::SpeechManager()
{
	this->initSpeech();		//初始化容器属性
	this->createSpeaker();	//创建12名选手
	this->loadRecode();		//加载数据
}

void SpeechManager::show_Menu() {
	cout << "*******************************" << endl
		<< "*****SpeechCompetition_Sys*****" << endl
		<< "**********#1.Start   **********" << endl
		<< "**********#2.Histry  **********" << endl
		<< "**********#3.Clean   **********" << endl
		<< "**********#0.Quit    **********" << endl << endl;
}

void SpeechManager::exit_Sys_0() {
	cout << "Bye Bye !!!" << endl;
	system("pause");
	exit(0);
}

void SpeechManager::initSpeech() {
	//容器置空
	this->v1.clear();
	this->v2.clear();
	this->vVectory.clear();
	this->m_Speaker.clear();
	//index置空
	this->m_Index = 1;

	this->m_Speaker.clear();
}

void SpeechManager::createSpeaker() {
	string nameSpace = "ABCDEFGHIJKL";
	for (int i = 0; i < nameSpace.length(); ++i)
	{
		string name = "Name";
		name += nameSpace[i];
		Speaker s;
		s.setSpeakerName(name);
		s.setSpeakerS1(0.0);
		s.setSpeakerS2(0.0);

		this->v1.push_back(i + 10001);		//选手编号 存入v1
		this->m_Speaker.insert(make_pair(i + 10001, s));//选手编号 和对应选手 存入map
	}
}

void SpeechManager::speechDraw() {
	cout << "The No.(" << this->m_Index << ") Round's Player is Drawing..." << endl
		<< "-----------------------------------------------------" << endl
		<< "The Order is :" << endl;

	if (1 == this->m_Index) {			//Round 1
		random_shuffle(v1.begin(),v1.end());
		for_each(v1.begin(), v1.end(), printVectorInt());
	}
	else if (2 == this->m_Index) {		//Round 2
		random_shuffle(v2.begin(), v2.end());
		for_each(v2.begin(), v2.end(), printVectorInt());
	}
	cout <<endl
		<< "-----------------------------------------------------" << endl;
	system("pause");
	cout << endl;
}

void SpeechManager::speechContest() {
	cout << "The No.(" << this->m_Index << ") Round's Contest is Fighting..." << endl
		<< "-----------------------------------------------------" << endl;
	vector<int> v_Player;		//比赛选手容器
	multimap<double, int, greater<double>> groupScore;		//准备临时容器,存放小组成绩
	int num = 0;		//记录人员个数	6人一组

	if (1 == this->m_Index) {
		v_Player = this->v1;
	}
	else if (2 == this->m_Index) {
		v_Player = this->v2;
	}
	for (vector<int>::iterator it= v_Player.begin(); it != v_Player.end(); ++it){	//遍历所有选手
		deque<double> d;		//评委打分
		++num;					//统计人数
		for (int i = 0; i < 10; ++i)
		{
			double score = (rand() % 401 + 600) / 10.f;			//(600-1000) /10.f
			//test:
			// cout<<"Test:"<<endl;
			//cout << score << " ; ";
			d.push_back(score);
		}
		//cout << endl;
		sort(d.begin(), d.end(), greater<double>());	//倒叙排序

		d.pop_front();		//del Top
		d.pop_back();		//del Last

		double sum = accumulate(d.begin(), d.end(), 0.0f);		//起始累加值 0.0f小数
		double avg = sum / (double)d.size();					//平均分

		if (1 == m_Index)
			this->m_Speaker[*it].setSpeakerS1(avg);			//平均分 存入 map容器
		else if(2 == m_Index)
			this->m_Speaker[*it].setSpeakerS2(avg);			//平均分 存入 map容器

		groupScore.insert(make_pair(avg, *it));				//key =平均成绩,value =ID
		if (0 == num % 6) {			//每六个人 取前三
			cout << "No.<" << num / 6 << "> group‘s Contest List: " << endl
				 << "-----------------------------------------------------" << endl;
			for (multimap<double,int,greater<double>>::iterator it = groupScore.begin(); it != groupScore.end(); ++it)
			{
				double* arr = this->m_Speaker[it->second].getScore();
				cout << "ID: " << it->second
					<< "\tName: " << this->m_Speaker[it->second].getName()
					<< "\tScore: " << arr[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 (1 == this->m_Index)
					this->v2.push_back((*it).second);
				else 
					this->vVectory.push_back((*it).second);
			}
			groupScore.clear();		//del 缓存 组成绩
			cout << endl;
		}

		/*
		cout << "Test:" << endl;
		double* arr = this->m_Speaker[*it].getScore();
		cout << "ID: " << *it
			<< "\tName: " << this->m_Speaker[*it].getName()
			<< "\tScore: " << arr[0];
		*/
	}			
	cout << "No.(" << this->m_Index << ") group‘s Contest Done!!! " << endl;
	system("pause");
	cout << endl;
}

void SpeechManager::showScore() {
	cout << "The No.(" << this->m_Index << ") Round's Winner List:" << endl
		<< "-----------------------------------------------------" << endl;

	vector<int> v;

	if (1 == this->m_Index)
	{
		v = v2;
	}
	else if (2 == this->m_Index) {
		v = vVectory;
	}
	
	for (vector<int>::iterator it = v.begin(); it!= v.end(); ++it)
	{
		double* arr = this->m_Speaker[*it].getScore();
		cout << "ID: " << *it
			<< "\tName: " << this->m_Speaker[*it].getName()
			<< "\tScore: " << arr[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 = vVectory.begin(); it != vVectory.end(); ++it)	//数据写入文件
	{
		double* arr = this->m_Speaker[*it].getScore();		//冠亚季三人
		ofs << *it << "," << arr[1] << ",";
	}
	ofs << endl;

	ofs.close();
	this->fileIsEmpty = false;
	cout << "Save it!!!" << endl;
}

void SpeechManager::startSpeech_1(){
	//第一轮比赛:1.抽签;2.比赛;3.显示结果
	this->speechDraw();
	this->speechContest();
	this->showScore();
	//第二轮比赛:1.抽签;2.比赛;3.显示结果
	++m_Index;
	this->speechDraw();
	this->speechContest();
	this->showScore();
	//保存分数到文件
	this->saveRecord();
	//重置比赛,获取记录
	this->initSpeech();		//初始化容器属性
	this->createSpeaker();	//创建12名选手
	this->loadRecode();		//加载数据
	cout << endl << "This Round is Finished!!!" << endl;
	system("pause");
	system("cls");
}

void SpeechManager::showRecode_2() {
	if (this->fileIsEmpty)
	{
		cout << "File is Empty!!!" << endl;
	}
	else {
		for (int i = 0; i < this->m_Record.size(); ++i)
		{
			cout << " NO.(" << i + 1 << ") Round Champion's ID: " << this->m_Record[i][0]
				<< "\tScore: " << this->m_Record[i][1] << endl;
			cout << " NO.(" << i + 1 << ") Round <No.2>'s ID: " << this->m_Record[i][2]
				<< "\tScore: " << this->m_Record[i][3] << endl;
			cout << " NO.(" << i + 1 << ") Round <No.3>'s ID: " << this->m_Record[i][4]
				<< "\tScore: " << this->m_Record[i][5] << endl;
		}
	}
	system("pause");
	system("cls");
}

void SpeechManager::loadRecode() {
	ifstream ifs("speech.csv", ios::in);
	if (!ifs.is_open())		//文件不存在
	{
		this->fileIsEmpty = true;
		//cout << "File is NOT Exist !!!" << endl;
		ifs.close();
		return;
	}

	//文件清空
	char c;
	ifs >> c;
	if (ifs.eof()) {
		this->fileIsEmpty = true;
		//cout << "File is Empty !!!" << endl;
		ifs.close();
		return;
	}

	this->fileIsEmpty = false;
	ifs.putback(c);			//将上文读取单个字符 存回

	string data; 
	int index = 0;			//第几届
	while (ifs >> data) {
		//test:
		//cout << data << endl;

		int loc = -1;			//查到’,‘ loc
		int start = 0;
		
		vector<string> vtemp;		//存放 6个 string 字符串

		while (1)
		{
			loc = data.find(",", start);
			if (-1 == loc) {			//未找到 ’,‘
				break;
			}
			string temp = data.substr(start, loc - start);
			//test:
			//cout << temp << endl;
			vtemp.push_back(temp);
			start = loc + 1;
		}
		this->m_Record.insert(make_pair(index, vtemp));
		++index;
	}
	ifs.close();
	// test:
	// for (map<int,vector<string>>::iterator it = this->m_Record.begin(); it != this->m_Record.end() ; ++it)
	//{
	//	cout << it->first
	//		<< " Winner ID: " << it->second[0]
	//		<< "\tScore: " << it->second[1] << endl;
	//}

}

void SpeechManager::clearRecode_3(){
	cout << endl << "Sure ?" << endl << "1.Yes" << endl << "2.No" << endl;
	int select = 0;
	cin >> select;
	if (1 == select) {
		//ios::trunc 如果文件存在,删除文件 重新创建
		ofstream ofs("speech.csv", ios::trunc);
		ofs.close();

		//初始化
		this->initSpeech();		//初始化容器属性
		this->createSpeaker();	//创建12名选手
		this->loadRecode();		//加载数据

		cout << "Clean Done!" << endl;
	}
	system("pause");
	system("cls");
}

SpeechManager::~SpeechManager()
{
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/2525.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

KDGX-A光缆故障断点检测仪

一、产品概述 KDGX-A光纤寻障仪是武汉凯迪正大为光纤网络领域施工、测试、维护所设计的一款测试仪表。可实现对光纤链路状态和故障的快速分析&#xff0c;适用于室外维护作业&#xff0c;是现场光纤网络测试与维护中替代OTDR的经济型解决方案。 二、主要特点 1)一键式光纤链路…

基于文心一言的底层视觉理解,百度网盘把「猫」换成了「黄色的猫」

随着移动互联网的一路狂飙&#xff0c;手机已经成为人们的新器官。出门不带钥匙可以&#xff0c;不带手机却是万万不可以的。而手机上&#xff0c;小小的摄像头也越来越成为各位「vlogger」的口袋魔方。每天有超过数亿的照片和视频被上传到百度网盘中&#xff0c;这些照片和视频…

【机器学习算法复现】随机森林,以又放回的方式构建的决策树为基础的集成学习方法,可回归可分类不同任务注意评价指标。

随机森林就是通过集成学习的Bagging思想将多棵树集成的一种算法&#xff1a;它的基本单元就是决策树。随机森林的名称中有两个关键词&#xff0c;一个是“随机”&#xff0c;一个就是“森林”。“森林”很好理解&#xff0c;一棵叫做树&#xff0c;那么成百上千棵就可以叫做森林…

CSS 扫盲

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录引入方式内部样式内联样式外部样式CSS 选择器CSS 常用属性值字体属性设置字体大小粗细文字样式文本属性文本颜色文本对齐文本装…

Docker基础篇——最全讲解

文章目录一、CentOS安装docker二、启动帮助类命令三、镜像命令1.名词概念2.常用命令2.1 镜像命令2.2 容器命令2.2.1&#xff1a;常用参数2.2.2&#xff1a;常用指令2.3 安装单机mysql、redis一、CentOS安装docker docker官网 1&#xff09;yum安装gcc相关&#xff1a; yum -y…

【Spring从成神到升仙系列 五】从根上剖析 Spring 循环依赖

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

经典七大比较排序算法 ·上

经典七大比较排序算法 上1 选择排序1.1 算法思想1.2 代码实现1.3 选择排序特性2 冒泡排序2.1 算法思想2.2 代码实现2.3 冒泡排序特性3 堆排序3.1 堆排序特性&#xff1a;4 快速排序4.1 算法思想4.2 代码实现4.3 快速排序特性5 归并排序5.1 算法思想5.2 代码实现5.3 归并排序特性…

QT的使用3:鼠标事件

鼠标事件0 事件1 需求2 查看控件的事件处理函数3 UI设计4 新建一个类&#xff0c;继承QLabel5 对已有对象进行类型提升6 重写事件处理函数7 项目进一步拓展&#xff08;1&#xff09;获取鼠标按键&#xff08;2&#xff09;鼠标移动&#xff08;3&#xff09;显示多个按键&…

【数据结构】Java实现栈

目录 1. 概念 2. 栈的使用 3. 自己动手实现栈&#xff08;使用动态数组实现栈&#xff09; 1. 创建一个MyStack类 2. push入栈 3. pop出栈 4. 查看栈顶元素 5. 判断栈是否为空与获取栈长 6. toString方法 4. 整体实现 4.1 MyStack类 4.2 Test类 4.3 测试结果 1.…

计算机网络笔记——物理层

计算机网络笔记——物理层2. 物理层2.1 通信基础2.1.1 信号2.1.2 信源、信道及信宿2.1.3 速率、波特及码元2.1.4 带宽2.1.5 奈奎斯特定理采样定理奈奎斯特定理2.1.6 香农定理2.1.7 编码与调制调制数字信号调制为模拟信号模拟数据调制为模拟信号编码数字数据编码为数字信号模拟数…

C#中WPF实现依赖注入和MVVM,以及服务定位ServiceLocator

最近在想重写架构于是就研究了一套WPF的相关内容&#xff0c;WPF不像MAUI内置了容器&#xff0c;需要我们自己手动添加&#xff0c;于是就有了今天的内容。 首先&#xff0c;我们新建一个.net6.0的WPF项目 由于WPF没有内置容器,我们先安装一下依赖注入的nuget包 Microsoft.Ex…

网络技术与应用概论(上)——“计算机网络”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容依旧是计算机网络的一些知识点噢&#xff0c;下面&#xff0c;让我们进入计算机网络的世界吧 网络内涵 网络特征 网络定义 互联网发展过程 从ARPA网络到Internet 从低速互联网到高速互联网 从数据结构到统一网…

【C语言】通讯录的实现(静态版)

【C语言】通讯录的实现(静态版一.前言1.前期准备a.菜单实现b.联系人结构体的构建c.菜单选项的功能d.#define 的定义2.功能的实现a.初始化通讯录b.增加联系人c.显示通讯录d.查找联系人e.修改联系人d.删除联系人3. 总代码test.ccontact.ccontact.h一.前言 本文将会用c语言实现一…

Golang每日一练(leetDay0013)

目录 37. 解数独 Sudoku Solver &#x1f31f;&#x1f31f;&#x1f31f; 38. 外观数列 Count and Say &#x1f31f;&#x1f31f; 39. 组合总和 Combination Sum &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Py…

大数据技术之Hive

第1章Hive基本概念1.1 Hive1.1.1 Hive的产生背景在那一年的大数据开源社区&#xff0c;我们有了HDFS来存储海量数据、MapReduce来对海量数据进行分布式并行计算、Yarn来实现资源管理和作业调度。但是面对海量数据和负责的业务逻辑&#xff0c;开发人员要编写MR来对数据进行统计…

【Go】K8s 管理系统项目[Jenkins Pipeline K8s环境–应用部署]

K8s 管理系统项目[Jenkins Pipeline K8s环境–应用部署] 1. k8s-plantform-api-Pipeline 考虑到实际工作中前后端可能是不同的同学完成,一般Api部分完成后改动会比较小,web部分改动会比较频繁.于是将api和web分了2个pipeline实现 1.1 GIt仓库 docker目录存放镜像构建相关文件…

简介虚拟地址空间:保障进程间独立性的机制

我们知道&#xff0c;进程之间是相互独立的&#xff0c;在操作系统级别中&#xff0c;一个进程所执行的程序无法直接访问另一个进程所执行的内存区域&#xff08;即实现进程间通信比较困难&#xff09;&#xff1b;一个进程运行的失败也不会影响其它进程的运行。这使我们的操作…

vue编程方法

1&#xff0c;app.vue 其中的moundted只是被执行一次。 系统中所有的组件都放到app。vue文件中。放到根组件中的只是被执行一次的代码可以放到main.js中码&#xff1f; 不可以&#xff0c;因为main文件只是一个js文件不是一个组件。组件中的一些属性不能被使用。比如&#xff…

VS Code上搭建Vue开发环境超详细教程

这篇关于在Visual Studio Code上搭建vue开发环境的超详细教程手把手教会你! 首先在Visual Studio Code上搭建vue开发环境有几个步骤&#xff1a; 1、下载安装node.js 2、安装npm 3、安装cnpm 4、安装vue/cli脚手架 5、创建vue项目 6、运行vue项目 1.下载安装node.js 地址&…

鸟哥的Linux私房菜 正则表示法与文件格式化处理

第十一章、正则表示法与文件格式化处理 https://linux.vbird.org/linux_basic/centos7/0330regularex.php 简体版 http://cn.linux.vbird.org/linux_basic/0330regularex.php 11.2.2 grep的一些高级选项 例题一、搜索特定字符串 例题二、利用中括号 [] 来搜寻集合字符 例题四…