当前位置: 首页 > news >正文

演讲比赛流程管理项目c++

对于一个基本项目,先分析基本的东西有哪些

1.类

演讲管理类:用于编写比赛流程用的功能

演讲者类:包含姓名,分数

创建比赛流程:创建选手12个人,分为两组,6人一组,每组进行两轮比赛,每次选则一半人晋级,最后选出三个人

展示菜单->用户选择功能->退出。

功能

1.展示菜单

2.评委打分

3.退出程序

4.开始比赛功能(展示比赛流程)

5.查看往届记录

6.保存每次比赛记录

7.创建选手功能。

8.初始化

开始编写项目

1.两个类

class SpeaKer
{public:string m_name;double m_score;};
//多文件调用
#include"Speaker.h"
#include<map>
#include<vector>
using namespace std;
//设计演讲比赛管理类
//1.创建基本步骤。
//2.实现基本功能,成员函数实现(在头文件声明,在源文件实现)//功能一.菜单功能
class SpeechManager
{//构造函数和析构函数的创建public://无参构造器SpeechManager();//菜单功能void show_Meun();//初始化,保证每次询问清除以前的数据void initSpeech();//创建选手void createSpeaker();//退出功能void exitSystem();//创建比赛流程功能,控制整个流程。void startSpeech();//抽签功能void speechDraw();//演讲比赛功能// 比赛流程分析抽签-开始演讲比赛-显示2第一轮比赛结果-抽签-开始演讲比赛-显示前三名结果-保存分数//析构函数//比赛功能void speechContest();//展示比赛结果void showScore();//保存比赛结果void saveRecord();//查看记录分数void loadRecord();//显示往届得分void showRecord();//清空记录功能实现void clearRecord();~SpeechManager();//成员属性//比赛选手容器vector<int> v1;//第一轮晋级的选手vector<int> v2;//胜利前三名vector<int> win;//存放编号以及对应的具体选手容器map<int, SpeaKer> m_speaker;//记录比赛轮次int m_index;//文件为空的标致bool fileIsEmpty;//往届记录map<int, vector<string>> m_Record;
};

现在分析要写的功能有哪些

1.首先找到需要的成员

比赛分为两轮需要两个容器存放比赛顺序 vectoe<int> v1; vector<int> v2;

最后前三名的 vector<int> win;

存放演讲者和编号map<int, SpeaKer> m_speaker;

记录比赛的轮次int m_index;

保存往届记录的容器

map<int, vector<string>> m_Record;

需要的功能

1.首先就是初始化,保证比赛流程不会收以前的记录影响

//初始化,保证每次询问清除以前的数据
void initSpeech();
void SpeechManager::initSpeech()
{//保证容器为空this->v1.clear();this->v2.clear();this->win.clear();this->m_speaker.clear();this->m_index = 1;//初始化记录容器this->m_Record.clear();
}

2.第二就是创建选手

void createSpeaker();//创建选手
void SpeechManager::createSpeaker()
{//一共12个人string nameseed = "ABCDEFGHIJKL";for (int i = 0; i < nameseed.size(); i++){string name = "选手";name += nameseed[i];SpeaKer sp;sp.m_name = name;for (int j = 0; j < 2; j++){sp.m_score[j] = 0;}//存编号this->v1.push_back(i + 10001);this->m_speaker.insert(make_pair(i + 10001, sp));}
}

3.补充一个菜单功能

void show_Meun();void SpeechManager::show_Meun()
{cout << "**********************************************" << endl;cout << "*************  欢迎参加演讲比赛  *************" << endl;cout << "*************  1.开始演讲比赛    *************" << endl;cout << "*************  2.查看往届记录    *************" << endl;cout << "*************  3.清空比赛记录    *************" << endl;cout << "*************  4.退出比赛程序    *************" << endl;cout << "**********************************************" << endl;cout << endl;}

4.退出功能

void exitSystem();//退出功能
void SpeechManager::exitSystem()
{cout << "欢迎下次使用";system("pause");exit(0);//exit(0)表示程序正常退出;除了0之外,其他参数均代表程序异常退出,如:exit(1),exit(-1)。
}

5.选手抽签功能

  

 void SpeechManager::speechDraw()  {//第一轮比赛cout << "第" << this->m_index << "轮比赛选手正在抽签" << endl;cout << "--------------------------------------" << endl;cout << "抽签后演讲顺序如下:";//1.抽签if (this->m_index == 1)//判断第几轮{random_shuffle(v1.begin(), v1.end());//随机打乱容器的顺序for (auto it : v1){cout << it << " ";}}else{random_shuffle(v2.begin(), v2.end());for (auto it : v2){cout << it << " ";}cout << endl;}cout << "-------------------------------------" << endl;system("pause");cout << endl;//按任意键继续}

6.比赛开始功能

	void SpeechManager::speechContest(){cout <<"--------------------- "<<"第" << m_index << "轮比赛正式开始"<<"-----------------"<<endl;cout << "成绩如下" << endl;//准备零时容器存放小组成绩multimap<double, int, greater<double>> gourpScore;int num = 0;//记录人数6人一组vector<int> v_src;//比赛容器//判断第几轮if (m_index == 1){v_src = v1;}else{v_src = v2;}//遍历所有选手比赛for (auto it : v_src){num++;//评委打分deque<double> d;//双端队列for (int i = 0; i < 10; i++){double score = (rand() % 401 + 600) / 10.f;//随机生成分数//cout << score << " ";d.push_back(score);}//cout << endl;//降序排列sort(d.begin(), d.end(), greater<double>());//去除最高分去除最低分d.pop_back();d.pop_front();//累加总分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[this->m_index - 1] = avg;//将打分数据存到临时数据里面gourpScore.insert(make_pair(avg, it));//每6个人取出前三名if (num % 6 == 0){cout << "第" << num / 6 << "小组比赛名次:" << endl;for (auto a : gourpScore){cout << "编号:" << a.second << "姓名:" << this->m_speaker[a.second].m_name << " 成绩:" << this->m_speaker[a.second].m_score[this->m_index - 1] << endl;}//取出前三名晋级刀第二轮int count = 0;for (auto i : gourpScore){if (count >=3) break;if (this->m_index == 1){v2.push_back(i.second);}else{win.push_back(i.second);}count++;}gourpScore.clear();}}cout << "-----------------------" <<"第"<< this->m_index << "轮比赛完毕" << "-----------------------" << endl;system("pause");}

7.显示比赛结果功能

	void SpeechManager::showScore(){cout << "-------------------第" << this->m_index << "轮晋级选手信息如下:-------------------" << endl;vector<int> v;if (this->m_index == 1){v = v2;}else{v = win;}for (auto i : v){cout << "选手:" << i << "姓名:" << this->m_speaker[i].m_name << "得分:" << m_speaker[i].m_score[this->m_index - 1] << endl;}cout << endl;system("pause");system("cls");//this->show_Meun();}

8.保存分数功能,保存到文件

	//1.保存分数void SpeechManager::saveRecord(){ofstream ofs;////文件名ofs.open("speech.csv", ios::out | ios::app);//用追加的方式写文件//将每个人数据写入到文件中for (auto it : win){ofs << it << "," << this->m_speaker[it].m_score[1]<< ",";}ofs << endl;ofs.close();cout << "记录已经保存" << endl;//只要里面有记录了,就应该告诉showRecord,防止因为存放记录文件名被修改出现问题this->fileIsEmpty = false;}

9.从文件中处理到最后答案容器

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;//表示第几届比赛//将字符读到data字符中while (ifs >> data){//cout << data << endl;vector<string> v;int pos = -1;int start = 0;while (true){pos = data.find(",", start);//从0开始查找","if (pos == -1){break;}string tmp = data.substr(start, pos - start);//找到了截取//cout << tmp << endl;v.push_back(tmp);start = pos + 1;}this->m_Record.insert(make_pair(index, v));index++;}ifs.close();/*for (auto it : m_Record){cout << it.first<<"编号 " << it.second[0] <<"分数" << it.second[1] << endl;}*/}

10.展示结果

	}void SpeechManager::showRecord(){if (this->fileIsEmpty == true){cout << "文件不存在" << endl;}else{for (int i = 0; i < this->m_Record.size(); i++){cout << "第" << i + 1 << "届" << endl;cout << "冠军编号:" << this->m_Record[i][0] << "得分:" << this->m_Record[i][1] << " " << endl;cout << "亚军编号:" << this->m_Record[i][2] << "得分:" << this->m_Record[i][3] << " " << endl;cout << "季军编号:" << this->m_Record[i][4] << "得分:" << this->m_Record[i][5] << " " << endl;}}system("pause");system("cls");}

11.清空记录

void SpeechManager::clearRecord(){cout << "确认清空?" << endl;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");}

13。最创建一个流程管理功能。

//在菜单上我们看到有开始演讲比赛,查看往届记录,两个功能,所以我们在用功能的时候必须要先初始化好,我们在无参构造器里面初始化SpeechManager::SpeechManager()
{//初始化容器this->initSpeech();//创建选手this->createSpeaker();//加载往届记录this->loadRecord();
}void SpeechManager::startSpeech()
{//因为要进行两轮比赛所以循环两次//第一轮开始比赛while (this->m_index <= 2){//首先选手抽签this->speechDraw();//开始比赛this->speechContest();//展示比赛结果this->showScore();//下一轮this->m_index++;}//比赛完存储数据,到文件this->saveRecord();//在每次比赛完以后要重置比赛容器,比如第一届比赛完了以后,进行第二届比赛,肯定要先处理以前比赛的记录,保证容器里面是空的。//初始化//为什么还有再写,因为创建对象只初始化一次,我们在每次调用比赛流程功能都要初始化this->initSpeech();//创建选手this->createSpeaker();//加载往届记录this->loadRecord();//初始记录容器cout << "本届比赛完毕!" << endl;system("pause");system("cls");
}

#include<bits/stdc++.h>
#include"speechManager.h"
using namespace std;
int main()
{
//创建对象SpeechManager sm;//随机数srand((unsigned int)time(NULL));//你的选择int choice = 0;while (true){//展示菜单sm.show_Meun();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;}}cout << "hello world" << endl;system("pause");return 0;
}

相关文章:

  • 网络互连与互联网4
  • python基础知识点(3)
  • Lambda 表达式的语法结构
  • 20250419将405的机芯由4LANE的LVDS OUT配置为8LANE的步骤
  • 怎么查看LLM Transformer 架构进行并行计算和设备映射
  • Python基础总结(七)之条件语句
  • 多线程和线程同步
  • Pandas取代Excel?
  • 交换排序——快速排序
  • opencv 图像的旋转
  • mysql的函数(第一期)
  • 简单线段树的讲解(一点点的心得体会)
  • 动态规划算法:状态压缩
  • 【python编程从入门到到实践】第二章 变量和简单的数据类型
  • Nginx 文件上传大小限制及 `client_max_body_size` 最大值详解
  • Linux 系统盘制作 | 引导加载器(GRUB 为例)| mount
  • 二叉树进阶 - 二叉搜索树
  • PDF转excel+json ,vue3+SpringBoot在线演示+附带源码
  • 宇树机器狗go2—slam建图(1)点云格式
  • MLLMs for TSAD ?
  • 《王牌对王牌》确认回归,“奔跑吧”将有主题乐园
  • 亚太峰会上哪个词最火?我们问了问AI
  • 泸州市长余先河已任四川省委统战部常务副部长
  • 两部门通报18个破坏耕地、毁林毁草典型问题
  • 江西修水警方:一民房内发生刑案,犯罪嫌疑人已被抓获
  • 企业跨境支付的最大挑战及解决方案