歌唱比賽評分系統設計(C語言完整版).docx_第1頁
歌唱比賽評分系統設計(C語言完整版).docx_第2頁
歌唱比賽評分系統設計(C語言完整版).docx_第3頁
歌唱比賽評分系統設計(C語言完整版).docx_第4頁
歌唱比賽評分系統設計(C語言完整版).docx_第5頁
已閱讀5頁,還剩81頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

。軟件設計實踐報告學 院: 中北大學信息商務學院 專 業: 通信工程專業 題 目: 歌唱比賽評分系統 1305044142 王 澤 學生姓名: 1305044138 郭世杰 1305044149 賀 鑫 完成時間: 2016年1月18日 指導教師: 魯旭濤 姚愛琴 李沅 目錄課程設計任務書41需求分析51.1題目分析51.2系統分析52設計概要63程序設計及模塊分工明細73.1人員模塊分工73.2人員模塊分工明細74測試結果354.1調試與測試354.2測試結果截圖36設計總結42致 謝43參考文獻44附錄45課程設計任務書1 設計目的C語言是通信工程專業一門重要的專業技術課程,它是一門實踐性很強的課程。軟件設計實踐課程是為配合c語言課程,對學生進行全面綜合訓練、與課堂教學、作業練習題、上機實驗相輔的必不可少的一個教學環節。利用所學的C語言知識及其編程方法:結構程序設計、數組、指針、結構體、文件操作等內容,通過布置具有一定難度的實際程序設計題目,要求學生獨立完成所布置題目。在分析設計過程中,要求學生養成良好的編程習慣,學會分析解決簡單的實際問題,學會C語言的實際調試技巧和方法,要求學生在教師的指導下逐步完成應用程序的設計2 設計內容和要求有十個選手參加歌唱比賽,十個裁判對每個選手的演唱進行打分,去掉一個最高分,去掉一個最低分,剩下分數的平均值作為每位選手最后的成績。要求:(1)采用結構體定義每個選手的參賽編號,姓名以及十個裁判打出的分數;(2)從鍵盤輸入每個選手的相關信息:參賽編號,姓名和十個得分;(3)計算每位選手的最后得分,并按分數由高到低排序;(4)查詢功能:輸入參賽選手的編號或姓名,便可輸出該選手的得分以及排名;以上功能采用菜單操作方式,即從鍵盤輸入1到3這三個數,分別完成以上(2)到(4)的功能。3 設計工作任務及工作量的要求u 每個組員完成自己的模塊設計。u 完成一份設計說明書。u 有正確的運行結果及結果分析1 需求分析1.1 題目分析軟件設計實踐課程是為配合c語言課程,對學生進行全面綜合訓練、與課堂教學、作業練習題、上機實驗相輔的必不可少的一個教學環節。利用所學的C語言知識及其編程方法:結構程序設計、數組、指針、結構體、文件操作等內容,通過布置具有一定難度的實際程序設計題目,要求學生獨立完成所布置題目。在分析設計過程中,要求學生養成良好的編程習慣,學會分析解決簡單的實際問題,學會C語言的實際調試技巧和方法來解決實際問題。1.2 系統分析歌唱比賽評分系統包括:u 菜單:系統以菜單方式工作,界面友好,易于操作。u 錄入:在每個輸入前都有詳細分類和提示,簡單明了,根據提示輸入參賽選手號數,姓名,各個評委打分成績。u 查詢:用戶輸入查詢條件,系統規則地在界面顯示查詢結果,不光可以輸入號數,查詢到該選手信息,每位評委打分;還可以選擇排名查詢,顯示的數據全面。u 修改:在已有數據的基礎上實現對每位選手的信息,以及評分的修改。u 排名:利用冒泡程序對數組進行排序,刪除一個最高與最低然后進行講剩下的值平均,得出選手最終得分,再根據分數高低排名。u 儲存:對于已經輸入的數據,已文檔的信息儲存到電腦硬盤中,實現永久儲存。系統的程序設計環境:本系統使用Visual C+ 作為程序開發工具。Visual C+是基于對象的快速應用程序開發工具,是當今最強大、最靈活的應用程序開發工具之一,具有良好的可視化應用程序開發環境和強大的可擴展數據庫功能。利用Visual C+提供的可視化組件庫進行編程,可以快速、高效地開發出基于Windows環境的各類應用程序。Visual C+語言的特點是面向對象設計的程序語言,Visual C+的基礎編程語言是具有面向對象特性的語言,具有代碼穩定、可讀性好、編譯速度快等優點,并將面向對象的概念移植到了C語言中,使這種基礎語言有了新的發展空間。與其它編程軟件相比,特別是在數據庫和網絡應用方面,Visual C+具有簡便易用、靈活高效的特點。開發軟件通常要經過修改源代碼、編譯、測試、再修改、再編譯、再測試等操作,這些操作形成了一個開發循環,所以快速的編譯器可以大大地降低開發周期。Visual C+正是建立在這種高效編譯器的基礎之上,是針對Windows的最快的高級語言代碼編譯器,因此生成的代碼十分精練高效,使Visual C+程序的運行速度更快。這也是使用Visual C+作為程序設計開發語言的重要原因。2 設計概要總體設計目標:使用者可以利用本系統進行對選手信息以及評委評分的各項運算操作,如根據需求添加選信息,刪除選手信息,對選手得分進行排名等。最后清晰完整的結果于屏幕中。方便了評分操作,不僅節省時間,而且提高準確性,可以達到事半功倍的效果。總體設計策略:本系統采用的是自頂向下、層次化的模塊結構。對高層模塊,采用以事務為中心的設計策略,把一個大的模塊逐步分解成較小的相對簡單的模塊。對低層模塊,采用以變換為中心的設計策略。為了提高每個模塊的內聚性、降低模塊間的耦合性,將每個模塊設計成具有單一功能的模塊(即功能內聚),使模塊間的聯系完全是通過主模塊的控制和調用來實現(即非直接耦合)。結合上述分析該系統應包括以下模塊:選手信息瀏覽,選手信息錄入,選手信息保存,選手成績查詢,選手信息修改,選手信息刪除。選手數據:編號、姓名、成績、平均成績。圖1.總體結構圖3 程序設計及模塊分工明細3.1 人員模塊分工王 澤:瀏覽選手數據browse();查詢選手成績search();查詢選手信息print()。郭世杰:菜單函數menu_select(); 修改函數update(); 保存函數save()。賀 鑫: 參賽選手信息錄入creat();成績排序rank();刪除函數del();公共模塊:color()、quit()、welcome()。3.2 人員模塊分工明細l 瀏覽選手數據browse()分析:實際為鏈表的遍歷,將頭節點的指針給予臨時節點p1,用while語句實現鏈表的遍歷。圖2.瀏覽選手數據模塊/*- browse函數 -*/void browse() SONGER_MESSAGE *p1; if(head = NULL & tail = NULL) printf(n-當前信息記錄為空-n); else printf(n-你要瀏覽的選手信息如下-n); printf(-|-n); printf( 編號 | 姓名 n); p1=head; while(p1 != NULL) printf(-|-n); printf( %-9d%-6sn,p1-num,p1-name); p1=p1-next; printf(-|-n); l 查詢選手成績search()分析:提供詳細成績查詢,排名查詢的函數調用。其中各功能均采用菜單選擇的方式。圖3.查詢選手成績/*- search函數-*/void search() int c; printf(n請選擇查詢內容:n); printf(1.選手詳細成績查詢 2.選手排名查詢n請輸入您的選擇:); scanf(%d,&c); switch(c) case 1: system(cls); print(); break; case 2: system(cls); rank(); break; l 查詢選手信息print()分析:實際為輸出鏈表中的某個某個節點,輸出某個選手的編號與姓名較為好實現,輸出10位評委成績則用的for語句來實現。圖4.查詢選手信息模塊/*- print函數 -*/void print() SONGER_MESSAGE * p1=(SONGER_MESSAGE *)malloc(LEN); int check=0,i; long seeknum; printf(n請輸入要查找的選手編號:); scanf(%d,&seeknum); if(head = NULL & tail = NULL ) printf(n對不起,當前記錄為空!n); else p1=head; printf(n-你要找的選手的成績如下-n);/在這里找到了要查找的選手成績 printf(-|-|-|-|-|-|-|-|-|-|-|-|-|-|-n); printf( 編號 | 姓名 | 成績| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 平均成績n); printf(-|-|-|-|-|-|-|-|-|-|-|-|-|-|-n); while(p1 != NULL) if(p1-num = seeknum) printf( %-7d%-6s,p1-num,p1-name); printf( ); for(i=0; igradesi); printf( %-6.2lfn,p1-ave); check=1; getchar(); return; else p1=p1-next; if(head != NULL & check = 0) printf(n對不起,你查看的選手成績不存在!n); getchar();l 菜單函數menu_select()分析:菜單主函數要求設計比較簡潔,只提供設輸入,處理和輸出部分的函數調用。其中各功能模塊用菜單方式選擇。圖5菜單模塊/*- menu_select函數 -*/void menu_select() char s100; int c; gets(s); /不管用戶輸入的是數字鍵或是字母鍵使用gets都能將輸入作為字符串接收 while(1) /限定用戶輸入的數值必須在1-7之間才有效,否則要求重新輸入 c = atoi(s); /利用atoi()函數將所接收的字符串轉換成數值,提供給if語句判斷 if(c 7) printf(您的輸入有誤,請重新輸入:); gets(s); else break; switch(c) case 1: system(cls); /清屏 browse(); /選手信息瀏覽 break; case 2: system(cls); creat(); /選手信息錄入 break; case 3: system(cls); save(); /選手信息保存 break; case 4: system(cls); search(); /選手成績查詢 break; case 5: system(cls); update(); /選手信息修改 break; case 6: system(cls); del(); /選手信息刪除 break; case 7: system(cls); quit(); /退出系統 return; break; default: break; getchar(); system(cls); menu(); menu_select();l 修改函數update()分析;實現選手信息的修改,核心內容為鏈表的遍歷。找出要修改的選手,修改其個人信息。圖6.修改模塊/*- update函數 -*/void update() SONGER_MESSAGE *p1;/=(SONGER_MESSAGE *)malloc(LEN); int check=0; /用來進行判斷,是否找到了要修改的信息 long updatenum; printf(n請輸入要修改的選手編號:); scanf(%d,&updatenum);/查找到要修改的選手 if(head = NULL & tail = NULL) printf(n-當前信息記錄為空-n); else p1=head; while(p1 != NULL) if(p1-num = updatenum) printf(n-你要修改的選手信息如下-n); printf(-|-n); printf( 編號 | 姓名 n); printf(-|-n); printf( %-9d%-6sn,p1-num,p1-name); printf(-|-n); printf(n-請重新寫入此選手信息:-n); check=1;/從新寫入修改項目 printf(n修改選手編號為:); scanf(%d,&p1-num); printf(n修改選手姓名為:); scanf(%s,p1-name); return; else p1=p1-next; if(head != NULL & check = 0) printf(n對不起,你要修改的選手信息不存在!n); getchar();l 保存函數save()分析:保存文件的流程。使用fopen()函數打開txt文件,“w”參數代表打開只寫文件,再利用fprintf()函數寫入選手內容,最后用fclose()函數關閉文件。圖7.保存模塊/*- save函數 -*/void save()/將數據保存到文件 FILE *fp; SONGER_MESSAGE *p1;/=(SONGER_MESSAGE *)malloc(LEN); p1=head; fp=fopen(參賽選手名單.txt,w); fprintf(fp,-|-n); fprintf(fp, 編號 | 姓名 n); while(p1 != NULL) fprintf(fp,-|-n); fprintf(fp, %-9d%-6sn,p1-num,p1-name); p1=p1-next; fprintf(fp,-|-n); fclose(fp); printf(nt文件已將保存到參賽選手名單.txt);l 參賽選手信息錄入creat()分析:錄入信息表現為創建鏈表節點并給節點的元素賦值,然后對評委的分數進行排序(鏈表的排序),排序選擇冒泡排序法,最后去掉一個最高分去掉一個最低分。圖7.參賽選手信息錄入模塊/*- creat函數 -*/void creat() int i,j; float t; char c=y; while(c = y | c = Y) SONGER_MESSAGE *p1=(SONGER_MESSAGE *)malloc(LEN); printf(n請輸入要錄入的選手信息:n); printf(n選手編號:); scanf(%d,&p1-num); printf(n選手姓名:); scanf(%s,p1-name); printf(n請輸入10位評委點評成績:); p1-ave = 0; for(i=0; igradesi); /runtime error p1-ave += p1-gradesi; for(i=0; iN-1; i+) /冒泡排序法讓那個成績從小到大排列,然后選出最大值是最后一個,最小值是第一個 for(j=0; jgradesjp1-gradesj+1) t=p1-gradesj; p1-gradesj=p1-gradesj+1; p1-gradesj+1=t; p1-ave=(p1-ave-(p1-grades0+p1-grades9)/8;/去掉一個最高分,去掉一個這一低分,得出最后的平均分 p1-next=NULL; if(p1=NULL) printf(n內存分配失敗n); n=n-1; if(head = NULL & tail = NULL) /當前沒有結點,創建第一個結點 head=p1; head-next=NULL; tail=head; printf(n-選手信息錄入成功-n); else /如果當前還有節點則插入到尾部 tail-next=p1; tail=p1; tail-next=NULL; printf(n-選手信息錄入成功-n); printf(是否繼續(Y/N):); getchar(); scanf(%c,&c); l 成績排序rank()分析:用冒泡排序的方法對平均成績(鏈表)進行排序。圖8.成績排序模塊/*- rank函數 -*/void rank() SONGER_MESSAGE *p1,*p2,*endpt,*p; / *endpt/*控制循環比較*/ *p/*臨時指針變量*/ n=0; p1=head; if(head = NULL & tail = NULL) printf(n-當前信息記錄為空-n); else p1 = (SONGER_MESSAGE *)malloc(LEN); p1-next = head; /*注意理解:我們增加一個節點,放在第一個節點的前面,主要是為了便于比較。因為第一個節點沒有前驅,我們不能交換地址。*/ head = p1; /*讓head指向p1節點,排序完成后,我們再把p1節點釋放掉*/ for(endpt=NULL; endpt!=head; endpt=p) /*結合第6點理解*/ for(p=p1=head; p1-next-next!=endpt; p1=p1-next) if(p1-next-ave next-next-ave) /*如果前面的節點鍵值比后面節點的鍵值小,則交換*/ p2 = p1-next-next; /1、排序后q節點指向p節點,在調整指向之前,我們要保存原p的指向節點地址,即:p2=p1-next-next p1-next-next = p2-next; /2、順著這一步一步往下推,排序后p1-next-next要指的是p2-next,所以p1-next-next=p2-next p2-next = p1-next; /3、p2-next原是q發出來的指向,排序后q的指向要變為指向p的,而原來p1-next是指向p的,所以p2-next=p1-next p1-next = p2; /4、p1-next原是指向p的,排序后圖16中p1-next要指向q,原來p1-next-next(即p2)是指向q的,所以p1-next=p2 p = p1-next-next; /5、至此,完成了相鄰兩節點的順序交換 p1 = head; /*把p1的信息去掉*/ head = head-next; /*讓head指向排序后的第一個節點*/ free(p1); /*釋放p1*/ printf(n-選手成績排名信息如下-n); printf(-|-|-|-n); printf( 編號 | 姓名 |平均成績| 名次 n); p1=head; while(p1 != NULL) printf(-|-|-|-n); printf( %-9d%-9s%-9.1lf%-5dn,p1-num,p1-name,p1-ave,n+1); n+; p1=p1-next; printf(-|-|-|-n); getchar();l 刪除函數del()分析:節點的刪除較為繁瑣。第一種情況:數據在鏈表頭部,并且只有一個結點。第二種情況:數據在鏈表頭部 ,頭結點。第三種情況:數據在鏈表中間,中間節點。第四種情況:數據在鏈表尾部,尾部節點。圖9.刪除模塊/*- del函數 -*/void del() SONGER_MESSAGE *node;/=(SONGER_MESSAGE *)malloc(LEN); SONGER_MESSAGE *p1; int check=0; /用來進行判斷,是否找到了要刪除的信息 long del_num; printf(n請輸入要刪除的選手的編號:); scanf(%d,&del_num); if(head = NULL & tail =NULL) printf(n當前信息記錄為空,刪除失敗!n); else node=head; p1=head; while(node != NULL) if(node-num = del_num) printf(n-要刪除的選手信息-n); printf(-|-n); printf( 編號 | 姓名 n); printf(-|-n); printf( %-9d%-6sn,node-num,node-name); /在這里找到了要刪除的選手信息 printf(-|-n); check=1; /找到要刪除的信息,賦為真 if(node = head & head-next = NULL) /是頭結點,并且只有一個結點 head=NULL; tail=head; free(node); printf(n-刪除信息成功-n); /刪除唯一的節點 else if(node = head & head-next != NULL) /刪除頭節點 node=head; head=head-next; free(node); printf(n-刪除信息成功-n); /頭節點刪除成功 n=n-1; else if(node -next != NULL) /刪除中間節點 p1-next=node-next; free(node); printf(n-刪除信息成功-n); /中間節點刪除成功 n=n-1; else if(node-next = NULL) /刪除尾節點 p1-next=NULL; tail=p1; free(node); printf(n-刪除信息成功-n); /尾節點刪除成功 n=n-1; getchar(); return; else p1=node; node=node-next; if(head != NULL & check = 0) printf(n對不起,你要刪除的選手信息不存在!n); getchar();u 公共模塊l 顏色控制函數color()分析:為了使程序看起來更美觀,所以引入windows api來控制顏色函數,用來改變字體顏色。/*-color函數 -*/void color(const unsigned short color1) /*僅限改變0-15的顏色;如果在0-15那么實現他的顏色 因為如果超過15后面的改變的是文本背景色。*/ if(color1=0&color1=15) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color1); /*如果不在0-15的范圍顏色,那么改為默認的顏色白色;*/ else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); /*顏色對應值: 0=黑色 8=灰色 1=藍色 9=淡藍色 2=綠色 10=淡綠色 0xa 3=湖藍色 11=淡淺綠色 0xb 4=紅色 12=淡紅色 0xc 5=紫色 13=淡紫色 0xd 6=黃色 14=淡黃色 0xe 7=白色 15=亮白色 0xf*/l 退出函數quit()分析:用來退出程序/*- quit函數 -*/void quit() printf(nnt=感謝您使用歌唱比賽評分系統=nn);l 目錄函數menu()分析;為程序入口提供顯示,因篇幅有限,所以顯示有錯亂。/*- menu函數 -*/void menu() system(mode con cols=100 lines=30); color(11); printf(t .;r155551r;. n); printf(t歌唱比賽評分系統 :r1hhhhhhhhhh1r: n); printf(t :1SSSS555555555SSSSSr n); printf(t .sSSS55555555555555SS1. ,. n); printf(t1.選手信息瀏覽 hS5555555555555555SSi iSh. n); printf(t rS555555555555555SSh, .sSSS1 n); printf(t rh55555555555555SS5i ;5S555S, n); printf(t2.選手信息錄入 Sh555555555555SS5r ,1SS5555Si n); printf(t hh5555555555SS5r

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論