




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
..-..-可修遍-"軟件設(shè)計(jì)實(shí)踐"報(bào)告學(xué)院:中北大學(xué)信息商務(wù)學(xué)院專業(yè):通信工程專業(yè)題目:歌唱比賽評(píng)分系統(tǒng)1305044142王澤學(xué)生:1305044138郭世杰1305044149賀鑫完成時(shí)間:2016年1月18日指導(dǎo)教師:魯旭濤愛琴沅目錄課程設(shè)計(jì)任務(wù)書21需求分析21.1題目分析21.2系統(tǒng)分析22設(shè)計(jì)概要23程序設(shè)計(jì)及模塊分工明細(xì)23.1人員模塊分工23.2人員模塊分工明細(xì)24測(cè)試結(jié)果24.1調(diào)試與測(cè)試24.2測(cè)試結(jié)果截圖2設(shè)計(jì)總結(jié)2致2參考文獻(xiàn)2附錄2課程設(shè)計(jì)任務(wù)書設(shè)計(jì)目的C語(yǔ)言是通信工程專業(yè)一門重要的專業(yè)技術(shù)課程,它是一門實(shí)踐性很強(qiáng)的課程。軟件設(shè)計(jì)實(shí)踐課程是為配合c語(yǔ)言課程,對(duì)學(xué)生進(jìn)展全面綜合訓(xùn)練、與課堂教學(xué)、作業(yè)練習(xí)題、上機(jī)實(shí)驗(yàn)相輔的必不可少的一個(gè)教學(xué)環(huán)節(jié)。利用所學(xué)的C語(yǔ)言知識(shí)及其編程方法:構(gòu)造程序設(shè)計(jì)、數(shù)組、指針、構(gòu)造體、文件操作等容,通過(guò)布置具有一定難度的實(shí)際程序設(shè)計(jì)題目,要求學(xué)生獨(dú)立完成所布置題目。在分析設(shè)計(jì)過(guò)程中,要求學(xué)生養(yǎng)成良好的編程習(xí)慣,學(xué)會(huì)分析解決簡(jiǎn)單的實(shí)際問(wèn)題,學(xué)會(huì)C語(yǔ)言的實(shí)際調(diào)試技巧和方法,要求學(xué)生在教師的指導(dǎo)下逐步完成應(yīng)用程序的設(shè)計(jì)設(shè)計(jì)容和要求有十個(gè)選手參加歌唱比賽,十個(gè)裁判對(duì)每個(gè)選手的演唱進(jìn)展打分,去掉一個(gè)最高分,去掉一個(gè)最低分,剩下分?jǐn)?shù)的平均值作為每位選手最后的成績(jī)。要求:〔1〕采用構(gòu)造體定義每個(gè)選手的參賽編號(hào),以及十個(gè)裁判打出的分?jǐn)?shù);〔2〕從鍵盤輸入每個(gè)選手的相關(guān)信息:參賽編號(hào),和十個(gè)得分;〔3〕計(jì)算每位選手的最后得分,并按分?jǐn)?shù)由高到低排序;〔4〕查詢功能:輸入?yún)①愡x手的編號(hào)或,便可輸出該選手的得分以及排名;以上功能采用菜單操作方式,即從鍵盤輸入1到3這三個(gè)數(shù),分別完成以上〔2〕到〔4〕的功能。設(shè)計(jì)工作任務(wù)及工作量的要求每個(gè)組員完成自己的模塊設(shè)計(jì)。完成一份設(shè)計(jì)說(shuō)明書。有正確的運(yùn)行結(jié)果及結(jié)果分析需求分析題目分析軟件設(shè)計(jì)實(shí)踐課程是為配合c語(yǔ)言課程,對(duì)學(xué)生進(jìn)展全面綜合訓(xùn)練、與課堂教學(xué)、作業(yè)練習(xí)題、上機(jī)實(shí)驗(yàn)相輔的必不可少的一個(gè)教學(xué)環(huán)節(jié)。利用所學(xué)的C語(yǔ)言知識(shí)及其編程方法:構(gòu)造程序設(shè)計(jì)、數(shù)組、指針、構(gòu)造體、文件操作等容,通過(guò)布置具有一定難度的實(shí)際程序設(shè)計(jì)題目,要求學(xué)生獨(dú)立完成所布置題目。在分析設(shè)計(jì)過(guò)程中,要求學(xué)生養(yǎng)成良好的編程習(xí)慣,學(xué)會(huì)分析解決簡(jiǎn)單的實(shí)際問(wèn)題,學(xué)會(huì)C語(yǔ)言的實(shí)際調(diào)試技巧和方法來(lái)解決實(shí)際問(wèn)題。系統(tǒng)分析歌唱比賽評(píng)分系統(tǒng)包括:菜單:系統(tǒng)以菜單方式工作,界面友好,易于操作。錄入:在每個(gè)輸入前都有詳細(xì)分類和提示,簡(jiǎn)單明了,根據(jù)提示輸入?yún)①愡x手號(hào)數(shù),,各個(gè)評(píng)委打分成績(jī)。查詢:用戶輸入查詢條件,系統(tǒng)規(guī)那么地在界面顯示查詢結(jié)果,不光可以輸入號(hào)數(shù),查詢到該選手信息,每位評(píng)委打分;還可以選擇排名查詢,顯示的數(shù)據(jù)全面。修改:在已有數(shù)據(jù)的根底上實(shí)現(xiàn)對(duì)每位選手的信息,以及評(píng)分的修改。排名:利用冒泡程序?qū)?shù)組進(jìn)展排序,刪除一個(gè)最高與最低然后進(jìn)展講剩下的值平均,得出選手最終得分,再根據(jù)分?jǐn)?shù)上下排名。儲(chǔ)存:對(duì)于已經(jīng)輸入的數(shù)據(jù),已文檔的信息儲(chǔ)存到電腦硬盤中,實(shí)現(xiàn)永久儲(chǔ)存。系統(tǒng)的程序設(shè)計(jì)環(huán)境:本系統(tǒng)使用VisualC++作為程序開發(fā)工具。VisualC++是基于對(duì)象的快速應(yīng)用程序開發(fā)工具,是當(dāng)今最強(qiáng)大、最靈活的應(yīng)用程序開發(fā)工具之一,具有良好的可視化應(yīng)用程序開發(fā)環(huán)境和強(qiáng)大的可擴(kuò)展數(shù)據(jù)庫(kù)功能。利用VisualC++提供的可視化組件庫(kù)進(jìn)展編程,可以快速、高效地開發(fā)出基于Windows環(huán)境的各類應(yīng)用程序。VisualC++語(yǔ)言的特點(diǎn)是面向?qū)ο笤O(shè)計(jì)的程序語(yǔ)言,VisualC++的根底編程語(yǔ)言是具有面向?qū)ο筇匦缘恼Z(yǔ)言,具有代碼穩(wěn)定、可讀性好、編譯速度快等優(yōu)點(diǎn),并將面向?qū)ο蟮母拍钜浦驳搅薈語(yǔ)言中,使這種根底語(yǔ)言有了新的開展空間。與其它編程軟件相比,特別是在數(shù)據(jù)庫(kù)和網(wǎng)絡(luò)應(yīng)用方面,VisualC++具有簡(jiǎn)便易用、靈活高效的特點(diǎn)。開發(fā)軟件通常要經(jīng)過(guò)修改源代碼、編譯、測(cè)試、再修改、再編譯、再測(cè)試等操作,這些操作形成了一個(gè)開發(fā)循環(huán),所以快速的編譯器可以大降低開發(fā)周期。VisualC++正是建立在這種高效編譯器的根底之上,是針對(duì)Windows的最快的高級(jí)語(yǔ)言代碼編譯器,因此生成的代碼十分精練高效,使VisualC++程序的運(yùn)行速度更快。這也是使用VisualC++作為程序設(shè)計(jì)開發(fā)語(yǔ)言的重要原因。設(shè)計(jì)概要總體設(shè)計(jì)目標(biāo):使用者可以利用本系統(tǒng)進(jìn)展對(duì)選手信息以及評(píng)委評(píng)分的各項(xiàng)運(yùn)算操作,如根據(jù)需求添加選信息,刪除選手信息,對(duì)選手得分進(jìn)展排名等。最后清晰完整的結(jié)果于屏幕中。方便了評(píng)分操作,不僅節(jié)省時(shí)間,而且提高準(zhǔn)確性,可以到達(dá)事半功倍的效果??傮w設(shè)計(jì)謀略:本系統(tǒng)采用的是自頂向下、層次化的模塊構(gòu)造。對(duì)高層模塊,采用以事務(wù)為中心的設(shè)計(jì)謀略,把一個(gè)大的模塊逐步分解成較小的相對(duì)簡(jiǎn)單的模塊。對(duì)低層模塊,采用以變換為中心的設(shè)計(jì)謀略。為了提高每個(gè)模塊的聚性、降低模塊間的耦合性,將每個(gè)模塊設(shè)計(jì)成具有單一功能的模塊〔即功能聚〕,使模塊間的聯(lián)系完全是通過(guò)主模塊的控制和調(diào)用來(lái)實(shí)現(xiàn)〔即非直接耦合〕。結(jié)合上述分析該系統(tǒng)應(yīng)包括以下模塊:選手信息瀏覽,選手信息錄入,選手信息保存,選手成績(jī)查詢,選手信息修改,選手信息刪除。選手?jǐn)?shù)據(jù):編號(hào)、、成績(jī)、平均成績(jī)。圖1.總體構(gòu)造圖程序設(shè)計(jì)及模塊分工明細(xì)人員模塊分工王澤:瀏覽選手?jǐn)?shù)據(jù)browse();查詢選手成績(jī)search();查詢選手信息print()。郭世杰:菜單函數(shù)menu_select();修改函數(shù)update();保存函數(shù)save()。賀鑫:參賽選手信息錄入creat〔〕;成績(jī)排序rank();刪除函數(shù)del();公共模塊:color()、quit()、wele()。人員模塊分工明細(xì)瀏覽選手?jǐn)?shù)據(jù)browse()分析:實(shí)際為鏈表的遍歷,將頭節(jié)點(diǎn)的指針給予臨時(shí)節(jié)點(diǎn)p1,用while語(yǔ)句實(shí)現(xiàn)鏈表的遍歷。STARTSTARTEND申明指針變量IF(head==NULL&&tail==NULL)當(dāng)前信息記錄為空表頭WHILEp1!=空輸出選手信息圖2.瀏覽選手?jǐn)?shù)據(jù)模塊/*browse函數(shù)*/voidbrowse(){SONGER_MESSAGE*p1;if(head==NULL&&tail==NULL){printf("\n當(dāng)前信息記錄為空\(chéng)n");}else{printf("\n你要瀏覽的選手信息如下\n");printf("|\n");printf("編號(hào)|\n");p1=head;while(p1!=NULL){printf("|\n");printf("%-9d%-6s\n",p1->num,p1->name);p1=p1->next;}printf("|\n");}}查詢選手成績(jī)search()分析:提供詳細(xì)成績(jī)查詢,排名查詢的函數(shù)調(diào)用。其中各功能均采用菜單項(xiàng)選擇擇的方式。STARTSTARTEND定義變量c,并賦值SWITCH(c)輸入1跳轉(zhuǎn)到詳細(xì)成績(jī)查詢Break輸入2排名查詢Break圖3.查詢選手成績(jī)/*search函數(shù)*/voidsearch(){intc;printf("\n請(qǐng)選擇查詢?nèi)荩篭n");printf("1.選手詳細(xì)成績(jī)查詢2.選手排名查詢\n請(qǐng)輸入您的選擇:");scanf("%d",&c);switch(c){case1:system("cls");print();break;case2:system("cls");rank();break;}}查詢選手信息print()分析:實(shí)際為輸出鏈表中的某個(gè)某個(gè)節(jié)點(diǎn),輸出某個(gè)選手的編號(hào)與較為好實(shí)現(xiàn),輸出10位評(píng)委成績(jī)那么用的for語(yǔ)句來(lái)實(shí)現(xiàn)。STARTSTARTEND輸入要查找的選手編號(hào)IFhead==NULL&&tail==NULL當(dāng)前記錄為空輸出表頭WHILE(p1!=NULL)IF(p1->num==seeknum)輸出編號(hào)XXFOR(i=0;i<N;i++)輸出每個(gè)評(píng)委的分?jǐn)?shù)平均分Return指向鏈表的下一個(gè)IFhead!=NULL&&check==0選手成績(jī)不存在Enter圖4.查詢選手信息模塊/*print函數(shù)*/voidprint(){SONGER_MESSAGE*p1=(SONGER_MESSAGE*)malloc(LEN);intcheck=0,i;longseeknum;printf("\n請(qǐng)輸入要查找的選手編號(hào):");scanf("%d",&seeknum);if(head==NULL&&tail==NULL){printf("\n對(duì)不起,當(dāng)前記錄為空!\n");}else{p1=head;printf("\n你要找的選手的成績(jī)?nèi)缦耚n");//在這里找到了要查找的選手成績(jī)printf("||||||||||||||\n");printf("編號(hào)||成績(jī)|1|2|3|4|5|6|7|8|9|10|平均成績(jī)\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對(duì)不起,你查看的選手成績(jī)不存在!\n");}getchar();}菜單函數(shù)menu_select()分析:菜單主函數(shù)要求設(shè)計(jì)比擬簡(jiǎn)潔,只提供設(shè)輸入,處理和輸出局部的函數(shù)調(diào)用。其中各功能模塊用菜單方式選擇。STARTSTARTEND定義變量chars[100];intc;WHILE〔1〕利用atoi()函數(shù)將所接收的字符串轉(zhuǎn)換成數(shù)值,提供應(yīng)if語(yǔ)句判斷IF(c<1||c>7)輸入有誤BreakSWITCH(c)1信息瀏覽Break2信息錄入Break3信息保存Break4成績(jī)查詢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ù)將所接收的字符串轉(zhuǎn)換成數(shù)值,提供應(yīng)if語(yǔ)句判斷if(c<1||c>7){printf("您的輸入有誤,請(qǐng)重新輸入:");gets(s);}elsebreak;}switch(c){case1:system("cls");//清屏browse();//選手信息瀏覽break;case2:system("cls");creat();//選手信息錄入break;case3:system("cls");save();//選手信息保存break;case4:system("cls");search();//選手成績(jī)查詢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()分析;實(shí)現(xiàn)選手信息的修改,核心容為鏈表的遍歷。找出要修改的選手,修改其個(gè)人信息。STARTSTARTEND輸入要修改的選手編號(hào):IF(head==NULL&&tail==NULL)當(dāng)前信息記錄為空p1=headWHILE(p1!=NULL)IF(p1->num==updatenum)修改信息Returnp1=p1->next;指向下一個(gè)節(jié)點(diǎn)IF(head!=NULL&&check==0)選手信息不存在NOgetchar();圖6.修改模塊/*update函數(shù)*/voidupdate(){SONGER_MESSAGE*p1;//=(SONGER_MESSAGE*)malloc(LEN);intcheck=0;//用來(lái)進(jìn)展判斷,是否找到了要修改的信息longupdatenum;printf("\n請(qǐng)輸入要修改的選手編號(hào):");scanf("%d",&updatenum);//查找到要修改的選手if(head==NULL&&tail==NULL){printf("\n當(dāng)前信息記錄為空\(chéng)n");}else{p1=head;while(p1!=NULL){if(p1->num==updatenum){printf("\n你要修改的選手信息如下\n");printf("|\n");printf("編號(hào)|\n");printf("|\n");printf("%-9d%-6s\n",p1->num,p1->name);printf("|\n");printf("\n請(qǐng)重新寫入此選手信息:\n");check=1;//從新寫入修改工程printf("\n修改選手編號(hào)為:");scanf("%d",&p1->num);printf("\n修改選手為:");scanf("%s",p1->name);return;}else{p1=p1->next;}}}if(head!=NULL&&check==0){printf("\n對(duì)不起,你要修改的選手信息不存在!\n");}getchar();}保存函數(shù)save()分析:保存文件的流程。使用fopen()函數(shù)翻開txt文件,"w〞參數(shù)代表翻開只寫文件,再利用fprintf()函數(shù)寫入選手容,最后用fclose〔〕函數(shù)關(guān)閉文件。STARTSTARTEND翻開一個(gè)文件,并寫入格式數(shù)據(jù)WHILE(p1!=NULL)向文件寫入"編號(hào)〞,"XX〞關(guān)閉文件圖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,"編號(hào)|\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é)點(diǎn)并給節(jié)點(diǎn)的元素賦值,然后對(duì)評(píng)委的分?jǐn)?shù)進(jìn)展排序〔鏈表的排序〕,排序選擇冒泡排序法,最后去掉一個(gè)最高分去掉一個(gè)最低分。STARTSTARTEND定義變量inti,j;floatt;charc='y';WHILE(c=='y'||c=='Y')錄入選手信息:編號(hào),XXFOR(i=0;i<N;i++)輸入10位評(píng)委點(diǎn)評(píng)成績(jī)FOR(i=0;i<N-1;i++)FOR(j=0;j<N-1-i;j++)IF(p1->grades[j]>p1->grades[j+1])交換數(shù)的位置去掉一個(gè)最高分,去掉一個(gè)這一低分,得出最后的平均分IF(p1==NULL)內(nèi)存分配失敗IF(head==NULL&&tail==NULL)創(chuàng)立節(jié)點(diǎn)選手信息錄入成功如果當(dāng)前還有節(jié)點(diǎn)那么插入到尾部是否繼續(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請(qǐng)輸入要錄入的選手信息:\n");printf("\n選手編號(hào):");scanf("%d",&p1->num);printf("\n選手:");scanf("%s",p1->name);printf("\n請(qǐng)輸入10位評(píng)委點(diǎn)評(píng)成績(jī):");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++)//冒泡排序法讓那個(gè)成績(jī)從小到大排列,然后選出最大值是最后一個(gè),最小值是第一個(gè)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;//去掉一個(gè)最高分,去掉一個(gè)這一低分,得出最后的平均分p1->next=NULL;if(p1==NULL){printf("\n存分配失敗\n");n=n-1;}if(head==NULL&&tail==NULL)//當(dāng)前沒(méi)有結(jié)點(diǎn),創(chuàng)立第一個(gè)結(jié)點(diǎn){head=p1;head->next=NULL;tail=head;printf("\n選手信息錄入成功\n");}else//如果當(dāng)前還有節(jié)點(diǎn)那么插入到尾部{tail->next=p1;tail=p1;tail->next=NULL;printf("\n選手信息錄入成功\n");}printf("是否繼續(xù)(Y/N):");getchar();scanf("%c",&c);}}成績(jī)排序rank()分析:用冒泡排序的方法對(duì)平均成績(jī)〔鏈表〕進(jìn)展排序。STARTEND定義指針變量STARTEND定義指針變量*p1,*p2,*endpt,*p;p1=head;IF(head==NULL&&tail==NULL)當(dāng)前信息記錄為空為p1分配內(nèi)存,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é)點(diǎn)的順序交換把p1的信息去掉,head指向排序后的第一個(gè)節(jié)點(diǎn)釋放p1并將p1重新指向頭指針WHILE(p1!=NULL)輸出選手排名加上表尾部getchar();圖8.成績(jī)排序模塊/*rank函數(shù)*/voidrank(){SONGER_MESSAGE*p1,*p2,*endpt,*p;//*endpt/*控制循環(huán)比擬*/*p/*臨時(shí)指針變量*/n=0;p1=head;if(head==NULL&&tail==NULL){printf("\n當(dāng)前信息記錄為空\(chéng)n");}else{p1=(SONGER_MESSAGE*)malloc(LEN);p1->next=head;/*注意理解:我們?cè)黾右粋€(gè)節(jié)點(diǎn),放在第一個(gè)節(jié)點(diǎn)的前面,主要是為了便于比擬。因?yàn)榈谝粋€(gè)節(jié)點(diǎn)沒(méi)有前驅(qū),我們不能交換地址。*/head=p1;/*讓head指向p1節(jié)點(diǎn),排序完成后,我們?cè)侔裵1節(jié)點(diǎn)釋放掉*/for(endpt=NULL;endpt!=head;endpt=p)/*結(jié)合第6點(diǎn)理解*/{for(p=p1=head;p1->next->next!=endpt;p1=p1->next){if(p1->next->ave<p1->next->next->ave)/*如果前面的節(jié)點(diǎn)鍵值比后面節(jié)點(diǎn)的鍵值小,那么交換*/{p2=p1->next->next;//1、排序后q節(jié)點(diǎn)指向p節(jié)點(diǎn),在調(diào)整指向之前,我們要保存原p的指向節(jié)點(diǎn)地址,即: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ā)出來(lái)的指向,排序后q的指向要變?yōu)橹赶騪的,而原來(lái)p1->next是指向p的,所以p2->next=p1->nextp1->next=p2;//4、p1->next原是指向p的,排序后圖16中p1->next要指向q,原來(lái)p1->next->next〔即p2)是指向q的,所以p1->next=p2p=p1->next->next;//5、至此,完成了相鄰兩節(jié)點(diǎn)的順序交換}}}p1=head;/*把p1的信息去掉*/head=head->next;/*讓head指向排序后的第一個(gè)節(jié)點(diǎn)*/free(p1);/*釋放p1*/printf("\n選手成績(jī)排名信息如下\n");printf("|||\n");printf("編號(hào)||平均成績(jī)|名次\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é)點(diǎn)的刪除較為繁瑣。第一種情況:數(shù)據(jù)在鏈表頭部,并且只有一個(gè)結(jié)點(diǎn)。第二種情況:數(shù)據(jù)在鏈表頭部,頭結(jié)點(diǎn)。第三種情況:數(shù)據(jù)在鏈表中間,中間節(jié)點(diǎn)。第四種情況:數(shù)據(jù)在鏈表尾部,尾部節(jié)點(diǎn)。STARTSTARTEND定義變量,輸入要?jiǎng)h除的選手的編號(hào)&del_numIF(head==NULL&&tail==NULL)信息記錄為空,刪除失?。ode=head;p1=head;WHILE(node!=NULL)IF(node->num==del_num)輸出要?jiǎng)h除的選手信息IF(node==head&&head->next==NULL)刪除唯一的節(jié)點(diǎn)IF(node==head&&head->next!=NULL)刪除頭節(jié)點(diǎn)IF(node->next!=NULL)中間節(jié)點(diǎn)刪除成功IFif(node->next==NULL)刪除尾節(jié)點(diǎn)getchar();Returnp1=node;node=node->next;IF(head!=NULL&&check==0)要?jiǎng)h除的選手信息不存在!圖9.刪除模塊/*del函數(shù)*/voiddel(){SONGER_MESSAGE*node;//=(SONGER_MESSAGE*)malloc(LEN);SONGER_MESSAGE*p1;intcheck=0;//用來(lái)進(jìn)展判斷,是否找到了要?jiǎng)h除的信息longdel_num;printf("\n請(qǐng)輸入要?jiǎng)h除的選手的編號(hào):");scanf("%d",&del_num);if(head==NULL&&tail==NULL){printf("\n當(dāng)前信息記錄為空,刪除失敗!\n");}else{node=head;p1=head;while(node!=NULL){if(node->num==del_num){printf("\n要?jiǎng)h除的選手信息\n");printf("|\n");printf("編號(hào)|\n");printf("|\n");printf("%-9d%-6s\n",node->num,node->name);//在這里找到了要?jiǎng)h除的選手信息printf("|\n");check=1;//找到要?jiǎng)h除的信息,賦為真if(node==head&&head->next==NULL)//是頭結(jié)點(diǎn),并且只有一個(gè)結(jié)點(diǎn){head=NULL;tail=head;free(node);printf("\n刪除信息成功\n");//刪除唯一的節(jié)點(diǎn)}elseif(node==head&&head->next!=NULL)//刪除頭節(jié)點(diǎn){node=head;head=head->next;free(node);printf("\n刪除信息成功\n");//頭節(jié)點(diǎn)刪除成功n=n-1;}elseif(node->next!=NULL)//刪除中間節(jié)點(diǎn){p1->next=node->next;free(node);printf("\n刪除信息成功\n");//中間節(jié)點(diǎn)刪除成功n=n-1;}elseif(node->next==NULL)//刪除尾節(jié)點(diǎn){p1->next=NULL;tail=p1;free(node);printf("\n刪除信息成功\n");//尾節(jié)點(diǎn)刪除成功n=n-1;}getchar();return;}else{p1=node;node=node->next;}}}if(head!=NULL&&check==0){printf("\n對(duì)不起,你要?jiǎng)h除的選手信息不存在!\n");}getchar();}公共模塊顏色控制函數(shù)color()分析:為了使程序看起來(lái)更美觀,所以引入windowsapi來(lái)控制顏色函數(shù),用來(lái)改變字體顏色。/*color函數(shù)*/voidcolor(constunsignedshortcolor1){/*僅限改變0-15的顏色;如果在0-15那么實(shí)現(xiàn)他的顏色因?yàn)槿绻^(guò)15后面的改變的是文本背風(fēng)光。*/if(color1>=0&&color1<=15)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color1);/*如果不在0-15的圍顏色,那么改為默認(rèn)的顏色白色;*/elseSetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);/*顏色對(duì)應(yīng)值:0=黑色8=灰色1=藍(lán)色9=淡藍(lán)色2=綠色10=淡綠色0xa3=湖藍(lán)色11=淡淺綠色0xb4=紅色12=淡紅色0xc5=紫色13=淡紫色0xd6=黃色14=淡黃色0xe7=白色15=亮白色0xf*/}退出函數(shù)quit()分析:用來(lái)退出程序/*quit函數(shù)*/voidquit(){printf("\n\n\t=========="感您使用歌唱比賽評(píng)分系統(tǒng)"==========\n\n");}目錄函數(shù)menu()分析;為程序入口提供顯示,因篇幅有限,所以顯示有錯(cuò)亂。/*menu函數(shù)*/voidmenu(){system("modeconcols=100lines=30");color(11);printf("\t.;r155551r;.\n");printf("\t★☆★☆歌唱比賽評(píng)分系統(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.選手成績(jī)查詢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()分析:一個(gè)系統(tǒng)需要一個(gè)美觀歡送界面,由于DOS窗口有限,所以用點(diǎn)陣字寫出"wele〞并且在右下角增加當(dāng)前時(shí)間顯示。時(shí)間用的time.h庫(kù)來(lái)實(shí)現(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當(dāng)前系統(tǒng)時(shí)間:%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按任意鍵進(jìn)入主菜單\n");getch();system("cls");menu();menu_select();return0;}主函數(shù)main()分析;提供程序入口。/*main函數(shù)*/intmain(){wele();return0;}庫(kù)函數(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構(gòu)造體structtm*ptr;//用于wele〔〕顯示時(shí)間的構(gòu)造體typedefstructsonger//定義選手信息鏈表構(gòu)造{longnum;//選手編號(hào)charname[20];//選手floatgrades[N];//選手成績(jī)doubleave;//平均成績(jī)structsonger*next;//鏈表的結(jié)點(diǎn),next是指針變量,指向構(gòu)造體變量=>指針域}SONGER_MESSAGE;//等價(jià)于structSONGER_MESSAGESONGER_MESSAGE*head;//定義鏈表的頭指針SONGER_MESSAGE*tail;//定義鏈表的尾指針intn=0;//n為全局變量,用于統(tǒng)計(jì)結(jié)點(diǎn)的個(gè)數(shù)測(cè)試結(jié)果調(diào)試與測(cè)試第一,用一組簡(jiǎn)單的數(shù)據(jù)對(duì)程序進(jìn)展調(diào)試,是否各函數(shù)有出錯(cuò)現(xiàn)象。然后用復(fù)雜數(shù)據(jù)對(duì)程序進(jìn)展調(diào)試。直到確定程序?qū)φ?shù)據(jù)沒(méi)有錯(cuò)誤為止。第二,當(dāng)數(shù)據(jù)測(cè)試時(shí),程序錯(cuò)誤,要首先找到出錯(cuò)的函數(shù),對(duì)函數(shù)中各個(gè)變量進(jìn)展觀察,有時(shí)變量很多,循環(huán)多重不要急,對(duì)各個(gè)數(shù)據(jù)的觀察,對(duì)程序的調(diào)試有很大的幫助。你也可以先對(duì)幾個(gè)變量熟悉后,在多重循環(huán)里,確定正確的數(shù)據(jù),將其跳過(guò)調(diào)試,對(duì)有疑問(wèn)的數(shù)據(jù)循環(huán)進(jìn)展仔細(xì)觀察。雖然這是比擬省力氣的活,但對(duì)復(fù)雜的數(shù)據(jù)錯(cuò)誤并不是很有效,所以仔細(xì)觀察每個(gè)數(shù)據(jù)的變化對(duì)調(diào)試的成功與否有決定性作用。第三,測(cè)試時(shí),根本的錯(cuò)誤并不一定在運(yùn)行錯(cuò)誤的函數(shù),或許在前面的函數(shù)已經(jīng)奠定了這些錯(cuò)誤數(shù)據(jù)的根底,需要反過(guò)頭來(lái),對(duì)所有的的函數(shù)進(jìn)展一項(xiàng)項(xiàng)的調(diào)試!從程序運(yùn)行的第一個(gè)函數(shù)開場(chǎng)調(diào)試。按照程序運(yùn)行的步驟下去。一個(gè)個(gè)確實(shí)定函數(shù)的正確性,每確定一個(gè)函數(shù),在以后的調(diào)試中可以減少對(duì)該函數(shù)的調(diào)試次數(shù),或者直接跳到下一個(gè)函數(shù)。所謂的各個(gè)擊破便是如此。對(duì)頭文件中的各個(gè)函數(shù)的返回值和它所要傳入的參變量及其功能更是需要注意。第四,調(diào)試時(shí),需要對(duì)錯(cuò)誤縮小圍,從整個(gè)程序到指定函數(shù),再到指定區(qū)域,再到指定行,在對(duì)程序縮小圍或?qū)幾g沒(méi)通過(guò)的程序縮小錯(cuò)誤圍時(shí)可以用"/**/"來(lái)進(jìn)展調(diào)試,確定正常圍,縮小錯(cuò)誤圍。測(cè)試結(jié)果截圖圖10.歡送界面圖11.主菜單圖12.選手信息瀏覽圖13選手信息錄入圖14選手信息保存圖15選手信息查詢圖16選手詳細(xì)信息查詢圖17選手排名查詢圖18選手信息修改圖19選手信息刪除圖20退出系統(tǒng)設(shè)計(jì)總結(jié)通過(guò)以上各章節(jié)的介紹,已經(jīng)完成了歌唱比賽評(píng)分系統(tǒng)設(shè)計(jì)系統(tǒng)的開發(fā),歌唱比賽評(píng)分系統(tǒng)設(shè)計(jì)是一套實(shí)用性非常強(qiáng)的系統(tǒng),可以應(yīng)用到各種評(píng)分系統(tǒng)。歌唱比賽評(píng)分系統(tǒng)設(shè)計(jì)不僅需要靈活的交互功能,還需要經(jīng)常與數(shù)據(jù)庫(kù)進(jìn)展聯(lián)系,要求具有操作簡(jiǎn)單和功能強(qiáng)大的數(shù)據(jù)庫(kù)訪問(wèn)能力。界面盡量美觀友好、多彩多姿,完全的圖形化設(shè)計(jì),操作者易于上手,同時(shí)多種媒體技術(shù)的集成利用,可以方便的完成用戶樂(lè)于承受的各種界面設(shè)計(jì)。本系統(tǒng)雖具備了根本的功能,但由于時(shí)間關(guān)系,還有很多功能待實(shí)現(xiàn),在此根底上結(jié)合實(shí)際應(yīng)用中所出現(xiàn)的問(wèn)題,更智能化的排名系統(tǒng),以及增加網(wǎng)絡(luò)評(píng)分,觀眾評(píng)分等功能。通過(guò)這次編程我深深的感受到對(duì)代碼的變量命名,代碼注釋格式,甚至嵌套中行縮進(jìn)的長(zhǎng)度和函數(shù)間的空行數(shù)字都有明確規(guī)定,良好的編寫習(xí)慣,不但有助于代碼的移植和糾錯(cuò),也有助于不同人員之間的協(xié)作。我們還要有模塊化思維能力,模塊化思維就是編程任何一個(gè)功能模塊或函數(shù)的時(shí)候,要多想一些,不要局限在完成當(dāng)前任務(wù)的簡(jiǎn)單思路上,想想看該模塊是否可以脫離這個(gè)系統(tǒng)存在,是否可以通過(guò)簡(jiǎn)單的修改參數(shù)的方式在其他系統(tǒng)和應(yīng)用環(huán)境下直接引用,這樣就能極大防止重復(fù)性的開發(fā)工作。善于總結(jié),也是學(xué)習(xí)能力的一種表達(dá),每次完成一個(gè)編程任務(wù),完成一段代碼,都應(yīng)當(dāng)有目的的跟蹤該程序的應(yīng)用狀況,隨時(shí)總結(jié),找到自己的缺乏,這樣所編寫的程序才能逐步提高。致在學(xué)習(xí)中,教師嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度、豐富淵博的知識(shí)、精益求精的工作態(tài)度以及侮人不倦的師者風(fēng)是我終生學(xué)習(xí)的楷模,教師們的高深精湛的造詣與嚴(yán)謹(jǐn)?shù)闹螌W(xué)精神,將永遠(yuǎn)鼓勵(lì)著我。在此,謹(jǐn)向教師們致以衷心的感和崇高的敬意!另外,感校方給予我我們這樣一次時(shí)機(jī),能夠獨(dú)立地完成一個(gè)課程設(shè)計(jì),并在這個(gè)過(guò)程當(dāng)中,給予我們各種方便,使我們?cè)谶@學(xué)期快要完畢的時(shí)候,能夠?qū)W(xué)到的知識(shí)應(yīng)用到實(shí)踐中,增強(qiáng)了我們實(shí)踐操作和動(dòng)手應(yīng)用能力,提高了獨(dú)立思考的能力。感所有任課教師和所有同學(xué)在這三年來(lái)給自己的指導(dǎo)和幫助,是他們教會(huì)了我專業(yè)知識(shí),教會(huì)了我如何學(xué)習(xí),教會(huì)了我如何做人。正是由于他們,我才能在各方面取得顯著的進(jìn)步,在此向他們表示我由衷的意。在這次課程設(shè)計(jì)的撰寫中,我得到了許多人的幫助。首先我要感我的教師在課程設(shè)計(jì)上給予我的指導(dǎo)、提供應(yīng)我的支持和幫助,這是我能順利完成這次設(shè)計(jì)的主要原因,更重要的是教師幫我解決了許多技術(shù)上的難題,讓我能把系統(tǒng)做得更加完善。在此期間,我不僅學(xué)到了許多新的知識(shí),而且也開闊了視野,提高了自己的設(shè)計(jì)能力。其次,我要感幫助過(guò)我的同學(xué),他們也為我解決了不少我不太明白的設(shè)計(jì)上的難題。最后再一次感所有在設(shè)計(jì)中幫助過(guò)我的良師益友和同學(xué)參考文獻(xiàn)[1]譚浩強(qiáng).C程序設(shè)計(jì).:清華大學(xué),2007.91-310[2]譚浩強(qiáng).C程序設(shè)計(jì)題解與上機(jī)指導(dǎo).:清華大學(xué),2005.130-155[3]明慧.VisualC++開發(fā)圖書管理系統(tǒng).:師大學(xué),2005.32-40[4]C編寫組編.常用C語(yǔ)言用法速查手冊(cè).:龍門書局,1995.34-45[5]俐,瑩編著.C語(yǔ)言高級(jí)程序設(shè)計(jì).:清華大學(xué),2006.67-78[6]海新,燕主編.C語(yǔ)言程序設(shè)計(jì)實(shí)用教程.:機(jī)械工業(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〔〕顯示時(shí)間的構(gòu)造體typedefstructsonger//定義選手信息鏈表構(gòu)造{longnum;//選手編號(hào)charname[20];//選手floatgrades[N];//選手成績(jī)doubleave;//平均成績(jī)structsonger*next;//鏈表的結(jié)點(diǎn),next是指針變量,指向構(gòu)造體變量=>指針域}SONGER_MESSAGE;//等價(jià)于structSONGER_MESSAGESONGER_MESSAGE*head;//定義鏈表的頭指針SONGER_MESSAGE*tail;//定義鏈表的尾指針intn=0;//n為全局變量,用于統(tǒng)計(jì)結(jié)點(diǎn)的個(gè)數(shù)voidcreat();//建立單向動(dòng)態(tài)鏈表。此函數(shù)帶回一個(gè)指向鏈表頭的指針,用于參賽選手的錄入voiddel();//用于刪除結(jié)點(diǎn),用于參賽選手的刪除voidsearch();//參賽選手成績(jī)的查詢voidprint();//用于輸出鏈表voidrank();//按個(gè)人平均成績(jī)從高到低的順序進(jìn)展排序voidupdate();//參賽選手的修改voidmenu();//操作系統(tǒng)菜單界面voidmenu_select();//菜單項(xiàng)選擇擇界面voidbrowse();//選手信息瀏覽voidsave();//選手信息保存voidquit();//退出系統(tǒng)界面/*browse函數(shù)*/voidbrowse(){SONGER_MESSAGE*p1;if(head==NULL&&tail==NULL){printf("\n當(dāng)前信息記錄為空\(chéng)n");}else{printf("\n你要瀏覽的選手信息如下\n");printf("|\n");printf("編號(hào)|\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請(qǐng)選擇查詢?nèi)荩篭n");printf("1.選手詳細(xì)成績(jī)查詢2.選手排名查詢\n請(qǐng)輸入您的選擇:");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請(qǐng)輸入要查找的選手編號(hào):");scanf("%d",&seeknum);if(head==NULL&&tail==NULL){printf("\n對(duì)不起,當(dāng)前記錄為空!\n");}else{p1=head;printf("\n你要找的選手的成績(jī)?nèi)缦耚n");//在這里找到了要查找的選手成績(jī)printf("||||||||||||||\n");printf("編號(hào)||成績(jī)|1|2|3|4|5|6|7|8|9|10|平均成績(jī)\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對(duì)不起,你查看的選手成績(jī)不存在!\n");}getchar();}/*menu_select函數(shù)*/voidmenu_select(){chars[100];intc;gets(s);//不管用戶輸入的是數(shù)字鍵或是字母鍵使用gets都能將輸入作為字符串接收while(1)//限定用戶輸入的數(shù)值必須在1-7之間才有效,否那么要求重新輸入{c=atoi(s);//利用atoi()函數(shù)將所接收的字符串轉(zhuǎn)換成數(shù)值,提供應(yīng)if語(yǔ)句判斷if(c<1||c>7){printf("您的輸入有誤,請(qǐng)重新輸入:");gets(s);}elsebreak;}switch(c){case1:system("cls");//清屏browse();//選手信息瀏覽break;case2:system("cls");creat();//選手信息錄入break;case3:system("cls");save();//選手信息保存break;case4:system("cls");search();//選手成績(jī)查詢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;//用來(lái)進(jìn)展判斷,是否找到了要修改的信息longupdatenum;printf("\n請(qǐng)輸入要修改的選手編號(hào):");scanf("%d",&updatenum);//查找到要修改的選手if(head==NULL&&tail==NULL){printf("\n當(dāng)前信息記錄為空\(chéng)n");}else{p1=head;while(p1!=NULL){if(p1->num==updatenum){printf("\n你要修改的選手信息如下\n");printf("|\n");printf("編號(hào)|\n");printf("|\n");printf("%-9d%-6s\n",p1->num,p1->name);printf("|\n");printf("\n請(qǐng)重新寫入此選手信息:\n");check=1;//從新寫入修改工程printf("\n修改選手編號(hào)為:");scanf("%d",&p1->num);printf("\n修改選手為:");scanf("%s",p1->name);return;}else{p1=p1->next;}}}if(head!=NULL&&check==0){printf("\n對(duì)不起,你要修改的選手信息不存在!\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,"編號(hào)|\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請(qǐng)輸入要錄入的選手信息:\n");printf("\n選手編號(hào):");scanf("%d",&p1->num);printf("\n選手:");scanf("%s",p1->name);printf("\n請(qǐng)輸入10位評(píng)委點(diǎn)評(píng)成績(jī):");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++)//冒泡排序法讓那個(gè)成績(jī)從小到大排列,然后選出最大值是最后一個(gè),最小值是第一個(gè)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;//去掉一個(gè)最高分,去掉一個(gè)這一低分,得出最后的平均分p1->next=NULL;if(p1==NULL){printf("\n存分配失敗\n");n=n-1;}if(head==NULL&&tail==NULL)//當(dāng)前沒(méi)有結(jié)點(diǎn),創(chuàng)立第一個(gè)結(jié)點(diǎn){head=p1;head->next=NULL;tail=head;printf("\n選手信息錄入成功\n");}else//如果當(dāng)前還有節(jié)點(diǎn)那么插入到尾部{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/*臨時(shí)指針變量*/n=0;p1=head;if(head==NULL&&tail==NULL){printf("\n當(dāng)前信息記錄為空\(chéng)n");}else{p1=(SONGER_MESSAGE*)malloc(LEN);p1->next=head;/*注意理解:我們?cè)黾右粋€(gè)節(jié)點(diǎn),放在第一個(gè)節(jié)點(diǎn)的前面,主要是為了便于比擬。因?yàn)榈谝粋€(gè)節(jié)點(diǎn)沒(méi)有前驅(qū),我們不能交換地址。*/head=p1;/*讓head指向p1節(jié)點(diǎn),排序完成后,我們?cè)侔裵1節(jié)點(diǎn)釋放掉*/for(endpt=NULL;endpt!=head;endpt=p)/*結(jié)合第6點(diǎn)理解*/{for(p=p1=head;p1->next->next!=endpt;p1=p1->next){if(p1->next->ave<p1->next->next->ave)/*如果前面的節(jié)點(diǎn)鍵值比后面節(jié)點(diǎn)的鍵值小,那么交換*/{p2=p1->next->next;//1、排序后q節(jié)點(diǎn)指向p節(jié)點(diǎn),在調(diào)整指向之前,我們要保存原p的指向節(jié)點(diǎn)地址,即: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ā)出來(lái)的指向,排序后q的指向要變?yōu)橹赶騪的,而原來(lái)p1->next是指向p的,所以p2->next=p1->nextp1->next=p2;//4、p1->next原是指向p的,排序后圖16中p1->next要指向q,原來(lái)p1->next->next〔即p2)是指向q的,所以p1->next=p2p=p1->next->next;//5、至此,完成了相鄰兩節(jié)點(diǎn)的順序交換}}}p1=head;/*把p1的信息去掉*/head=head->next;/*讓head指向排序后的第一個(gè)節(jié)點(diǎn)*/free(p1);/*釋放p1*/printf("\n選手成績(jī)排名信息如下\n");printf("|||\n");printf("編號(hào)||平均成績(jī)|名次\n");p1=head;while(p1!=NULL){printf("|||\n");printf("%-9d%-9s%-9.1lf%-5d\n",p1->num
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鏈家房屋買賣定金支付及退還標(biāo)準(zhǔn)協(xié)議
- 二零二五年度住房租賃補(bǔ)貼擔(dān)保服務(wù)合同
- 二零二五年度蘇州市教育機(jī)構(gòu)用工企業(yè)勞動(dòng)合同書
- 二零二五年度云計(jì)算資源合作共享合同
- 2025年度電子商務(wù)平臺(tái)招防范合同法律風(fēng)險(xiǎn)合作協(xié)議
- 2025年度涂料班組涂料行業(yè)市場(chǎng)分析咨詢合同
- 二零二五年度特色日租房短租體驗(yàn)協(xié)議書
- 二零二五年度貸款居間代理及金融科技創(chuàng)新應(yīng)用合同
- 2025年度高端合同事務(wù)律師服務(wù)合同
- 2025年度智慧交通項(xiàng)目提前終止合同及交通設(shè)施移交協(xié)議
- 司機(jī)安全駕駛培訓(xùn)課件
- 硬化性肺泡細(xì)胞瘤-課件
- 簡(jiǎn)明新疆地方史趙陽(yáng)
- 狹窄性腱鞘炎中醫(yī)臨床路徑及表單
- Q∕SY 19001-2017 風(fēng)險(xiǎn)分類分級(jí)規(guī)范
- 智慧消防綜合解決方案
- 市場(chǎng)營(yíng)銷組合策略及營(yíng)銷戰(zhàn)略課件
- 信息技術(shù)基礎(chǔ)ppt課件(完整版)
- DGJ 08-70-2021 建筑物、構(gòu)筑物拆除技術(shù)標(biāo)準(zhǔn)
- 2022年義務(wù)教育語(yǔ)文課程標(biāo)準(zhǔn)(2022版)解讀【新課標(biāo)背景下的初中名著閱讀教學(xué)質(zhì)量提升思考】
- 屋面網(wǎng)架結(jié)構(gòu)液壓提升施工方案(50頁(yè))
評(píng)論
0/150
提交評(píng)論