1.需求
2.文件目录
3.代码
3.1Speaker.h
#pragma once
#include<iostream>
using namespace std;class Speaker {public:string m_Name;double m_Score[2];};
3.2SpeechManager.h
#pragma once
#include<iostream>
#include<vector>
#include "Speaker.h"
#include<map>
#include<algorithm>
#include<functional>
#include<deque>
#include<numeric>
#include<fstream>
using namespace std;class SpeechManager {public: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;public:SpeechManager();void showMenu();void exitSystem();void initSpeech();void createSpeaker();void startSpeech();void speechDraw();void speechContest();void showScore();void saveRecord();void loadRecord();void showRecord();void clearRecord();~SpeechManager();};
3.3SpeechManager.cpp
#include "SpeechManager.h"SpeechManager::SpeechManager() {this->initSpeech();this->createSpeaker();this->loadRecord();
}SpeechManager::~SpeechManager() {}void SpeechManager::showMenu() {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;}this->v1.push_back(i + 10001);this->m_Speaker.insert(make_pair(i + 10001, sp));}
}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());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<double>> groupScore;int num = 0;vector<int> v_Src;if (this->m_Index == 1) {v_Src = this->v1;}else {v_Src = this->v2;}for (vector<int>::iterator it = v_Src.begin(); it != v_Src.end(); it++) {num++;deque<double> d;for (vector<int>::iterator it = v_Src.begin(); it != v_Src.end(); it++) {double score = (rand() % 401 + 600) / 10.f;d.push_back(score);}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();this->m_Speaker[*it].m_Score[this->m_Index - 1] = avg;groupScore.insert(make_pair(avg, *it));if (num % 6 == 0) {cout << "第" << num / 6 << "小组比赛名次:" << endl;for (multimap<double, int, greater<double>>::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<double>>::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->showMenu();
}void SpeechManager::saveRecord() {ofstream ofs;ofs.open("speech.csv", ios::out | ios::app);for (auto idx : this->vVictory) {ofs << idx << "," << this->m_Speaker[idx].m_Score[1] << ",";}ofs << endl;ofs.close();cout << "记录已经保存" << endl;this->fileIsEmpty = false;
}void SpeechManager::startSpeech() {// 第一轮抽签this->speechDraw();// 第一轮比赛this->speechContest();// 显式晋级结果this->showScore();// 第二轮比赛this->m_Index++;// 第二轮抽签this->speechDraw();// 第二轮比赛this->speechContest();// 显式最终结果this->showScore();// 保存分数this->saveRecord();// 初始化属性this->initSpeech();this->createSpeaker();this->loadRecord();cout << "本届比赛完毕" << endl;system("pause");system("cls");
}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) {vector<string> v;int pos = -1;int start = 0;while (true) {pos = data.find(",", start);if (pos == -1) {break;}string tmp = data.substr(start, pos - start);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) {ofstream ofs("speech.csv", ios::trunc);ofs.close();this->initSpeech();this->createSpeaker();this->loadRecord();cout << "清空成功!" << endl;}system("pause");system("cls");
}
3.4演讲比赛管理系统.cpp
#include<iostream>
#include "SpeechManager.h"
#include<ctime>
using namespace std;int main() {srand((unsigned int)time(NULL));SpeechManager sm;int choice = 0;while (true) {sm.showMenu();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;
}