版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
(此文檔為word格式,下載后您可任意編輯修改!)高級(jí)語言程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告系部名稱電子與信息工程系學(xué)生姓名專業(yè)名稱電子信息工程班級(jí)學(xué)號(hào)指導(dǎo)教師時(shí)間實(shí)驗(yàn)題目學(xué)生信息管理系統(tǒng)一、實(shí)驗(yàn)?zāi)康?.熟悉C語言程序的編輯、編譯鏈接和運(yùn)行的過程,至少能夠用一種編譯器較熟練地編輯、編譯及調(diào)試程序。2.掌握C語言數(shù)據(jù)類型,如何定義一個(gè)整型、字符型和實(shí)型的變量,以及對(duì)它們賦值的方法。3.熟練運(yùn)用if語句和switch語句以及嵌套應(yīng)用。涉及循環(huán)調(diào)用的,了解并掌握三種控制語句while、do-while和for語句。4.學(xué)習(xí)并掌握C語言定義函數(shù)的基本方法、聲明函數(shù)及調(diào)用函數(shù)的方法和過程。5.掌握文件和文件指針的概念以及文件的定義方法,認(rèn)識(shí)文件打開、關(guān)閉、讀、寫等文件基本操作函數(shù)。6.掌握結(jié)構(gòu)體類型變量、數(shù)組的定義和使用。7.了解指針和鏈表的概念,掌握指針的定義和使用指針變量的方法以及鏈表的正確用法。靈活使用鏈表來儲(chǔ)存學(xué)生信息。8.掌握數(shù)組的定義、引用以及輸入輸出的方法、通過字符數(shù)組存儲(chǔ)字符串,進(jìn)一步使用字符串二、實(shí)驗(yàn)內(nèi)容學(xué)生管理程序具有下列功能:一、輸入部分通過鍵盤輸入多位學(xué)生的學(xué)生信息。學(xué)生的信息包含有:學(xué)生姓名、性別、學(xué)號(hào)、出生年月日、年齡、成績(jī)。二、輸出部分輸出當(dāng)前已存儲(chǔ)的學(xué)生信息三、更新部分此部分分為了三個(gè)目錄:①插入讓用戶自定義在哪個(gè)學(xué)生的左側(cè)插入一個(gè)新的學(xué)生的信息②刪除刪除用戶指定的學(xué)生信息③修改修改用戶指定的學(xué)生信息四、查詢部分分為兩個(gè)目錄①按名字查詢輸出用戶查詢的學(xué)生信息②按學(xué)號(hào)查詢輸出用戶查詢的學(xué)生信息查詢用戶指定的學(xué)生信息五、排序此部分分為了兩個(gè)目錄:①按學(xué)號(hào)排序②按成績(jī)排序六、統(tǒng)計(jì)此部分也分為了兩個(gè)目錄:①統(tǒng)計(jì)當(dāng)前一共存儲(chǔ)了多少個(gè)學(xué)生的信息②統(tǒng)計(jì)當(dāng)前存儲(chǔ)的學(xué)生信息中的男生或女生的人數(shù)③統(tǒng)計(jì)及格人數(shù)④統(tǒng)計(jì)不及格人數(shù)七、釋放開發(fā)工具—-Win-TC運(yùn)行平臺(tái)——中文DOS運(yùn)行環(huán)境三、需求分析一、函數(shù)功能描述⑴輸入部分通過鍵盤輸入多位學(xué)生的學(xué)生信息。學(xué)生的信息包含有:學(xué)生姓名、性別、學(xué)號(hào)、出生年月日、年齡、成績(jī)。/*此次做的學(xué)生管理系統(tǒng)是利用鏈表而完成的程序,故第一部分想要實(shí)現(xiàn)建立鏈表*/⑵、輸出部分輸出當(dāng)前已存儲(chǔ)的學(xué)生信息/*通過鏈表的頭結(jié)點(diǎn)的地址來依次輸出每個(gè)結(jié)點(diǎn)中的值域中的內(nèi)容,直至尾結(jié)點(diǎn)來實(shí)現(xiàn)輸出學(xué)生信息*/⑶、更新部分此部分分為了三個(gè)目錄:①插入讓用戶自定義在哪個(gè)學(xué)生的左側(cè)插入一個(gè)新的學(xué)生的信息/*這部分的功能是讓用戶自定義插在哪個(gè)個(gè)學(xué)生左邊,并輸入該學(xué)生的學(xué)號(hào),找到其在鏈表中存儲(chǔ)的結(jié)點(diǎn)處插入一個(gè)新的結(jié)點(diǎn),而這個(gè)新的結(jié)點(diǎn)的中的值域存儲(chǔ)的是一個(gè)新的學(xué)生信息,從而實(shí)現(xiàn)插入一個(gè)新的學(xué)生信息*/②刪除刪除用戶指定的學(xué)生信息/*這部分的功能是輸入學(xué)生的學(xué)號(hào),找到其在鏈表中存儲(chǔ)的結(jié)點(diǎn)處,并將這整個(gè)結(jié)點(diǎn)刪除,再把該結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)和后驅(qū)節(jié)點(diǎn)連接,來實(shí)現(xiàn)這個(gè)學(xué)生信息的刪除*/③修改修改用戶指定的學(xué)生信息/*這部分是利用輸入學(xué)生的學(xué)號(hào),來找到存儲(chǔ)該學(xué)生信息的結(jié)點(diǎn),通過該結(jié)點(diǎn)的鏈域來修改其中的值域,來實(shí)現(xiàn)對(duì)學(xué)生信息的修改*/⑷、查詢部分查詢用戶指定的學(xué)生信息①按名字查詢輸出用戶查詢的學(xué)生信息/*這部分是利用輸入學(xué)生的姓名,來找到存儲(chǔ)該學(xué)生信息的結(jié)點(diǎn),輸出該結(jié)點(diǎn)的值域中的內(nèi)容,來實(shí)現(xiàn)對(duì)學(xué)生信息的查詢功能*/②按學(xué)號(hào)查詢輸出用戶查詢的學(xué)生信息/*同上,只是查詢條件為學(xué)號(hào)*/⑸、排序此部分分為了兩個(gè)目錄:①按學(xué)號(hào)排序/*此部分程序設(shè)計(jì)較為復(fù)雜,但大致是通過對(duì)鏈表中個(gè)結(jié)點(diǎn)的值域比較,按小到大的順序排序,但必須要修改相應(yīng)的鏈域,才能實(shí)現(xiàn)排序的功能*/②按成績(jī)排序/*此部分和大致內(nèi)容和按學(xué)號(hào)排序一樣,但不同的是,此處是按大到小的順序排序*/⑹、統(tǒng)計(jì)此部分也分為了兩個(gè)目錄:①統(tǒng)計(jì)當(dāng)前一共存儲(chǔ)了多少個(gè)學(xué)生的信息/*通過輸出學(xué)生的信息,每輸入一個(gè)總和數(shù)加一,最后輸出總和數(shù)來實(shí)現(xiàn)統(tǒng)計(jì)人數(shù)*/②統(tǒng)計(jì)當(dāng)前存儲(chǔ)的學(xué)生信息中的男生或女生的人數(shù)/*從頭結(jié)點(diǎn)開始,一個(gè)一個(gè)結(jié)點(diǎn)的去查看其值域,若性別為男生或女生,總和數(shù)加一,最后輸出總和數(shù)來實(shí)現(xiàn)統(tǒng)計(jì)男生或女生的人數(shù)*/③統(tǒng)計(jì)及格人數(shù)/*從頭結(jié)點(diǎn)開始,一個(gè)一個(gè)結(jié)點(diǎn)的去查看其值域,若成績(jī)大于60,總和數(shù)加一,最后輸出總和數(shù)來實(shí)現(xiàn)統(tǒng)計(jì)及格的人數(shù)*/④統(tǒng)計(jì)不及格人數(shù)/*從頭結(jié)點(diǎn)開始,一個(gè)一個(gè)結(jié)點(diǎn)的去查看其值域,若成績(jī)小于60,總和數(shù)加一,最后輸出總和數(shù)來實(shí)現(xiàn)統(tǒng)計(jì)不及格的人數(shù)*/⑺、釋放這個(gè)部分和動(dòng)態(tài)存儲(chǔ)分配中的釋放空間有著類似的概念,即所建立的鏈表所申請(qǐng)的存儲(chǔ)空間全部釋放,也就是說把當(dāng)前錄入的所有學(xué)生信息全部刪除,本著申請(qǐng)動(dòng)態(tài)存儲(chǔ)空間最后要釋放的原則,設(shè)計(jì)了這個(gè)部分二、問題的提出如何完成排序部分這個(gè)功能的呢?因?yàn)槭褂面湵?,感覺上排序似乎是整個(gè)程序設(shè)計(jì)中最難的部分,因?yàn)橐鶕?jù)結(jié)點(diǎn)中值域的內(nèi)容來對(duì)應(yīng)的修改鏈域,而鏈域中的指針問題若不考慮清楚,則很有可能造成鏈表的混亂,造成某些結(jié)點(diǎn)沒有連接上或等其他情況,因此本人將排序這部分作為整個(gè)程序設(shè)計(jì)的重點(diǎn)。三.程序可以滿足以下功能:1.各模塊間通過菜單切換和調(diào)用2.主函數(shù)通過調(diào)用菜單函數(shù)實(shí)現(xiàn)對(duì)各功能模塊的調(diào)用,各功能模塊間根據(jù)需要可相互調(diào)用。3.程序能夠保證各模塊功能的獨(dú)立和數(shù)據(jù)共享。/*不使用全局變量則能保證函數(shù)之間的獨(dú)立性,利用形參與實(shí)參之間的數(shù)值傳遞來實(shí)現(xiàn)數(shù)據(jù)共享*/4.相近功能以級(jí)聯(lián)菜單的形式集成。四、概要設(shè)計(jì)1.方案設(shè)計(jì)2.數(shù)據(jù)結(jié)構(gòu)說明structdate{intyear,month,day;/*這個(gè)結(jié)構(gòu)體的成員代表的是學(xué)生的出生年月日*/};structStudent/*這個(gè)結(jié)構(gòu)體的成員分別代表了學(xué)生的學(xué)號(hào)、電話、名字、性別、年齡、{成績(jī)、出生年月日*/longnum,tel;charname[11],sex[2];intage,score;structdateBirth;structStudent*next;/*這個(gè)是在鏈表中建立起連接各個(gè)結(jié)點(diǎn)的鏈域的一個(gè)指向這個(gè)};structStudent結(jié)構(gòu)體的指針*/3.模塊功能說明在設(shè)計(jì)的程序中,共設(shè)計(jì)了intOutput(structStudent*);/*輸出當(dāng)前存儲(chǔ)的所有學(xué)生信息*/voidOutput_student(structStudent*);/*在查詢中顯示所查詢的學(xué)生信息*/structStudent*Find(structStudent*,long);/*在查詢、插入、修改函數(shù)中使用來尋找到相關(guān)的存儲(chǔ)了相關(guān)的學(xué)生信息的結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)地址*/structStudent*Creat(long);/*在插入函數(shù)中調(diào)用,創(chuàng)建一個(gè)新的結(jié)點(diǎn),其值域存儲(chǔ)一個(gè)新的學(xué)生信息,并返回指向這個(gè)結(jié)點(diǎn)的指針,用于插入時(shí)與其前驅(qū)和后驅(qū)結(jié)點(diǎn)的鏈域連接*/voidInsert(structStudent**,long,long);/*在用戶指定的結(jié)點(diǎn)左邊插入一個(gè)新的結(jié)點(diǎn),既是把Creat這個(gè)函數(shù)傳遞過來的的新結(jié)點(diǎn)的指針與其前驅(qū)和后驅(qū)結(jié)點(diǎn)的鏈域連接*/intInsertNode(structStudent**);/*輸出些提示用戶操作的語句,只要想要插入的那個(gè)學(xué)生的學(xué)號(hào)不為0,則提示插入成功,否則插入失敗*/intDelete(structStudent**);/*找到存儲(chǔ)了用戶指定的學(xué)生信息的結(jié)點(diǎn),將其刪除*/intRevise(structStudent*);/*找到存儲(chǔ)了用戶指定的學(xué)生信息的結(jié)點(diǎn),修改其值域的內(nèi)容*/voidRenew(structStudent**);/*建立個(gè)子菜單,菜單內(nèi)有三個(gè)目錄:一、插入二、刪除三、修改四、退出讓用戶選擇*/voidInquire_name(structStudent*);/*輸入想查詢的學(xué)生姓名,從頭結(jié)點(diǎn)開始,一個(gè)一個(gè)結(jié)點(diǎn)的去查看其值域,若相同,則輸出這個(gè)結(jié)點(diǎn)的值域內(nèi)的內(nèi)容*/voidInquire_num(structStudent*);/*輸入想查詢的學(xué)生學(xué)號(hào),從頭結(jié)點(diǎn)開始,一個(gè)一個(gè)結(jié)點(diǎn)的去查看其值域,若相同,則輸出這個(gè)結(jié)點(diǎn)的值域內(nèi)的內(nèi)容*/voidInquire(structStudent*);/*建立個(gè)子菜單,菜單內(nèi)有三個(gè)目錄:一、按姓名查詢二、按學(xué)號(hào)查詢?nèi)?、退出讓用戶選擇*/voidPaixu_num(structStudent**);/*按照學(xué)生的學(xué)號(hào)排序*/voidPaixu_score(structStudent**);/*按照學(xué)生的成績(jī)排序*/voidPaixu(structStudent**);/*建立個(gè)子菜單,菜單內(nèi)有三個(gè)目錄:一、按學(xué)號(hào)排序二、按成績(jī)排序三、退出讓用戶選擇*/voidSum_people(structStudent*);/*統(tǒng)計(jì)學(xué)生的個(gè)數(shù)*/voidSum_sex(structStudent*);/*統(tǒng)計(jì)學(xué)生中男/女生的個(gè)數(shù)*/voidSum_pass(structStudent*);/*統(tǒng)計(jì)及格人數(shù)*/voidSum_no(structStudent*);/*統(tǒng)計(jì)不及格人數(shù)*/voidSum(structStudent*);/*建立個(gè)子菜單,菜單內(nèi)有三個(gè)目錄:一、統(tǒng)計(jì)學(xué)生個(gè)數(shù)二、統(tǒng)計(jì)學(xué)生中男/女生的個(gè)數(shù)三、*統(tǒng)計(jì)及格人數(shù)四、統(tǒng)計(jì)不及格人數(shù)五、退出讓用戶選擇*/voidFree(structStudent**);/*刪除所有學(xué)生的信息,采用不斷刪除頭結(jié)點(diǎn)的方式來依次刪除所有的結(jié)點(diǎn)*/五、詳細(xì)設(shè)計(jì)1.主要功能模塊的流程圖如下:⑴主函數(shù)設(shè)計(jì)過程主函數(shù)中因?yàn)橐⒅鞑藛嗡兄骱瘮?shù)中并沒有什么復(fù)雜的的設(shè)計(jì)過程,較簡(jiǎn)單。密碼部分稍微復(fù)雜。而菜單部分只需用switch語句來建立主菜單,以供用戶選擇。密碼部分:使用了一個(gè)while循環(huán)來判斷用戶輸入的密碼是否正確,若正確,則繼續(xù)執(zhí)行下面的語句,否則就要不斷的輸入密碼,直至正確,確保了用戶資料的保密性。部分源程序如下:voidmain(void){intchoice,code;system("cls");printf("請(qǐng)輸入密碼:");scanf("%d",&choice);while(choice!=123)/*利用while循環(huán)的來實(shí)現(xiàn)密碼功能*/{printf("\n密碼錯(cuò)誤!\n");printf("請(qǐng)?jiān)佥斎朊艽a!");scanf("%d",&choice);}printf("\n密碼正確!\n");printf("按任意鍵繼續(xù)!");bioskey(0);}⑵輸入函數(shù)設(shè)計(jì)過程輸入部分因?yàn)闋砍兜芥湵淼慕?,所以輸入函?shù)比主函數(shù)復(fù)雜。下面是建立鏈表的詳細(xì)過程設(shè)計(jì)。structStudent*Input1(void){structStudent*h,*p,*q;charname[11];intk;LINE;printf("當(dāng)前輸入的人數(shù)序號(hào)(輸入0結(jié)束輸入):\n\n");scanf("%d",&k);LINE;h=NULL;while(k>0){p=NEW;/*用動(dòng)態(tài)存儲(chǔ)分配來實(shí)現(xiàn)創(chuàng)建一個(gè)新的結(jié)點(diǎn)*/…/*這部分,是給創(chuàng)建結(jié)點(diǎn)中的值域賦值*/p->next=NULL;/*給P的下一個(gè)結(jié)點(diǎn)賦值為0*/if(h==NULL)/*這個(gè)部分的執(zhí)行順序是①③②③②③…,所以給h一開始賦值為①h=p;NULL為這個(gè)用意,這樣h空間就存有創(chuàng)建的鏈表的首地址*/else②q->next=p;/*一開始先執(zhí)行①③,所以q一開始指向鏈表的頭結(jié)點(diǎn),之后執(zhí)③q=p;②③②③這樣,就讓頭結(jié)點(diǎn)與第二個(gè)結(jié)點(diǎn)之間的鏈域連接,再后讓q指LINE;向改變,直到第二個(gè)結(jié)點(diǎn),依次連接新的結(jié)點(diǎn),直至循環(huán)條件結(jié)束。*/printf("當(dāng)前輸入的人數(shù)序號(hào)(輸入0結(jié)束輸入):\n\n");scanf("%d",&k);LINE;}returnh;}⑶輸出函數(shù)設(shè)計(jì)過程輸出函數(shù)和輸入函數(shù)大致設(shè)計(jì)過程有相似之處,輸出函數(shù)也比較簡(jiǎn)單,就是給輸出函數(shù)中的形參傳遞鏈表的首地址,將h指向頭結(jié)點(diǎn),當(dāng)h不為0時(shí),即還沒有到最后一個(gè)結(jié)點(diǎn),每次輸出對(duì)應(yīng)結(jié)點(diǎn)內(nèi)值域的內(nèi)容后,再將h指向移到下一個(gè)結(jié)點(diǎn),又因?yàn)樾螀⒃趆在輸出函數(shù)調(diào)用后就會(huì)被釋放,所以并沒有改變鏈表的頭結(jié)點(diǎn)的地址。for(;h;h=h->next,i++)/*h=h->next是當(dāng)前結(jié)點(diǎn)的值域的內(nèi)容輸出完畢后用來使h的指向指向下一{個(gè)結(jié)點(diǎn),再輸出這個(gè)結(jié)點(diǎn)值域的內(nèi)容,循環(huán)直至尾結(jié)點(diǎn)輸出完畢*/………/*輸出值域的內(nèi)容*/}⑷更新函數(shù)這個(gè)函數(shù)包含了三個(gè)模塊,插入,刪除,修改,因?yàn)楦潞瘮?shù)與主函數(shù)的程序設(shè)計(jì)一樣都是利用switch語句,所以這里只看這三個(gè)模塊的程序設(shè)計(jì)。插入紅色線修改后的鏈表情況,這使用了Find這個(gè)函數(shù),所以根據(jù)Find函數(shù)有三種情況:①成功找到相關(guān)結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn),則返回值p不為NULL且p->next也不為NULL;p不為NULL但p->next=NULL表明所查找得點(diǎn)不存在,則插在最后一個(gè)結(jié)點(diǎn)處;若返回值p為NULL,所查找的結(jié)點(diǎn)就是頭結(jié)點(diǎn)。因?yàn)榈诙N情況不影響,所以可以將函數(shù)設(shè)計(jì)為if(q){p->next=q->next;q->next=p;}else{p->next=*h;*h=p;}其中p指向創(chuàng)建的新結(jié)點(diǎn),q指向相關(guān)結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)。刪除紅色線修改后的鏈表情況,同樣的這也因?yàn)镕ind函數(shù)分為了三種情況,為找到相關(guān)結(jié)點(diǎn)的情況就不予考慮了,這兩種情況的方法都是一樣的:找到了相關(guān)結(jié)點(diǎn),想用temp指向要釋放的結(jié)點(diǎn),再越過其指向下一個(gè)結(jié)點(diǎn),再釋放temp指向的空間。只是第二種還要修改鏈表的首地址,要不則刪除不成功。三、修改修改函數(shù)中比較簡(jiǎn)單,沒有像前二個(gè)函數(shù)那樣還有可能修改頭地址。修改函數(shù)只要利用Find函數(shù)來查找到相關(guān)的結(jié)點(diǎn),來對(duì)應(yīng)的修改其值域即可。⑸查詢函數(shù)查詢函數(shù)分為了兩個(gè)模塊,按姓名查詢和按學(xué)號(hào)查詢。同樣的也是利用Find函數(shù)來查找相關(guān)結(jié)點(diǎn),輸出此結(jié)點(diǎn)值域的內(nèi)容。程序設(shè)計(jì)部分相關(guān)程序:printf("請(qǐng)輸入要查詢的學(xué)號(hào):");LINE;scanf("%ld",&num);p=Find(h,num);if(p&&(p->next)){p=p->next;Output_student(p);}elseif(p==NULL)Output_student(h);elseprintf("不存在該學(xué)生!");同樣的根據(jù)Find函數(shù)分為了兩種情況:一是未找到相關(guān)結(jié)點(diǎn),則不輸出,二、找到了相關(guān)結(jié)點(diǎn),輸出相關(guān)結(jié)點(diǎn)的值域內(nèi)容。⑹排序函數(shù)此部分也分為了兩個(gè)模塊,但是程序設(shè)計(jì)思想基本一致,故只說明其中的一個(gè)模塊。分為了兩種情況:第一是頭結(jié)點(diǎn)與第二個(gè)結(jié)點(diǎn)作比較,若頭結(jié)點(diǎn)內(nèi)值域中指定的成員值大于第二個(gè)結(jié)點(diǎn),則需交換。因?yàn)樯婕暗筋^結(jié)點(diǎn)地址的改變,所以將其單獨(dú)作為一種情況來討論。p=(*h)->next;if((p->score)>((*h)->score)){(*h)->next=p->next;p->next=(*h);(*h)=p;根據(jù)這個(gè)過程可以將其交換。第二種情況:無需改變到頭結(jié)點(diǎn)的地址,所以這個(gè)情況和上述情況的只有稍微差別。for(t=(*h),p=(*h)->next,q=p->next;q&&p;t=t->next){if((q->num)<(p->num)){p->next=q->next;/*這部分若條件為真,則進(jìn)行交換。*/q->next=p;t->next=q;q=p->next;}else{p=p->next;/*條件為假,無需交換,繼續(xù)下個(gè)結(jié)點(diǎn)與其后驅(qū)結(jié)點(diǎn)的比較*/q=q->next;}這部分的程序設(shè)計(jì)時(shí),有點(diǎn)類似與冒泡的方法。因?yàn)檫@兩種情況執(zhí)行后相當(dāng)于用一個(gè)結(jié)點(diǎn)依次與其后驅(qū)結(jié)點(diǎn)比較,故再用一個(gè)循環(huán),循環(huán)次數(shù)為最大結(jié)點(diǎn)數(shù),這樣就可以完成了排序這部分功能的實(shí)現(xiàn)。⑺統(tǒng)計(jì)函數(shù)這個(gè)部分分為了四個(gè)部分,但是程序設(shè)計(jì)思想基本一致,故只說明其中的一個(gè)模塊。統(tǒng)計(jì)學(xué)生人數(shù)模塊中,考慮調(diào)用Output函數(shù)輸出,輸出一個(gè)學(xué)生的信息,總和數(shù)加一。程序設(shè)計(jì)voidSum_people(structStudent*h){inti;printf("學(xué)生信息:\n");LINE;i=Output(h);LINE;printf("有%d個(gè)學(xué)生\n",i);printf("按任意鍵繼續(xù)!\n");bioskey(0);}調(diào)用Output函數(shù),以完成統(tǒng)計(jì)的功能。⒉運(yùn)行結(jié)果輸入的數(shù)據(jù):插入函數(shù)的運(yùn)行:輸入個(gè)新的學(xué)生信息:name:ljnnum:7sex:myear:1988maonth:3day:13age:19score:70tel:335統(tǒng)計(jì)函數(shù):統(tǒng)計(jì)人數(shù)函數(shù)的運(yùn)行(注此時(shí)數(shù)據(jù)有些不同,因?yàn)橛羞^修改、刪除等操作)查詢函數(shù)的運(yùn)行:排序函數(shù)的運(yùn)行:六、調(diào)試情況,設(shè)計(jì)技巧及體會(huì)1調(diào)試中的主要問題調(diào)試中主要出現(xiàn)的問題:⑴經(jīng)常遇到程序執(zhí)行到某部分就不運(yùn)行,而編譯和鏈接都成功,說明程序設(shè)計(jì)上有些問題,語法等并未出錯(cuò),這時(shí)就要去再行考慮設(shè)計(jì)的程序哪部分考慮不周全。⑵因?yàn)檫@次使用鏈表來設(shè)計(jì)程序,就牽扯到形參和實(shí)參的問題。曾經(jīng)因?yàn)榭紤]不周全,在自定義函數(shù)前的基類出錯(cuò),導(dǎo)致相關(guān)的值未改變,這里就要考慮好形參和實(shí)參的問題。2程序的不足和改進(jìn)之處因?yàn)橛面湵韥碓O(shè)計(jì)一個(gè)程序,較復(fù)雜,最后沒來得及,設(shè)計(jì)相關(guān)的文件存儲(chǔ)來實(shí)現(xiàn)將數(shù)據(jù)保存,以致每次運(yùn)行程序都要重新輸入新的數(shù)據(jù)改進(jìn)之處:可以再考慮編寫一個(gè)函數(shù),這個(gè)函數(shù)的功能是將數(shù)據(jù)寫入文件中并保存。3在設(shè)計(jì)過程中的感受萬事開頭難,編寫一個(gè)自定義函數(shù)時(shí),要先界定好函數(shù)的功能,要有幾個(gè)形參,返回值是什么類型等問題,還是形參和實(shí)參的問題,如果不考慮清楚則自定義函數(shù)就很難編寫出來。在設(shè)計(jì)過程中可以幫助自己的編程能力,也可以在一些平時(shí)沒有考慮甚至考慮不周全的問題上認(rèn)真的考慮,總的來說,兩周的實(shí)習(xí)是有很大收獲的。七、源程序清單#include<stdio.h>#include<string.h>#include<conio.h>#defineLINEprintf("--\n");#defineNEW(structStudent*)malloc(sizeof(structStudent))#defineOK1#defineFALSE0structdate{intyear,month,day;};structStudent{longnum,tel;charname[11],sex[2];intage,score;structdateBirth;structStudent*next;};structStudent*Input();intOutput(structStudent*);/*這部分是所有函數(shù)的聲明*/voidOutput_student(structStudent*);structStudent*Find(structStudent*,long);structStudent*Creat(long);voidInsert(structStudent**,long,long);intInsertNode(structStudent**);intDelete(structStudent**);intRevise(structStudent*);voidRenew(structStudent**);voidInquire_name(structStudent*);voidInquire_num(structStudent*);voidInquire(structStudent*);voidPaixu_num(structStudent**);voidPaixu_score(structStudent**);voidPaixu(structStudent**);voidSum_people(structStudent*);voidSum_sex(structStudent*);voidSum_pass(structStudent*);voidSum_no(structStudent*);voidSum(structStudent*);voidFree(structStudent**);voidFree(structStudent**h){structStudent*p;while(*h){p=*h;*h=p->next;free(p);}LINE;printf("刪除成功!");LINE;bioskey(0);}voidSum(structStudent*h){intchoice;do{system("cls");LINE;printf("\n\n****統(tǒng)計(jì)******\n\n");LINE;printf("1.人數(shù)\n\n");printf("2.男/女生人數(shù)\n\n");printf("3.及格人數(shù)\n\n");printf("4.不及格人數(shù)\n\n");printf("0.、退出\n\n");printf("請(qǐng)輸入(0_4):\n\n");scanf("%d",&choice);switch(choice){case1:Sum_people(h);break;case2:Sum_sex(h);break;case3:Sum_pass(h);break;case4:Sum_no(h);break;case0:break;}}while(choice!=0);}voidSum_no(structStudent*h){inti;printf("學(xué)生信息:\n");LINE;Output(h);LINE;for(i=0;h;h=h->next){if((h->num)<60)i++;}printf("不及格的人數(shù)有:%d\n",i);printf("按任意鍵繼續(xù)!\n");bioskey(0);}voidSum_pass(structStudent*h){inti;printf("學(xué)生信息:\n");LINE;Output(h);LINE;for(i=0;h;h=h->next){if((h->num)>60)i++;}printf("及格的人數(shù)有:%d\n",i);printf("按任意鍵繼續(xù)!\n");bioskey(0);}voidSum_people(structStudent*h){inti;printf("學(xué)生信息:\n");LINE;i=Output(h);LINE;printf("有%d個(gè)學(xué)生\n",i);printf("按任意鍵繼續(xù)!\n");bioskey(0);}voidSum_sex(structStudent*h){charsex[2];inti;printf("學(xué)生信息:\n");LINE;Output(h);LINE;printf("請(qǐng)選擇男生或女生(輸入m/f:\n");scanf("%s",sex);for(i=0;h;h=h->next){if(strcmp(h->sex,sex)==0)i++;}printf("%s生一共有%d個(gè):\n",sex,i);printf("按任意鍵繼續(xù)!\n");bioskey(0);}voidPaixu(structStudent**head){intchoice;do{system("cls");LINE;printf("\n\n****排序******\n\n");LINE;printf("1.按學(xué)號(hào)排序\n\n");printf("2.按成績(jī)排序n\n");printf("0.退出\n\n");printf("請(qǐng)輸入(0_2):\n\n");scanf("%d",&choice);switch(choice){case1:Paixu_num(head);break;case2:Paixu_score(head);break;case0:break;}}while(choice!=0);}voidPaixu_score(structStudent**h){structStudent*p,*q,*t;inti;for(;i<66;i++){p=(*h)->next;if((p->score)>((*h)->score)){(*h)->next=p->next;p->next=(*h);(*h)=p;}for(t=(*h),p=(*h)->next,q=p->next;q&&p;t=t->next){if((q->score)>(p->score)){p->next=q->next;q->next=p;t->next=q;q=p->next;}else{p=p->next;q=q->next;}}}printf("排序完成!");Output(*h);printf("按任意鍵繼續(xù)!");bioskey(0);}voidPaixu_num(structStudent**h){structStudent*p,*q,*t;inti;for(;i<66;i++){p=(*h)->next;if((p->num)<((*h)->num)){(*h)->next=p->next;p->next=(*h);(*h)=p;}for(t=(*h),p=(*h)->next,q=p->next;q&&p;t=t->next){if((q->num)<(p->num)){p->next=q->next;q->next=p;t->next=q;q=p->next;}else{p=p->next;q=q->next;}}}printf("排序完成!");Output(*h);printf("按任意鍵繼續(xù)!");bioskey(0);}voidInquire(structStudent*h){intchoice;do{system("cls");LINE;printf("\n\n****查詢******\n\n");LINE;printf("1.按名字查詢\n\n");printf("2.按學(xué)號(hào)查詢\n\n");printf("0.退出\n\n");printf("請(qǐng)輸入(0_2):\n\n");scanf("%d",&choice);switch(choice){case1:Inquire_name(h);break;case2:Inquire_num(h);break;case0:break;}}while(choice!=0);}voidInquire_num(structStudent*h){structStudent*p;longnum;LINE;printf("請(qǐng)輸入要查詢的學(xué)號(hào):");LINE;scanf("%ld",&num);p=Find(h,num);if(p&&(p->next)){p=p->next;Output_student(p);}elseif(p==NULL)Output_student(h);elseprintf("不存在該學(xué)生!");bioskey(0);}voidInquire_name(structStudent*h){structStudent*p;charname[11];LINE;printf("請(qǐng)輸入要查詢的學(xué)生姓名");LINE;scanf("%s",name);for(p=NULL;h&&(strcmp(h->name,name)!=0);h=h->next)p=h;if(p&&(p->next)){p=p->next;Output_student(p);}elseif(p==NULL)Output_student(h);elseprintf("該學(xué)生不存在!");bioskey(0);}voidRenew(structStudent**head){intchoice;do{system("cls");LINE;printf("\n\n******更新學(xué)生信息******\n\n");LINE;printf("1.插入\n\n");printf("2.刪除\n\n");printf("3.修改\n\n");printf("0.Exit\n\n");printf("請(qǐng)輸入(0_2):\n");scanf("%d",&choice);switch(choice){case1:if(InsertNode(head))printf("插入成功!");elseprintf("插入失敗!");bioskey(0);printf("按任意鍵繼續(xù)!");break;case2:if(Delete(head))printf("刪除成功!");elseprintf("刪除失敗!");bioskey(0);printf("按任意鍵繼續(xù)");break;case3:if(Revise(*head))printf("修改成功!");elseprintf("修改失敗!");bioskey(0);printf("按任意鍵繼續(xù)!");break;case0:break;}}while(choice!=0);}intRevise(structStudent*h){longnum;structStudent*p;intAction=OK;system("cls");LINE;printf("請(qǐng)輸入要修改的學(xué)生學(xué)號(hào):");LINE;scanf("%ld",&num);p=Find(h,num);if(p&&p->next){p=p->next;printf("newname:\n");scanf("%s",p->name);printf("newnum:\n");scanf("%ld",&p->num);printf("newsex(morf)");scanf("%s",p->sex);printf("newyear:\n");scanf("%d",&(p->Birth.year));printf("newmonth:\n");scanf("%d",&(p->Birth.month));printf("newday:\n");scanf("%d",&(p->Birth.day));printf("newage:\n");scanf("%d",&p->age);printf("newscore:\n");scanf("%d",&p->score);printf("newtel:\n");scanf("%ld",&p->tel);}elseif(p==NULL){printf("newname:\n");scanf("%s",h->name);printf("newnum:\n");scanf("%ld",&h->num);printf("newsex(morf):");scanf("%s",h->sex);printf("newyear:\n");scanf("%d",&(h->Birth.year));printf("newmonth:\n");scanf("%d",&(h->Birth.month));printf("newday:\n");scanf("%d",&(h->Birth.day));printf("newage:\n");scanf("%d",&h->age);printf("newscore:\n");scanf("%d",&h->score);printf("newtel:\n");scanf("%ld",&h->tel);}elseAction=FALSE;Output(h);returnAction;bioskey(0);}intDelete(structStudent**p){longnum;structStudent*q,*temp;intAction=OK;system("cls");LINE;printf("請(qǐng)輸入要?jiǎng)h除的學(xué)生的學(xué)號(hào):");LINE;scanf("%ld",&num);q=Find(*p,num);if(q&&q->next){temp=q->next;q->next=temp->next;free(temp);}elseif(q==NULL){temp=*p;*p=temp->next;free(temp);}elseif(q!=NULL&&q->next==NULL)Action=FALSE;Output(*p);returnAction;bioskey(0);}intInsertNode(structStudent**h){longOldnum,Newnum;intAction=OK;system("cls");LINE;printf("插入的功能是:");LINE;Output(*h);LINE;printf("\n若想要在某個(gè)學(xué)生的左邊插入一個(gè)新的學(xué)生信息的學(xué)號(hào),輸入該學(xué)生的學(xué)號(hào):");printf("\n警告!!\n");printf("若找不到該學(xué)生,則自動(dòng)插入到最后一個(gè)學(xué)生處!\n");scanf("%ld",&Oldnum);LINE;printf("請(qǐng)輸入要新的學(xué)生的學(xué)號(hào)");scanf("%ld",&Newnum);if(Newnum>0)Insert(h,Oldnum,Newnum);elseAction=FALSE;Output(*h);returnAction;bioskey(0);}voidInsert(structStudent**h,longOldnum,longNewnum){structStudent*p,*q;p=Creat(Newnum);q=Find(*h,Oldnum);if(q){p->next=q->next;q->next=p;}else{p->next=*h;*h=p;}bioskey(0);}structStudent*Creat(longNewnum){structStudent*p;p=NEW;p->num=Newnum;printf("新的學(xué)生的名字:\n");scanf("%s",p->name);printf("性別(morf):");scanf("%s",p->sex);printf("出生的年份:\n");scanf("%d",&(p->Birth.year));printf("出生的月份:\n");scanf("%d",&(p->Birth.month));printf("出生的天數(shù):\n");scanf("%d",&(p->Birth.day));printf("年齡:\n");scanf("%d",&p->age);printf("成績(jī):\n");scanf("%d",&p->score);printf("電話l:\n");scanf("%ld",&p->tel);p->next=NULL;returnp;}structStudent*Find(structStudent*h,longOldnum){structStudent*p;for(p=NULL;h&&(h->num!=Oldnum);h=h->next)p=h;returnp;}voidOutput_student(structStudent*p){printf("\n\n該學(xué)生的信息是:\n");LINE;printf("姓名:%s\n",p->name);printf("學(xué)號(hào):%ld\n",p->num);printf("性別:%s\n",p->sex);printf("出生年份:%d\n",p->Birth.year);printf("出生月份:%d\n",p->Birth.month);printf("出生天數(shù):%d\n",p->Birth.day);printf("年齡:%d\n",p->age);printf("成績(jī):%d\n",p->score);printf("電話:%ld\n",p->tel);LINE;}intOutput(structStudent*h){inti=1;LINE;printf("\n\n學(xué)生信息是:\n\n");LINE;for(;h;h=h->next,i++){printf("\n第%d個(gè)學(xué)生的信息是:\n\n",i);printf("名字:%s\n",h->name);printf("學(xué)號(hào):%ld\n",h->num);printf("性別:%s\n",h->sex);printf("出生年份r:%d\n",(h->Birth.year));printf("出生月份:%d\n",(h->Birth.month));printf("出生天數(shù):%d\n",(h->Birth.day));printf("年齡:%d\n",h->age);printf("成績(jī):%d\n",h->score);printf("電話:%ld\n",h->tel);}LINE;printf("按任意鍵繼續(xù)!");LINE;bioskey(0);returni-1;}structStudent*Input1(void){structStudent*h,*p,*q;charname[11];intk;LINE;printf("當(dāng)前輸入的人數(shù)序號(hào)(輸入0結(jié)束輸入):\n\n");scan
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版泥工施工環(huán)保評(píng)估及監(jiān)測(cè)服務(wù)合同2篇
- 中小企業(yè)綠色環(huán)保生產(chǎn)技術(shù)改造2025年實(shí)施合同
- 二零二五年度新型農(nóng)民合作社成員入社合同范本
- 二零二五年度摩托車行業(yè)技術(shù)交流合作合同
- 山東省17地市2013一模語文分解-文學(xué)類文本閱讀
- 2025年度個(gè)人獨(dú)資企業(yè)股權(quán)買賣合同模板
- 二零二五年度真石漆施工項(xiàng)目風(fēng)險(xiǎn)評(píng)估與管理合同2篇
- 二零二五年度程序員入職心理健康關(guān)愛與支持合同4篇
- 二零二五年度儲(chǔ)藏煤場(chǎng)租賃合同附煤炭?jī)?chǔ)存環(huán)境影響評(píng)估4篇
- 二零二五版某某金融資產(chǎn)證券化項(xiàng)目補(bǔ)充合同3篇
- 四川省宜賓市2023-2024學(xué)年八年級(jí)上學(xué)期期末義務(wù)教育階段教學(xué)質(zhì)量監(jiān)測(cè)英語試題
- 價(jià)值醫(yī)療的概念 實(shí)踐及其實(shí)現(xiàn)路徑
- 2024年中國(guó)華能集團(tuán)燃料有限公司招聘筆試參考題庫(kù)含答案解析
- 《紅樓夢(mèng)》中的男性形象解讀
- 安全生產(chǎn)技術(shù)規(guī)范 第49部分:加油站 DB50-T 867.49-2023
- 《三國(guó)演義》中的語言藝術(shù):詩詞歌賦的應(yīng)用
- 腸外營(yíng)養(yǎng)液的合理配制
- 消防安全教育培訓(xùn)記錄表
- 2023年河南省新鄉(xiāng)市鳳泉區(qū)事業(yè)單位招聘53人高頻考點(diǎn)題庫(kù)(共500題含答案解析)模擬練習(xí)試卷
- 2023年小升初簡(jiǎn)歷下載
- 廣府文化的奇葩
評(píng)論
0/150
提交評(píng)論