學生信息管理_第1頁
學生信息管理_第2頁
學生信息管理_第3頁
學生信息管理_第4頁
學生信息管理_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實驗一一、 課題任務設計一個“學生基本信息管理系統”。主要實現學生基本信息的錄入、插入、修改、刪除、查詢等基本功能。學生信息包括學生的學號、姓名、性別、年齡、家庭地址、電話等信息,具體功能如下:l 獲取學生基本信息。可以從文件中讀取基本信息,也可直接錄入。l 查詢學生基本信息。輸入學生學號或姓名等信息后,顯示學生的所有信息。l 添加學生基本信息。在學生基本信息表的指定位置添加學生基本信息。(由于本實驗按照“學生學號非降序順序”的儲存順序,故不需要在指定位置添加學生信息即可實現對學生信息的儲存)l 修改學生基本信息。在學生基本信息表中,修改指定學生的基本信息。l 刪除學生基本信息。在學生基本信息

2、表中,刪除指定學生的基本信息。l 保存文件。當學生基本信息表發生添加、修改、刪除等變化后,都要對最終結果進行保存。本實驗采用鏈表對學生基本信息進行存儲,使用鏈表的基本算法實現學生基本信息的各項管理功能。二、 概要1. 函數說明本程序包含12個函數:主函數main();鏈表初始化函數:InitList();遍歷函數:ListTraverse();輸入函數:ReadIn();插入函數:InsertAscend();寫入文件函數:WriteToFile();讀入文件函數:ReadFromFile();打印函數:Print();學號查找函數:FindFromNum();姓名查找函數:FindFromN

3、ame();刪除元素函數:DeleteElem();修改函數:Modify().2. 抽象數據類型的定義本實驗對鏈表的操作涉及到如下抽象數據類型:ADT List 數據對象:D = ai | ai ÎElemSet, i=1,n,n0 數據關系:R1 = <ai-1, ai> | ai-1,ai ÎD, i=2, ,n 基本操作: InitList (&L) 操作結果:構造一個空的線性表L。ListTraverse(L,visit()初始條件:線性表L已存在。操作結果:依次對L的每個數據元素調用函數visit()。一旦visit()失敗,則操作失敗。De

4、leteElem(L,e)初始條件:線性表L存在且非空。操作結果:通過查找,刪除L中值為e的元素。FindFromList(L,e,&p,&q)初始條件:線性表L存在且非空。操作結果:查找L中值為e的元素,查找成功,則返回TRUE,否則返回FALSE。WriteToFile(e)初始條件:e包含所需信息。操作結果:將信息寫入指定文件。ReadFromFile(e)初始條件:文件已存在。操作結果:從指定的文件讀取信息到e。InsertAscend(L, e)初始條件:線性表L已存在。操作結果:將e按照非降序插入L。ADT List3. 主程序流程本實驗的主程序流程如下:輸入初始學

5、生信息從文件讀入學生信息添加新的學生信息查詢學生信息修改學生信息刪除學生信息顯示所有學生信息將所有學生信息存入文件操作結束主程序數據類型定義鏈表初始化主菜單4. 調用說明本實驗將頭文件、函數文件、主程序寫入一個cpp文件,不存在多文件之間的相互調用。各程序模塊之間的調用關系如下:三、 詳細設計1. 學生信息結構類型定義:struct studchar nameNAMELEN;long long num;char sex;int age;char tel20;char addressADDRESSLEN;typedef struct stud ElemType;2. 鏈表結點定義:struct

6、LNodeElemType data;LNode *next;typedef struct LNode *LinkList;3. 實現命令選擇的算法:通過分支結構實現不同命令(菜單)的設置,用戶可選擇不同的命令而進行相應的操作。4. 實現錄入學生初始信息算法:先將錄入的學生信息保存在結構數組中,再將其按照非降序插入到鏈表中,具體算法如下:(k=0)scanf("%s",);/讀入姓名scanf("%ld",&studentk.num);/讀入學號scanf("%*c%c",&studentk.

7、sex);/讀入性別scanf("%d",&studentk.age);/讀入年齡scanf("%s",studentk.tel);/讀入電話scanf("%s",studentk.address);/讀入家庭住址InsertAscend(T,studentk+);/將所錄入信息插入到鏈表5. 實現插入學生信息算法:通過調用ReadIn()函數和InsertAscend()函數分別實現信息的輸入以及信息的插入,具體算法如下:ReadIn(e);InsertAscend(T,e);6. 實現查找學生信息的算法:本算法是通過學生姓

8、名或者學號索引從而查找學生所有信息,具體是先通過調用FindFromName()或FindFromNum()函數對學生姓名和學號進行查找,若查找成功則調用Print()函數輸出對應的學生信息。7. 實現學生信息修改算法:本算法和查找算法類似,也是先通過調用FindFromName()或FindFromNum()兩個函數查詢到學生信息,然后再調用修改函數Modify()實現對學生信息的修改,如果學生學號發生改動,則再次調用插入函數InsertAscend()將學生信息插入到鏈表中。8. 實現學生信息刪除算法:本算法主要通過調用刪除元素函數DeleteElem()實現對學生信息的刪除操作。9. 實

9、現顯示所有學生信息算法:本算法主要通過調用遍歷函數ListTraverse()函數實現對所有學生信息的遍歷,然后再嵌套調用Print()函數實現對學生信息的輸出,具體算法如下:ListTraverse(T,Print);10. 實現文件的讀取算法:本算法是通過文件的基本操作來實現,具體如下;/文件讀取操作printf("請輸入文件名: ");scanf("%s",filename);if(fp=fopen(filename,"rb")=NULL)printf("打開文件失敗!n");elsewhile(ReadFr

10、omFile(e)InsertAscend(T,e);fclose(fp);/文件保存操作printf("請輸入文件名: ");scanf("%s",filename);if(fp=fopen(filename,"wb")=NULL)printf("打開文件失敗!n");elseListTraverse(T,WriteToFile);fclose(fp);四、 調試分析本實驗在調試中遇到的主要問題如下:1. 剛開始,采用vs2012編譯器來寫程序,寫完之后在程序運行過程中發現從來沒有見過的錯誤,調不出黑框,而且在請

11、教他人以及在網上搜索教程之后仍無法debug,從而導致初期調試失敗。之后換了另一個編譯器,才發現是原來編譯器的出現了鏈接錯誤。在糾正了一些小錯誤之后,終于可以調試。2. 首先遇到的問題便是實現命令“1”。先是嘗試將讀入的學生信息直接插入鏈表,發現與命令“3”可能會有重復,在查閱資料后,采用了結構數組的儲存形式,嘗試先將學生信息儲存到結構數組中,然后將其插入鏈表,此算法容易實現。問題的關鍵在于用什么樣的方式控制輸入的結束以及輸入的格式,在進行了采用循環、eof結束符等等嘗試之后,才探索出其實連用scanf即可實現。解決了這個問題,剩下的問題就基本好解決了,因為所有的命令都死建立在命令“1”上的。

12、3. 關于鏈表的操作有基本的格式,因此在實現命令“3”“4”“5”“6”“7”“8”“9”沒有出現太大的困難。4. 另一個棘手的問題便是關于文件的操作和處理。之前對文件的接觸較少,因此在文件操作這方面一直是短板,好在查閱資料之后,能夠實現了基本的文件操作,也符合了實驗要求,達到了實驗目的。五、 測試結果初始界面:命令“1”可以每次錄入1個學生信息并將其保存:命令“3”添加新的學生信息并將其保存:命令“4”實現通過姓名對學生信息的查詢:命令“5”實現通過學號對學生信息的查詢:命令“6”實現通過姓名對學生信息的修改:(可用命令“10”實時查看當前學生信息)命令“7”實現通過學號對學生信息的修改:命

13、令“8”實現通過姓名對學生信息的刪除:命令“9”實現通過學號對學生信息的刪除:命令“10”實現顯示所有學生信息功能:命令“11”實現對學生信息的保存,文件將會被保存在當前工程目錄下:命令“2”實現對已保存學生信息文件的讀取:至此,本實驗所有功能都實現。六、 附錄本實驗源代碼如下:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>#include<process.h>#include<iostream>#include<math

14、.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define NAMELEN 20#define STUDNUM 1000#define ADDRESSLEN 30using namespace std;typedef int Status;/定義節點信息struct studchar nameNAMELEN;long long num;char sex;int age;char tel20;char addressADDRESSLEN;typedef struct stud

15、 ElemType;/線性表的單鏈表存儲結構struct LNodeElemType data;LNode *next;typedef struct LNode *LinkList; /另一種定義LinkList的方法FILE *fp;/文件操作Status InitList(LinkList &L) /* 操作結果:構造一個空的線性表L */L=(LinkList)malloc(sizeof(LNode); /* 產生頭結點,并使L指向此頭結點 */if(!L) /* 存儲分配失敗 */exit(OVERFLOW);L->next=NULL; /* 指針域為空 */return

16、 OK;Status ListTraverse(LinkList L,void(*vi)(ElemType)/* vi的形參類型為ElemType*/ /* 初始條件:線性表L已存在。操作結果:依次對L的每個數據元素調用函數vi() */LinkList p=L->next;while(p)vi(p->data);p=p->next;printf("n");return OK;void ReadIn(struct stud &e) /* 由鍵盤輸入結點信息 */printf("請輸入姓名: ");scanf("%s&q

17、uot;,);printf("請輸入學號: ");scanf("%lld",&e.num);printf("請輸入性別(m:男 f:女): ");scanf("%*c%c",&e.sex);printf("請輸入年齡: ");scanf("%d",&e.age);printf("請輸入電話: ");scanf("%s",e.tel);printf("請輸入家庭住址;");scanf

18、("%s",e.address);void InsertAscend(LinkList L,ElemType e)/按學號非降序插入LinkList q=L,p=L->next;while(p&&e.num>p->data.num)q=p;p=p->next;q->next=(LinkList)malloc(sizeof(LNode);q->next->data=e;q->next->next=p;void WriteToFile(struct stud e) /* 將結點信息寫入fp指定的文件 */fw

19、rite(&e,sizeof(stud),1,fp);Status ReadFromFile(stud &e) /* 由fp指定的文件讀取結點信息到e */int i;i=fread(&e,sizeof(stud),1,fp);if(i=1) /* 讀取文件成功 */return OK;elsereturn ERROR;void Print(stud e) /* 打印記錄e的內容 */printf(" %s %6lld",,e.num);if(e.sex='m')printf(" 男");elsepri

20、ntf(" 女");printf("%5d %-4s",e.age,e.tel);printf("%15sn",e.address);Status FindFromNum(LinkList L,long long num,LinkList &p,LinkList &q)/根據學號查找學生信息p=L;while(p)q=p->next;if(q&&q->data.num>num)break;if(q&&q->data.num=num)return TRUE;p=q;

21、return FALSE;Status FindFromName(LinkList L,char name,LinkList &p,LinkList &q)/根據姓名查找學生信息p=L;while(p)q=p->next;if(q&&!strcmp(q->,name)return TRUE;p=q;return FALSE;Status DeleteElem(LinkList L,long long num)/通過學號刪除學生信息LinkList p,q;if(FindFromNum(L,num,p,q)p->next=q-&

22、gt;next;free(q);return TRUE;return FALSE;Status DeleteElem(LinkList L,char name)/通過姓名刪除學生信息LinkList p,q;if(FindFromName(L,name,p,q)p->next=q->next;free(q);return TRUE;return FALSE;void Modify(ElemType &e) /* 修改結點內容,并按學號將結點非降序插入鏈表L */ char s80; Print(e); /* 顯示原內容 */ printf("請輸入待修改項的內容,

23、不修改的項按回車鍵保持原值:n"); printf("請輸入姓名: "); gets(s); if(strlen(s) strcpy(,s); printf("請輸入學號: "); gets(s); if(strlen(s) e.num=atol(s); printf("請輸入性別(m:男 f:女): "); gets(s); if(strlen(s) e.sex=s0; printf("請輸入年齡: "); gets(s); if(strlen(s) e.age=atoi(s); print

24、f("請輸入電話: "); gets(s); if(strlen(s) strcpy(e.tel,s); printf("請輸入家庭住址:"); gets(s); if(strlen(s) strcpy(e.address,s); /* 修改完畢 */ int main()/主函數struct stud studentSTUDNUM;/定義結構數組,保存初始學生信息int i,j,k=0,flag=1;/flag作為標識long long num;char filename20,nameNAMELEN;ElemType e;LinkList T,p,q;

25、/定義鏈表TInitList(T);初始化鏈表while(flag)printf("1: 輸入初始學生信息n");printf("2: 從文件讀入學生信息n");printf("3: 添加新的學生信息n");printf("4: 通過學生姓名查詢學生信息n");printf("5: 通過學生學號查詢學生信息n");printf("6: 通過學生姓名修改學生信息n");printf("7: 通過學生學號修改學生信息n");printf("8: 通過

26、學生姓名刪除學生信息n");printf("9: 通過學生學號刪除學生信息n");printf("10: 顯示所有學生信息n");printf("11: 將所有學生信息存入文件n");printf("12: 操作結束n");printf("請選擇操作命令:");scanf("%d",&i);printf("n");switch(i)case 1: printf("請依次輸入姓名、學號、性別、年齡、電話、家庭住址:(學號不超過9位

27、數)n"); scanf("%s",); scanf("%lld",&studentk.num); scanf("%*c%c",&studentk.sex); scanf("%d",&studentk.age); scanf("%s",studentk.tel); scanf("%s",studentk.address);/依次讀入學生信息InsertAscend(T,studentk+);/將學生信息插入鏈表pri

28、ntf("n"); break;case 2:printf("請輸入文件名: ");scanf("%s",filename);if(fp=fopen(filename,"rb")=NULL)printf("打開文件失敗!n");/打開文件elsewhile(ReadFromFile(e)InsertAscend(T,e);fclose(fp);printf("n");break;case 3:printf("請輸入以下信息:n");ReadIn(e);In

29、sertAscend(T,e);printf("n");break;case 4:printf("請輸入要查找的學生姓名: ");scanf("%s",name);if(!FindFromName(T,name,p,q)printf("沒有姓名為%s的學生信息n",name);elsePrint(q->data);printf("n");break;case 5:printf("請輸入要查找的學生學號: ");scanf("%lld",&nu

30、m);if(!FindFromNum(T,num,p,q)printf("沒有學號為%lld的學生信息n",num);elsePrint(q->data);printf("n");break;case 6:printf("請輸入要修改的學生姓名:");scanf("%s%*c",name);if(!FindFromName(T,name,p,q)printf("沒有姓名為%s的學生信息n",name);elsenum=q->data.num;Modify(q->data);if(q->data.num!=num)p->next=q->next;InsertAsce

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論