版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
..-..-可修遍-"軟件設計實踐"報告學院:中北大學信息商務學院專業(yè):通信工程專業(yè)題目:歌唱比賽評分系統(tǒng)1305044142王澤學生:1305044138郭世杰1305044149賀鑫完成時間:2016年1月18日指導教師:魯旭濤愛琴沅目錄課程設計任務書21需求分析21.1題目分析21.2系統(tǒng)分析22設計概要23程序設計及模塊分工明細23.1人員模塊分工23.2人員模塊分工明細24測試結果24.1調試與測試24.2測試結果截圖2設計總結2致2參考文獻2附錄2課程設計任務書設計目的C語言是通信工程專業(yè)一門重要的專業(yè)技術課程,它是一門實踐性很強的課程。軟件設計實踐課程是為配合c語言課程,對學生進展全面綜合訓練、與課堂教學、作業(yè)練習題、上機實驗相輔的必不可少的一個教學環(huán)節(jié)。利用所學的C語言知識及其編程方法:構造程序設計、數(shù)組、指針、構造體、文件操作等容,通過布置具有一定難度的實際程序設計題目,要求學生獨立完成所布置題目。在分析設計過程中,要求學生養(yǎng)成良好的編程習慣,學會分析解決簡單的實際問題,學會C語言的實際調試技巧和方法,要求學生在教師的指導下逐步完成應用程序的設計設計容和要求有十個選手參加歌唱比賽,十個裁判對每個選手的演唱進展打分,去掉一個最高分,去掉一個最低分,剩下分數(shù)的平均值作為每位選手最后的成績。要求:〔1〕采用構造體定義每個選手的參賽編號,以及十個裁判打出的分數(shù);〔2〕從鍵盤輸入每個選手的相關信息:參賽編號,和十個得分;〔3〕計算每位選手的最后得分,并按分數(shù)由高到低排序;〔4〕查詢功能:輸入參賽選手的編號或,便可輸出該選手的得分以及排名;以上功能采用菜單操作方式,即從鍵盤輸入1到3這三個數(shù),分別完成以上〔2〕到〔4〕的功能。設計工作任務及工作量的要求每個組員完成自己的模塊設計。完成一份設計說明書。有正確的運行結果及結果分析需求分析題目分析軟件設計實踐課程是為配合c語言課程,對學生進展全面綜合訓練、與課堂教學、作業(yè)練習題、上機實驗相輔的必不可少的一個教學環(huán)節(jié)。利用所學的C語言知識及其編程方法:構造程序設計、數(shù)組、指針、構造體、文件操作等容,通過布置具有一定難度的實際程序設計題目,要求學生獨立完成所布置題目。在分析設計過程中,要求學生養(yǎng)成良好的編程習慣,學會分析解決簡單的實際問題,學會C語言的實際調試技巧和方法來解決實際問題。系統(tǒng)分析歌唱比賽評分系統(tǒng)包括:菜單:系統(tǒng)以菜單方式工作,界面友好,易于操作。錄入:在每個輸入前都有詳細分類和提示,簡單明了,根據(jù)提示輸入參賽選手號數(shù),,各個評委打分成績。查詢:用戶輸入查詢條件,系統(tǒng)規(guī)那么地在界面顯示查詢結果,不光可以輸入號數(shù),查詢到該選手信息,每位評委打分;還可以選擇排名查詢,顯示的數(shù)據(jù)全面。修改:在已有數(shù)據(jù)的根底上實現(xiàn)對每位選手的信息,以及評分的修改。排名:利用冒泡程序對數(shù)組進展排序,刪除一個最高與最低然后進展講剩下的值平均,得出選手最終得分,再根據(jù)分數(shù)上下排名。儲存:對于已經輸入的數(shù)據(jù),已文檔的信息儲存到電腦硬盤中,實現(xiàn)永久儲存。系統(tǒng)的程序設計環(huán)境:本系統(tǒng)使用VisualC++作為程序開發(fā)工具。VisualC++是基于對象的快速應用程序開發(fā)工具,是當今最強大、最靈活的應用程序開發(fā)工具之一,具有良好的可視化應用程序開發(fā)環(huán)境和強大的可擴展數(shù)據(jù)庫功能。利用VisualC++提供的可視化組件庫進展編程,可以快速、高效地開發(fā)出基于Windows環(huán)境的各類應用程序。VisualC++語言的特點是面向對象設計的程序語言,VisualC++的根底編程語言是具有面向對象特性的語言,具有代碼穩(wěn)定、可讀性好、編譯速度快等優(yōu)點,并將面向對象的概念移植到了C語言中,使這種根底語言有了新的開展空間。與其它編程軟件相比,特別是在數(shù)據(jù)庫和網絡應用方面,VisualC++具有簡便易用、靈活高效的特點。開發(fā)軟件通常要經過修改源代碼、編譯、測試、再修改、再編譯、再測試等操作,這些操作形成了一個開發(fā)循環(huán),所以快速的編譯器可以大降低開發(fā)周期。VisualC++正是建立在這種高效編譯器的根底之上,是針對Windows的最快的高級語言代碼編譯器,因此生成的代碼十分精練高效,使VisualC++程序的運行速度更快。這也是使用VisualC++作為程序設計開發(fā)語言的重要原因。設計概要總體設計目標:使用者可以利用本系統(tǒng)進展對選手信息以及評委評分的各項運算操作,如根據(jù)需求添加選信息,刪除選手信息,對選手得分進展排名等。最后清晰完整的結果于屏幕中。方便了評分操作,不僅節(jié)省時間,而且提高準確性,可以到達事半功倍的效果??傮w設計謀略:本系統(tǒng)采用的是自頂向下、層次化的模塊構造。對高層模塊,采用以事務為中心的設計謀略,把一個大的模塊逐步分解成較小的相對簡單的模塊。對低層模塊,采用以變換為中心的設計謀略。為了提高每個模塊的聚性、降低模塊間的耦合性,將每個模塊設計成具有單一功能的模塊〔即功能聚〕,使模塊間的聯(lián)系完全是通過主模塊的控制和調用來實現(xiàn)〔即非直接耦合〕。結合上述分析該系統(tǒng)應包括以下模塊:選手信息瀏覽,選手信息錄入,選手信息保存,選手成績查詢,選手信息修改,選手信息刪除。選手數(shù)據(jù):編號、、成績、平均成績。圖1.總體構造圖程序設計及模塊分工明細人員模塊分工王澤:瀏覽選手數(shù)據(jù)browse();查詢選手成績search();查詢選手信息print()。郭世杰:菜單函數(shù)menu_select();修改函數(shù)update();保存函數(shù)save()。賀鑫:參賽選手信息錄入creat〔〕;成績排序rank();刪除函數(shù)del();公共模塊:color()、quit()、wele()。人員模塊分工明細瀏覽選手數(shù)據(jù)browse()分析:實際為鏈表的遍歷,將頭節(jié)點的指針給予臨時節(jié)點p1,用while語句實現(xiàn)鏈表的遍歷。STARTSTARTEND申明指針變量IF(head==NULL&&tail==NULL)當前信息記錄為空表頭WHILEp1!=空輸出選手信息圖2.瀏覽選手數(shù)據(jù)模塊/*browse函數(shù)*/voidbrowse(){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%-6s\n",p1->num,p1->name);p1=p1->next;}printf("|\n");}}查詢選手成績search()分析:提供詳細成績查詢,排名查詢的函數(shù)調用。其中各功能均采用菜單項選擇擇的方式。STARTSTARTEND定義變量c,并賦值SWITCH(c)輸入1跳轉到詳細成績查詢Break輸入2排名查詢Break圖3.查詢選手成績/*search函數(shù)*/voidsearch(){intc;printf("\n請選擇查詢容:\n");printf("1.選手詳細成績查詢2.選手排名查詢\n請輸入您的選擇:");scanf("%d",&c);switch(c){case1:system("cls");print();break;case2:system("cls");rank();break;}}查詢選手信息print()分析:實際為輸出鏈表中的某個某個節(jié)點,輸出某個選手的編號與較為好實現(xiàn),輸出10位評委成績那么用的for語句來實現(xiàn)。STARTSTARTEND輸入要查找的選手編號IFhead==NULL&&tail==NULL當前記錄為空輸出表頭WHILE(p1!=NULL)IF(p1->num==seeknum)輸出編號XXFOR(i=0;i<N;i++)輸出每個評委的分數(shù)平均分Return指向鏈表的下一個IFhead!=NULL&&check==0選手成績不存在Enter圖4.查詢選手信息模塊/*print函數(shù)*/voidprint(){SONGER_MESSAGE*p1=(SONGER_MESSAGE*)malloc(LEN);intcheck=0,i;longseeknum;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;i<N;i++){printf("%.1f",p1->grades[i]);}printf("%-6.2lf\n",p1->ave);check=1;getchar();return;}else{p1=p1->next;}}}if(head!=NULL&&check==0){printf("\n對不起,你查看的選手成績不存在!\n");}getchar();}菜單函數(shù)menu_select()分析:菜單主函數(shù)要求設計比擬簡潔,只提供設輸入,處理和輸出局部的函數(shù)調用。其中各功能模塊用菜單方式選擇。STARTSTARTEND定義變量chars[100];intc;WHILE〔1〕利用atoi()函數(shù)將所接收的字符串轉換成數(shù)值,提供應if語句判斷IF(c<1||c>7)輸入有誤BreakSWITCH(c)1信息瀏覽Break2信息錄入Break3信息保存Break4成績查詢Break5信息修改Break6信息刪除Break7退出系統(tǒng)ReturnBreakdefaultBreakCode圖5菜單模塊/*menu_select函數(shù)*/voidmenu_select(){chars[100];intc;gets(s);//不管用戶輸入的是數(shù)字鍵或是字母鍵使用gets都能將輸入作為字符串接收while(1)//限定用戶輸入的數(shù)值必須在1-7之間才有效,否那么要求重新輸入{c=atoi(s);//利用atoi()函數(shù)將所接收的字符串轉換成數(shù)值,提供應if語句判斷if(c<1||c>7){printf("您的輸入有誤,請重新輸入:");gets(s);}elsebreak;}switch(c){case1:system("cls");//清屏browse();//選手信息瀏覽break;case2:system("cls");creat();//選手信息錄入break;case3:system("cls");save();//選手信息保存break;case4:system("cls");search();//選手成績查詢break;case5:system("cls");update();//選手信息修改break;case6:system("cls");del();//選手信息刪除break;case7:system("cls");quit();//退出系統(tǒng)return;break;default:break;}getchar();system("cls");menu();menu_select();}修改函數(shù)update()分析;實現(xiàn)選手信息的修改,核心容為鏈表的遍歷。找出要修改的選手,修改其個人信息。STARTSTARTEND輸入要修改的選手編號:IF(head==NULL&&tail==NULL)當前信息記錄為空p1=headWHILE(p1!=NULL)IF(p1->num==updatenum)修改信息Returnp1=p1->next;指向下一個節(jié)點IF(head!=NULL&&check==0)選手信息不存在NOgetchar();圖6.修改模塊/*update函數(shù)*/voidupdate(){SONGER_MESSAGE*p1;//=(SONGER_MESSAGE*)malloc(LEN);intcheck=0;//用來進展判斷,是否找到了要修改的信息longupdatenum;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%-6s\n",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();}保存函數(shù)save()分析:保存文件的流程。使用fopen()函數(shù)翻開txt文件,"w〞參數(shù)代表翻開只寫文件,再利用fprintf()函數(shù)寫入選手容,最后用fclose〔〕函數(shù)關閉文件。STARTSTARTEND翻開一個文件,并寫入格式數(shù)據(jù)WHILE(p1!=NULL)向文件寫入"編號〞,"XX〞關閉文件圖7.保存模塊/*save函數(shù)*/voidsave()//將數(shù)據(jù)保存到文件{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%-6s\n",p1->num,p1->name);p1=p1->next;}fprintf(fp,"|\n");fclose(fp);printf("\n\t文件已將保存到\"參賽選手.txt\"");}參賽選手信息錄入creat〔〕分析:錄入信息表現(xiàn)為創(chuàng)立鏈表節(jié)點并給節(jié)點的元素賦值,然后對評委的分數(shù)進展排序〔鏈表的排序〕,排序選擇冒泡排序法,最后去掉一個最高分去掉一個最低分。STARTSTARTEND定義變量inti,j;floatt;charc='y';WHILE(c=='y'||c=='Y')錄入選手信息:編號,XXFOR(i=0;i<N;i++)輸入10位評委點評成績FOR(i=0;i<N-1;i++)FOR(j=0;j<N-1-i;j++)IF(p1->grades[j]>p1->grades[j+1])交換數(shù)的位置去掉一個最高分,去掉一個這一低分,得出最后的平均分IF(p1==NULL)內存分配失敗IF(head==NULL&&tail==NULL)創(chuàng)立節(jié)點選手信息錄入成功如果當前還有節(jié)點那么插入到尾部是否繼續(xù)(Y/N)圖7.參賽選手信息錄入模塊/*creat函數(shù)*/voidcreat(){inti,j;floatt;charc='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;i<N;i++){scanf("%f",&(p1->grades[i]));//runtimeerrorp1->ave+=p1->grades[i];}for(i=0;i<N-1;i++)//冒泡排序法讓那個成績從小到大排列,然后選出最大值是最后一個,最小值是第一個for(j=0;j<N-1-i;j++)if(p1->grades[j]>p1->grades[j+1]){t=p1->grades[j];p1->grades[j]=p1->grades[j+1];p1->grades[j+1]=t;}p1->ave=(p1->ave-(p1->grades[0]+p1->grades[9]))/8;//去掉一個最高分,去掉一個這一低分,得出最后的平均分p1->next=NULL;if(p1==NULL){printf("\n存分配失敗\n");n=n-1;}if(head==NULL&&tail==NULL)//當前沒有結點,創(chuàng)立第一個結點{head=p1;head->next=NULL;tail=head;printf("\n選手信息錄入成功\n");}else//如果當前還有節(jié)點那么插入到尾部{tail->next=p1;tail=p1;tail->next=NULL;printf("\n選手信息錄入成功\n");}printf("是否繼續(xù)(Y/N):");getchar();scanf("%c",&c);}}成績排序rank()分析:用冒泡排序的方法對平均成績〔鏈表〕進展排序。STARTEND定義指針變量STARTEND定義指針變量*p1,*p2,*endpt,*p;p1=head;IF(head==NULL&&tail==NULL)當前信息記錄為空為p1分配內存,p1->next=head;head=p1;FOR(endpt=NULL;endpt!=head;endpt=p)FOR(p=p1=head;p1->next->next!=endpt;p1=p1->next)IF(p1->next->ave<p1->next->next->ave)兩節(jié)點的順序交換把p1的信息去掉,head指向排序后的第一個節(jié)點釋放p1并將p1重新指向頭指針WHILE(p1!=NULL)輸出選手排名加上表尾部getchar();圖8.成績排序模塊/*rank函數(shù)*/voidrank(){SONGER_MESSAGE*p1,*p2,*endpt,*p;//*endpt/*控制循環(huán)比擬*/*p/*臨時指針變量*/n=0;p1=head;if(head==NULL&&tail==NULL){printf("\n當前信息記錄為空\n");}else{p1=(SONGER_MESSAGE*)malloc(LEN);p1->next=head;/*注意理解:我們增加一個節(jié)點,放在第一個節(jié)點的前面,主要是為了便于比擬。因為第一個節(jié)點沒有前驅,我們不能交換地址。*/head=p1;/*讓head指向p1節(jié)點,排序完成后,我們再把p1節(jié)點釋放掉*/for(endpt=NULL;endpt!=head;endpt=p)/*結合第6點理解*/{for(p=p1=head;p1->next->next!=endpt;p1=p1->next){if(p1->next->ave<p1->next->next->ave)/*如果前面的節(jié)點鍵值比后面節(jié)點的鍵值小,那么交換*/{p2=p1->next->next;//1、排序后q節(jié)點指向p節(jié)點,在調整指向之前,我們要保存原p的指向節(jié)點地址,即:p2=p1->next->nextp1->next->next=p2->next;//2、順著這一步一步往下推,排序后p1->next->next要指的是p2->next,所以p1->next->next=p2->nextp2->next=p1->next;//3、p2->next原是q發(fā)出來的指向,排序后q的指向要變?yōu)橹赶騪的,而原來p1->next是指向p的,所以p2->next=p1->nextp1->next=p2;//4、p1->next原是指向p的,排序后圖16中p1->next要指向q,原來p1->next->next〔即p2)是指向q的,所以p1->next=p2p=p1->next->next;//5、至此,完成了相鄰兩節(jié)點的順序交換}}}p1=head;/*把p1的信息去掉*/head=head->next;/*讓head指向排序后的第一個節(jié)點*/free(p1);/*釋放p1*/printf("\n選手成績排名信息如下\n");printf("|||\n");printf("編號||平均成績|名次\n");p1=head;while(p1!=NULL){printf("|||\n");printf("%-9d%-9s%-9.1lf%-5d\n",p1->num,p1->name,p1->ave,n+1);n++;p1=p1->next;}printf("|||\n");}getchar();}刪除函數(shù)del()分析:節(jié)點的刪除較為繁瑣。第一種情況:數(shù)據(jù)在鏈表頭部,并且只有一個結點。第二種情況:數(shù)據(jù)在鏈表頭部,頭結點。第三種情況:數(shù)據(jù)在鏈表中間,中間節(jié)點。第四種情況:數(shù)據(jù)在鏈表尾部,尾部節(jié)點。STARTSTARTEND定義變量,輸入要刪除的選手的編號&del_numIF(head==NULL&&tail==NULL)信息記錄為空,刪除失??!node=head;p1=head;WHILE(node!=NULL)IF(node->num==del_num)輸出要刪除的選手信息IF(node==head&&head->next==NULL)刪除唯一的節(jié)點IF(node==head&&head->next!=NULL)刪除頭節(jié)點IF(node->next!=NULL)中間節(jié)點刪除成功IFif(node->next==NULL)刪除尾節(jié)點getchar();Returnp1=node;node=node->next;IF(head!=NULL&&check==0)要刪除的選手信息不存在!圖9.刪除模塊/*del函數(shù)*/voiddel(){SONGER_MESSAGE*node;//=(SONGER_MESSAGE*)malloc(LEN);SONGER_MESSAGE*p1;intcheck=0;//用來進展判斷,是否找到了要刪除的信息longdel_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%-6s\n",node->num,node->name);//在這里找到了要刪除的選手信息printf("|\n");check=1;//找到要刪除的信息,賦為真if(node==head&&head->next==NULL)//是頭結點,并且只有一個結點{head=NULL;tail=head;free(node);printf("\n刪除信息成功\n");//刪除唯一的節(jié)點}elseif(node==head&&head->next!=NULL)//刪除頭節(jié)點{node=head;head=head->next;free(node);printf("\n刪除信息成功\n");//頭節(jié)點刪除成功n=n-1;}elseif(node->next!=NULL)//刪除中間節(jié)點{p1->next=node->next;free(node);printf("\n刪除信息成功\n");//中間節(jié)點刪除成功n=n-1;}elseif(node->next==NULL)//刪除尾節(jié)點{p1->next=NULL;tail=p1;free(node);printf("\n刪除信息成功\n");//尾節(jié)點刪除成功n=n-1;}getchar();return;}else{p1=node;node=node->next;}}}if(head!=NULL&&check==0){printf("\n對不起,你要刪除的選手信息不存在!\n");}getchar();}公共模塊顏色控制函數(shù)color()分析:為了使程序看起來更美觀,所以引入windowsapi來控制顏色函數(shù),用來改變字體顏色。/*color函數(shù)*/voidcolor(constunsignedshortcolor1){/*僅限改變0-15的顏色;如果在0-15那么實現(xiàn)他的顏色因為如果超過15后面的改變的是文本背風光。*/if(color1>=0&&color1<=15)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color1);/*如果不在0-15的圍顏色,那么改為默認的顏色白色;*/elseSetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);/*顏色對應值:0=黑色8=灰色1=藍色9=淡藍色2=綠色10=淡綠色0xa3=湖藍色11=淡淺綠色0xb4=紅色12=淡紅色0xc5=紫色13=淡紫色0xd6=黃色14=淡黃色0xe7=白色15=亮白色0xf*/}退出函數(shù)quit()分析:用來退出程序/*quit函數(shù)*/voidquit(){printf("\n\n\t=========="感您使用歌唱比賽評分系統(tǒng)"==========\n\n");}目錄函數(shù)menu()分析;為程序入口提供顯示,因篇幅有限,所以顯示有錯亂。/*menu函數(shù)*/voidmenu(){system("modeconcols=100lines=30");color(11);printf("\t.;r155551r;.\n");printf("\t★☆★☆歌唱比賽評分系統(tǒng)☆★☆★:r1hhhhhhhhhh1r:\n");printf("\t:1SSSS555555555SSSSSr\n");printf("\t.sSSS555SS1.,.\n");printf("\t1.選手信息瀏覽hS55555SSiiSh.\n");printf("\trS5555SSh,.sSSS1\n");printf("\trh555SS5i;5S555S,\n");printf("\t2.選手信息錄入Sh5SS5r,1SS5555Si\n");printf("\thh5555555555SS5r..sSS555555S;\n");printf("\t,hS555555SSS5r..r5SS555555S5.\n");printf("\t3.選手信息保存:SS555SSS1;,sSSS5555555SS;\n");printf("\tiSSSShi.;1SSS55555555SS;\n");printf("\t,sr,,r5SS55555555SSS1,s1.\n");printf("\t4.選手成績查詢i533SSSSSSSSSSS5s,.1SS5i\n");printf("\t.:is1h5555h1si,.r5S55SSh;\n");printf("\t..,;s5SS55555SS1,\n");printf("\t5.選手信息修改.sS3S555555555SSs.\n");printf("\t,r5SS55555555SS5i\n");printf("\t;hSSS5555555SSh:\n");printf("\t6.選手信息刪除:sSSS5555555SS1,\n");printf("\t,r5SS5555555SSr.\n");printf("\t.ihSSS55555SS5;\n");printf("\t7.退出系統(tǒng):1SSS55555SSs\n");printf("\t,r5SS5555S5\n");printf("\t:shhhhh:\n");color(15);}歡送模塊wele()分析:一個系統(tǒng)需要一個美觀歡送界面,由于DOS窗口有限,所以用點陣字寫出"wele〞并且在右下角增加當前時間顯示。時間用的time.h庫來實現(xiàn)。/*wele函數(shù)*/intwele(){system("modeconcols=65lines=25");printf("\n\n\n\n");color(14);printf("##########################\n");color(14);printf("#############\n");color(11);printf("############\n");color(11);printf("####################\n");color(11);printf("############\n");color(13);printf("#############\n");color(13);printf("###############################\n");color(10);printf("\n\n\n\n\n制作:電子信息工程系通信工程1班42王澤38郭世杰49賀鑫\n");color(15);time_tit;it=time(NULL);ptr=localtime(&it);printf("\n\t\t\t當前系統(tǒng)時間:%4d年%02d月%02d日%d:%d\n",ptr->tm_year+1900,ptr->tm_mon+1,ptr->tm_mday,ptr->tm_hour,ptr->tm_min,ptr->tm_sec);printf("\n\n按任意鍵進入主菜單\n");getch();system("cls");menu();menu_select();return0;}主函數(shù)main()分析;提供程序入口。/*main函數(shù)*/intmain(){wele();return0;}庫函數(shù)#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>#include<malloc.h>#include<Windows.h>#include<time.h>#defineLENsizeof(SONGER_MESSAGE)#defineN10構造體structtm*ptr;//用于wele〔〕顯示時間的構造體typedefstructsonger//定義選手信息鏈表構造{longnum;//選手編號charname[20];//選手floatgrades[N];//選手成績doubleave;//平均成績structsonger*next;//鏈表的結點,next是指針變量,指向構造體變量=>指針域}SONGER_MESSAGE;//等價于structSONGER_MESSAGESONGER_MESSAGE*head;//定義鏈表的頭指針SONGER_MESSAGE*tail;//定義鏈表的尾指針intn=0;//n為全局變量,用于統(tǒng)計結點的個數(shù)測試結果調試與測試第一,用一組簡單的數(shù)據(jù)對程序進展調試,是否各函數(shù)有出錯現(xiàn)象。然后用復雜數(shù)據(jù)對程序進展調試。直到確定程序對正常數(shù)據(jù)沒有錯誤為止。第二,當數(shù)據(jù)測試時,程序錯誤,要首先找到出錯的函數(shù),對函數(shù)中各個變量進展觀察,有時變量很多,循環(huán)多重不要急,對各個數(shù)據(jù)的觀察,對程序的調試有很大的幫助。你也可以先對幾個變量熟悉后,在多重循環(huán)里,確定正確的數(shù)據(jù),將其跳過調試,對有疑問的數(shù)據(jù)循環(huán)進展仔細觀察。雖然這是比擬省力氣的活,但對復雜的數(shù)據(jù)錯誤并不是很有效,所以仔細觀察每個數(shù)據(jù)的變化對調試的成功與否有決定性作用。第三,測試時,根本的錯誤并不一定在運行錯誤的函數(shù),或許在前面的函數(shù)已經奠定了這些錯誤數(shù)據(jù)的根底,需要反過頭來,對所有的的函數(shù)進展一項項的調試!從程序運行的第一個函數(shù)開場調試。按照程序運行的步驟下去。一個個確實定函數(shù)的正確性,每確定一個函數(shù),在以后的調試中可以減少對該函數(shù)的調試次數(shù),或者直接跳到下一個函數(shù)。所謂的各個擊破便是如此。對頭文件中的各個函數(shù)的返回值和它所要傳入的參變量及其功能更是需要注意。第四,調試時,需要對錯誤縮小圍,從整個程序到指定函數(shù),再到指定區(qū)域,再到指定行,在對程序縮小圍或對編譯沒通過的程序縮小錯誤圍時可以用"/**/"來進展調試,確定正常圍,縮小錯誤圍。測試結果截圖圖10.歡送界面圖11.主菜單圖12.選手信息瀏覽圖13選手信息錄入圖14選手信息保存圖15選手信息查詢圖16選手詳細信息查詢圖17選手排名查詢圖18選手信息修改圖19選手信息刪除圖20退出系統(tǒng)設計總結通過以上各章節(jié)的介紹,已經完成了歌唱比賽評分系統(tǒng)設計系統(tǒng)的開發(fā),歌唱比賽評分系統(tǒng)設計是一套實用性非常強的系統(tǒng),可以應用到各種評分系統(tǒng)。歌唱比賽評分系統(tǒng)設計不僅需要靈活的交互功能,還需要經常與數(shù)據(jù)庫進展聯(lián)系,要求具有操作簡單和功能強大的數(shù)據(jù)庫訪問能力。界面盡量美觀友好、多彩多姿,完全的圖形化設計,操作者易于上手,同時多種媒體技術的集成利用,可以方便的完成用戶樂于承受的各種界面設計。本系統(tǒng)雖具備了根本的功能,但由于時間關系,還有很多功能待實現(xiàn),在此根底上結合實際應用中所出現(xiàn)的問題,更智能化的排名系統(tǒng),以及增加網絡評分,觀眾評分等功能。通過這次編程我深深的感受到對代碼的變量命名,代碼注釋格式,甚至嵌套中行縮進的長度和函數(shù)間的空行數(shù)字都有明確規(guī)定,良好的編寫習慣,不但有助于代碼的移植和糾錯,也有助于不同人員之間的協(xié)作。我們還要有模塊化思維能力,模塊化思維就是編程任何一個功能模塊或函數(shù)的時候,要多想一些,不要局限在完成當前任務的簡單思路上,想想看該模塊是否可以脫離這個系統(tǒng)存在,是否可以通過簡單的修改參數(shù)的方式在其他系統(tǒng)和應用環(huán)境下直接引用,這樣就能極大防止重復性的開發(fā)工作。善于總結,也是學習能力的一種表達,每次完成一個編程任務,完成一段代碼,都應當有目的的跟蹤該程序的應用狀況,隨時總結,找到自己的缺乏,這樣所編寫的程序才能逐步提高。致在學習中,教師嚴謹?shù)闹螌W態(tài)度、豐富淵博的知識、精益求精的工作態(tài)度以及侮人不倦的師者風是我終生學習的楷模,教師們的高深精湛的造詣與嚴謹?shù)闹螌W精神,將永遠鼓勵著我。在此,謹向教師們致以衷心的感和崇高的敬意!另外,感校方給予我我們這樣一次時機,能夠獨立地完成一個課程設計,并在這個過程當中,給予我們各種方便,使我們在這學期快要完畢的時候,能夠將學到的知識應用到實踐中,增強了我們實踐操作和動手應用能力,提高了獨立思考的能力。感所有任課教師和所有同學在這三年來給自己的指導和幫助,是他們教會了我專業(yè)知識,教會了我如何學習,教會了我如何做人。正是由于他們,我才能在各方面取得顯著的進步,在此向他們表示我由衷的意。在這次課程設計的撰寫中,我得到了許多人的幫助。首先我要感我的教師在課程設計上給予我的指導、提供應我的支持和幫助,這是我能順利完成這次設計的主要原因,更重要的是教師幫我解決了許多技術上的難題,讓我能把系統(tǒng)做得更加完善。在此期間,我不僅學到了許多新的知識,而且也開闊了視野,提高了自己的設計能力。其次,我要感幫助過我的同學,他們也為我解決了不少我不太明白的設計上的難題。最后再一次感所有在設計中幫助過我的良師益友和同學參考文獻[1]譚浩強.C程序設計.:清華大學,2007.91-310[2]譚浩強.C程序設計題解與上機指導.:清華大學,2005.130-155[3]明慧.VisualC++開發(fā)圖書管理系統(tǒng).:師大學,2005.32-40[4]C編寫組編.常用C語言用法速查手冊.:龍門書局,1995.34-45[5]俐,瑩編著.C語言高級程序設計.:清華大學,2006.67-78[6]海新,燕主編.C語言程序設計實用教程.:機械工業(yè),2007.161-174附錄源代碼:#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>#include<malloc.h>#include<Windows.h>#include<time.h>#defineLENsizeof(SONGER_MESSAGE)#defineN10structtm*ptr;//用于wele〔〕顯示時間的構造體typedefstructsonger//定義選手信息鏈表構造{longnum;//選手編號charname[20];//選手floatgrades[N];//選手成績doubleave;//平均成績structsonger*next;//鏈表的結點,next是指針變量,指向構造體變量=>指針域}SONGER_MESSAGE;//等價于structSONGER_MESSAGESONGER_MESSAGE*head;//定義鏈表的頭指針SONGER_MESSAGE*tail;//定義鏈表的尾指針intn=0;//n為全局變量,用于統(tǒng)計結點的個數(shù)voidcreat();//建立單向動態(tài)鏈表。此函數(shù)帶回一個指向鏈表頭的指針,用于參賽選手的錄入voiddel();//用于刪除結點,用于參賽選手的刪除voidsearch();//參賽選手成績的查詢voidprint();//用于輸出鏈表voidrank();//按個人平均成績從高到低的順序進展排序voidupdate();//參賽選手的修改voidmenu();//操作系統(tǒng)菜單界面voidmenu_select();//菜單項選擇擇界面voidbrowse();//選手信息瀏覽voidsave();//選手信息保存voidquit();//退出系統(tǒng)界面/*browse函數(shù)*/voidbrowse(){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%-6s\n",p1->num,p1->name);p1=p1->next;}printf("|\n");}}/*search函數(shù)*/voidsearch(){intc;printf("\n請選擇查詢容:\n");printf("1.選手詳細成績查詢2.選手排名查詢\n請輸入您的選擇:");scanf("%d",&c);switch(c){case1:system("cls");print();break;case2:system("cls");rank();break;}}/*print函數(shù)*/voidprint(){SONGER_MESSAGE*p1=(SONGER_MESSAGE*)malloc(LEN);intcheck=0,i;longseeknum;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;i<N;i++){printf("%.1f",p1->grades[i]);}printf("%-6.2lf\n",p1->ave);check=1;getchar();return;}else{p1=p1->next;}}}if(head!=NULL&&check==0){printf("\n對不起,你查看的選手成績不存在!\n");}getchar();}/*menu_select函數(shù)*/voidmenu_select(){chars[100];intc;gets(s);//不管用戶輸入的是數(shù)字鍵或是字母鍵使用gets都能將輸入作為字符串接收while(1)//限定用戶輸入的數(shù)值必須在1-7之間才有效,否那么要求重新輸入{c=atoi(s);//利用atoi()函數(shù)將所接收的字符串轉換成數(shù)值,提供應if語句判斷if(c<1||c>7){printf("您的輸入有誤,請重新輸入:");gets(s);}elsebreak;}switch(c){case1:system("cls");//清屏browse();//選手信息瀏覽break;case2:system("cls");creat();//選手信息錄入break;case3:system("cls");save();//選手信息保存break;case4:system("cls");search();//選手成績查詢break;case5:system("cls");update();//選手信息修改break;case6:system("cls");del();//選手信息刪除break;case7:system("cls");quit();//退出系統(tǒng)return;break;default:break;}getchar();system("cls");menu();menu_select();}/*update函數(shù)*/voidupdate(){SONGER_MESSAGE*p1;//=(SONGER_MESSAGE*)malloc(LEN);intcheck=0;//用來進展判斷,是否找到了要修改的信息longupdatenum;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%-6s\n",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();}/*save函數(shù)*/voidsave()//將數(shù)據(jù)保存到文件{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%-6s\n",p1->num,p1->name);p1=p1->next;}fprintf(fp,"|\n");fclose(fp);printf("\n\t文件已將保存到\"參賽選手.txt\"");}/*creat函數(shù)*/voidcreat(){inti,j;floatt;charc='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;i<N;i++){scanf("%f",&(p1->grades[i]));//runtimeerrorp1->ave+=p1->grades[i];}for(i=0;i<N-1;i++)//冒泡排序法讓那個成績從小到大排列,然后選出最大值是最后一個,最小值是第一個for(j=0;j<N-1-i;j++)if(p1->grades[j]>p1->grades[j+1]){t=p1->grades[j];p1->grades[j]=p1->grades[j+1];p1->grades[j+1]=t;}p1->ave=(p1->ave-(p1->grades[0]+p1->grades[9]))/8;//去掉一個最高分,去掉一個這一低分,得出最后的平均分p1->next=NULL;if(p1==NULL){printf("\n存分配失敗\n");n=n-1;}if(head==NULL&&tail==NULL)//當前沒有結點,創(chuàng)立第一個結點{head=p1;head->next=NULL;tail=head;printf("\n選手信息錄入成功\n");}else//如果當前還有節(jié)點那么插入到尾部{tail->next=p1;tail=p1;tail->next=NULL;printf("\n選手信息錄入成功\n");}printf("是否繼續(xù)(Y/N):");getchar();scanf("%c",&c);}}/*rank函數(shù)*/voidrank(){SONGER_MESSAGE*p1,*p2,*endpt,*p;//*endpt/*控制循環(huán)比擬*/*p/*臨時指針變量*/n=0;p1=head;if(head==NULL&&tail==NULL){printf("\n當前信息記錄為空\n");}else{p1=(SONGER_MESSAGE*)malloc(LEN);p1->next=head;/*注意理解:我們增加一個節(jié)點,放在第一個節(jié)點的前面,主要是為了便于比擬。因為第一個節(jié)點沒有前驅,我們不能交換地址。*/head=p1;/*讓head指向p1節(jié)點,排序完成后,我們再把p1節(jié)點釋放掉*/for(endpt=NULL;endpt!=head;endpt=p)/*結合第6點理解*/{for(p=p1=head;p1->next->next!=endpt;p1=p1->next){if(p1->next->ave<p1->next->next->ave)/*如果前面的節(jié)點鍵值比后面節(jié)點的鍵值小,那么交換*/{p2=p1->next->next;//1、排序后q節(jié)點指向p節(jié)點,在調整指向之前,我們要保存原p的指向節(jié)點地址,即:p2=p1->next->nextp1->next->next=p2->next;//2、順著這一步一步往下推,排序后p1->next->next要指的是p2->next,所以p1->next->next=p2->nextp2->next=p1->next;//3、p2->next原是q發(fā)出來的指向,排序后q的指向要變?yōu)橹赶騪的,而原來p1->next是指向p的,所以p2->next=p1->nextp1->next=p2;//4、p1->next原是指向p的,排序后圖16中p1->next要指向q,原來p1->next->next〔即p2)是指向q的,所以p1->next=p2p=p1->next->next;//5、至此,完成了相鄰兩節(jié)點的順序交換}}}p1=head;/*把p1的信息去掉*/head=head->next;/*讓head指向排序后的第一個節(jié)點*/free(p1);/*釋放p1*/printf("\n選手成績排名信息如下\n");printf("|||\n");printf("編號||平均成績|名次\n");p1=head;while(p1!=NULL){printf("|||\n");printf("%-9d%-9s%-9.1lf%-5d\n",p1->num
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年新科版九年級化學下冊階段測試試卷
- 2025年滬科版七年級化學上冊階段測試試卷
- 專業(yè)牛肉運輸服務協(xié)議模板2024版A版
- 2025版砂石料買賣合同樣本2篇
- 2025年冀教版九年級地理下冊月考試卷
- 央企與國企的區(qū)別在哪里
- 2025年外研版高三英語下冊階段測試試卷
- 2025年粵教版九年級物理下冊月考試卷含答案
- 2025年人教版選擇性必修2地理上冊階段測試試卷含答案
- 2025年外研銜接版九年級化學上冊月考試卷
- 江蘇省建筑節(jié)能分部工程施工方案范本
- 危險化學品事故應急預案
- 高考寫作指導:《登泰山記》《我與地壇》材料
- 同意未成年出國聲明 - 中英
- 數(shù)字經濟學導論-全套課件
- 2023版(五級)脊柱按摩師技能認定考試題庫大全-上(單選題部分)
- 教育系統(tǒng)自然災害類突發(fā)公共事件應急預案
- 2022電氣技術員考試題庫及答案
- 魯教版化學八年級上冊全冊教學課件(五四制)
- 竇占龍憋寶:九死十三災
- EPC項目實施計劃(設計、采購、施工過程管理)
評論
0/150
提交評論