版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)一一、 課題任務(wù)設(shè)計(jì)一個(gè)“學(xué)生基本信息管理系統(tǒng)”。主要實(shí)現(xiàn)學(xué)生基本信息的錄入、插入、修改、刪除、查詢等基本功能。學(xué)生信息包括學(xué)生的學(xué)號(hào)、姓名、性別、年齡、家庭地址、電話等信息,具體功能如下:l 獲取學(xué)生基本信息??梢詮奈募凶x取基本信息,也可直接錄入。l 查詢學(xué)生基本信息。輸入學(xué)生學(xué)號(hào)或姓名等信息后,顯示學(xué)生的所有信息。l 添加學(xué)生基本信息。在學(xué)生基本信息表的指定位置添加學(xué)生基本信息。(由于本實(shí)驗(yàn)按照“學(xué)生學(xué)號(hào)非降序順序”的儲(chǔ)存順序,故不需要在指定位置添加學(xué)生信息即可實(shí)現(xiàn)對(duì)學(xué)生信息的儲(chǔ)存)l 修改學(xué)生基本信息。在學(xué)生基本信息表中,修改指定學(xué)生的基本信息。l 刪除學(xué)生基本信息。在學(xué)生基本信息
2、表中,刪除指定學(xué)生的基本信息。l 保存文件。當(dāng)學(xué)生基本信息表發(fā)生添加、修改、刪除等變化后,都要對(duì)最終結(jié)果進(jìn)行保存。本實(shí)驗(yàn)采用鏈表對(duì)學(xué)生基本信息進(jìn)行存儲(chǔ),使用鏈表的基本算法實(shí)現(xiàn)學(xué)生基本信息的各項(xiàng)管理功能。二、 概要1. 函數(shù)說(shuō)明本程序包含12個(gè)函數(shù):主函數(shù)main();鏈表初始化函數(shù):InitList();遍歷函數(shù):ListTraverse();輸入函數(shù):ReadIn();插入函數(shù):InsertAscend();寫入文件函數(shù):WriteToFile();讀入文件函數(shù):ReadFromFile();打印函數(shù):Print();學(xué)號(hào)查找函數(shù):FindFromNum();姓名查找函數(shù):FindFromN
3、ame();刪除元素函數(shù):DeleteElem();修改函數(shù):Modify().2. 抽象數(shù)據(jù)類型的定義本實(shí)驗(yàn)對(duì)鏈表的操作涉及到如下抽象數(shù)據(jù)類型:ADT List 數(shù)據(jù)對(duì)象:D = ai | ai ElemSet, i=1,n,n0 數(shù)據(jù)關(guān)系:R1 = | ai-1,ai D, i=2, ,n 基本操作: InitList (&L) 操作結(jié)果:構(gòu)造一個(gè)空的線性表L。ListTraverse(L,visit()初始條件:線性表L已存在。操作結(jié)果:依次對(duì)L的每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)visit()。一旦visit()失敗,則操作失敗。DeleteElem(L,e)初始條件:線性表L存在且非空。操作結(jié)果:
4、通過(guò)查找,刪除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。ADT List3. 主程序流程本實(shí)驗(yàn)的主程序流程如下:輸入初始學(xué)生信息從文件讀入學(xué)生信息添加新的學(xué)生信息查詢學(xué)生信息修改學(xué)生信息刪除學(xué)生信息顯示所
5、有學(xué)生信息將所有學(xué)生信息存入文件操作結(jié)束主程序數(shù)據(jù)類型定義鏈表初始化主菜單4. 調(diào)用說(shuō)明本實(shí)驗(yàn)將頭文件、函數(shù)文件、主程序?qū)懭胍粋€(gè)cpp文件,不存在多文件之間的相互調(diào)用。各程序模塊之間的調(diào)用關(guān)系如下:三、 詳細(xì)設(shè)計(jì)1. 學(xué)生信息結(jié)構(gòu)類型定義:struct studchar nameNAMELEN;long long num;char sex;int age;char tel20;char addressADDRESSLEN;typedef struct stud ElemType;2. 鏈表結(jié)點(diǎn)定義:struct LNodeElemType data;LNode *next;typedef st
6、ruct LNode *LinkList;3. 實(shí)現(xiàn)命令選擇的算法:通過(guò)分支結(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é)號(hào)scanf(%*c%c,&studentk.sex);/讀入性別scanf(%d,&studentk.age);/讀入年齡scanf(%s,studentk.tel);/讀入電話scanf(%s,studentk.
7、address);/讀入家庭住址InsertAscend(T,studentk+);/將所錄入信息插入到鏈表5. 實(shí)現(xiàn)插入學(xué)生信息算法:通過(guò)調(diào)用ReadIn()函數(shù)和InsertAscend()函數(shù)分別實(shí)現(xiàn)信息的輸入以及信息的插入,具體算法如下:ReadIn(e);InsertAscend(T,e);6. 實(shí)現(xiàn)查找學(xué)生信息的算法:本算法是通過(guò)學(xué)生姓名或者學(xué)號(hào)索引從而查找學(xué)生所有信息,具體是先通過(guò)調(diào)用FindFromName()或FindFromNum()函數(shù)對(duì)學(xué)生姓名和學(xué)號(hào)進(jìn)行查找,若查找成功則調(diào)用Print()函數(shù)輸出對(duì)應(yīng)的學(xué)生信息。7. 實(shí)現(xiàn)學(xué)生信息修改算法:本算法和查找算法類似,也是先通
8、過(guò)調(diào)用FindFromName()或FindFromNum()兩個(gè)函數(shù)查詢到學(xué)生信息,然后再調(diào)用修改函數(shù)Modify()實(shí)現(xiàn)對(duì)學(xué)生信息的修改,如果學(xué)生學(xué)號(hào)發(fā)生改動(dòng),則再次調(diào)用插入函數(shù)InsertAscend()將學(xué)生信息插入到鏈表中。8. 實(shí)現(xiàn)學(xué)生信息刪除算法:本算法主要通過(guò)調(diào)用刪除元素函數(shù)DeleteElem()實(shí)現(xiàn)對(duì)學(xué)生信息的刪除操作。9. 實(shí)現(xiàn)顯示所有學(xué)生信息算法:本算法主要通過(guò)調(diào)用遍歷函數(shù)ListTraverse()函數(shù)實(shí)現(xiàn)對(duì)所有學(xué)生信息的遍歷,然后再嵌套調(diào)用Print()函數(shù)實(shí)現(xiàn)對(duì)學(xué)生信息的輸出,具體算法如下:ListTraverse(T,Print);10. 實(shí)現(xiàn)文件的讀取算法:本
9、算法是通過(guò)文件的基本操作來(lái)實(shí)現(xiàn),具體如下;/文件讀取操作printf(請(qǐng)輸入文件名: );scanf(%s,filename);if(fp=fopen(filename,rb)=NULL)printf(打開(kāi)文件失敗!n);elsewhile(ReadFromFile(e)InsertAscend(T,e);fclose(fp);/文件保存操作printf(請(qǐng)輸入文件名: );scanf(%s,filename);if(fp=fopen(filename,wb)=NULL)printf(打開(kāi)文件失敗!n);elseListTraverse(T,WriteToFile);fclose(fp);四、
10、 調(diào)試分析本實(shí)驗(yàn)在調(diào)試中遇到的主要問(wèn)題如下:1. 剛開(kāi)始,采用vs2012編譯器來(lái)寫程序,寫完之后在程序運(yùn)行過(guò)程中發(fā)現(xiàn)從來(lái)沒(méi)有見(jiàn)過(guò)的錯(cuò)誤,調(diào)不出黑框,而且在請(qǐng)教他人以及在網(wǎng)上搜索教程之后仍無(wú)法debug,從而導(dǎo)致初期調(diào)試失敗。之后換了另一個(gè)編譯器,才發(fā)現(xiàn)是原來(lái)編譯器的出現(xiàn)了鏈接錯(cuò)誤。在糾正了一些小錯(cuò)誤之后,終于可以調(diào)試。2. 首先遇到的問(wèn)題便是實(shí)現(xiàn)命令“1”。先是嘗試將讀入的學(xué)生信息直接插入鏈表,發(fā)現(xiàn)與命令“3”可能會(huì)有重復(fù),在查閱資料后,采用了結(jié)構(gòu)數(shù)組的儲(chǔ)存形式,嘗試先將學(xué)生信息儲(chǔ)存到結(jié)構(gòu)數(shù)組中,然后將其插入鏈表,此算法容易實(shí)現(xiàn)。問(wèn)題的關(guān)鍵在于用什么樣的方式控制輸入的結(jié)束以及輸入的格式,在進(jìn)
11、行了采用循環(huán)、eof結(jié)束符等等嘗試之后,才探索出其實(shí)連用scanf即可實(shí)現(xiàn)。解決了這個(gè)問(wèn)題,剩下的問(wèn)題就基本好解決了,因?yàn)樗械拿疃妓澜⒃诿睢?”上的。3. 關(guān)于鏈表的操作有基本的格式,因此在實(shí)現(xiàn)命令“3”“4”“5”“6”“7”“8”“9”沒(méi)有出現(xiàn)太大的困難。4. 另一個(gè)棘手的問(wèn)題便是關(guān)于文件的操作和處理。之前對(duì)文件的接觸較少,因此在文件操作這方面一直是短板,好在查閱資料之后,能夠?qū)崿F(xiàn)了基本的文件操作,也符合了實(shí)驗(yàn)要求,達(dá)到了實(shí)驗(yàn)?zāi)康?。五?測(cè)試結(jié)果初始界面:命令“1”可以每次錄入1個(gè)學(xué)生信息并將其保存:命令“3”添加新的學(xué)生信息并將其保存:命令“4”實(shí)現(xiàn)通過(guò)姓名對(duì)學(xué)生信息的查詢:命令
12、“5”實(shí)現(xiàn)通過(guò)學(xué)號(hào)對(duì)學(xué)生信息的查詢:命令“6”實(shí)現(xiàn)通過(guò)姓名對(duì)學(xué)生信息的修改:(可用命令“10”實(shí)時(shí)查看當(dāng)前學(xué)生信息)命令“7”實(shí)現(xiàn)通過(guò)學(xué)號(hào)對(duì)學(xué)生信息的修改:命令“8”實(shí)現(xiàn)通過(guò)姓名對(duì)學(xué)生信息的刪除:命令“9”實(shí)現(xiàn)通過(guò)學(xué)號(hào)對(duì)學(xué)生信息的刪除:命令“10”實(shí)現(xiàn)顯示所有學(xué)生信息功能:命令“11”實(shí)現(xiàn)對(duì)學(xué)生信息的保存,文件將會(huì)被保存在當(dāng)前工程目錄下:命令“2”實(shí)現(xiàn)對(duì)已保存學(xué)生信息文件的讀?。褐链?,本實(shí)驗(yàn)所有功能都實(shí)現(xiàn)。六、 附錄本實(shí)驗(yàn)源代碼如下:#include#include#include#include#include#include#include#define TRUE 1#define FAL
13、SE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define NAMELEN 20#define STUDNUM 1000#define ADDRESSLEN 30using namespace std;typedef int Status;/定義節(jié)點(diǎn)信息struct studchar nameNAMELEN;long long num;char sex;int age;char tel20;char addressADDRESSLEN;typedef struct stud ElemType;/線性表的單鏈表存儲(chǔ)結(jié)構(gòu)struct LN
14、odeElemType data;LNode *next;typedef struct LNode *LinkList; /另一種定義LinkList的方法FILE *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) /* 存儲(chǔ)分配失敗 */exit(OVERFLOW);L-next=NULL; /* 指針域?yàn)榭?*/return OK;Status ListTraverse(LinkList L,void
15、(*vi)(ElemType)/* vi的形參類型為ElemType*/ /* 初始條件:線性表L已存在。操作結(jié)果:依次對(duì)L的每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)vi() */LinkList p=L-next;while(p)vi(p-data);p=p-next;printf(n);return OK;void ReadIn(struct stud &e) /* 由鍵盤輸入結(jié)點(diǎn)信息 */printf(請(qǐng)輸入姓名: );scanf(%s,);printf(請(qǐng)輸入學(xué)號(hào): );scanf(%lld,&e.num);printf(請(qǐng)輸入性別(m:男 f:女): );scanf(%*c%c,&e.sex
16、);printf(請(qǐng)輸入年齡: );scanf(%d,&e.age);printf(請(qǐng)輸入電話: );scanf(%s,e.tel);printf(請(qǐng)輸入家庭住址;);scanf(%s,e.address);void InsertAscend(LinkList L,ElemType e)/按學(xué)號(hào)非降序插入LinkList q=L,p=L-next;while(p&e.nump-data.num)q=p;p=p-next;q-next=(LinkList)malloc(sizeof(LNode);q-next-data=e;q-next-next=p;void WriteToFile(struc
17、t stud e) /* 將結(jié)點(diǎn)信息寫入fp指定的文件 */fwrite(&e,sizeof(stud),1,fp);Status ReadFromFile(stud &e) /* 由fp指定的文件讀取結(jié)點(diǎn)信息到e */int i;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
18、(%5d %-4s,e.age,e.tel);printf(%15sn,e.address);Status FindFromNum(LinkList L,long long num,LinkList &p,LinkList &q)/根據(jù)學(xué)號(hào)查找學(xué)生信息p=L;while(p)q=p-next;if(q&q-data.numnum)break;if(q&q-data.num=num)return TRUE;p=q;return FALSE;Status FindFromName(LinkList L,char name,LinkList &p,LinkList &q)/根據(jù)姓名查找學(xué)生信息p=L
19、;while(p)q=p-next;if(q&!strcmp(,name)return TRUE;p=q;return FALSE;Status DeleteElem(LinkList L,long long num)/通過(guò)學(xué)號(hào)刪除學(xué)生信息LinkList p,q;if(FindFromNum(L,num,p,q)p-next=q-next;free(q);return TRUE;return FALSE;Status DeleteElem(LinkList L,char name)/通過(guò)姓名刪除學(xué)生信息LinkList p,q;if(FindFromName(L,nam
20、e,p,q)p-next=q-next;free(q);return TRUE;return FALSE;void Modify(ElemType &e) /* 修改結(jié)點(diǎn)內(nèi)容,并按學(xué)號(hào)將結(jié)點(diǎn)非降序插入鏈表L */ char s80; Print(e); /* 顯示原內(nèi)容 */ printf(請(qǐng)輸入待修改項(xiàng)的內(nèi)容,不修改的項(xiàng)按回車鍵保持原值:n); printf(請(qǐng)輸入姓名: ); gets(s); if(strlen(s) strcpy(,s); printf(請(qǐng)輸入學(xué)號(hào): ); gets(s); if(strlen(s) e.num=atol(s); printf(請(qǐng)輸入性別(m
21、:男 f:女): ); gets(s); if(strlen(s) e.sex=s0; printf(請(qǐng)輸入年齡: ); gets(s); if(strlen(s) e.age=atoi(s); printf(請(qǐng)輸入電話: ); gets(s); if(strlen(s) strcpy(e.tel,s); printf(請(qǐng)輸入家庭住址:); gets(s); if(strlen(s) strcpy(e.address,s); /* 修改完畢 */ int main()/主函數(shù)struct stud studentSTUDNUM;/定義結(jié)構(gòu)數(shù)組,保存初始學(xué)生信息int i,j,k=0,flag=
22、1;/flag作為標(biāo)識(shí)long long num;char filename20,nameNAMELEN;ElemType e;LinkList T,p,q;/定義鏈表TInitList(T);初始化鏈表while(flag)printf(1: 輸入初始學(xué)生信息n);printf(2: 從文件讀入學(xué)生信息n);printf(3: 添加新的學(xué)生信息n);printf(4: 通過(guò)學(xué)生姓名查詢學(xué)生信息n);printf(5: 通過(guò)學(xué)生學(xué)號(hào)查詢學(xué)生信息n);printf(6: 通過(guò)學(xué)生姓名修改學(xué)生信息n);printf(7: 通過(guò)學(xué)生學(xué)號(hào)修改學(xué)生信息n);printf(8: 通過(guò)學(xué)生姓名刪除學(xué)生信息n
23、);printf(9: 通過(guò)學(xué)生學(xué)號(hào)刪除學(xué)生信息n);printf(10: 顯示所有學(xué)生信息n);printf(11: 將所有學(xué)生信息存入文件n);printf(12: 操作結(jié)束n);printf(請(qǐng)選擇操作命令:);scanf(%d,&i);printf(n);switch(i)case 1: printf(請(qǐng)依次輸入姓名、學(xué)號(hào)、性別、年齡、電話、家庭住址:(學(xué)號(hào)不超過(guò)9位數(shù))n); scanf(%s,); scanf(%lld,&studentk.num); scanf(%*c%c,&studentk.sex); scanf(%d,&studentk.age);
24、scanf(%s,studentk.tel); scanf(%s,studentk.address);/依次讀入學(xué)生信息InsertAscend(T,studentk+);/將學(xué)生信息插入鏈表printf(n); break;case 2:printf(請(qǐng)輸入文件名: );scanf(%s,filename);if(fp=fopen(filename,rb)=NULL)printf(打開(kāi)文件失??!n);/打開(kāi)文件elsewhile(ReadFromFile(e)InsertAscend(T,e);fclose(fp);printf(n);break;case 3:printf(請(qǐng)輸入以下信息:
25、n);ReadIn(e);InsertAscend(T,e);printf(n);break;case 4:printf(請(qǐng)輸入要查找的學(xué)生姓名: );scanf(%s,name);if(!FindFromName(T,name,p,q)printf(沒(méi)有姓名為%s的學(xué)生信息n,name);elsePrint(q-data);printf(n);break;case 5:printf(請(qǐng)輸入要查找的學(xué)生學(xué)號(hào): );scanf(%lld,&num);if(!FindFromNum(T,num,p,q)printf(沒(méi)有學(xué)號(hào)為%lld的學(xué)生信息n,num);elsePrint(q-data);printf(n);break;case 6:printf(請(qǐng)輸入要修改的學(xué)生姓名:);scanf(%s%*c,name);if(!FindFromName(T,name
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年重型機(jī)械焊接安裝服務(wù)協(xié)議3篇
- 2025年度二手房交易首付分期及風(fēng)險(xiǎn)控制協(xié)議4篇
- 2025年度防火門檢測(cè)維修服務(wù)合同4篇
- 2025版協(xié)議離婚實(shí)操教程與全程輔導(dǎo)合同3篇
- 2025年個(gè)人房產(chǎn)測(cè)繪與房地產(chǎn)市場(chǎng)調(diào)研合同4篇
- 2025版臨時(shí)演出場(chǎng)地租賃協(xié)議書(shū)3篇
- 2025年度綠色環(huán)保項(xiàng)目臨時(shí)工勞動(dòng)合同范本8篇
- 個(gè)人家政服務(wù)合同2024年度專用3篇
- 2025年度智慧城市基礎(chǔ)設(shè)施場(chǎng)外工程承包合同4篇
- 2025年度物業(yè)設(shè)施設(shè)備智能化升級(jí)合同3篇
- 2025年生產(chǎn)主管年度工作計(jì)劃
- 2024-2025學(xué)年山東省聊城市高一上學(xué)期期末數(shù)學(xué)教學(xué)質(zhì)量檢測(cè)試題(附解析)
- 西方史學(xué)史課件3教學(xué)
- 2024年中國(guó)醫(yī)藥研發(fā)藍(lán)皮書(shū)
- 廣東省佛山市 2023-2024學(xué)年五年級(jí)(上)期末數(shù)學(xué)試卷
- 臺(tái)兒莊介紹課件
- 人工智能算法與實(shí)踐-第16章 LSTM神經(jīng)網(wǎng)絡(luò)
- 17個(gè)崗位安全操作規(guī)程手冊(cè)
- 2025年山東省濟(jì)南市第一中學(xué)高三下學(xué)期期末統(tǒng)一考試物理試題含解析
- 中學(xué)安全辦2024-2025學(xué)年工作計(jì)劃
- 網(wǎng)絡(luò)安全保障服務(wù)方案(網(wǎng)絡(luò)安全運(yùn)維、重保服務(wù))
評(píng)論
0/150
提交評(píng)論