#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_Index = 1;
this->m_Record.clear();
}
////创建12名选手////
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::startSpeech()
{
////第1轮////
//抽签
this->speechDraw();
//比赛
this->speechContest();
//显示结果
this->showScore();
////第2轮////
this->m_Index++;
//抽签
this->speechDraw();
//比赛
this->speechContest();
//显示结果
this->showScore();
////保存分数////
this->saveRecord();
////重置比赛////
this->initSpeech();
////创建选手////
this->createSpeaker();
////加往届数据////
this->loadRecord();
cout << "本届比赛完毕!" << endl;
}
////抽签////
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<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
else
{
random_shuffle(v2.begin(), v2.end());
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 count = 0;
//取前三名
for (multimap<double, int, greater<int>>::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");
}
////显示分数////
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;
}
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;
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->m_Record.insert(make_pair(index, v));
index++;
}
ifs.close();
}
void SpeechManager::showRecord()
{
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 << "确认清空?" << 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->initSpeech()
没有合适的资源?快使用搜索试试~ 我知道了~
基于C++的演讲比赛流程管理系统源码+详细文档
共24个文件
tlog:6个
obj:3个
cpp:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 157 浏览量
2024-03-19
10:42:08
上传
评论
收藏 537KB ZIP 举报
温馨提示
基于C++的演讲比赛流程管理系统源码+详细文档 程序功能 开始演讲比赛:完成整届比赛的流程,每个比赛阶段需要给用户一个提示,用户按任意键后继续下一个阶段 查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用.csv后缀名保存 清空比赛记录:将文件中数据清空 退出比赛程序:可以退出当前程序
资源推荐
资源详情
资源评论
收起资源包目录
演讲比赛系统.zip (24个子文件)
演讲比赛系统
speechManager.cpp 8KB
speechManager.h 1KB
演讲比赛流程管理系统.md 17KB
speaker.h 221B
演讲比赛系统.vcxproj.user 165B
speaker.cpp 117B
演讲比赛系统.vcxproj 6KB
演讲比赛系统.cpp 568B
Debug
vc141.pdb 716KB
演讲比赛系统.obj 67KB
演讲比赛系统.tlog
CL.write.1.tlog 2KB
CL.command.1.tlog 2KB
演讲比赛系统.lastbuildstate 206B
link.command.1.tlog 1KB
link.read.1.tlog 4KB
link.write.1.tlog 502B
CL.read.1.tlog 58KB
vc141.idb 251KB
speaker.obj 91KB
演讲比赛系统.log 10KB
speechManager.obj 1.82MB
演讲比赛系统.vcxproj.filters 1KB
speech.csv 200B
演讲比赛系统.sln 1KB
共 24 条
- 1
资源评论
程序员柳
- 粉丝: 8139
- 资源: 1469
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功