中国计算机设计大赛赛事统计预习报告
文章目錄
- 一、問題描述和基本要求
- 二、問題分析和任務定義
- 1.數據結構的選取
- 2.問題分析
- 3.功能分析
- 三、邏輯設計
- 1.變量的類型說明:
- 2.變量說明
- 3.函數說明
- 4.抽象數據結構
- 四、物理結構
- 1.存儲結構
- 2.模塊設計
- 3.函數設計
- 4.算法流程圖
- 五、測試數據
- 六、具體函數實現
一、問題描述和基本要求
【問題描述】
參加計算機設計大賽的n個學校編號為1n,賽事分成m個項目,項目的編號為1m.比賽獲獎按照得分降序,取前三名,寫一個統計程序產生各種成績單和得分報表。
【基本要求】
1)每個比賽項目至少有10支參賽隊;每個學校最多有6支隊伍參賽;
2)能統計各學校的總分;
3)可以按照學校編號或名稱,學校的總分、各項目的總分排序輸出;
4)可以按學校編號查詢學校某個項目的獲獎情況;可以按項目編號查詢取得前三名的學校;
5)數據存入文件并能隨時查詢
【設計要求】
1)輸入數據形式和范圍:可以輸入學校的名稱,賽事項目的名稱。
2)輸出形式:有中文提示,各學校分數為整數
3)界面要求:交互設計要合理,每個功能可以設立菜單,根據提示,可以完成相關功能的要求。
4)存儲結構:學生自己根據系統功能要求自己設計,但是賽事相關數據要存儲在文件中。
【測試數據】
要求使用全部合法數據,整體非法數據,局部非法數據。進行程序測試,以保證程序的穩定。
【實現提示】
假設3<賽事項目數量<=10,學校名稱長度不超過20個字符。每個賽事結束時,將其編號、名稱輸入,并依次輸入參賽學校編號、學校名稱和成績.
二、問題分析和任務定義
1.數據結構的選取
本項目使用結構體作為數據結構,分別用學校(school)、團隊(team)、項目(project)來表示比賽的相關信息。
2.問題分析
本題目中,并沒有給我們相關的比賽信息,所以需要我們自己去輸入或用隨機數生成,但要能保存在數據里,留待下一次的取用,同時要注意題目對相關數量的要求。
項目project盡量在3-10個左右
學校school要能保證使每個項目至少10只隊伍
團隊team要保證每個學校不能超過六個
注意每個team只能選一個項目
3.功能分析
(1)能夠隨時添加相關信息;
(2)照學校編號或名稱查詢,學校的總分輸出;
(3)按學校編號查詢學校某個項目的獲獎情況;
(4)可以按項目編號查詢取得前三名的學校(注意并列的情況);
(5)可以查詢任意項目的總分;
三、邏輯設計
1.變量的類型說明:
| team類 | score(團隊得分)、jud(參加的項目) |
| project類 | score(項目得分)、sum(項目總分) |
2.變量說明
| te[i] | 參加的隊伍(Team類型) |
| pro[m] | 賽事項目(project類型) |
3.函數說明
| input() | 添加新的參賽學校和隊伍 |
| readdata() | 讀取文件里的比賽信息,通過fstream來完成 |
| schoolsum() | 計算學校總分排名 |
| evschoolsum() | 按照學校編碼查詢總分 |
| prothree() | 按項目編號查詢取得前三名的學校 |
| evprosum() | 計算項目總分 |
| schoolaw() | 按學校編號查詢學校某個項目的獲獎情況 |
4.抽象數據結構
ADT 計算機設計大賽賽事統計Data學校列表schools<School>項目列表projects<Project>隊伍列表teams<Team>Operation界面設計輸入:無功能:輸出主菜單交互界面輸出:主菜單交互界面讀取數據輸入:無功能:讀取文件中的比賽信息輸出:無添加學校/隊伍輸入:學校/隊伍信息功能:將輸入的信息存入對應的結構體數組中輸出:無輸出學校/項目總分輸入:無功能:輸出學校/項目總分輸出:學校/項目總分輸出任意學校的總分 輸入:學校編號功能:根據編號輸出學校總分輸出:學校總分輸出所有學校總分,總分降序輸出輸入:無功能:降序輸出所有學校總分輸出:所有學校總分通過學校編號查詢各項目總分降序輸出輸入:學校編號功能:查詢該學校所有項目分數,并且降序輸出輸出:學校所有項目分數 按學校編號查詢學校某個項目的獲獎情況輸入:學校編號和項目編號功能:查詢該學校對應項目的獲獎情況輸出:該學校對應項目的獲獎情況按項目編號查詢取得前三名的學校 輸入:項目編號功能:查詢該項目取得前三名的學校輸出:該項目取得前三名的學校編號退出程序輸入:N功能:退出程序輸出:無 end ADT四、物理結構
1.存儲結構
1.定義結構體school類和team類,并在school類中存放team類數組
2.定義結構體project類表示項目
2.模塊設計
1.主函數模塊
2.讀取數據和輸入模塊
3.計算總分降序輸出模塊
4.獲得項目排名模塊
3.函數設計
偽代碼: 1.school類:name(名字)、length(參賽隊伍數量)、sum(學校總分); 2.team類: score(團隊得分)、jud(參加的項目); 3.project類:score(項目得分)、sum(項目總分); 4.sch[n]; 5.te[i]; 6.pro[m]; 7.readdata(){讀取文件里的比賽信息,通過fstream來完成} 8.input(){添加比賽信息} 9.evschoolsum(){查詢各個學校的總分,并降序輸出} 10.schoolsum(){按編號查詢學校總分} 11.prothree(){按項目編號查詢取得前三名的學校} 12.evprosum() {計算項目總分 } 13.schoolaw(){按學校編號查詢學校某個項目的獲獎情況}4.算法流程圖
五、測試數據
六、具體函數實現
1.schoolsum()
void schoolsum() //根據編號查詢學校總分 {int a;cout << "目前共有" << n << "個學校參賽" << endl;cout << "請輸入需要查詢總分的學校編號(1-" << n << ")" << endl;while (true){cin >> a;if (!cin.good()||a<1 || a>n)cout << "輸入編號有誤,請重新輸入" << endl;else break;cin.clear();cin.ignore(1024, '\n');}cout << "該學校的總分為" << sch[a - 1].sum << endl; }2.evschoolsum()
void evschoolsum() //各學校總分,降序輸出 {int a[100];int b[100];for (int i = 0; i < n; i++)a[i] = sch[i].sum;sort(a, a + n); //對數組排序for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (sch[j].sum == a[i])b[i] = j;}}cout << "學校編號" <<" " << "學校名稱" << " " << "總分" << endl;for (int i = 0; i < n; i++) //降序輸出{cout << " " << b[n-i-1]+1 <<" " <<sch[b[n-i-1]].name<< " " << a[n - i - 1] << endl;} }3.evprosum()
void evprosum() //項目總分 {cout << "項目" << " " << "總分" << endl;for (int i = 0; i < 6; i++){cout << " " << i+1 << " " << pro[i].sum << endl;} }4.scevprosum()
void scevprosum() //根據學校編號查詢各個項目得分 {int x;cout << "請輸入所需要查詢的學校編號(1-" << n << ")" << endl;while (true){cin >> x;if (!cin.good()||x<1 || x>n)cout << "輸入編號有誤,請重新輸入" << endl;else break;cin.clear();cin.ignore(1024, '\n');}int a[20];int b[20];for (int i = 0; i < sch[x - 1].length; i++)a[i] = sch[x - 1].te[i].sc;sort(a, a + sch[x - 1].length); //對數組排序for (int i = 0; i < sch[x - 1].length; i++){for (int j = 0; j < sch[x - 1].length; j++){if (sch[x-1].te[j].sc == a[i])b[i] = sch[x - 1].te[j].jud;}}cout << "項目編號" << " " << "總分" << endl;for (int i = 0; i < sch[x - 1].length; i++) //降序輸出{cout << " " << b[sch[x - 1].length - i - 1] <<" " << a[sch[x - 1].length - i - 1] << endl;} }5.prothree()
void prothree() //根據編號查詢項目的前三名 {int x;int y = 0;int a[100];int b[3];cout << "請輸入需要查詢排名的項目編號(1-6)" << endl;while (true){cin >> x;if (!cin.good()||x < 1 || x>6)cout << "輸入編號有誤,請重新輸入" << endl;else break;cin.clear();cin.ignore(1024, '\n');}for (int i = 0; i < n; i++)a[i] = pro[x-1].score[i];sort(a, a + n);for (int i = n-1; i > n-4; i--){for (int j = 0; j < n; j++){if (pro[x-1].score[j] == a[i])b[y++] = j+1;}}if (b[0] == b[1]){cout << "該項目的第一名為: 學校" << b[0] <<"和學校"<<b[1]<< endl;cout << "該項目的第二名為: 學校" << b[1] << endl;}else if (b[1] == b[2]){cout << "該項目的第一名為: 學校" << b[0] << endl;cout << "該項目的第二名為: 學校" << b[1] << "和學校" << b[2] << endl;}else if(b[0]==b[1]==b[2]){cout << "該項目的第一名為: 學校" << b[0] << "和學校" << b[1] <<"和學校"<<b[2]<< endl;}else{cout << "該項目的第一名為: 學校" << b[0] << endl;cout << "該項目的第二名為: 學校" << b[1] << endl;cout << "該項目的第三名為: 學校" << b[2] << endl;} }6.schoolaw()
void schoolaw() //查詢任意學校任意項目獲獎情況 {int a;int b;int jud = 0;cout << "請輸入所需要查詢的學校編號(1-" <<n <<")" << endl;while (true){cin >> a;if (!cin.good()||a<1 || a>n)cout << "輸入編號有誤,請重新輸入" << endl;else break;cin.clear();cin.ignore(1024, '\n');}cout << "請輸入需要查詢的項目編號(1-6)" << endl;while (true){cin >> b;if (!cin.good()||b < 1 || b>6)cout << "暫無該編號項目,請重新輸入" << endl;else break;cin.clear();cin.ignore(1024, '\n');}int c[100];for (int i = 0; i < n; i++)c[i] = pro[b-1].score[i];sort(c, c + n);for (int i = n - 1; i > n - 4; i--){if(pro[b-1].score[a-1]==c[i]){cout<<"該學校在該項目中獲得第"<<abs(i-n)<<"名"<<endl;jud = 1;break;}}if (jud == 0)cout << "該學校在該項目中沒有獲獎" << endl; }以上代碼均能ac。
總結
以上是生活随笔為你收集整理的中国计算机设计大赛赛事统计预习报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 筑泰防务助力江门市公安打造新一代警务移动
- 下一篇: .NET基础示例系列之二十四:家谱软件(