




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、數據結構課程設計-運動會分數統(tǒng)計運動會分數統(tǒng)計一、需求分析1、本演示程序中,可以輸入參加運動會的學校編號及項目編號,學校編號要求為1<<N,男子比賽項目編號要求為1M,女子比賽項目編號要求為M+1M+W;根據具體情況選擇輸入參加項目的男女類別和取成績名次類別;最后選擇輸入名次。2、演示程序以用戶和計算機對話方式進行,即在計算機終端上顯示提示信息之后,由用戶輸入進行查詢成績的操作:產生各學校的成績單,包括:各學校所取得的每項成績的項目號、名次(成績)、姓名和得產生團體總分報表,內容包括校號、男子團體總分、女子團子總分和團體總分,然后進行數據保存操作。3、本程序執(zhí)行命令包括:1)輸入比
2、賽數據2)查詢相關記錄3)顯示各學校的成績單4)顯示各校團體總分報表4、 測試數據N=4,M=3,W=2,編號為奇數的項目取前五名,為偶數的項目取前三名。具體數據如下:輸入學校編號:1 2 4輸入項目編號:1 3 2性別選擇: 男 女 男取成績名次: 前3名 前5名 前3名名次選擇: 第1名 第4名 第2名二、概要設計1. 程序中所有數據類型有:int , struct , char , struct * , struct , char;2. 整形定義nsc學??倲祄sp男子項目總數wsp女子項目總數ntsp項目總數serial學校編號item得分項目range得分名次score得分成績ove
3、rgame已結束的項目編號menscore男子團體總分womenscore女子團體總分totalscore校團體總分3. 本程序包含六個模塊:1)主程序模塊main ( ) 初始化; If(“命令”=“輸入”) 判斷數據是否合法;接受輸入數據;數據處理運算; If(“命令”=“查詢”)接受具體指令; 顯示相應數據;2)Input()比賽結果錄入3)Cout()范圍判斷4)School()各學校取得成績細表5)Overall()各校男、女及總團體總分6)Calculate()數據處理4. 程序流程圖如下:Case2Y成績查詢N繼續(xù)查詢團體總分N結束退出NY繼續(xù)輸出查詢學校成績Case1Case3
4、查詢各學校成績N輸入某項目各名次成績Y繼續(xù)輸入輸入學校及男女項目范圍YY輸入開始-初始化三、詳細設計1. 元素類型、變量、指針類型struct athletestruct /*參賽運動員*/ char name20; char xingming20; /*姓名*/ int score; /*得分成績*/ int range; /*得分名次*/ int item; /*得分項目*/;struct schoolstruct /*參賽學校*/ int count; /*計算實際運動員個數*/ int serial; /*學校編號*/ int menscore; /*男子團體總分*/ int wome
5、nscore; /*女子團體總分*/ int totalscore; /*團體總分*/ struct athletestruct athleteMaxSize; /*參賽運動員*/ struct schoolstruct *next; /*參賽學校*/;int nsc,msp,wsp; /*實際參賽學校個數,男子、女子項目*/int ntsp; /*項目總數*/int i,j; /*循環(huán)控制變量*/int overgame; /*已結束的項目編號*/int serial,range; /*獲獎的學校編號 & 獲獎名次*/int n; /*用來判斷項目類型(奇&偶)*/struc
6、t schoolstruct *head,*pfirst,*psecond; /*用于開辟存儲區(qū)域*/int *phead=NULL,*pafirst=NULL,*pasecond=NULL; /*用于項目數組指針*/2. 輸入模塊,建立鏈表,然后存儲數據。包括學校、男女項目范圍、各項目成績及對輸入數據合法性判斷等。1) 輸入學校及項目的范圍并判斷輸入范圍合法性: Is_Star_DoMain: printf("n請輸入參賽學校總數(<= 20): "); scanf("%d",&nsc); if(nsc<=0|nsc>20)
7、printf("輸入錯誤,請重新輸入!n"); goto Is_Star_DoMain; Is_Msp_DoMain:輸入男子項目總數并判斷男子項目范圍大小是否合法 Is_Wsp_DoMain:輸入女子項目總數并判斷女子項目范圍大小是否合法2) 輸入記錄:char answer; /*接受判斷所有項目是否結束:'y'結束,'n'沒結束*/ head = (struct schoolstruct *)malloc(sizeof(struct schoolstruct); head->next = NULL; pfirst = head;
8、/*工作指針*/ answer = 'y' while ( answer = 'y' ) Is_Game_DoMain: 提示用戶選擇取前三名還是前五名,奇數項為取五名,偶數項取前三名,判斷是否已經輸入過或者是否超出范圍。 overgame = *pafirst; if ( pafirst != phead ) for ( pasecond = phead ; pasecond < pafirst ; pasecond + ) if ( overgame = *pasecond ) printf("n*此運動項目已經輸入過,請重新選擇其他項目序號
9、!n"); goto Is_Game_DoMain; pafirst = pafirst + 1; if ( overgame > ntsp|overgame<=0 ) printf("n沒有這樣的運動項目!"); printf("n請重新輸入!"); goto Is_Game_DoMain; switch ( overgame%2 ) /*判斷奇偶性*/ case 0: n = 3;break; case 1: n = 5;break; for ( i = 1 ; i <= n ; i+ ) Is_Serial_DoMain
10、: printf("n請輸入第 %d名學校的編號(>0&<=%d): ",i,nsc); scanf("%d",&serial); if ( serial > nsc ) /*判斷是否存在該校*/ printf("n編號超出學??倲?n請重新輸入!"); goto Is_Serial_DoMain; if ( head->next = NULL ) /*建立第一個節(jié)點*/ create(); psecond = head->next ; /*遍歷指針*/ while ( psecond !
11、= NULL ) /*遍歷鏈表判斷是否已存在該校*/ if ( psecond->serial = serial ) pfirst = psecond; pfirst->count = pfirst->count + 1; goto Store_Data; else psecond = psecond->next; create();Store_Data:/*存儲數據*/ pfirst->athletepfirst->count.item = overgame; pfirst->athletepfirst->count.range = i; pf
12、irst->serial = serial; printf("請輸入學校名稱: "); scanf("%s",pfirst->athletepfirst->); printf("請輸入運動員姓名: "); scanf("%s",pfirst->athletepfirst->count.xingming); 3. 計算統(tǒng)計模塊,通過遍歷鏈表,將各參賽學校的成績統(tǒng)計出來并存入結構成員中,來修改鏈表中的數據.判斷運動項目奇偶性予以不通名字賦值: if ( pfirst-&
13、gt;athletei.item % 2 = 0 ) /*偶數項目*/ switch (pfirst->athletei.range) case 1:pfirst->athletei.score = 5;break; case 2:pfirst->athletei.score = 3;break; case 3:pfirst->athletei.score = 2;break; else /*奇數項目*/ switch (pfirst->athletei.range) case 1:pfirst->athletei.score = 7;break; case
14、 2:pfirst->athletei.score = 5;break; case 3:pfirst->athletei.score = 3;break; case 4:pfirst->athletei.score = 2;break; case 5:pfirst->athletei.score = 1;break; 計算男女項目的各自成績及團體總成績: if ( pfirst->athletei.item <=msp ) /*男子項目*/ pfirst->menscore = pfirst->menscore + pfirst->athl
15、etei.score; else /*女子項目*/ pfirst->womenscore = pfirst->womenscore + pfirst->athletei.score; pfirst->totalscore = pfirst->menscore + pfirst->womenscore; pfirst = pfirst->next;4. 成績的輸入,即成績的查詢。1) 查詢單個學校的成績表。School()printf("請選擇要查詢的學校編號(1-%d):",nsc);pfirst = head->next;
16、psecond = head->next; while ( pfirst->next != NULL ) /*學校*/scanf("%d",&a); if(a<=0|a>nsc) printf("輸入學校編號超出范圍,請重新輸入!"); School(); 在小于總項目數范圍呢,從第一個項目開始察看是否有學校代碼與要察看的學校代碼相同的,如果有輸出。 printf("n編號為%d的學校的成績如下:n",a); printf("n項目編號t運動員姓名t名次t得分"); for (i=1
17、;i<=ntsp;i+) /*運動員*/ for(j=1;j<=5;j+) if(pfirst->athletej.serial=a)printf("n%dtt%st%dt%dn",j,pfirst->athletepfirst->count.xingming, pfirst->athletej.range,pfirst->athletej.score); 2) 男女總分及團體總分輸出。由于男女團體總分,和團體總分在計算過程中已經計算完成,這里可以直接調用。Overall() printf("n比賽情況結果顯示:n學校編號
18、t學校名稱tt男子團體總分t女子團體總分t團體總分"); pfirst = head->next; while ( pfirst->next != NULL ) printf("n %dtt %stt %dtt %dtt %d",pfirst->serial,pfirst->athletepfirst->,pfirst->menscore,pfirst->womenscore,pfirst->totalscore); pfirst = pfirst->next; pfirst = pfirs
19、t->next; 5. 主函數和其他函數算法。 main() /*主函數:主函數很簡單,大部分是調用其他函數來實現功能的*/ 初始化 Firstout(); Inserts(); Firstout() printf("n*n"); printf("* 運動會分數統(tǒng)計系統(tǒng) *n"); printf("*n"); printf("* 1.開始輸入數據 *n"); printf("* 2.退出系統(tǒng) *n"); printf("*n"); printf("請選擇操作:
20、n"); i=getche(); switch(i)/*根據選擇進行操作*/ 其他一些提示性操作6. 函數的調用關系圖反映了演示程序的層次結構:MainCputCalculateStartFirstoutFindSchoolOverallInsertsInputSceondoutIs_Star_DoMainIs_Wsp_DoMainIs_Msp_DoMainStore_DataIs_Game_DoMainIs_Serial_DoMain四、測試分析1. 調試中所遇到的較重要問題的回顧:1) 提出問題:所有輸入輸出內容只能在一屏內顯示,學過c語言,很知道”n”是換行,”f”是換屏的,可
21、是在這里就是無法實現。解決問題: 輸入clrscr();2)提出問題:設置選項,供用戶輸入選擇時,當按任意鍵時都會跳入下一步操作,或者直接退出系統(tǒng)。分析問題:在供用戶選擇時,提供了幾個選項,就寫幾個case語句,但是當用戶輸入的并不是這幾個數字時,系統(tǒng)就不能做出正確判斷。解決問題:修改case語句,添加default語句提示出錯,要求重新輸入; Default: clrscr(); /*清屏*/ printf("輸入錯誤,請重新選擇"); 3)提出問題:當同一項目中有同一學校的兩個人時,便不能正確輸出或者輸出相同人名。 分析問題:由于同時有兩個相同學校編號的人存在,系統(tǒng)在輸
22、出時,不能確定那個是正確的,或者用后來的覆蓋以前的。 解決問題:用for函數實現從開始到結尾的遍歷。2. 算法的效率及改進設想 算法的效率:總的來講,嚴重引響執(zhí)行速度的便是查找,查找任意一個數據,便要將其所在的結構從頭至尾遍歷一次,耗費大量的時間。 改進設想:因大部分顯示均是以學校為單位,所以將以由有關人的各種信息為集合的結構改為以由有關學校的各種信息為集合的結構。五、用戶手冊1) 運行可執(zhí)行程序sport.exe;2) 出現提示:* 運動會分數統(tǒng)計系統(tǒng) * 1.開始輸入數據 * 2.退出系統(tǒng) *請選擇操作:選擇1,進入數據錄入;3) 根據提示輸入學校個數,男子項目個數及女子項目個數,如果輸入
23、超出范圍,會出現提示:“輸入錯誤,請重新輸入!”并返回重新輸入; 4) 出現如下提示:奇數項目取前五名偶數項目取前三名請輸入運動項目序(<=ntsp)根據需要輸入項目編號; 如果輸入編號超出范圍,會提示“沒有這樣的運動項目!請重新輸入!” ,如果該項目已經輸入過,則提示:“此運動項目已經輸入過,請重新選擇其他項目序號!” ; 5) 根據屏幕提示輸入各個名次學校編號、學校名稱和運動員姓名,如果輸入學校編號超出范圍會提示:“編號超出學校總數!n請重新輸入!”;特別說明:如果兩次對同一編號的學校輸入不通的校名,將保留后來輸入的校名; 6) 輸入完畢,提示用戶是否繼續(xù)輸入下一個項目數據,“y”是
24、“n”否;7) 選擇否后進入下一界面:* 運動會分數統(tǒng)計系統(tǒng) * 1.成績查詢 * 2.全部重錄(重新開始) * * 3.退出 * *請選擇繼續(xù)操作:選擇1進程成績查詢,選擇2返回2);8) 選擇1后進入查詢選擇頁面:* 運動會分數統(tǒng)計系統(tǒng)查詢 * 1.各學校成績單 * 2.團體總分 * 3.返回上一級 * 請選擇繼續(xù)操作:選擇1按學校編號進行查詢,選擇2查詢學校男女團體總分和團體總分表,選擇3返回到上一界面;9) 選擇1后,提示用戶輸入查詢學校編號,輸入即顯示改校成績,包括項目編號、運動員姓名、分數和名次,并可根據提示選擇其他操作;* * 運動會分數統(tǒng)計系統(tǒng)-各學校成績查詢 * 1.繼續(xù)各學
25、校成績查詢 * 2.團體總分查詢 * 3.返回上一級菜單 * 4.退出系統(tǒng) * 編號為%d的學校的成績如下: 項目編號 運動員姓名 名次 得分 * * * * 10) 選擇2后,顯示各學校編號、男子團體總分、女子團子總分和團體總分,并可根據提示選擇其他操作,顯示如下: * 運動會分數統(tǒng)計系統(tǒng)-團體總分查詢 * 1.各學校成績查詢 * 2.返回上一級菜單 * 3.退出 * 比賽情況結果顯示:學校編號 學校名稱 男子團體總分 女子團體總分 團體總分"* * * * *六、測試結果: 輸入學校數目:8,男子項目5,女子項目5; 輸入成績如下:(注:名次從左往右依次遞增,其它同一)項目編號:
26、1 得分類型: 五級制取得名次12345學校編號12345學校名稱青島理工大學青島科技大學青島大學中國海洋大學石油大學項目編號:4 得分類型: 三級制學校編號461學校名稱中國海洋大學青島濱海學院青島理工大學項目編號:3 得分類型:五級制學校編號3178(10)2學校名稱青島大學青島理工大學青島職業(yè)學院萊陽農學院青島科技大學項目編號:8 得分類型:三級制學校編號(0)362學校名稱 青島大學青島濱海學院青島科技大學項目編號:5 得分類型:五級制學校編號82144學校名稱萊陽農學院青島科技大學青島理工大學中國海洋大學中國海洋大學項目編號:7 得分類型:五級制學校編號23517學校名稱青島科技大學
27、青島大學華東石油大學青島理工大學青島職業(yè)學院項目編號:6 得分類型:三級制學校編號353學校名稱青島大學華東石油大學青島大學輸入數據后所得的不同方式查詢的結果:1、 從主菜單起的路徑:1開始輸入數據進行數據輸入繼續(xù)輸入數據1.查詢成績2.團體總分查詢顯示結果如下:學校編號學校名男子團體總分女子團體總分團體總分8萊陽農學院9097青島職業(yè)學院3146青島濱海學院3365華東石油大學1674中國海洋大學100103青島大學1017272青島科技大學119201青島理工大學172192、從1顯示提示起的路徑:1.各學校成績查詢輸入學校編號查詢輸入編號:1項目編號學校名稱名次得分1青島理工大學173青
28、島理工大學254青島理工大學325青島理工大學337青島理工大學423. 從2顯示提示起的路徑:1.各學校成績查詢輸入學校編號查詢輸入編號:4項目編號學校名稱名次得分1中國海洋大學424中國海洋大學155中國海洋大學425中國海洋大學515. 從3顯示提示起的路徑:1.各學校成績查詢輸入學校編號查詢 輸入編號:9 輸入學校編碼超出范圍,請重新輸入!6. 從4顯示提示起的路徑4退出,退出系統(tǒng).七、心得體會在此次設計中,明顯感到自己所學知識不夠,而且運用不是很熟練。在數據結構分析和使用上還有待改進和提高。在今后的學習中,一定得認真學習,多做練習,多寫程序。對于指針的使用,由于之前在c語言的學習過程
29、中,沒有很好的掌握,在數據處理和調用過程中導致調用失敗,結果無法顯示.經過幾天的學習,對數據結構的知識有了更深一步的了解,對c語言的知識也有了深一步的鞏固,知道了一個系統(tǒng)設計的大體步驟和方法,特別的是函數的調用問題有了更深的理解,由于調用的出現可以減少很多不必要的麻煩,可同時也造成了系統(tǒng)處理的緩慢.總之,作這個系統(tǒng)讓我收獲很多,給我將來的設計之路作好了很好的準備. 八、附錄:程序原代碼如下:/*包含的頭文件有:*/#include <malloc.h> /*分配size個字節(jié)的內存空間*/#include <stdio.h> /*輸入輸出函數*/#include <
30、;stdlib.h> /*動態(tài)存儲分配函數或其他函數*/#define NULL 0#define MaxSize 30/*變量的定義一:*/struct athletestruct /*參賽運動員*/ char name20; int score; /*得分成績*/ int range; /*得分名次*/ int item; /*得分項目*/;struct schoolstruct /*參賽學校*/ int count; /*計算實際運動員個數*/ int serial; /*學校編號*/ int menscore; /*男子團體總分*/ int womenscore; /*女子團體總
31、分*/ int totalscore; /*團體總分*/ struct athletestruct athleteMaxSize; /*參賽運動員*/ struct schoolstruct *next; /*參賽學校*/;/*變量的定義二:*/int nsc,msp,wsp; /*實際參賽學校個數,男子項目,女子項目*/int ntsp; /*項目總數*/int i,j; /*循環(huán)控制變量*/int overgame; /*已結束的項目編號*/int serial,range; /*獲獎的學校編號 & 獲獎名次*/int n; /*用來判斷項目類型(奇&偶)*/struct
32、schoolstruct *head,*pfirst,*psecond; /*用于開辟存儲區(qū)域*/int *phead=NULL,*pafirst=NULL,*pasecond=NULL; /*用于項目數組指針*/*A:輸入模塊*/* 建立鏈表,然后存儲數據。*/ /*建立鏈表*/cput () Is_Star_DoMain: printf("n請輸入參賽學??倲担?lt;= 20): "); scanf("%d",&nsc); if(nsc<=0|nsc>20) printf("輸入錯誤,請重新輸入!n"); g
33、oto Is_Star_DoMain; Is_Msp_DoMain: printf("請輸入男子項目總數(<=30): "); scanf("%d",&msp); if(msp<=0|msp>30) printf("輸入錯誤,請重新輸入!n"); goto Is_Msp_DoMain; Is_Wsp_DoMain: printf("請輸入女子項目總數(<=20): "); scanf("%d",&wsp); if(wsp<=0|wsp>20)
34、printf("輸入錯誤,請重新輸入!n"); goto Is_Wsp_DoMain;input () char answer; /*接受判斷所有項目是否結束:'y'結束,'n'沒結束*/ head = (struct schoolstruct *)malloc(sizeof(struct schoolstruct); head->next = NULL; pfirst = head; /*工作指針*/ answer = 'y' while ( answer = 'y' ) Is_Game_DoMain:
35、 printf("n奇數項目取前五名n偶數項目取前三名"); printf("n請輸入運動項目序號(<=%d):",ntsp); scanf("%d",pafirst); overgame = *pafirst; if ( pafirst != phead ) for ( pasecond = phead ; pasecond < pafirst ; pasecond + ) if ( overgame = *pasecond ) printf("n*此運動項目已經輸入過,請重新選擇其他項目序號!n")
36、; goto Is_Game_DoMain; pafirst = pafirst + 1; if ( overgame > ntsp|overgame<=0 ) printf("n沒有這樣的運動項目!"); printf("n請重新輸入!"); goto Is_Game_DoMain; switch ( overgame%2 ) case 0: n = 3;break; case 1: n = 5;break; for ( i = 1 ; i <= n ; i+ ) Is_Serial_DoMain: printf("n請輸入
37、第 %d名學校的編號(>0&<=%d): ",i,nsc); scanf("%d",&serial); if ( serial > nsc ) /*判斷是否存在該校*/ printf("n編號超出學??倲?n請重新輸入!"); goto Is_Serial_DoMain; if ( head->next = NULL ) /*建立第一個節(jié)點*/ create(); psecond = head->next ; /*遍歷指針*/ while ( psecond != NULL ) /*遍歷鏈表判斷是否
38、已存在該校*/ if ( psecond->serial = serial ) pfirst = psecond; pfirst->count = pfirst->count + 1; goto Store_Data; else psecond = psecond->next; create();Store_Data: /*存儲數據*/ pfirst->athletepfirst->count.item = overgame; pfirst->athletepfirst->count.range = i; pfirst->serial =
39、serial; printf("請輸入學校名稱: "); scanf("%s",pfirst->athletepfirst->); printf("n是否是否繼續(xù)輸入運動項目?(y&n) "); answer = getch(); printf("n"); /*B:計算統(tǒng)計模塊*/* 通過遍歷鏈表,將各參賽學校的成績統(tǒng)計出來并存入結構成員中,來修改鏈表中的數據。*/*計算*/calculate() pfirst = head->next; while ( pfirst-
40、>next != NULL ) for (i=1;i<=pfirst->count;i+) if ( pfirst->athletei.item % 2 = 0 ) /*偶數項目*/ switch (pfirst->athletei.range) case 1:pfirst->athletei.score = 5;break; case 2:pfirst->athletei.score = 3;break; case 3:pfirst->athletei.score = 2;break; else /*奇數項目*/ switch (pfirst->athletei.range) case 1:pfirst->athletei.score = 7;break; case 2:pfirst->athletei.score = 5;break; case 3:pfirst->athletei.score = 3;break; case 4:pfirs
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南昌市污泥固化處理工程方案
- 2025年天津市創(chuàng)佳時代科技企業(yè)管理有限公司招聘考試筆試試題(含答案)
- 2025年濟寧金鄉(xiāng)縣城鎮(zhèn)公益性崗位招聘考試筆試試題(含答案)
- 老年癡呆中醫(yī)課件
- 老年護理課件結尾
- 老年護理職業(yè)前景
- 老師的視頻課件圖片
- 老師開班會課件模板
- 老師如何開班會課件
- 餐廳裝修工程進度與付款管理合同
- 2024水電站實時數據采集規(guī)范
- 山東省濟南市南山區(qū)2022-2023學年六年級下學期期末考試語文試題
- 物業(yè)員工壓力管理培訓課件
- 護士進修的人體解剖與生理學
- 二級醫(yī)院PCCM規(guī)范化建設標準解讀
- 品牌形象設計之輔助圖形的操作
- 可用性控制程序
- T73繼電器組裝生產線技術方案
- 團員組織關系轉接介紹信(樣表)
- 福建省泉州市泉州實驗中學2024屆八上數學期末聯考模擬試題含解析
- 抖音員工號申請在職證明參考模板
評論
0/150
提交評論