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

下載本文檔

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

文檔簡介

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

2、查詢,輸出成員信息(包括其本人、父親、孩子的信息)。6). 修改某成員信息?!净疽蟆浚航缑嬉螅河泻侠淼奶崾荆總€功能可以設立菜單,根據(jù)提示,可以完成相關的功能要求。存儲結(jié)構(gòu):學生自己根據(jù)系統(tǒng)功能要求自己設計,但是要求相關數(shù)據(jù)要存儲在數(shù)據(jù)文件中。測試數(shù)據(jù):要求使用1、全部合法數(shù)據(jù);2、局部非法數(shù)據(jù)。進行程序測試,以保證程序的穩(wěn)定。測試數(shù)據(jù)及測試結(jié)果請在上交的資料中寫明。 指導教師:_ 年 月 日課 程 設 計 評 語 成績: 指導教師:_ 年 月 日洛 陽 理 工 學 院 課 程 設 計 報 告一、 算法思想本程序是一個管理家譜的系統(tǒng),通過這個系統(tǒng)可以對家族成員進行創(chuàng)建、顯示、查找、修改、

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

4、改家譜查找成員讀寫家譜按照姓名按照生日修改本人修改父母修改孩子存盤讀盤退出系統(tǒng)二、 模塊劃分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

5、 name,int length):按照姓名查找家譜成員8. TreeNode * SearchTree1(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

6、ReadFamily(TreeNode *root):讀取家譜三、 數(shù)據(jù)結(jié)構(gòu)typedef struct TreeNode int ChildNum; /記錄這個人擁有幾個兒女 char Name20;/記錄這個人的姓名 char birthday20;/生日int marriage;/婚否(1表示結(jié)婚,0表示沒結(jié)婚)int death;/生死(1表示活著,0表示過世) char Kind;/標示節(jié)點的種類有女G男B char address100;/住址 char livemassage50;/死亡日期(如果其已經(jīng)死亡) struct TreeNode *NextNode20; /記錄這個人

7、的兒女 struct TreeNode *Parent; /記錄這個節(jié)點的父節(jié)點 TreeNode,*tree;四、 測試第一組數(shù)據(jù)為:爺爺,奶奶,爸爸,媽媽,我,二叔,二嬸,姐姐,三叔,三嬸,弟弟一共三代11個人。其中爺爺是根節(jié)點,奶奶為爺爺?shù)呐渑?,同時也是爺爺?shù)牡谝粋€后繼節(jié)點。爸爸,二叔,三叔為爺爺?shù)淖优?。爸爸的配偶是媽媽,爸爸的子女是我。二叔的配偶是二嬸,子女是姐姐。三叔的的配偶是三嬸,三叔的的子女是弟弟。進入程序之后,首先進行創(chuàng)建家譜,然后進行存盤,之后進行修改和查詢等步驟。退出程序在進入程序時,進行讀盤。之后在進行其他操作,程序完成之后退出即可。爺爺爸爸二叔奶奶三叔媽媽二嬸三嬸我姐姐

8、弟弟 圖1 家族樹第一組數(shù)據(jù)測試截圖為:圖2 顯示家譜圖3 按照姓名查找家族成員圖4 存盤第二組數(shù)據(jù)為:王老王大劉老王二李大張二王小一王小二圖4 王家家族樹第二組數(shù)據(jù)測試截屏為:圖5 修改家族成員的信息圖6 修改某個人的具體信息圖7 按照生日查找某人圖8 讀盤五、 源程序#include #include #include #ifdef WIN32#define CLEAR system(cls)#define TipForSaveFilePosition printf(tt輸入文件名及保存位置(eg: D:example.txt): )#define TipForReadFilePositi

9、on printf(tt文件名及其路徑(eg: D:example.txt): )#else#define CLEAR system(clear)#define TipForSaveFilePosition printf(tt輸入文件名及保存位置(eg: /home/xiong/example.txt): )#define TipForReadFilePosition printf(tt文件名及其路徑(eg: /home/xiong/example.txt): )#endif#define maxFileNameLen 50 /保存的文件名的最大長度int FLAG=0;int a=1; ty

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

11、 TreeNode,*tree; void 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); TreeNo

12、de * SearchTree1(TreeNode *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=&(*T

13、ree); Tree=(TreeNode *)malloc(sizeof(TreeNode); Tree-Parent =NULL; strcpy(Tree-Name,0); Menue(Tree); 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(ntt A:輸入家譜信息建

14、立樹 ); printf(ntt B:輸出整個家譜信息 ); printf(ntt C:按出生日期查找某人 ); printf(ntt D:按姓名查找某人 ); printf(ntt E:修改某個人的信息 );printf(ntt F:存盤 );printf(ntt G:讀盤 ); printf(ntt H:退出整個程序 nt); c=getchar();switch(c) case A: TreeNode * NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode);printf(nt請輸入姓名:); scanf(%s,Tree-Name);

15、printf(nt請輸入性別女G男B:); getchar(); scanf(%c,&(Tree-Kind);Tree-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) printf(nt家譜圖的多叉樹尚未建立請先建立樹n); getchar(); break; printf(nnt整個家譜的主要信息如下:); OutPutAll(

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

17、nt家譜圖的多叉樹尚未建立請先建立樹n); getchar(); break; printf(nt請輸入你要查找的人的姓名:nt); scanf(%s,name); 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;cas

18、e F:if(strcmp(Tree-Name,0)=0) printf(nt家譜圖的多叉樹尚未建立請先建立樹n); getchar(); break; SaveFamily(Tree);getchar(); break;case G:/*if(strcmp(Tree-Name,0)=0) printf(nt家譜圖的多叉樹尚未建立請先建立樹n); getchar(); break; */ReadFamily(&Tree);getchar();break; case H: printf(nnt-本次服務到此結(jié)束-); printf(nt-歡迎下次使用-);printf(nt-謝謝-nn);bre

19、ak;case n:break; default: printf(nnt-對不起!你的選擇不在服務范圍之內(nèi)!-); printf(nt-請您再次選擇所需的服務項!-); printf(nt-謝謝-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); Node-NextNode0=NewNode; Node-NextNode0=NUL

20、L; printf(nt請輸入出生日期:); scanf(%s,Node-birthday); printf(nt請輸入家庭住址:);getchar(); scanf(%s,Node-address); printf(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);

21、scanf(%s,NewNode-Name); if(strcmp(NewNode-Name,0)!=0)printf(t請輸入配偶的出生日期:);scanf(%s,NewNode-birthday); printf(nt請輸入家庭住址:);getchar();scanf(%s,NewNode-address);printf(nt請輸入是否建在(1-是或0-否):); scanf(%d,&(NewNode-death); if(NewNode-death=0) printf(nt請輸入去世日期:); scanf(%s,NewNode-livemassage); else if(NewNode-

22、death=1) printf(nt仍然建在);printf(nt請輸入%s的子女的數(shù)目(當子女輸入0時便停止輸入該成員有關信息):,Node-Name); scanf(%d,&(Node-ChildNum); if(Node-ChildNum)=0&strcmp(NewNode-Name,0)=0) return ; if(Node-Kind=G|Node-Kind=g) NewNode-Kind=B; else NewNode-Kind=G; NewNode-ChildNum=0; NewNode-NextNode0=NULL; Node-NextNode0=NewNode; Node-N

23、extNode0-Parent=Node;/孩子的父母 for(i=1;iChildNum;i+) NewNode=(TreeNode *)malloc(sizeof(TreeNode);a+;printf(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=NewNo

24、de; CreatTree(Node-NextNodei); /從子女的數(shù)目開始void OutPutAll(TreeNode *Tree) int i, flag=0;printf(nt-*-*-*-*-*-*-*-*-*-);printf(nt姓名:%s 出生日期:%s 家庭住址:%s 性別: %c,Tree-Name,Tree-birthday,Tree-address,Tree-Kind);if (Tree-Kind=G|Tree-Kind=g) flag=1; printf(女); else printf(男);printf(t是否健在(1-健在,0-去世):);if(Tree-de

25、ath=1) printf(1);else if(Tree-death=0) printf(0); if (!(Tree-NextNode0) printf(nt至今沒有配偶和子女n); return; if(flag=1) printf(nt丈夫 姓名:%s,Tree-NextNode0-Name); else printf(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;

26、i+) printf(nt第%d個子女的姓名:%s 出生日期:%s 家庭住址:%s 性別%c,i,Tree-NextNodei-Name,Tree-NextNodei-birthday,Tree-NextNodei-address,Tree-NextNodei-Kind); if (Tree-NextNodei-Kind=G|Tree-NextNodei-Kind=g) printf(女); else printf(男);printf(t是否健在(1-健在,0-去世):); if(Tree-death=1) printf(1); else if(Tree-death=0) printf(0);

27、 printf(nt);for(i=1;iChildNum;i+) OutPutAll(Tree-NextNodei); TreeNode * SearchTree(TreeNode *Tree,char name,int length) int i; TreeNode *NewNode; if(strcmp(Tree-Name,name)=0) if(length=0) FLAG=1; else FLAG=0; return Tree; if(Tree-NextNode0=NULL) return NULL; for(i=0;iChildNum;i+) if (i=0) NewNode=Se

28、archTree(Tree-NextNodei,name,0); else NewNode=SearchTree(Tree-NextNodei,name,20); if (NewNode!=NULL) return NewNode; return NULL; void OutPutMessage(TreeNode * Tree,char name,int length) int flag=0,i; TreeNode *NewNode; printf(nnt-*-*-*-*-*-*-*-*-*-*-); if(Tree=NULL) printf(nnt*該家譜圖中沒有%s這個人的信息請確認是否輸

29、入錯誤*n,name); return; printf(nnt您所要找的人已經(jīng)找到信息如下所示:); printf(nnt姓名:%s出生日期:%s 家庭住址:%s 性別:%c,name,Tree-birthday,Tree-address,Tree-Kind); if (Tree-Kind=G|Tree-Kind=g) flag=1; /標記他(她)的性別 printf(女); else printf(男);printf(t是否健在(1-健在,0-去世):);if(Tree-death=1) printf(1);else if(Tree-death=0) printf(0); NewNode=

30、Tree-Parent; if (FLAG=1) if(flag=1) printf(nnt她是嫁入此家族的所以親生父母信息不在家譜內(nèi)包括); printf(nt丈夫 姓名:%s,NewNode-Name); else printf(nnt他是入贅此家族的所以親生父母信息不在家譜內(nèi)包括); printf(nt妻子姓名:%s,NewNode-Name); if (NewNode-ChildNum)0) /判斷他(她)是否有孩子 printf(nt的孩子的信息如下:); /輸出他(她)的孩子的信息for(i=1;iChildNum;i+) printf(nt姓名:%s 性別:,NewNode-Ne

31、xtNodei-Name);if (NewNode-NextNodei-Kind=G|NewNode-Kind=g) printf(女); else printf(男);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); else if (NewNode-Kind=G|NewNode-Kind=g) /判斷父親節(jié)點是父

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

33、s,Tree-NextNode0-Name); if (Tree-ChildNum0) /判斷他(她)是否有孩子 printf(nt的孩子的信息如下:); /輸出他(她)的孩子的信息 for(i=1;iChildNum;i+) printf(nt姓名:%s 性別:,Tree-NextNodei-Name); if (Tree-NextNodei-Kind=G|Tree-Kind=g) printf(女); else printf(男);printf(t是否健在(1-健在,0-去世):); if(Tree-death=1) printf(1); else if(Tree-death=0) pri

34、ntf(0); else printf(nt%s至今還沒有孩子,name); else printf(nt%s至今還沒有配偶和孩子n,Tree-Name); TreeNode * SearchTree1(TreeNode *Tree,char birth,int length) int i; TreeNode *NewNode; if(strcmp(Tree-birthday,birth)=0) if(length=0) FLAG=1; else FLAG=0; return Tree; if(Tree-NextNode0=NULL) return NULL; for(i=0;iChildNu

35、m;i+) if (i=0) NewNode=SearchTree1(Tree-NextNodei,birth,0); else NewNode=SearchTree1(Tree-NextNodei,birth,20); if (NewNode!=NULL) return NewNode; return NULL; void OutPutMessage1(TreeNode * Tree,char birth,int length) int flag=0,i; TreeNode *NewNode; printf(nnt-*-*-*-*-*-*-*-*-*-*-); if(Tree=NULL) p

36、rintf(nnt*該家譜圖中沒有出生日期為%s這個人的信息請確認是否輸入錯誤*n,birth); return; printf(nnt您所要找的人已經(jīng)找到信息如下所示:); printf(nnt姓名:%s出生日期:%s 家庭住址:%s 性別:%c,Tree-Name,Tree-birthday,Tree-address,Tree-Kind); if (Tree-Kind=G|Tree-Kind=g) flag=1; /標記他(她)的性別 printf(女); else printf(男); void Change(TreeNode * Tree) /修改某個人的信息 char name20;

37、 TreeNode * NewNode; printf(nt請輸入你要修改的人的姓名:nt); scanf(%s,name); NewNode=SearchTree(Tree,name,20); if(NewNode=NULL) printf(nnt*該家譜圖中沒有%s這個人的信息請確認是否輸入錯誤*n,name); return; else SubMenue1(NewNode); void SubMenue1(TreeNode * Tree) /輸出副菜單 char c; int flag,i; char name20; char birth20; char address150; char

38、 Parent220; TreeNode * NewNode; getchar(); while(1) system(cls); printf(t); printf(nnt -*-請選擇你的操作-*- ); printf(nt-*-*-*-A:修改個人的信息-*-*-*-*-*-*- ); printf(nt-*-*-*-B:修改父母的信息-*-*-*-*-*-*- ); printf(nt-*-*-*-C:修改子女的信息-*-*-*-*-*-*- ); printf(nt-*-*-*-D:退出-*-*-*-*-*-*-*-*-*-nt); c=getchar(); switch(c) cas

39、e A: printf(nnt請輸入修改的姓名:如果不需要修改就輸入0然后按Enter鍵繼續(xù)nt); scanf(%s,name); if(strcmp(name,0)!=0) strcpy(Tree-Name,name); printf(nnt是否要修改性別:如果需要就輸入1不需要修改就輸入0然后按Enter鍵繼續(xù)nt); scanf(%d,&flag); if (flag=1) if(Tree-Kind=G|Tree-Kind=g) Tree-Kind=B; else Tree-Kind=G; printf(nnt請輸入修改的出生日期:如果不需要修改就輸入0然后按Enter鍵繼續(xù)nt); scanf(%s,birth); if(strcmp(birth,0)!=0) strcpy(Tree-birthday,birth); pr

溫馨提示

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

評論

0/150

提交評論