家譜管理系統(tǒng).docx_第1頁
家譜管理系統(tǒng).docx_第2頁
家譜管理系統(tǒng).docx_第3頁
家譜管理系統(tǒng).docx_第4頁
家譜管理系統(tǒng).docx_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、.洛陽理工學(xué)院課程設(shè)計報告課程名稱數(shù)據(jù)結(jié)構(gòu)課程設(shè)計_設(shè)計題目家譜管理系統(tǒng)_專計算機科學(xué)與技術(shù)業(yè) _專業(yè)資料.班級B150405學(xué)號B15080822姓名宋士龍_完成日期2016年 12月 30日_課程設(shè)計任務(wù)書設(shè)計題目:家譜管理系統(tǒng)設(shè)計容與要求:【問題描述】:實現(xiàn)具有下列功能的家譜管理系統(tǒng)1). 輸入文件以存放最初家譜中各成員的信息,成員的信息中均應(yīng)包含以下容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。2). 實現(xiàn)數(shù)據(jù)的存盤和讀盤。3). 顯示家譜。4). 按照出生日期查詢成員。5). 按照姓名查詢,輸出成員信息(包括其本人、父親、孩子的信息)

2、。6). 修改某成員信息?!净疽蟆浚簩I(yè)資料.界面要求:有合理的提示,每個功能可以設(shè)立菜單,根據(jù)提示,可以完成相關(guān)的功能要求。存儲結(jié)構(gòu):學(xué)生自己根據(jù)系統(tǒng)功能要求自己設(shè)計,但是要求相關(guān)數(shù)據(jù)要存儲在數(shù)據(jù)文件中。測試數(shù)據(jù):要求使用1、全部合法數(shù)據(jù); 2、局部非法數(shù)據(jù)。進(jìn)行程序測試,以保證程序的穩(wěn)定。測試數(shù)據(jù)及測試結(jié)果請在上交的資料中寫明。指導(dǎo)教師: _年月日課程設(shè)計評語成績:指導(dǎo)教師: _年月日專業(yè)資料.一、算法思想本程序是一個管理家譜的系統(tǒng),通過這個系統(tǒng)可以對家族成員進(jìn)行創(chuàng)建、顯示、查找、修改、以及保存家譜和讀取家譜功能。該系統(tǒng)分為以下幾個模塊,分別是:創(chuàng)建家譜,顯示家譜、按姓名和生日查找家庭

3、成員、修改家譜、存盤、讀盤以及退出系統(tǒng)。本程序用到的存儲形式為多叉樹,因為家譜中每個人既有父母又有孩子,而且孩子的個數(shù)并不確定,所以用多叉樹來存儲最為合適。用多叉樹來存儲,就用用到多叉樹的遞歸創(chuàng)建及遞歸遍歷。因為是多叉樹,所以遍歷時用廣度優(yōu)先搜索合適。本函數(shù)最主要的思想就是遞歸調(diào)用,每個子函數(shù)中都會用到遞歸。定義結(jié)構(gòu)體時給定指針數(shù)組的最大容量,來規(guī)定家譜中最多可以存多少人。定義一個家族樹的指針變量用來當(dāng)每個子函數(shù)的參數(shù),從而將其返回到主函數(shù)中。以下時算法思想流程圖:家譜管理系統(tǒng)創(chuàng)建家譜顯示家譜查找成員修改家譜讀寫家譜按按修修修存讀照照改改改盤盤姓生本父孩名日人母子退出系統(tǒng)專業(yè)資料.二、模塊劃分

4、1.int main(): 主函數(shù)2.void CreatTree(TreeNode *Tree):創(chuàng)建家族樹3.void OutPutAll(TreeNode *Tree):顯示家譜4.void Menue(TreeNode *Tree):主菜單5.void SubMenue1(TreeNode * Tree):副菜單(修改選項菜單)6.void Change(TreeNode * Tree):修改家譜7.TreeNode * SearchTree(TreeNode *Tree,char name,int length):按照姓名查找家譜成員8.TreeNode * SearchTree1(

5、TreeNode *Tree,char birth,int length):按照生日查找家譜成員9.void OutPutMessage(TreeNode * Tree,char name,int length):輸出按姓名查找到的家譜成員10.void OutPutMessage1(TreeNode * Tree,char birth,int length):輸出按生日查找到的家譜成員11.void SaveFamily(TreeNode *root):保存家譜12.void ReadFamily(TreeNode *root):讀取家譜三、數(shù)據(jù)結(jié)構(gòu)typedef struct TreeNo

6、de專業(yè)資料.intChildNum; /記錄這個人擁有幾個兒女char Name20;/記錄這個人的姓名char birthday20;/生日int marriage;/婚否( 1 表示結(jié)婚, 0 表示沒結(jié)婚)int death;/生死( 1 表示活著, 0 表示過世)char Kind;/標(biāo)示節(jié)點的種類有女G 男 Bchar address100;/住址char livemassage50;/死亡日期(如果其已經(jīng)死亡)struct TreeNode *NextNode20;/ 記錄這個人的兒女struct TreeNode *Parent;/ 記錄這個節(jié)點的父節(jié)點TreeNode,*tre

7、e;四、測試第一組數(shù)據(jù)為:爺爺,奶奶,爸爸,媽媽,我,二叔,二嬸,姐姐,三叔,三嬸,弟弟一共三代 11 個人。其中爺爺是根節(jié)點,奶奶為爺爺?shù)呐渑迹瑫r也是爺爺?shù)牡谝粋€后繼節(jié)點。爸爸,二叔,三叔為爺爺?shù)淖优0职值呐渑际菋寢?,爸爸的子女是我。二叔的配偶是二嬸,子女是姐姐。三叔的的配偶是三嬸,三叔的的子女是弟弟。進(jìn)入程序之后,首先進(jìn)行創(chuàng)建家譜,然后進(jìn)行存盤,之后進(jìn)行修改和查詢等步驟。退出程序在進(jìn)入程序時,進(jìn)行讀盤。之后在進(jìn)行其他操作,程序完成之后退出即可。專業(yè)資料.爺爺奶奶爸爸媽媽二叔二嬸三叔三嬸我姐姐弟弟圖1 家族樹第一組數(shù)據(jù)測試截圖為:專業(yè)資料.圖 2 顯示家譜圖 3 按照姓名查找家族成員專業(yè)

8、資料.圖4 存盤第二組數(shù)據(jù)為:專業(yè)資料.王老劉老王二張二王大李大王 小王 小一二圖 4 王家家族樹第二組數(shù)據(jù)測試截屏為:圖 5 修改家族成員的信息專業(yè)資料.圖 6 修改某個人的具體信息專業(yè)資料.圖 7 按照生日查找某人圖8 讀盤五、源程序#include #include #include #ifdef WIN32#define CLEAR system(cls)#defineTipForSaveFilePositionprintf(tt輸入文件名及 保存位置(eg:D:example.txt): )#define TipForReadFilePosition printf(tt文件名及其路徑

9、(eg: D:example.txt):)專業(yè)資料.#else#define CLEAR system(clear)#defineTipForSaveFilePositionprintf(tt輸入文件名及 保存位置(eg:/home/xiong/example.txt):)#defineTipForReadFilePositionprintf(tt文件名及其路徑(eg:/home/xiong/example.txt):)#endif#define maxFileNameLen 50 /保存的文件名的最大長度int FLAG=0;int a=1;typedef struct TreeNodein

10、tChildNum; /記錄這個人擁有幾個兒女char Name20;/記錄這個人的姓名char birthday20;/生日int marriage;/婚否( 1 表示結(jié)婚, 0 表示沒結(jié)婚)int death;/生死( 1 表示活著, 0 表示過世)char Kind;/標(biāo)示節(jié)點的種類有女G 男 Bchar address100;/住址char livemassage50;/死亡日期(如果其已經(jīng)死亡)struct TreeNode *NextNode20;/ 記錄這個人的兒女struct TreeNode *Parent;/ 記錄這個節(jié)點的父節(jié)點專業(yè)資料.TreeNode,*tree;vo

11、id CreatTree(TreeNode *Tree);void OutPutAll(TreeNode *Tree);void Menue(TreeNode *Tree);void SubMenue1(TreeNode * Tree);void SubMenue2(TreeNode *Tree);void Change(TreeNode * Tree);void AddNew(TreeNode * Tree);TreeNode * SearchTree(TreeNode *Tree,char name,int length);TreeNode * SearchTree1(TreeNode *

12、Tree,char birth,int length) ;void OutPutMessage(TreeNode * Tree,char name,int length);void OutPutMessage1(TreeNode * Tree,char birth,int length);void SaveFamily(TreeNode *root);void ReadFamily(TreeNode *root);int main()/主函數(shù)TreeNode *Tree;/TreeNode *Tree1;/Tree1=&(*Tree);Tree=(TreeNode *)malloc(sizeo

13、f(TreeNode);Tree-Parent =NULL;strcpy(Tree-Name,0);Menue(Tree);專業(yè)資料.return 0;void Menue(TreeNode *Tree)/輸出主菜單/*TreeNode *Tree1;Tree1=&Tree;*/char c;char name20;char birth20;while(1)system(cls);printf(t);printf(nntt*歡 迎 使 用 家 族 管 理 系 統(tǒng) *nn);printf(nttA: 輸入家譜信息建立樹);printf(nttB:輸出整個家譜信息);printf(nttC:按出生

14、日期查找某人);printf(nttD: 按姓名查找某人);printf(nttE:修改某個人的信息);printf(nttF:存盤);printf(nttG:讀盤);專業(yè)資料.printf(nttH: 退出整個程序nt);c=getchar();switch(c)case A:TreeNode * NewNode;NewNode=(TreeNode *)malloc(sizeof(TreeNode);printf(nt請輸入姓名 :);scanf(%s,Tree-Name);printf(nt請輸入性別女G 男 B:);getchar();scanf(%c,&(Tree-Kind);Tree

15、-Parent=NewNode;Tree-Parent=NULL;/CreatTree(Tree);/printf(nt-家譜圖已經(jīng)建立成功-nn);printf(nnt-請按 Enter 鍵繼續(xù)操作 -);getchar();break;case B:if(strcmp(Tree-Name,0)=0)專業(yè)資料.printf(nt家譜圖的多叉樹尚未建立請先建立樹n);getchar();break;printf(nnt整個家譜的主要信息如下:);OutPutAll(Tree);getchar();break;case C:if(strcmp(Tree-birthday,0)=0)printf(

16、nt家譜圖的多叉樹尚未建立請先建立樹n);getchar();break;printf(nt請輸入你要查找的出生日期:);scanf(%s,birth);OutPutMessage1(SearchTree1(Tree,birth,20),birth,20);printf(nnt-*-*-*-*-*-*-*-*-*-*-nt);getchar();break;case D:專業(yè)資料.if(strcmp(Tree-Name,0)=0)printf(nt家譜圖的多叉樹尚未建立請先建立樹n);getchar();break;printf(nt請輸入你要查找的人的姓名:nt);scanf(%s,name

17、);OutPutMessage(SearchTree(Tree,name,20),name,20);printf(nnt-*-*-*-*-*-*-*-*-*-*-nt);getchar();break;case E:if(strcmp(Tree-Name,0)=0)printf(nt家譜圖的多叉樹尚未建立請先建立樹n);getchar();break;Change(Tree);getchar();break;專業(yè)資料.case F:if(strcmp(Tree-Name,0)=0)printf(nt家譜圖的多叉樹尚未建立請先建立樹n);getchar();break;SaveFamily(Tr

18、ee);getchar();break;case G:/*if(strcmp(Tree-Name,0)=0)printf(nt家譜圖的多叉樹尚未建立請先建立樹n);getchar();break;*/ReadFamily(&Tree);getchar();break;case H:printf(nnt-本次服務(wù)到此結(jié)束-);專業(yè)資料.printf(nt-歡迎下次使用 -);printf(nt-謝謝 -nn);break;case n:break;default:printf(nnt-對不起 ! 你的選擇不在服務(wù)圍之!-);printf(nt-請您再次選擇所需的服務(wù)項!-);printf(nt-

19、謝謝 -nt);getchar();break;if (c=H|c=f)break;getchar();void CreatTree(TreeNode *Node) /創(chuàng)建樹int i;TreeNode *NewNode;NewNode=(TreeNode *)malloc(sizeof(TreeNode);專業(yè)資料.Node-NextNode0=NewNode;Node-NextNode0=NULL;printf(nt請輸入出生日期:);scanf(%s,Node-birthday);printf(nt請輸入家庭住址:);getchar();scanf(%s,Node-address);pr

20、intf(nt請輸入是否建在(1- 是或 0- 否 ): );scanf(%d,&(Node-death);if(Node-death=0)printf(nt請輸入去世日期:);scanf(%s,Node-livemassage);else if(Node-death=1)printf(nt仍然建在 );printf(nt請輸入 %s 的配偶的姓名(輸入 0 代表沒結(jié)婚 ):,Node-Name);scanf(%s,NewNode-Name);if(strcmp(NewNode-Name,0)!=0)printf(t請輸入配偶的出生日期:);scanf(%s,NewNode-birthday)

21、;printf(nt請輸入家庭住址:);getchar();scanf(%s,NewNode-address);專業(yè)資料.printf(nt請輸入是否建在(1- 是或 0- 否 ): );scanf(%d,&(NewNode-death);if(NewNode-death=0)printf(nt請輸入去世日期:);scanf(%s,NewNode-livemassage);else if(NewNode-death=1)printf(nt仍然建在 );printf(nt請輸入 %s 的子女的數(shù)目(當(dāng)子女輸入0時便停止輸入該成員有關(guān)信息):,Node-Name);scanf(%d,&(Node-

22、ChildNum);if(Node-ChildNum)=0&strcmp(NewNode-Name,0)=0)return ;if(Node-Kind=G|Node-Kind=g)NewNode-Kind=B;elseNewNode-Kind=G;NewNode-ChildNum=0;NewNode-NextNode0=NULL;Node-NextNode0=NewNode;Node-NextNode0-Parent=Node;/孩子的父母專業(yè)資料.for(i=1;iChildNum;i+)NewNode=(TreeNode *)malloc(sizeof(TreeNode);a+;print

23、f(nt請輸入 %s 的第 %d 子女的名字 :,Node-Name,i);scanf(%s,NewNode-Name);printf(nt請輸入 %s 的第 %d 子女的性別女G 男 B:,Node-Name,i);getchar();scanf(%c,&NewNode-Kind);NewNode-ChildNum=-1;NewNode-Parent=Node;Node-NextNodei=NewNode;CreatTree(Node-NextNodei); /從子女的數(shù)目開始void OutPutAll(TreeNode *Tree)int i, flag=0;printf(nt-*-*-

24、*-*-*-*-*-*-*-);printf(nt姓 名 :%s出 生 日 期 :%s家 庭 住 址 : %s性別: %c,Tree-Name,Tree-birthday,Tree-address,Tree-Kind); if (Tree-Kind=G|Tree-Kind=g)專業(yè)資料.flag=1;printf(女 );elseprintf(男 );printf(t是否健在 (1- 健在, 0- 去世 ): );if(Tree-death=1) printf(1);else if(Tree-death=0) printf(0);if (!(Tree-NextNode0)printf(nt至今

25、沒有配偶和子女n);return;if(flag=1)printf(nt丈夫姓名 :%s,Tree-NextNode0-Name);elseprintf(nt妻子姓名 :%s,Tree-NextNode0-Name);printf(t是否健在 (1- 健在, 0- 去世 ): );if(Tree-death=1) printf(1);else if(Tree-death=0) printf(0);for(i=1;iChildNum;i+)專業(yè)資料.printf(nt第 %d個 子 女 的 姓 名 :%s出 生 日 期 :%s家 庭 住 址 : %s性別 %c,i,Tree-NextNodei-

26、Name,Tree-NextNodei-birthday,Tree-NextNodei-address,Tree-NextNodei-Kind);if (Tree-NextNodei-Kind=G|Tree-NextNodei-Kind=g)printf(女 );elseprintf(男 );printf(t是否健在 (1- 健在, 0- 去世 ): );if(Tree-death=1) printf(1);else if(Tree-death=0) printf(0);printf(nt);for(i=1;iChildNum;i+)OutPutAll(Tree-NextNodei);Tree

27、Node * SearchTree(TreeNode *Tree,char name,int length)int i;TreeNode *NewNode;if(strcmp(Tree-Name,name)=0)專業(yè)資料.if(length=0)FLAG=1;elseFLAG=0;return Tree;if(Tree-NextNode0=NULL)return NULL;for(i=0;iChildNum;i+)if (i=0)NewNode=SearchTree(Tree-NextNodei,name,0);elseNewNode=SearchTree(Tree-NextNodei,nam

28、e,20);if (NewNode!=NULL)return NewNode;return NULL;void OutPutMessage(TreeNode * Tree,char name,int length)專業(yè)資料.int flag=0,i;TreeNode *NewNode;printf(nnt-*-*-*-*-*-*-*-*-*-*-);if(Tree=NULL)printf(nnt*該 家 譜 圖 中 沒 有 %s這 個 人 的 信 息 請 確 認(rèn) 是 否 輸 入 錯 誤*n,name);return;printf(nnt您所要找的人已經(jīng)找到信息如下所示:);printf(nnt

29、姓名:%s出生日期:%s家庭住址:%s性別:%c,name,Tree-birthday,Tree-address,Tree-Kind);if (Tree-Kind=G|Tree-Kind=g)flag=1;/ 標(biāo)記他 (她 )的性別printf(女 );elseprintf(男 );printf(t是否健在 (1- 健在, 0- 去世 ): );if(Tree-death=1) printf(1);else if(Tree-death=0) printf(0);專業(yè)資料.NewNode=Tree-Parent;if (FLAG=1)if(flag=1)printf(nnt她是嫁入此家族的所以親

30、生父母信息不在家譜包括);printf(nt丈夫姓名 :%s,NewNode-Name);elseprintf(nnt他是入贅此家族的所以親生父母信息不在家譜包括);printf(nt妻子姓名 :%s,NewNode-Name);if (NewNode-ChildNum)0)/ 判斷他 (她) 是否有孩子printf(nt的孩子的信息如下:); / 輸出他 (她)的孩子的信息for(i=1;iChildNum;i+)printf(nt姓名 :%s 性別 :,NewNode-NextNodei-Name);if (NewNode-NextNodei-Kind=G|NewNode-Kind=g)p

31、rintf(女 );專業(yè)資料.elseprintf(男 );printf(t是否健在 (1- 健在, 0- 去世 ): );if(Tree-death=1) printf(1);else if(Tree-death=0) printf(0);return;if(NewNode=NULL)/判斷它是不是根節(jié)點如果是的話就沒有父母兄弟信息printf(nt是這個家譜圖里最年長的人,name);elseif (NewNode-Kind=G|NewNode-Kind=g)/ 判斷父親節(jié)點是父親還是母親printf(nt母親姓名 :%s,NewNode-Name);/輸出他(她)的父母親的信息print

32、f(nt父親姓名 :%s,NewNode-NextNode0-Name);else專業(yè)資料.printf(nt母親姓名 :%s,NewNode-NextNode0-Name);printf(nt父親姓名 :%s,NewNode-Name);if(Tree-NextNode0!=NULL) /判斷他 (她) 是否有配偶if(flag=1)/輸出他 (她 )的配偶的信息printf(nt丈夫 姓名 :%s,Tree-NextNode0-Name);elseprintf(nt妻子 姓名 :%s,Tree-NextNode0-Name);if (Tree-ChildNum0) /判斷他 (她 )是否有

33、孩子printf(nt的孩子的信息如下:); / 輸出他 (她 )的孩子的信息for(i=1;iChildNum;i+)printf(nt姓名 :%s性別 :,Tree-NextNodei-Name);if (Tree-NextNodei-Kind=G|Tree-Kind=g)printf(女 );elseprintf(男 );printf(t是否健在 (1- 健在, 0- 去世 ): );專業(yè)資料.if(Tree-death=1) printf(1);else if(Tree-death=0) printf(0);elseprintf(nt%s至今還沒有孩子,name);elseprintf(nt%s至今還沒有配偶和孩子n,Tree-Name)

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論