【C++课程设计——演讲比赛系统】

文章目录

  • 前言
  • 一、演讲比赛程序需求
  • 二、每个功能模块的实现
    • 1. 创建管理类(.h文件)
    • 2.1. 创建管理类(.cpp文件)
    • 3.创建参赛选手类(.h)
    • 4.将整体逻辑进行封装
  • 测试
  • 项目总结


前言

在学习完C++的stl容器后,我们来写一下小项目对其进行应用!
项目名称为:演讲比赛系统

一、演讲比赛程序需求

  1. 比赛规则
    学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛。
    比赛方式:分组比赛,每组6个人;选手每次要随机分组,进行比赛
    每名选手都有对应的编号,如 10001 ~ 10012
    第一轮分为两个小组,每组6个人。 整体按照选手编号进行抽签后顺序演讲。
    当小组演讲完后,淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛。
    第二轮为决赛,前三名胜出
    每轮比赛过后需要显示晋级选手的信息

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

二、每个功能模块的实现

1. 创建管理类(.h文件)

功能描述:
提供菜单界面与用户交互
对演讲比赛流程进行控制
与文件的读写交互

#include<iostream>
#include<vector>
#include<deque>
#include<string>
#include<map>
#include"Speaker.h"
#include<time.h>
#include<algorithm>
#include<numeric>
#include<fstream>
using namespace std;class speechManager {
public://构造函数speechManager();//菜单函数void Show_Menu();//初始化函数void initSperker();//创建12位初始选手void creatSpeaker();//开始进行比赛void startSpeech();//比赛抽签void speechDraw();//开始比赛void speechContest();//显示晋级结果void showScore();//保存每届记录void saveRecord();//退出系统void gameOver();//析构函数~speechManager();//读取记录void loadRecord();//展示记录void showRecord();//清空文件void clearRecord();//文件为空的标志bool fileIsEmpty;//往届记录map<int, vector<string>> _Record;vector<int> v1;//存放开始所有参赛选手vector<int> v2;//存放第一轮结束后晋级选手vector<int> vVictory;//存放最终前三名map<int, Speaker> _Speaker;int index;//记录该次比赛轮数
};

2.1. 创建管理类(.cpp文件)

#include"SpeechManager.h"//构造函数
speechManager::speechManager()
{initSperker();creatSpeaker();this->loadRecord();
}//菜单函数
void speechManager::Show_Menu()
{cout << "************************************************" << endl;cout << "*************欢迎参加演讲比赛*******************" << endl;cout << "*************1.开始演讲比赛*********************" << endl;cout << "*************2.查看往届比赛记录*****************" << endl;cout << "*************3.清空比赛记录*********************" << endl;cout << "*************0.退出比赛系统*********************" << endl;cout << "************************************************" << endl;
}//退出系统
void speechManager::gameOver()
{cout << "欢迎下次再来!" << endl;system("pause");system("cls");
}//初始化函数
void speechManager::initSperker()
{v1.clear();v2.clear();vVictory.clear();_Speaker.clear();index = 1;this->_Record.clear();
}//创建12位初始选手
void speechManager::creatSpeaker()
{string nameSeed = "ABCDEFGHIJKL";for (int i = 0; i < nameSeed.size(); i++){string name("选手");name += nameSeed[i];Speaker sp;sp._name = name;for (int i = 0; i < 2; i++){sp._score[i] = 0;}v1.push_back(10001 + i);_Speaker.insert(make_pair(10001 + i, sp));}
}//比赛抽签
void speechManager::speechDraw()
{cout << "第 " << index << " 轮选手正在抽签" << endl;cout << "-----------------------------" << endl;cout << "抽签后的演讲顺序如下" << endl;if (index == 1){random_shuffle(v1.begin(), v1.end());for (auto it = v1.begin(); it != v1.end(); it++){cout << *it << " ";}cout << endl;}else{random_shuffle(v2.begin(), v2.end());for (auto it = v2.begin(); it != v2.end(); it++){cout << *it << " ";}cout << endl;}cout << "-----------------------------------" << endl;system("pause");
}//开始比赛
void speechManager::speechContest()
{cout << "-------------第" << index << "轮比赛正式开始---------------" << endl;multimap<double, int, greater<double>> groupScore;//临时容器,可排出分数由高到低的选手编号//并且此容器遍历为出来为降序int num = 0;vector<int> v_src;if (index == 1){v_src = v1;} else{v_src = v2;}for (auto it = v_src.begin(); it != v_src.end(); it++){num++;deque<double> d;for (int i = 0; i < 10; i++)//10个评委打分{double score = (rand() % 401 + 600) / 10.0f;d.push_back(score);}谁有争议,可以查看分数//for (auto e : d)//{//	cout << e << " ";//}//cout << endl;sort(d.begin(), d.end());d.pop_back();d.pop_front();double sum = accumulate(d.begin(), d.end(), 0.0f);//double avg = sum / (double)d.size();double avg = sum /d.size();_Speaker[*it]._score[index - 1] = avg;groupScore.insert(make_pair(avg, *it));if (num % 6 == 0){cout << "第" << num / 6 << "组比赛名次" << endl;for (auto it = groupScore.begin(); it != groupScore.end(); it++){cout << "编号: " << it->second << " 姓名: " << this->_Speaker[it -> second]._name << " 成绩: " << this->_Speaker[it->second]._score[this->index - 1] <<endl;}int count = 0;//取前三名for (auto it = groupScore.begin(); it!= groupScore.end() && count < 3; it++, count++){if (this->index == 1){v2.push_back((*it).second);}else{vVictory.push_back((*it).second);}}groupScore.clear();cout << endl;}}cout << "---------第" << index << "轮比赛完毕-----------" << endl;system("pause");
}//显示晋级结果
void speechManager::showScore()
{cout << "第" << index << "轮晋级选手如下" << endl;vector<int> v;if (index == 1){v = v2;}else{v = vVictory;}for (auto it = v.begin(); it != v.end(); it++){cout << "选手编号:" << *it << " 姓名: " << _Speaker[*it]._name << " 得分: " <<_Speaker[*it]._score[this->index - 1] << endl;}cout << endl;//system("cls");//this->Show_Menu();
}//开始进行比赛
void speechManager::startSpeech()
{//第一轮抽签speechDraw();//第一轮比赛speechContest();//显示晋级结果showScore();index++;//第二轮抽签speechDraw();//第二轮比赛speechContest();//显示最终结果showScore();//保存结果saveRecord();//重置属性initSperker();creatSpeaker();this->loadRecord();system("cls");
}//保存每届记录
void speechManager::saveRecord()
{ofstream ofs;ofs.open("speech.csv", ios::out | ios::app);//csv格式需要添加逗号分隔开for (auto it = vVictory.begin(); it != vVictory.end(); it++){ofs << *it << "," << _Speaker[*it]._score[1] << ",";}ofs << endl;ofs.close();//cout << "记录已保存" << endl;this->fileIsEmpty = false;system("pause");
}//读取记录
void speechManager::loadRecord()
{ifstream ifs("speech.csv", ios::in); //输入流对象 读取文件/*ifstream ifs;ifs.open("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){vector<string>v;int pos = -1;int start = 0;while (true){pos = data.find(",", start); //从0开始查找 ','if (pos == -1){break; //找不到break返回}string tmp = data.substr(start, pos - start); //找到了,进行分割 参数1 起始位置,参数2 截取长度v.push_back(tmp);start = pos + 1;}this->_Record.insert(make_pair(index, v));index++;}ifs.close();
}void speechManager::showRecord()
{if (this->fileIsEmpty){cout << "文件为空或不存在!" << endl;}else{for (int i = 0; i < this->_Record.size(); i++){cout << "第" << i + 1 << "届 " <<"冠军编号:" << this->_Record[i][0] << " 得分:" << this->_Record[i][1] << " ""亚军编号:" << this->_Record[i][2] << " 得分:" << this->_Record[i][3] << " ""季军编号:" << this->_Record[i][4] << " 得分:" << this->_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){//打开模式 ios::trunc 如果存在删除文件并重新创建ofstream ofs("speech.csv", ios::trunc);ofs.close();//初始化属性this->initSperker();//创建选手this->creatSpeaker();//获取往届记录this->loadRecord();cout << "清空成功!" << endl;}system("pause");system("cls");
}//析构函数
speechManager::~speechManager()
{}

3.创建参赛选手类(.h)

#include<string>
#include<iostream>
using namespace std;
class Speaker {
public:string _name;double _score[2];};

4.将整体逻辑进行封装

#include"SpeechManager.h"int main0()
{speechManager pm;srand((unsigned int)(time(NULL)));int choice = 1;do {pm.Show_Menu();cout << "请输入你的选项:" << endl;cin >> choice;switch (choice){case 1:pm.startSpeech();break;case 2:pm.showRecord();break;case 3:pm.clearRecord();break;case 0:pm.gameOver();break;default:cout << "输入有误,请按任意键后重新输入!" << endl;system("pause");system("cls");break;}} while (choice);return 0;
}

测试

开始进行比赛,进行抽签

在这里插入图片描述

第一轮比赛结束

在这里插入图片描述

第二轮比赛开始抽号

在这里插入图片描述

第二轮比赛结束

在这里插入图片描述

第二轮比赛得出结果

在这里插入图片描述

查看往届比赛成绩

在这里插入图片描述

在这里插入图片描述

清空往届比赛成绩

在这里插入图片描述

在这里插入图片描述

项目总结

本案例主要是对C++的stl容器和文件操作进行使用,基本涵盖了容器常用接口的使用,对大家对于stl的进一步熟悉能起较大左右作用!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[渗透测试] 任意文件读取漏洞

任意文件读取漏洞 概述 漏洞成因 存在读取文件的功能&#xff08;Web应用开放了文件读取功能&#xff09;读取文件的路径客户端可控&#xff08;完全控制或者影响文件路径&#xff09;没有对文件路径进行校验或者校验不严格导致被绕过输出文件内容 漏洞危害 下载服务器中的…

入门机器视觉的正确打开方式——徒手撸一个python+opencv实现的机器视觉简易调试工具(下)

目录 1.引言2.框架思路3.图像处理流程化的实现3.1如何解析图像流程数据结构3.2 使用networkx网络图库3.3 python实现 4.结论5.python源码PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源 1.引言 在当今AI时代&#xff0c;关于视觉…

05 threeJs基础---阵列立方体和相机适配体验立方体

1.增加相机视角fov 注&#xff1a; 范围更大&#xff0c;意味着可以看到渲染范围更大&#xff0c;远小近大的视觉效果更明显 fov:眼球张开的角度&#xff0c;0时相当于闭眼。aspect:可视区域横纵比。near:眼睛能看到的最近垂直距离。far&#xff1a;眼睛能看到的最远垂直距离。…

天气网站爬虫及可视化

摘要&#xff1a;随着互联网的快速发展&#xff0c;人们对天气信息的需求也越来越高。本论文基于Python语言&#xff0c;设计并实现了一个天气网站爬虫及可视化系统。该系统通过网络爬虫技术从多个天气网站上获取实时的天气数据&#xff0c;并将数据进行清洗和存储。同时&#…

Vue2中管理$bus事件,统一移除事件

1. vue2中使用了,很多bus,在有些地方忘记清理了,导致重复事件bug. 对bus进行改造,实现清除遗留. 下面的简单实现. 1.eventbus.js // eventBus.js import Vue from vue;class EventBusClass extends Vue {constructor() {super();this.listeners [];}on(event, callback, con…

SwiftUI八与UIKIT交互

代码下载 SwiftUI可以在苹果全平台上无缝兼容现有的UI框架。例如&#xff0c;可以在SwiftUI视图中嵌入UIKit视图或UIKit视图控制器&#xff0c;反过来在UIKit视图或UIKit视图控制器中也可以嵌入SwiftUI视图。 本文展示如何把landmark应用的主页混合使用UIPageViewController和…

【深度学习】服务器炼丹代码配置、Python使用指定gpu显卡运行代码

【显卡】服务器炼丹代码配置 写在最前面一、查看哪几块显卡能用二、使用指定gpu运行代码1、指定使用GPU0运行脚本&#xff08;默认是第一张显卡, 0代表第一张显卡的id,其他的以此类推&#xff09;2、指定使用多张显卡运行脚本 三、如何使用1、单块显卡使用2、多GPU训练使用Data…

使用minio搭建oss

文章目录 1.minio安装1.拉取镜像2.启动容器3.开启端口1.9090端口2.9000端口 4.访问1.网址http://:9090/ 5.创建一个桶 2.minio文件服务基本环境搭建1.创建一个文件模块2.目录结构3.配置依赖3.application.yml 配置4.编写配置类MinioConfig.java&#xff0c;构建minioClient5.Fi…

FullScreen API与F11快捷键的相关问题排查与解决

前言 某个项目需要点击全屏按钮将页面中某个容器内的元素进行全屏显示便于用户操作&#xff0c;点击退出全屏时显示原来的页面内容 问题 1&#xff1a;指定元素全屏存在部分元素无法显示 记得之前看 FullScreen 相关API时有印象可以让某一元素直接全屏显示&#xff0c;随即…

LeetCode 算法:翻转二叉树 c++

原题链接&#x1f517;&#xff1a;翻转二叉树 难度&#xff1a;简单⭐️ 题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 …

面对.rmallox勒索病毒:如何有效防范及应对

引言&#xff1a; 在当今数字化社会&#xff0c;网络安全问题日益严重&#xff0c;勒索病毒成为企业和个人不可忽视的威胁之一。最近出现的.rmallox勒索病毒更是给全球各地的用户带来了严重的数据安全问题。本文将探讨.rmallox勒索病毒的特点、感染方式及应对策略&#xff0c;…

【D3.js in Action 3 精译】1.1.3 D3.js 的工作原理

译者注 上一节我们探讨了 D3.js 的适用场景——需要高度定制化、可以尽情释放想象力的复杂图表。这一节我们再跟随作者的视角&#xff0c;看看 D3.js 的工作原理究竟是怎样的。 1.1.3 D3.js 的工作原理 您可能已经体验过 D3 并且发现它不太容易上手。这也许是因为您把它当成了…

Oracle 23ai的Windows平台版本发布了

Oracle 23ai free的版本之前只有Linux平台的版本&#xff0c;刚刚增加了Windows平台的版本&#xff0c;这里尝一下鲜。 关于号主&#xff0c;姚远&#xff1a; Oracle ACE&#xff08;Oracle和MySQL数据库方向&#xff09;华为云最有价值专家《MySQL 8.0运维与优化》的作者拥有…

UI设计必备的6个网站,赶紧收藏!

6个UI设计必备网站&#xff0c;找素材、找灵感一步到位&#xff0c;赶紧收藏起来吧&#xff01; 1、菜鸟图库 UI图片素材-UI图片模板免费下载 - 菜鸟图库 菜鸟图库提供了超多免费设计素材&#xff0c;在这里你可以找到平面、UI、电商等设计类素材&#xff0c;还有大量的高清背…

AI视频教程下载-数据分析中的提示工程:Python、Pandas、ChatGPT

Prompt Engineering for Data Analysis Python, Pandas, ChatGPT ChatGPT与Python&#xff1a;无需编程。借助ChatGPT、Python、Pandas及提示工程进行数据分析与数据可视化 "利用Python、Pandas和ChatGPT进行数据分析的提示工程"是一门开创性的课程&#xff0c;它通…

《昇思25天学习打卡营第5天|onereal》

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&#xff1a;Pointw…

添加用户页面(Flask+前端+MySQL整合)

首先导入Flask库和pymysql库。Flask用于创建Web应用程序&#xff0c;pymysql用于连接和操作MySQL数据库。 from flask import Flask, render_template, request import pymysql创建一个Flask应用实例。__name__参数告诉Flask使用当前模块作为应用的名称。 app Flask(__name_…

[Go Web] Kratos 使用的简单总结

文章目录 1.Kratos 简介2.传输协议3.日志4.错误处理5.配置管理6.wire 1.Kratos 简介 Kratos并不绑定于特定的基础设施&#xff0c;不限定于某种注册中心&#xff0c;或数据库ORM等&#xff0c;所以您可以十分轻松地将任意库集成进项目里&#xff0c;与Kratos共同运作。 API -&…

老无忧,成熟人士都在玩的社交app

随着互联网向不同年龄群体的进一步渗透&#xff0c;越来越多大龄人士逐步在传统以年轻人为主的平台中搭建起自己的空间&#xff0c;对缔结社交关系的需求也变得强烈起来。老无忧无忧交友app应运而生&#xff0c;于2024年6月1日正式上线&#xff08;以下简称“老无忧”&#xff…

校园圈子小程序系统搭建需求和需要哪些功能?APP小程序H5前后端源码交付

功能&#xff1a;小程序授权登陆&#xff0c;支持app双端&#xff0c;小程序&#xff0c;h5&#xff0c;pc端&#xff0c;手机号登陆&#xff0c;发帖&#xff0c;建圈子、发活动。可置顶推荐帖子&#xff0c;关注、粉 丝、点赞等。可作为圈子贴吧、小红书、校园社区、表白墙、…