家譜管理系統_第1頁
家譜管理系統_第2頁
家譜管理系統_第3頁
家譜管理系統_第4頁
家譜管理系統_第5頁
已閱讀5頁,還剩21頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

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

2、查詢,輸出成員信息(包括其本人、父親、孩子的信息)。6). 修改某成員信息。【基本要求】:界面要求:有合理的提示,每個功能可以設立菜單,根據提示,可以完成相關的功能要求。存儲結構:學生自己根據系統功能要求自己設計,但是要求相關數據要存儲在數據文件中。測試數據:要求使用1、全部合法數據;2、局部非法數據。進行程序測試,以保證程序的穩定。測試數據及測試結果請在上交的資料中寫明。 指導教師:_ 年 月 日課 程 設 計 評 語 成績: 指導教師:_ 年 月 日洛 陽 理 工 學 院 課 程 設 計 報 告一、 算法思想本程序是一個管理家譜的系統,通過這個系統可以對家族成員進行創建、顯示、查找、修改、

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

4、改家譜查找成員讀寫家譜按照姓名按照生日修改本人修改父母修改孩子存盤讀盤退出系統二、 模塊劃分1. int main():主函數2. void CreatTree(TreeNode *Tree):創建家族樹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):讀取家譜三、 數據結構typedef struct TreeNode int ChildNum; /記錄這個人擁有幾個兒女 char Name20;/記錄這個人的姓名 char birthday20;/生日int marriage;/婚否(1表示結婚,0表示沒結婚)int death;/生死(1表示活著,0表示過世) char Kind;/標示節點的種類有女G男B char address100;/住址 char livemassage50;/死亡日期(如果其已經死亡) struct TreeNode *NextNode20; /記錄這個人

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

8、弟弟 圖1 家族樹第一組數據測試截圖為:圖2 顯示家譜圖3 按照姓名查找家族成員圖4 存盤第二組數據為:王老王大劉老王二李大張二王小一王小二圖4 王家家族樹第二組數據測試截屏為:圖5 修改家族成員的信息圖6 修改某個人的具體信息圖7 按照生日查找某人圖8 讀盤五、 源程序#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32#define CLEAR system("cls")#define TipForSaveFilePosition printf(

9、"tt輸入文件名及保存位置(eg: D:example.txt): ")#define TipForReadFilePosition printf("tt文件名及其路徑(eg: D:example.txt): ")#else#define CLEAR system("clear")#define TipForSaveFilePosition printf("tt輸入文件名及保存位置(eg: /home/xiong/example.txt): ")#define TipForReadFilePosition prin

10、tf("tt文件名及其路徑(eg: /home/xiong/example.txt): ")#endif#define maxFileNameLen 50 /保存的文件名的最大長度int FLAG=0;int a=1; typedef struct TreeNode int ChildNum; /記錄這個人擁有幾個兒女 char Name20;/記錄這個人的姓名 char birthday20;/生日int marriage;/婚否(1表示結婚,0表示沒結婚)int death;/生死(1表示活著,0表示過世) char Kind;/標示節點的種類有女G男B char ad

11、dress100;/住址 char livemassage50;/死亡日期(如果其已經死亡) struct TreeNode *NextNode20; /記錄這個人的兒女 struct TreeNode *Parent; /記錄這個節點的父節點 TreeNode,*tree; void CreatTree(TreeNode *Tree); void OutPutAll(TreeNode *Tree); void Menue(TreeNode *Tree); void SubMenue1(TreeNode * Tree); void SubMenue2(TreeNode *Tree); void

12、 Change(TreeNode * Tree); void AddNew(TreeNode * Tree); TreeNode * SearchTree(TreeNode *Tree,char name,int length); TreeNode * SearchTree1(TreeNode *Tree,char birth,int length) ; void OutPutMessage(TreeNode * Tree,char name,int length); void OutPutMessage1(TreeNode * Tree,char birth,int length); voi

13、d SaveFamily(TreeNode *root); void ReadFamily(TreeNode *root); int main()/主函數 TreeNode *Tree;/TreeNode *Tree1; /Tree1=&(*Tree); Tree=(TreeNode *)malloc(sizeof(TreeNode); Tree->Parent =NULL; strcpy(Tree->Name,"0"); Menue(Tree); return 0; void Menue(TreeNode *Tree)/輸出主菜單 /*TreeNode

14、 *Tree1; Tree1=&Tree;*/ char c; char name20;char birth20;while(1) system("cls"); printf("t"); printf("nntt*歡 迎 使 用 家 族 管 理 系 統*nn");printf("ntt A:輸入家譜信息建立樹 "); printf("ntt B:輸出整個家譜信息 "); printf("ntt C:按出生日期查找某人 "); printf("ntt D:按姓

15、名查找某人 "); 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&qu

16、ot;,Tree->Name); printf("nt請輸入性別女G男B:"); getchar(); scanf("%c",&(Tree->Kind);Tree->Parent=NewNode; Tree->Parent=NULL;/ CreatTree(Tree); / printf("nt-家譜圖已經建立成功-nn"); printf("nnt-請按Enter鍵繼續操作-"); getchar(); break; case 'B': if(strcmp(Tree

17、->Name,"0")=0) printf("nt家譜圖的多叉樹尚未建立請先建立樹n"); getchar(); break; printf("nnt整個家譜的主要信息如下:"); OutPutAll(Tree); getchar(); break; case 'C': if(strcmp(Tree->birthday,"0")=0) printf("nt家譜圖的多叉樹尚未建立請先建立樹n"); getchar(); break; printf("nt請輸入

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

19、t請輸入你要查找的人的姓名: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);

20、getchar(); break;case '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; */ReadFamil

21、y(&Tree);getchar();break; case 'H': printf("nnt-本次服務到此結束-"); printf("nt-歡迎下次使用-");printf("nt-謝謝-nn");break;case 'n':break; default: printf("nnt-對不起!你的選擇不在服務范圍之內!-"); printf("nt-請您再次選擇所需的服務項!-"); printf("nt-謝謝-nt");getcha

22、r(); break; if (c='H'|c='f') break; getchar(); void CreatTree(TreeNode *Node) /創建樹 int i; TreeNode *NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode); Node->NextNode0=NewNode; Node->NextNode0=NULL; printf("nt請輸入出生日期:"); scanf("%s",Node->birthday); prin

23、tf("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') print

24、f("nt仍然建在");printf("nt請輸入%s的配偶的姓名(輸入0代表沒結婚):",Node->Name); scanf("%s",NewNode->Name); if(strcmp(NewNode->Name,"0")!=0)printf("t請輸入配偶的出生日期:");scanf("%s",NewNode->birthday); printf("nt請輸入家庭住址:");getchar();scanf("%s&

25、quot;,NewNode->address);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請

26、輸入%s的子女的數目(當子女輸入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&

27、#39; NewNode->ChildNum=0; NewNode->NextNode0=NULL; Node->NextNode0=NewNode; Node->NextNode0->Parent=Node;/孩子的父母 for(i=1;i<=Node->ChildNum;i+) NewNode=(TreeNode *)malloc(sizeof(TreeNode);a+;printf("nt請輸入%s的第%d子女的名字:",Node->Name,i); scanf("%s",NewNode->Na

28、me); 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); /從子女的數目開始void OutPutAll(TreeNode *Tree) int i, flag=0;printf("nt-*-

29、*-*-*-*-*-*-*-*-");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-&

30、gt;death=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

31、是否健在(1-健在,0-去世):");if(Tree->death=1) printf("1");else if(Tree->death=0) printf("0");for(i=1;i<=Tree->ChildNum;i+) printf("nt第%d個子女的姓名:%s 出生日期:%s 家庭住址:%s 性別%c",i,Tree->NextNodei->Name,Tree->NextNodei->birthday,Tree->NextNodei->address,T

32、ree->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"); prin

33、tf("nt");for(i=1;i<=Tree->ChildNum;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;

34、i<=Tree->ChildNum;i+) if (i=0) NewNode=SearchTree(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-*-*-*-*-

35、*-*-*-*-*-*-"); if(Tree=NULL) printf("nnt*該家譜圖中沒有%s這個人的信息請確認是否輸入錯誤*n",name); return; printf("nnt您所要找的人已經找到信息如下所示:"); printf("nnt姓名:%s出生日期:%s 家庭住址:%s 性別:%c",name,Tree->birthday,Tree->address,Tree->Kind); if (Tree->Kind='G'|Tree->Kind='g

36、9;) flag=1; /標記他(她)的性別 printf("女"); else printf("男");printf("t是否健在(1-健在,0-去世):");if(Tree->death=1) printf("1");else if(Tree->death=0) printf("0"); NewNode=Tree->Parent; if (FLAG=1) if(flag=1) printf("nnt她是嫁入此家族的所以親生父母信息不在家譜內包括"); p

37、rintf("nt丈夫 姓名:%s",NewNode->Name); else printf("nnt他是入贅此家族的所以親生父母信息不在家譜內包括"); printf("nt妻子姓名:%s",NewNode->Name); if (NewNode->ChildNum)>0) /判斷他(她)是否有孩子 printf("nt的孩子的信息如下:"); /輸出他(她)的孩子的信息for(i=1;i<=NewNode->ChildNum;i+) printf("nt姓名:%s

38、性別:",NewNode->NextNodei->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");

39、 return; if(NewNode=NULL)/判斷它是不是根節點如果是的話就沒有父母兄弟信息 printf("nt是這個家譜圖里最年長的人",name); else if (NewNode->Kind='G'|NewNode->Kind='g') /判斷父親節點是父親還是母親 printf("nt母親 姓名:%s",NewNode->Name);/輸出他(她)的父母親的信息 printf("nt父親 姓名:%s",NewNode->NextNode0->Name);

40、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妻子 姓名:%s",Tree->NextNode0->

41、;Name); if (Tree->ChildNum>0) /判斷他(她)是否有孩子 printf("nt的孩子的信息如下:"); /輸出他(她)的孩子的信息 for(i=1;i<=Tree->ChildNum;i+) printf("nt姓名:%s 性別:",Tree->NextNodei->Name); if (Tree->NextNodei->Kind='G'|Tree->Kind='g') printf("女"); else printf(&

42、quot;男");printf("t是否健在(1-健在,0-去世):"); if(Tree->death=1) printf("1"); else if(Tree->death=0) printf("0"); else printf("nt%s至今還沒有孩子",name); else printf("nt%s至今還沒有配偶和孩子n",Tree->Name); TreeNode * SearchTree1(TreeNode *Tree,char birth,int le

43、ngth) 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;i<=Tree->ChildNum;i+) if (i=0) NewNode=SearchTree1(Tree->NextNodei,birth,0); else NewNode=SearchTree1(Tree->NextNodei,birt

44、h,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) printf("nnt*該家譜圖中沒有出生日期為%s這個人的信息請確認是否輸入錯誤*n",birth); return; printf("nnt您所要找的人

45、已經找到信息如下所示:"); 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) /修改某個人的信息

46、char name20; 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;

47、char name20; char birth20; char address150; char Parent220; TreeNode * NewNode; getchar(); while(1) system("cls"); printf("t"); printf("nnt -*-請選擇你的操作-*- "); printf("nt-*-*-*-A:修改個人的信息-*-*-*-*-*-*- "); printf("nt-*-*-*-B:修改父母的信息-*-*-*-*-*-*- "); prin

48、tf("nt-*-*-*-C:修改子女的信息-*-*-*-*-*-*- "); printf("nt-*-*-*-D:退出-*-*-*-*-*-*-*-*-*-nt"); c=getchar(); switch(c) case 'A': printf("nnt請輸入修改的姓名:如果不需要修改就輸入0然后按Enter鍵繼續nt"); scanf("%s",name); if(strcmp(name,"0")!=0) strcpy(Tree->Name,name); print

49、f("nnt是否要修改性別:如果需要就輸入'1'不需要修改就輸入'0'然后按Enter鍵繼續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鍵繼續nt"); scanf("%s",birth); if(strcmp(birth,"0")!=0) strcpy(Tree->birthday,birth); printf("nnt請輸入修改的家庭地址:如果不需要修改就輸入0然后按Enter鍵繼續nt"); scanf("%s",address1); if(strcmp(address1,"0")!=0) strcpy(Tree->address,address1); printf("nnt個人信息修改成功")

溫馨提示

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

評論

0/150

提交評論