C++ 【第三篇】实战之演讲比赛系统(二)
演讲比赛系统
一 :程序需求
- 
 - 
比赛方式:分组比赛,每组6个人;选手每次要随机分组,进行比赛
 - 
每名选手都有对应的编号,如 10001 ~ 10012
 - 
第一轮分为两个小组,每组6个人。 整体按照选手编号进行抽签后顺序演讲。
 - 
当小组演讲完后,淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛。
 - 
第二轮为决赛,前三名胜出
 - 
每轮比赛过后需要
 
程序功能
- 
开始演讲比赛:完成整届比赛的流程,每个比赛阶段需要给用户一个提示,用户按任意键后继续下一个阶段
 - 
查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用.csv后缀名保存
 - 
清空比赛记录:将文件中数据清空
 - 
 
#include <iostream> using namespace std; #include "speechManager.h" #include<string> #include <ctime> int main() { //随机数种子 srand((unsigned int)time(NULL)); //创建管理类对象 SpeechManager sm; //测试12名选手创建 //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; }
#pragma once #include<iostream> using namespace std; class Speaker { public: string m_Name; //姓名 double m_Score[2]; //分数 最多有两轮得分 };
#include<iostream> using namespace std; #include <vector> #include <map> #include "speaker.h" #include <string> #include <algorithm> #include <functional> #include <numeric> #include <deque> #include <fstream> class SpeechManager { public: SpeechManager(); void show_Menu();//展示菜单 void exitSystem();//退出系统 void initSpeech(); //初始化容器和属性 void createSpeaker(); //创建12名选手 void startSpeech(); //开始比赛 void speechDraw(); //抽签 void speechContest();//比赛 void showScore(); //显示晋级结果 void saveRecord(); //保存分数 void loadRecord();//读取记录 void showRecord(); //显示往届得分 void clearRecord(); //清空记录 //成员属性 vector<int>v1; //第一轮比赛选手编号容器 vector<int>v2; //第一轮晋级选手编号容器 vector<int>vVictory;//胜出前三名选手编号容器 map<int, Speaker>m_Speaker;//存放编号以及对应具体选手容器 int m_Index;//存放比赛轮数 bool fileIsEmpty; //文件为空 map<int, vector<string>> m_Record;//往届记录 ~SpeechManager(); };
#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::startSpeech() { //第一轮比赛 //1、抽签 speechDraw(); //2、比赛 speechContest(); //3、显示晋级结果 showScore(); //第二轮比赛 this->m_Index++; //1、抽签 speechDraw(); //2、比赛 speechContest(); //3、显示最终结果 showScore(); //4、保存分数 saveRecord(); //重置比赛 ,获取记录 //初始化容器和属性 this->initSpeech(); //创建12名选手 this->createSpeaker(); //加载往届记录 this->loadRecord(); cout << "本届比赛完毕!" << endl; system("pause"); system("cls"); } //抽签 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 //rand() % (b-a+1)+ a ;就表示a~b 之间的一个随机整数。 //cout << score << " "; d.push_back(score); } sort(d.begin(), d.end(), greater<double>()); //降序 , sort #include <algorithm> greater #include <functional> d.pop_front(); //去掉最高分 d.pop_back(); //去掉最低分 double sum = accumulate(d.begin(), d.end(), 0.0f); //获取总分 #include <numeric> 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; //有记录了,文件不为空 this->fileIsEmpty=false; } 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() { 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 << "确认清空?" << 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(); //创建选手 this->createSpeaker(); //获取往届记录 this->loadRecord(); cout << "清空成功!" << endl; } system("pause"); system("cls"); }
    作者:华王
博客:https://www.cnblogs.com/huahuawang/
                    
                
                
            
        
浙公网安备 33010602011771号