版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)一一、 課題任務(wù)設(shè)計(jì)一個(gè)“學(xué)生基本信息管理系統(tǒng)”.主要實(shí)現(xiàn)學(xué)生基本信息的錄入、插入、修改、刪除、查詢等基本功能。學(xué)生信息包括學(xué)生的學(xué)號、姓名、性別、年齡、家庭地址、電話等信息,具體功能如下:l 獲取學(xué)生基本信息.可以從文件中讀取基本信息,也可直接錄入。l 查詢學(xué)生基本信息。輸入學(xué)生學(xué)號或姓名等信息后,顯示學(xué)生的所有信息。l 添加學(xué)生基本信息。在學(xué)生基本信息表的指定位置添加學(xué)生基本信息。(由于本實(shí)驗(yàn)按照“學(xué)生學(xué)號非降序順序"的儲存順序,故不需要在指定位置添加學(xué)生信息即可實(shí)現(xiàn)對學(xué)生信息的儲存)l 修改學(xué)生基本信息。在學(xué)生基本信息表中,修改指定學(xué)生的基本信息.l 刪除學(xué)生基本信息.在學(xué)
2、生基本信息表中,刪除指定學(xué)生的基本信息.l 保存文件。當(dāng)學(xué)生基本信息表發(fā)生添加、修改、刪除等變化后,都要對最終結(jié)果進(jìn)行保存.本實(shí)驗(yàn)采用鏈表對學(xué)生基本信息進(jìn)行存儲,使用鏈表的基本算法實(shí)現(xiàn)學(xué)生基本信息的各項(xiàng)管理功能。二、 概要1. 函數(shù)說明本程序包含12個(gè)函數(shù):主函數(shù)main();鏈表初始化函數(shù):InitList();遍歷函數(shù):ListTraverse();輸入函數(shù):ReadIn();插入函數(shù):InsertAscend();寫入文件函數(shù):WriteToFile();讀入文件函數(shù):ReadFromFile();打印函數(shù):Print();學(xué)號查找函數(shù):FindFromNum();姓名查找函數(shù):Find
3、FromName();刪除元素函數(shù):DeleteElem();修改函數(shù):Modify().2. 抽象數(shù)據(jù)類型的定義本實(shí)驗(yàn)對鏈表的操作涉及到如下抽象數(shù)據(jù)類型:ADTList 數(shù)據(jù)對象:D = ai aiÎElemSet, i=1,n,n0 數(shù)據(jù)關(guān)系:R1 = <ai1, ai | ai-1,ai ÎD, i=2, ,n 基本操作:InitList (L) 操作結(jié)果:構(gòu)造一個(gè)空的線性表L.ListTraverse(L,visit())初始條件:線性表L已存在。操作結(jié)果:依次對L的每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)visit()。一旦visit()失敗,則操作失敗。DeleteElem(
4、L,e)初始條件:線性表L存在且非空.操作結(jié)果:通過查找,刪除L中值為e的元素。FindFromList(L,e,&p,q)初始條件:線性表L存在且非空.操作結(jié)果:查找L中值為e的元素,查找成功,則返回TRUE,否則返回FALSE。WriteToFile(e)初始條件:e包含所需信息。操作結(jié)果:將信息寫入指定文件。ReadFromFile(e)初始條件:文件已存在。操作結(jié)果:從指定的文件讀取信息到e。InsertAscend(L, e)初始條件:線性表L已存在.操作結(jié)果:將e按照非降序插入L。ADTList3. 主程序流程本實(shí)驗(yàn)的主程序流程如下:輸入初始學(xué)生信息從文件讀入學(xué)生信息添加新
5、的學(xué)生信息查詢學(xué)生信息修改學(xué)生信息刪除學(xué)生信息顯示所有學(xué)生信息將所有學(xué)生信息存入文件操作結(jié)束主程序數(shù)據(jù)類型定義鏈表初始化主菜單4. 調(diào)用說明本實(shí)驗(yàn)將頭文件、函數(shù)文件、主程序?qū)懭胍粋€(gè)cpp文件,不存在多文件之間的相互調(diào)用。各程序模塊之間的調(diào)用關(guān)系如下:三、 詳細(xì)設(shè)計(jì)1. 學(xué)生信息結(jié)構(gòu)類型定義:struct studchar nameNAMELEN;longlongnum;char sex;int age;chartel20;char addressADDRESSLEN;;typedefstruct stud ElemType;2. 鏈表結(jié)點(diǎn)定義:structLNodeElemType data;
6、LNode *next;typedefstructLNode LinkList;3. 實(shí)現(xiàn)命令選擇的算法:通過分支結(jié)構(gòu)實(shí)現(xiàn)不同命令(菜單)的設(shè)置,用戶可選擇不同的命令而進(jìn)行相應(yīng)的操作.4. 實(shí)現(xiàn)錄入學(xué)生初始信息算法:先將錄入的學(xué)生信息保存在結(jié)構(gòu)數(shù)組中,再將其按照非降序插入到鏈表中,具體算法如下:(k=0)scanf(”s",);/讀入姓名scanf("%ld”,&studentk。num);/讀入學(xué)號scanf("%c%c”,&studentk。sex);/讀入性別scanf("d",&stud
7、entk。age);/讀入年齡scanf("s”,studentk。tel);/讀入電話scanf(”%s",studentk。address);/讀入家庭住址InsertAscend(T,studentk+);/將所錄入信息插入到鏈表5. 實(shí)現(xiàn)插入學(xué)生信息算法:通過調(diào)用ReadIn()函數(shù)和InsertAscend()函數(shù)分別實(shí)現(xiàn)信息的輸入以及信息的插入,具體算法如下:ReadIn(e);InsertAscend(T,e);6. 實(shí)現(xiàn)查找學(xué)生信息的算法:本算法是通過學(xué)生姓名或者學(xué)號索引從而查找學(xué)生所有信息,具體是先通過調(diào)用FindFromName()或FindFromNu
8、m()函數(shù)對學(xué)生姓名和學(xué)號進(jìn)行查找,若查找成功則調(diào)用Print()函數(shù)輸出對應(yīng)的學(xué)生信息.7. 實(shí)現(xiàn)學(xué)生信息修改算法:本算法和查找算法類似,也是先通過調(diào)用FindFromName()或FindFromNum()兩個(gè)函數(shù)查詢到學(xué)生信息,然后再調(diào)用修改函數(shù)Modify()實(shí)現(xiàn)對學(xué)生信息的修改,如果學(xué)生學(xué)號發(fā)生改動,則再次調(diào)用插入函數(shù)InsertAscend()將學(xué)生信息插入到鏈表中。8. 實(shí)現(xiàn)學(xué)生信息刪除算法:本算法主要通過調(diào)用刪除元素函數(shù)DeleteElem()實(shí)現(xiàn)對學(xué)生信息的刪除操作.9. 實(shí)現(xiàn)顯示所有學(xué)生信息算法:本算法主要通過調(diào)用遍歷函數(shù)ListTraverse()函數(shù)實(shí)現(xiàn)對所有學(xué)生信息的
9、遍歷,然后再嵌套調(diào)用Print()函數(shù)實(shí)現(xiàn)對學(xué)生信息的輸出,具體算法如下:ListTraverse(T,Print);10. 實(shí)現(xiàn)文件的讀取算法:本算法是通過文件的基本操作來實(shí)現(xiàn),具體如下;/文件讀取操作printf(”請輸入文件名: ”);scanf(”s”,filename);if((fp=fopen(filename,”rb”))=NULL)printf("打開文件失敗!n”);elsewhile(ReadFromFile(e))InsertAscend(T,e);fclose(fp);/文件保存操作printf("請輸入文件名: ”);scanf(”s",
10、filename);if((fp=fopen(filename,"wb”))=NULL)printf(”打開文件失敗!n");elseListTraverse(T,WriteToFile);fclose(fp);四、 調(diào)試分析本實(shí)驗(yàn)在調(diào)試中遇到的主要問題如下:1. 剛開始,采用vs2012編譯器來寫程序,寫完之后在程序運(yùn)行過程中發(fā)現(xiàn)從來沒有見過的錯(cuò)誤,調(diào)不出黑框,而且在請教他人以及在網(wǎng)上搜索教程之后仍無法debug,從而導(dǎo)致初期調(diào)試失敗.之后換了另一個(gè)編譯器,才發(fā)現(xiàn)是原來編譯器的出現(xiàn)了鏈接錯(cuò)誤。在糾正了一些小錯(cuò)誤之后,終于可以調(diào)試。2. 首先遇到的問題便是實(shí)現(xiàn)命令“1”.先
11、是嘗試將讀入的學(xué)生信息直接插入鏈表,發(fā)現(xiàn)與命令“3"可能會有重復(fù),在查閱資料后,采用了結(jié)構(gòu)數(shù)組的儲存形式,嘗試先將學(xué)生信息儲存到結(jié)構(gòu)數(shù)組中,然后將其插入鏈表,此算法容易實(shí)現(xiàn)。問題的關(guān)鍵在于用什么樣的方式控制輸入的結(jié)束以及輸入的格式,在進(jìn)行了采用循環(huán)、eof結(jié)束符等等嘗試之后,才探索出其實(shí)連用scanf即可實(shí)現(xiàn)。解決了這個(gè)問題,剩下的問題就基本好解決了,因?yàn)樗械拿疃妓澜⒃诿睢?”上的。3. 關(guān)于鏈表的操作有基本的格式,因此在實(shí)現(xiàn)命令“3”“4"“5"“6”“7”“8”“9”沒有出現(xiàn)太大的困難。4. 另一個(gè)棘手的問題便是關(guān)于文件的操作和處理。之前對文件的接觸較
12、少,因此在文件操作這方面一直是短板,好在查閱資料之后,能夠?qū)崿F(xiàn)了基本的文件操作,也符合了實(shí)驗(yàn)要求,達(dá)到了實(shí)驗(yàn)?zāi)康?。五?測試結(jié)果初始界面:命令“1”可以每次錄入1個(gè)學(xué)生信息并將其保存:命令“3"添加新的學(xué)生信息并將其保存:命令“4”實(shí)現(xiàn)通過姓名對學(xué)生信息的查詢:命令“5"實(shí)現(xiàn)通過學(xué)號對學(xué)生信息的查詢:命令“6"實(shí)現(xiàn)通過姓名對學(xué)生信息的修改:(可用命令“10”實(shí)時(shí)查看當(dāng)前學(xué)生信息)命令“7"實(shí)現(xiàn)通過學(xué)號對學(xué)生信息的修改:命令“8”實(shí)現(xiàn)通過姓名對學(xué)生信息的刪除:命令“9”實(shí)現(xiàn)通過學(xué)號對學(xué)生信息的刪除:命令“10”實(shí)現(xiàn)顯示所有學(xué)生信息功能:命令“11”實(shí)現(xiàn)對學(xué)
13、生信息的保存,文件將會被保存在當(dāng)前工程目錄下:命令“2"實(shí)現(xiàn)對已保存學(xué)生信息文件的讀?。褐链?本實(shí)驗(yàn)所有功能都實(shí)現(xiàn)。六、 附錄本實(shí)驗(yàn)源代碼如下:includestdio。h>#include<stdlib。h#include<string.h>includemalloc。h>include<process。h#includeiostreamincludemath.hdefine TRUE 1define FALSE 0#define OK 1define ERROR 0#define INFEASIBLE -1#define NAMELEN 20#
14、define STUDNUM 1000define ADDRESSLEN 30using namespace std;typedefint Status;/定義節(jié)點(diǎn)信息struct studchar nameNAMELEN;longlongnum;char sex;int age;chartel20;char addressADDRESSLEN;typedefstruct stud ElemType;/線性表的單鏈表存儲結(jié)構(gòu)structLNodeElemType data;LNode *next;typedefstructLNode LinkList; /另一種定義LinkList的方法FIL
15、E fp;/文件操作Status InitList(LinkList L) /* 操作結(jié)果:構(gòu)造一個(gè)空的線性表L /L=(LinkList)malloc(sizeof(LNode); / 產(chǎn)生頭結(jié)點(diǎn),并使L指向此頭結(jié)點(diǎn) */if(!L) / 存儲分配失敗 */exit(OVERFLOW);L>next=NULL; /* 指針域?yàn)榭?*/return OK;Status ListTraverse(LinkListL,void(vi)(ElemType)/ vi的形參類型為ElemType*/ /* 初始條件:線性表L已存在.操作結(jié)果:依次對L的每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)vi() /LinkLis
16、t p=L-next;while(p)vi(pdata);p=pnext;printf(”n”);return OK;voidReadIn(struct stud e) / 由鍵盤輸入結(jié)點(diǎn)信息 */printf(”請輸入姓名: ");scanf("s",);printf("請輸入學(xué)號: ");scanf(”%lld”,e。num);printf(”請輸入性別(m:男 f:女): ”);scanf(”%c%c",e。sex);printf(”請輸入年齡: ”);scanf(”%d”,e。age);printf(”請輸入電話:
17、 ”);scanf(”s”,e.tel);printf(”請輸入家庭住址;");scanf("s”,e.address);voidInsertAscend(LinkListL,ElemType e)/按學(xué)號非降序插入LinkList q=L,p=L>next;while(pe.num>pdata.num)q=p;p=p-next;qnext=(LinkList)malloc(sizeof(LNode));qnextdata=e;qnext->next=p;voidWriteToFile(struct stud e) / 將結(jié)點(diǎn)信息寫入fp指定的文件 /fw
18、rite(&e,sizeof(stud),1,fp);Status ReadFromFile(stud e) / 由fp指定的文件讀取結(jié)點(diǎn)信息到e /inti;i=fread(e,sizeof(stud),1,fp);if(i=1) /* 讀取文件成功 /return OK;elsereturn ERROR;void Print(stud e) /* 打印記錄e的內(nèi)容 /printf(” s %6lld",,e.num);if(e.sex='m)printf(" 男");elseprintf(” 女”);printf(”%5d %-4s
19、”,e。age,e。tel);printf(”15sn”,e。address);Status FindFromNum(LinkListL,long long num,LinkList p,LinkList &q)/根據(jù)學(xué)號查找學(xué)生信息p=L;while(p)q=pnext;if(q&&q->data。num>num)break;if(qq>data.num=num)return TRUE;p=q;return FALSE;Status FindFromName(LinkListL,char name,LinkList p,LinkList q)/根據(jù)姓
20、名查找學(xué)生信息p=L;while(p)q=p>next;if(q&!strcmp(q>,name)return TRUE;p=q;return FALSE;Status DeleteElem(LinkListL,long long num)/通過學(xué)號刪除學(xué)生信息LinkListp,q;if(FindFromNum(L,num,p,q))pnext=q>next;free(q);return TRUE;return FALSE;Status DeleteElem(LinkListL,char name)/通過姓名刪除學(xué)生信息LinkListp,q;if
21、(FindFromName(L,name,p,q)pnext=qnext;free(q);return TRUE;return FALSE;void Modify(ElemType &e) / 修改結(jié)點(diǎn)內(nèi)容,并按學(xué)號將結(jié)點(diǎn)非降序插入鏈表L */char s80; Print(e); / 顯示原內(nèi)容 /printf(”請輸入待修改項(xiàng)的內(nèi)容,不修改的項(xiàng)按回車鍵保持原值:n”);printf("請輸入姓名: ”);gets(s);if(strlen(s)strcpy(,s);printf(”請輸入學(xué)號: ”);gets(s);if(strlen(s)e。num=atol
22、(s);printf("請輸入性別(m:男 f:女): ");gets(s);if(strlen(s)e.sex=s0;printf("請輸入年齡: ”);gets(s);if(strlen(s))e。age=atoi(s);printf("請輸入電話: ”);gets(s);if(strlen(s))strcpy(e。tel,s);printf("請輸入家庭住址:”);gets(s);if(strlen(s)strcpy(e。address,s); /* 修改完畢 / int main()/主函數(shù)struct stud studentSTUD
23、NUM;/定義結(jié)構(gòu)數(shù)組,保存初始學(xué)生信息inti,j,k=0,flag=1;/flag作為標(biāo)識longlongnum;char filename20,nameNAMELEN;ElemType e;LinkListT,p,q;/定義鏈表TInitList(T);初始化鏈表while(flag)printf("1: 輸入初始學(xué)生信息n");printf("2: 從文件讀入學(xué)生信息n”);printf(”3: 添加新的學(xué)生信息n”);printf(”4: 通過學(xué)生姓名查詢學(xué)生信息n”);printf("5: 通過學(xué)生學(xué)號查詢學(xué)生信息n”);printf(”6:
24、 通過學(xué)生姓名修改學(xué)生信息n");printf("7: 通過學(xué)生學(xué)號修改學(xué)生信息n”);printf(”8: 通過學(xué)生姓名刪除學(xué)生信息n”);printf(”9: 通過學(xué)生學(xué)號刪除學(xué)生信息n");printf(”10: 顯示所有學(xué)生信息n");printf(”11: 將所有學(xué)生信息存入文件n");printf(”12: 操作結(jié)束n");printf("請選擇操作命令:”);scanf("%d",i);printf(”n”);switch(i)case 1: printf("請依次輸入姓名、學(xué)號、
25、性別、年齡、電話、家庭住址:(學(xué)號不超過9位數(shù))n”);scanf(”%s”,);scanf(”lld",&studentk。num);scanf(”%*cc”,studentk。sex);scanf(”d”,studentk。age);scanf("s",studentk.tel);scanf(”%s",studentk.address);/依次讀入學(xué)生信息InsertAscend(T,studentk+);/將學(xué)生信息插入鏈表printf(”n");break;case 2:printf("請輸入
26、文件名: ”);scanf(”s",filename);if((fp=fopen(filename,"rb”)=NULL)printf(”打開文件失?。”);/打開文件elsewhile(ReadFromFile(e)InsertAscend(T,e);fclose(fp);printf(”n”);break;case 3:printf("請輸入以下信息:n”);ReadIn(e);InsertAscend(T,e);printf("n");break;case 4:printf(”請輸入要查找的學(xué)生姓名: ");scanf(”s”
27、,name);if(!FindFromName(T,name,p,q)printf("沒有姓名為s的學(xué)生信息n”,name);elsePrint(qdata);printf(”n”);break;case 5:printf("請輸入要查找的學(xué)生學(xué)號: ");scanf("%lld”,num);if(!FindFromNum(T,num,p,q))printf(”沒有學(xué)號為lld的學(xué)生信息n",num);elsePrint(q->data);printf("n”);break;case 6:printf(”請輸入要修改的學(xué)生姓名:");scanf(”s*c",name);if(!FindFromName(T,name,p,q))printf(”沒有姓名為s的學(xué)生信息n&q
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年全球及中國中置電機(jī)自行車行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國PTZ電子體積校正器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國軍用飛行器模擬器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國工業(yè)木鋸機(jī)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 期末測試卷01【考試范圍:6-10單元】(原卷版)
- 2025國際商業(yè)代理合同詳細(xì)版樣本
- 擔(dān)保合同范文集錦年
- 健身房私教合同范文
- 電力設(shè)備采購合同模板
- 2025XL數(shù)字地震儀器租賃合同
- 《造血干細(xì)胞移植護(hù)理》課件
- 課題申報(bào)參考:全齡友好視角下的社區(qū)語言景觀評估及空間優(yōu)化研究
- 中央2025年公安部部分直屬事業(yè)單位招聘84人筆試歷年參考題庫附帶答案詳解
- 五年級下冊語文四大名著常考知識點(diǎn)
- 2025年1月日歷表(含農(nóng)歷-周數(shù)-方便記事備忘)
- 2024年同等學(xué)力人員申請碩士學(xué)位英語試卷與參考答案
- 臨床用血管理培訓(xùn)
- 工業(yè)自動化生產(chǎn)線操作手冊
- 《走進(jìn)神奇》說課稿
- 2024年內(nèi)蒙古中考語文試卷五套合卷附答案
- 五年級下冊語文教案 學(xué)習(xí)雙重否定句 部編版
評論
0/150
提交評論