1 /*
2 比賽規則:
3 學校舉行一演講比賽,共12個人參加,比賽兩輪,第一輪為淘汰賽 第二輪為決賽
4 每名選手都有對應的編號:如10001~10012
5 比賽方式:分組比賽 每組6人
6 第一輪分為兩小組,整體按照選手編號進行抽籤後順序演講
7 十個評委分別個每名選手打分,去除最高分和最低分 求的平均分為本輪選手的成績
8 當小組演講完後 淘汰組內排名最後的三個選手 前三名晉級,進入下一輪的比賽
9 第二輪為決賽 前三名勝出
10 每輪比賽過後需要顯示晉級選手的資訊
11 */
12 /*基於STL的演講比賽流程管理系統*/
13 /**
14 *專案名稱:基於STL的演講比賽流程管理系統
15 *時 間:2021.8.18
16 *作 者:Bytezero!·zhenglei
17 */
1 /*
2 比賽規則:
3 學校舉行一演講比賽,共12個人參加,比賽兩輪,第一輪為淘汰賽 第二輪為決賽
4 每名選手都有對應的編號:如10001~10012
5 比賽方式:分組比賽 每組6人
6 第一輪分為兩小組,整體按照選手編號進行抽籤後順序演講
7 十個評委分別個每名選手打分,去除最高分和最低分 求的平均分為本輪選手的成績
8 當小組演講完後 淘汰組內排名最後的三個選手 前三名晉級,進入下一輪的比賽
9 第二輪為決賽 前三名勝出
10 每輪比賽過後需要顯示晉級選手的資訊
11 */
12 /*基於STL的演講比賽流程管理系統*/
13 /**
14 *專案名稱:基於STL的演講比賽流程管理系統
15 *時 間:2021.8.18
16 *作 者:Bytezero!·zhenglei
17 */
18
19 /*speechcontest*/
20
21 #include<iostream>
22 #include"speechManager.h"
23 #include<string>
24
25 using namespace std;
26
27 int main()
28 {
29 srand((unsigned int)time(NULL));
30 //建立管理類的物件
31 SpeechManager sm;
32
33 //測試12名選手建立
34 //for (map<int, Speaker>::iterator it = sm.m_Speaker.begin(); it != sm.m_Speaker.end(); it++)
35 //{
36 // cout << "選手編號:" << it->first << "\t\t姓名:" << it->second.m_Name <<"\t分數:"<<it->second.m_Score[0]<< endl;
37 //}
38
39
40
41 int choice = 0; //用於儲存使用者的輸入
42 while (true)
43 {
44 //呼叫展示選單
45 sm.show_Menu();
46 cout << "請輸入您的選擇:" << endl;
47 cin >> choice;
48
49 switch (choice)
50 {
51 case 1: //開始比賽
52 sm.startSpeech();
53 break;
54 case 2: //檢視往屆的比賽記錄
55 sm.showRecord();
56 break;
57 case 3: //清空比賽記錄
58 sm.clearRecord();
59 break;
60 case 0: //退出系統
61 sm.exitSystem();
62 break;
63
64 default: //輸入有誤
65 cout << "對不起,您輸入有誤,請重新輸入!!!" << endl;
66 system("pause");
67 system("cls"); //清屏
68
69 break;
70 }
71
72 }
73
74
75 system("pause");
76 return 0;
77 }
1 speechManager.c
2
3 /**
4 *專案名稱:基於STL的演講比賽流程管理系統
5 *時 間:2021.8.18
6 *作 者:Bytezero!·zhenglei
7 */
8 #include"speechManager.h"
9 #include<algorithm>
10
11
12 //建構函式
13 SpeechManager::SpeechManager()
14 {
15 //初始化容器和屬性
16 this->initSpeech();
17
18 //建立12名選手
19 this->createSpeaker();
20
21 //載入往屆記錄
22 this->loadRecord();
23 }
24
25 //展示選單
26 void SpeechManager::show_Menu()
27 {
28 cout << "**********************************************" << endl;
29 cout << "************* 歡迎參加演講比賽 *************" << endl;
30 cout << "************** 1.開始演講比賽 **************" << endl;
31 cout << "************** 2.檢視往屆記錄 **************" << endl;
32 cout << "************** 3.清空比賽記錄 **************" << endl;
33 cout << "************** 0.退出比賽程式 **************" << endl;
34 cout << "**********************************************" << endl;
35 cout << endl;
36
37 }
38
39 //退出系統
40 void SpeechManager::exitSystem()
41 {
42 cout << "歡迎下次使用!!!" << endl;
43 system("pause");
44 exit(0);
45 }
46
47 //初始化容器和屬性
48 void SpeechManager::initSpeech()
49 {
50 //容器都置空
51 this->v1.clear();
52 this->v2.clear();
53 this->vVictory.clear();
54 this->m_Speaker.clear();
55
56 //初始化比賽輪數
57 this->m_Index = 1;
58
59 //初始化記錄容器
60 this->m_Record.clear();
61
62
63 }
64
65 //建立12名選手
66 void SpeechManager::createSpeaker()
67 {
68 //12名選手的名字
69 string nameSeed = "ABCDEFGHIJKL";
70 for (int i= 0; i < nameSeed.size(); i++)
71 {
72 string name = "選手";
73 name += nameSeed[i];
74
75 //建立具體選手
76 Speaker sp;
77 sp.m_Name = name;
78
79 for (int j = 0; j < 2; j++)
80 {
81 sp.m_Score[j] = 0;
82 }
83 //建立選手編號,並且放入v1容器中
84 this->v1.push_back(i + 10001);
85
86 //選手編號以及對應選手 放入map容器中
87 this->m_Speaker.insert(make_pair(i + 10001, sp));
88
89
90 }
91 }
92 //開始比賽 比賽整個流程控制函式
93 void SpeechManager::startSpeech()
94 {
95 //第一輪開始比賽
96
97 //1.抽籤
98 this->speechDraw();
99
100 //2.比賽
101 this->speechContest();
102
103 //3.顯示晉級結果
104 this->showScore();
105
106 //第二輪比賽
107 this->m_Index++;
108 //1.抽籤
109 this->speechDraw();
110
111 //2.比賽
112 speechContest();
113
114 //3.顯示最終結果
115 this->showScore();
116
117 //4.儲存分數到檔案中
118 this->saveRecord();
119 //重置比賽 獲取記錄
120
121 //初始化容器和屬性
122 this->initSpeech();
123
124 //建立12名選手
125 this->createSpeaker();
126
127 //載入往屆記錄
128 this->loadRecord();
129
130 cout << "本屆比賽完畢!" << endl;
131 system("pause");
132 system("cls");
133
134
135 }
136 //抽籤
137 void SpeechManager::speechDraw()
138 {
139 cout << "第 <<" << this->m_Index << ">> 輪比賽選手在抽籤" << endl;
140 cout << "----------------------------------------------" << endl;
141 cout << "抽籤後演講順序如下:" << endl;
142
143 if (this->m_Index == 1)
144 {
145 //第一輪比賽 //打亂
146 random_shuffle(v1.begin(), v1.end());
147 for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
148 {
149 cout << *it << " ";
150 }
151 cout << endl;
152 }
153 else
154 {
155 //第二輪
156 random_shuffle(v2.begin(), v2.end());
157 for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++)
158 {
159 cout << *it << " ";
160 }
161 cout << endl;
162 }
163
164 cout << "----------------------------------------------" << endl;
165 system("pause");
166 cout << endl;
167
168
169 }
170
171 //具體比賽
172 void SpeechManager::speechContest()
173 {
174 cout << "--------------- 第" << this->m_Index << " 輪比賽正式開始 ---------------" << endl;
175
176 //準備臨時容器 存放小組成績 給分數排序
177 multimap<double, int, greater<double>>groupScore;
178
179 int num = 0; //記錄人員個數 6人一組
180
181
182 vector<int>v_Src; //比賽的人員容器
183 if (this->m_Index == 1)
184 {
185
186 v_Src = v1;
187 }
188 else
189 {
190
191 v_Src = v2;
192 }
193 //遍歷所有選手進行比賽
194 for (vector<int>::iterator it = v_Src.begin(); it != v_Src.end(); it++)
195 {
196 num++;
197 //評委打分
198 deque<double>d;
199 for (int i = 0; i < 10; i++)
200 {
201 double score = (rand() % 401 + 600)/10.f; //600~1000
202 //cout << score << " ";
203 d.push_back(score);
204
205 }
206 //cout << endl;
207
208
209 //降序
210 sort(d.begin(), d.end(),greater<double>());
211
212 d.pop_front(); //去除最高分
213 d.pop_back(); //去除最低分
214
215 double sum = accumulate(d.begin(), d.end(), 0.0f); //總分
216
217 double avg = sum / (double)d.size(); //平均分
218 //列印平均分
219 //cout << "編號:" << *it << "\t姓名:" << this->m_Speaker[*it].m_Name <<"\t獲取平均分:" << avg << endl;
220
221 //將平均分放入到容器中
222 this->m_Speaker[*it].m_Score[this->m_Index - 1] = avg;
223
224 //將打分的資料 放入到臨時小組容器中
225
226 groupScore.insert(make_pair(avg, *it)); //key是得分,value是具體選手編號
227
228 //每6人取出前三名
229 if (num % 6 == 0)
230 {
231 cout << "第" << num / 6 << "小組比賽名次: " << endl;
232 for (multimap<double, int, greater<double>>::iterator it = groupScore.begin(); it != groupScore.end(); it++)
233 {
234 cout << "編號:" << it->second << "\t姓名:" << this->m_Speaker[it->second].m_Name << "\t成績:"
235 << this->m_Speaker[it->second].m_Score[this->m_Index - 1] << endl;
236
237 }
238 //取走前三名
239 int count = 0;
240 for (multimap<double, int, greater<double>>::iterator it = groupScore.begin(); it != groupScore.end() && count < 3; it++, count++)
241 {
242 if (this->m_Index == 1)
243 {
244 v2.push_back((*it).second);
245 }
246 else
247 {
248 vVictory.push_back((*it).second);
249 }
250 }
251
252
253
254 groupScore.clear(); //小組容器清空
255 cout << endl;
256 }
257
258
259
260 }
261 cout << "--------------- 第" << this->m_Index << "輪比賽完畢! ---------------" << endl;
262 system("pause");
263 }
264
265 //顯示得分
266 void SpeechManager::showScore()
267 {
268 cout << "--------------- 第" << this->m_Index << "輪比賽選手資訊如下: ---------------" << endl;
269
270 vector<int>v;
271 if (this->m_Index == 1)
272 {
273 v = v2;
274 }
275 else
276 {
277 v = vVictory;
278 }
279
280 for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
281 {
282 cout << "選手編號:" << *it << "\t姓名:" << m_Speaker[*it].m_Name
283 << "\t得分:" << m_Speaker[*it].m_Score[this->m_Index - 1] << endl;
284
285 }
286 cout << endl;
287
288 system("pause");
289 system("cls");
290 this->show_Menu();
291
292 }
293 //儲存記錄
294 void SpeechManager::saveRecord()
295 {
296 ofstream ofs;
297 ofs.open("speech.csv", ios::out | ios::app);//用追加的方式寫檔案
298
299 //將每個人的資料寫入檔案中
300 for (vector<int>::iterator it = vVictory.begin(); it != vVictory.end(); it++)
301 {
302 ofs << *it << "," << this->m_Speaker[*it].m_Score[1] << ",";
303 }
304 ofs << endl;
305
306 //關閉檔案
307 ofs.close();
308 cout << "記錄已經儲存" << endl;
309
310 //有記錄了 要更新
311 this->fileIsEmpty = false;
312
313 }
314
315 //讀取記錄
316 void SpeechManager::loadRecord()
317 {
318 ifstream ifs("speech.csv", ios::in);//讀檔案
319 if (!ifs.is_open())
320 {
321 this->fileIsEmpty = true;
322 //cout << "檔案不存在!" << endl;
323 ifs.close();
324 return;
325 }
326
327 //檔案清空
328 char ch;
329 ifs >> ch;
330 if (ifs.eof())
331 {
332 //cout << "檔案為空!" << endl;
333 this->fileIsEmpty = true;
334 ifs.close();
335 return;
336 }
337
338 //檔案不為空
339 this->fileIsEmpty = false;
340 ifs.putback(ch); //將上邊的讀取的單個字元 再放回來
341
342 string data;
343 int index = 0;
344
345 while (ifs >> data)
346 {
347 //cout << data << endl;
348
349 vector<string>v; //為了存放6個string字串
350
351 int pos = -1; //查到 逗號 , 位置的變數
352 int start = 0; //起始位置
353
354 while(true)
355 {
356 pos = data.find(",", start);
357
358 if (pos == -1)
359 {
360 //沒有找到
361 break;
362
363 }
364 string temp = data.substr(start, pos - start);
365 //cout << temp << endl;
366 v.push_back(temp);
367 start = pos + 1;
368 }
369 this->m_Record.insert(make_pair(index, v));
370 index++;
371 }
372
373 ifs.close();
374
375 //for (map<int, vector<string>>::iterator it = m_Record.begin(); it != m_Record.end(); it++)
376 //{
377 // cout << it->first << "冠軍編號:" << it->second[0] << "\t分數:"
378 // << it->second[1] << endl;
379 //}
380
381
382
383 }
384
385 //顯示往屆記錄
386 void SpeechManager::showRecord()
387 {
388 if (this->fileIsEmpty)
389 {
390 cout << "檔案為空或者檔案不存在!" << endl;
391 }
392 else
393 {
394 for (int i = 0; i < this->m_Record.size(); i++)
395 {
396 cout << "第" << i + 1 << "屆比賽獲獎名單\n"
397 << "冠軍編號:" << this->m_Record[i][0] << "\t\t冠軍得分:" << this->m_Record[i][1] << "\n"
398 << "亞軍編號:" << this->m_Record[i][2] << "\t\t亞軍得分:" << this->m_Record[i][3] << "\n"
399 << "季軍編號:" << this->m_Record[i][4] << "\t\t季軍得分:" << this->m_Record[i][5] << endl;
400
401
402 }
403
404 }
405
406 system("pause");
407 system("cls");
408 }
409
410 //清空記錄
411 void SpeechManager::clearRecord()
412 {
413 cout << "您是否確認清空檔案?" << endl;
414 cout << "1---是" << endl;
415 cout << "2---否" << endl;
416
417 int select = 0;
418 cin >> select;
419
420 if (select == 1)
421 {
422 //確認清空
423 ofstream ofs("speech.csv", ios::trunc); //刪除重新建立
424 ofs.close(); //關閉
425
426 //初始化容器和屬性
427 this->initSpeech();
428
429 //建立12名選手
430 this->createSpeaker();
431
432 //載入往屆記錄
433 this->loadRecord();
434
435 cout << "清空成功!!" << endl;
436
437 }
438 system("pause");
439 system("cls");
440
441
442
443 }
444
445 //解構函式
446 SpeechManager::~SpeechManager()
447 {
448
449 }
1 speechManager.h
2
3 #include<numeric>
4 #include<string>
5 #include<fstream>
6 using namespace std;
7
8 //設計演講比賽的管理類
9 class SpeechManager
10 {
11 public:
12 //建構函式
13 SpeechManager();
14
15 //展示選單
16 void show_Menu();
17
18 //退出系統
19 void exitSystem();
20
21
22 //解構函式
23 ~SpeechManager();
24
25 //初始化容器和屬性
26 void initSpeech();
27
28 //建立12名選手
29 void createSpeaker();
30
31 //開始比賽 比賽整個流程控制函式
32 void startSpeech();
33
34 //抽籤
35 void speechDraw();
36
37
38 //具體比賽
39 void speechContest();
40
41 //顯示得分
42 void showScore();
43
44 //儲存記錄
45 void saveRecord();
46
47 //讀取記錄
48 void loadRecord();
49
50 //顯示往屆記錄
51 void showRecord();
52
53 //清空記錄
54 void clearRecord();
55
56
57 //判斷檔案是否為空
58 bool fileIsEmpty;
59
60 //存放往屆記錄的容器
61 map<int, vector<string>>m_Record;
62
63
64 //成員屬性
65 //儲存第一輪比賽選手編號容器
66 vector<int>v1;
67
68 //第一輪晉級選手編號容器
69 vector<int>v2;
70
71
72 //勝出的前三名選手編號容器
73 vector<int>vVictory;
74
75 //存放編號以及對應具體選手容器
76 map<int, Speaker>m_Speaker;
77
78 //存放比賽輪數的
79 int m_Index;
80
81
82
83
84 };
1 /**
2 *專案名稱:基於STL的演講比賽流程管理系統
3 *時 間:2021.8.18
4 *作 者:Bytezero!·zhenglei
5 */
6
7 speaker.h
8
9 #pragma once
10 #include<iostream>
11 using namespace std;
12
13
14 //選手類
15 class Speaker
16 {
17 public:
18
19 string m_Name;
20 double m_Score[2]; //分數 最多有倆輪的得分
21
22 };
//主介面
//1.開始
(可以參加多次比賽)
//2 檢視記錄
//檔案裡的儲存檔案
//3.清空
//檔案清空
//不參加的時候 沒有資料
//2
//0 退出程式