家谱管理系统.docx
- 文档编号:4350284
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:28
- 大小:149.43KB
家谱管理系统.docx
《家谱管理系统.docx》由会员分享,可在线阅读,更多相关《家谱管理系统.docx(28页珍藏版)》请在冰豆网上搜索。
家谱管理系统
洛阳理工学院
课程设计报告
课程名称
数据结构课程设计
设计题目
家谱管理系统
专业
计算机科学与技术
班级
B_1_5_0_4_0_5
学号
B_1_5_0_8_0_8_2_2
姓名
宋士龙
完成日期2_0_1_6__年___1_2_月___3_0_日
课程设计任务书
设计题目:
家谱管理系统
设计内容与要求:
【问题描述】:
实现具有下列功能的家谱管理系统
1).输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:
姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它
信息、但不是必需的。
2).实现数据的存盘和读盘。
3).显示家谱。
4).按照出生日期查询成员名单。
5).按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
6).修改某成员信息。
【基本要求】:
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:
学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。
测试数据:
要求使用1、全部合法数据;2、局部非法数据。
进行程序测试,以保证程序的稳定。
测试数据及测试结果请在上交的资料中写明。
指导教师:
年月日
课程设计评语
成绩:
指导教师:
、算法思想
本程序是一个管理家谱的系统,通过这个系统可以对家族成员进行创建、显示、查找、修改、以及保存家谱和读取家谱功能。
该系统分为以下几个模块,分别是:
创建家谱,显示家谱、按姓名和生日查找家庭成员、修改家谱、存盘、读盘以及退出系统。
本程序用到的存储形式为多叉树,因为家谱中每个人既有父母又有孩子,而且孩子的个数并不确定,所以用多叉树来存储最为合适。
用多叉树来存储,就用用到多叉树的递归创建及递归遍历。
因为是多叉树,所以遍历时用广度优先搜索合适。
本函数最主要的思想就是递归调用,每个子函数中都会用到递归。
定义结构体时给定指针数组的最大容量,来规定家谱中最多可以存多少人。
定义一个家族树的指针变量用来当每个子函数的参数,从而将其返回到主函数中。
以下时算法思想流程图:
、模块划分
1.intmain():
主函数
2.voidCreatTree(TreeNode*Tree)创建家族树
3.voidOutPutAII(TreeNode*Tree):
显示家谱
4.voidMenue(TreeNode*Tree):
主菜单
5.voidSubMenue1(TreeNode*Tree)副菜单(修改选项菜单)
6.voidChange(TreeNode*Tree)修改家谱
7.TreeNode*SearchTree(TreeNode*Tree,charname[],intlength)按照姓名查找家谱成员
8.TreeNode*SearchTree1(TreeNode*Tree,charbirth[],intlength:
)按照生日查找家谱成员
9.voidOutPutMessage(TreeNode*Tree,charname[],intlength)输出按姓名查找到的家谱成员
10.voidOutPutMessage1(TreeNode*Tree,charbirth[],intlength):
输出按生日查找到的家谱成员
11.voidSaveFamily(TreeNode*root):
保存家谱
12.voidReadFamily(TreeNode**root):
读取家谱
三、数据结构
typedefstructTreeNode
{
intChildNum;//记录这个人拥有几个儿女
charName[20];//记录这个人的姓名
charbirthday[20];//生日
intmarriage;//婚否(1表示结婚,0表示没结婚)
intdeath;//生死(1表示活着,0表示过世)
charKind;〃标示节点的种类有女G男B
charaddress[100];〃住址
charlivemassage[50];〃死亡日期(如果其已经死亡)structTreeNode*NextNode[20];//记录这个人的儿女structTreeNode*Parent;//记录这个节点的父节点
}TreeNode,*tree;
四、测试
第一组数据为:
爷爷,奶奶,爸爸,妈妈,我,二叔,二婶,姐姐,三叔,三婶,弟弟一共三代11个人。
其中爷爷是根节点,奶奶为爷爷的配偶,同时也是爷爷的第一个后继节点。
爸爸,二叔,三叔为爷爷的子女。
爸爸的配偶是妈妈,爸爸的子女是我。
二叔的配偶是二婶,子女是姐姐。
三叔的的配偶是三婶,三叔的的子女是弟弟。
进入程序之后,首先进行创建家谱,然后进行存盘,之后进行修改和查询等步骤。
退出程序在进入程序时,进行读盘。
之后在进行其他操作,程序完成之后退出即可。
图1家族树
第一组数据测试截图为:
trtt―x**4ct寓**«*h*#ttsnt
姓容:
年普出圭H期:
1944.他.药家庭崔址t山东冑鹰沂市性剧:
B1I
妻子趣有;拥奶母香量在门傩左・卜击此hD
和彳讦立旳姓旨爸爸出生日駅1.9陌03一06遽庭性扯山东肖临折市性瑕晒女的娃客:
二H出生白期!
19?
O.Q8.0iS康庭住址:
Ll_耒省吐沂巾fi&JEM
B3牛于玄的逑备三权Lt±S®:
1977(T14\0思圧臣址:
山东石话沂育隹刖已英
-—*■**——・・♦——**«———■---*4■—•«*—■
妊名:
二就31±B^;]ST0.08.05氟眶佚fch山專首t®祈巾世刑:
E申
套子妊営:
二瞬在qw在.—去世)=L
竟1个手女的蛙各蛆粗由生Sfe:
lMl.ML14黑麗隹址土血条嘗薯诉市性]・c女
1**+事—■—SS*t————istt1———
旌名一姐粗岀iBfllilW1.02.14蠢庭生址t山未肯尙诉巾住狂:
Gt
車今逵雄配囲和子玄
图2显示家谱
■1C:
\Likteng-eke1—Q
**十*E■欢迎便用东廳营瑾蚕^C*T■**•<***
A&•、豪港它U建上忖
R怖呂乎孚屮
|?
岭朝去扛苹k
D:
擔堆名査找棠人匸魅汽昱-\r-s3.
F:
和
c:
^a
H-退吕豎'•煜?
底听蓦找巧人己雄找麹博.鼠(0下昕示
壮名一等孕岀生m羁一_创丄一旧一亠豪哇生址I山未肯I乱rrrtf性制卫臭岂■連在「■羞芒,)-壬世”1
谨蜀社Z:
三怛
H亲曲呂;三R
涓迫至令iEti青扌任w疔子
图3按照姓名查找家族成员
Ut乂Ulef丸>£iHlitl\dkti^plke£he%."E=口
*片*=口廿軌迎怯用!
t族管理系统十*中***=
B:
五出%t■应诒怙u匚:
筈出主刁些会技-枣人D:
« 卜人的信息 F: 存盘 tas H: ifitE^f£(T *****保存家涪***** AAX件容迪陳存(X豪(*E: D: \\«XU»I«Ltxt)ID: \\JIAFV.t>t新建丸件成功.文件世耳瓯怦为: ? : \JIAJV.tit 图4存盘 第二组数据为: 图4王家家族树 第二组数据测试截屏为: ■'CALter&\^drmn\pe-口fAkucJumgLEXL—□X —•«=**—-flJiiS恨的嫌ft…«**— ”__*#fl.: 修说牛人的佶息*■*--**** …紀*L希—B: 修段父彎的■荷胃一•金「打••*口命 ■■■拿—耳—C: 價i氐于女的fg息 stt~—*"^0: jfi岀*—*事-"新一p*—*— 图5修改家族成员的信息 ・'C: \Jtin'J.ie-s.^iDp, he--'C-.rjs "用一、忙汝=■: =£;七$」■■丐抵诈池和祀iV匕三芳三: 理卞冷王'」■■二 曼召薑幣改岂耳•上毕筆逶丸糊.2: 匸詩芝密氏讥議汎P燃弓崔比“于貢遵束0 荷荷人修改的出生日糊;帕果不需要核改就输人中‘幣石桂Enttr这进決0 淸达人悸戏为疣庭地址: ;0卑乂需呈底戌戏输人-0-然台養E「-t£r健进塗 ■-L信息修改成功 谊按Ent刊-站年蒔於作1 图6修改某个人的具体信息 ■1C;'Ll^^'^diTwADe^tlop.<.f 柑*・*"*飞门悭用療族管邂帝^***-**-**' 任听要找的人己軽找捌悟总5P下听示: 柱合: 王4■二岀主白皑2O0S家咗住址: 缶匡性钊B境 ■mr・|||^M■ 锻政拥音笙 图7按照生日查找某人 L.」i11'1-j-l! t-in1: u■: c.-r- a? fii瓦港盲目逢亶nr t祜卅峑牛落滑伍帛 c芒V三三卑耳述早\ 加據硅茗占找其人 E條就笑牛人的■息 F: 存我 G.isS U咆出整不程字 读翳家请H4»441 »Ajt仲宕聂算踣栏*口便賦中flfflur晉. 亢杵宅艮耳珞律〈*E;m^xaii^1<.txt),E? ''-JIA.txt 图8读盘 五、源程序 #include #include #inelude #ifdefWIN32 #defineCLEARsystem("cls") #defineTipForSaveFilePositionprintf("\t\t输入文件名及保存位置(eg: D: \W\example.txt): ") #defineTipForReadFilePositionprintf("\t\t文件名及其路径(eg: D: \W\example.txt): ") #else #defineCLEARsystem("clear") #defineTipForSaveFilePositionprintf("\t\t输入文件名及保存位置(eg: /home/xiong/example.txt): ") #defineTipForReadFilePositionprintf("\t\t文件名及其路径(eg: /home/xiong/example.txt): ") #endif #definemaxFileNameLen50//保存的文件名的最大长度 intFLAG=0; inta=1; typedefstructTreeNode { intChildNum;//记录这个人拥有几个儿女 charName[20];〃记录这个人的姓名 charbirthday[20];〃生日 intmarriage;//婚否(1表示结婚,0表示没结婚) intdeath;//生死(1表示活着,0表示过世) charKind;〃标示节点的种类有女G男B charaddress[100];〃住址 charlivemassage[50];〃死亡日期(如果其已经死亡)structTreeNode*NextNode[20];//记录这个人的儿女 structTreeNode*Parent;//记录这个节点的父节点 }TreeNode,*tree; voidCreatTree(TreeNode*Tree); voidOutPutAll(TreeNode*Tree); voidMenue(TreeNode*Tree); voidSubMenue1(TreeNode*Tree); voidSubMenue2(TreeNode*Tree); voidChange(TreeNode*Tree); voidAddNew(TreeNode*Tree); TreeNode*SearchTree(TreeNode*Tree,charname[],intlength);TreeNode*SearchTree1(TreeNode*Tree,charbirth[],intlength);voidOutPutMessage(TreeNode*Tree,charname[],intlength);voidOutPutMessage1(TreeNode*Tree,charbirth[],intlength);voidSaveFamily(TreeNode*root); voidReadFamily(TreeNode**root); intmain()//主函数 { TreeNode*Tree;//TreeNode**Tree1;//Tree1=&(*Tree); Tree=(TreeNode*)malloc(sizeof(TreeNode)); Tree->Parent=NULL;strcpy(Tree->Name,"0"); Menue(Tree); return0; } voidMenue(TreeNode*Tree)//输出主菜单 { /*TreeNode**Tree1; Tree1=&Tree;*/ charc; charname[20]; charbirth[20]; while (1) { system("cls"); 欢迎使用家族管理系统**********\n\n");A: 输入家谱信息建立树"); printf("\t"); printf("\n\n\t\t********** printf("\n\t\t printf("\n\t\t B: 输出整个家谱信息 "); printf("\n\t\t C: 按出生日期查找某人 "); printf("\n\t\t D: 按姓名查找某人 "); printf("\n\t\t E: 修改某个人的信息 "); printf("\n\t\t F: 存盘”); printf("\n\t\t G: 读盘"); printf("\n\t\tc=getchar();switch(c) { case'A': H: 退出整个程序 \n\t") TreeNode*NewNode; NewNode=(TreeNode*)malloc(sizeof(TreeNode));printf("\n\t请输入姓名: "); scanf("%s",Tree->Name); printf("\n\t请输入性别女G男B: "); getchar();scanf("%c",&(Tree->Kind));Tree->Parent=NewNode;Tree->Parent=NULL;//CreatTree(Tree);// printf("\n\t家谱图已经建立成功\n\n"); printf("\n\n\t请按Enter键继续操作"); getchar(); break; case'B': if(strcmp(Tree->Name,"0")==0){ printf("\n\t家谱图的多叉树尚未建立请先建立树\n");getchar(); break; } printf("\n\n\t整个家谱的主要信息如下: ");OutPutAll(Tree); getchar(); break; case'C': if(strcmp(Tree->birthday,"0")==0) { printf("\n\t家谱图的多叉树尚未建立请先建立树\n");getchar(); break; } printf("\n\t请输入你要查找的出生日期: "); scanf("%s",birth); OutPutMessage1(SearchTree1(Tree,birth,20),birth,20);printf("\n\n\t**********\n\t"); getchar(); break; case'D': if(strcmp(Tree->Name,"0")==0) { printf("\n\t家谱图的多叉树尚未建立请先建立树\n");getchar(); break; } printf("\n\t请输入你要查找的人的姓名: \n\t");scanf("%s",name); OutPutMessage(SearchTree(Tree,name,20),name,20);printf("\n\n\t**********\n\t"); getchar(); break; case'E': if(strcmp(Tree->Name,"0")==0) { printf("\n\t家谱图的多叉树尚未建立请先建立树\n");getchar(); break; } Change(Tree); getchar(); break; case'F': if(strcmp(Tree->Name,"0")==0) { printf("\n\t家谱图的多叉树尚未建立请先建立树\n");getchar(); break; } SaveFamily(Tree); getchar(); break; case'G': /*if(strcmp(Tree->Name,"0")==0) { printf("\n\t家谱图的多叉树尚未建立请先建立树\n");getchar(); break; }*/ ReadFamily(&Tree);getchar(); break; case'H': printf("\n\n\t 本次服务到此结束-- " printf("\n\t 欢迎下次使用 "); printf("\n\t 谢谢 \n\n"); break; case'\n': break; default: printf("\n\n\t ---对不起! 你的选择不在服务范围之内 " printf("\n\t ---请您再次选择所需的服务项! "); printf("\n\t getchar(); break; 谢谢\n\t"); } if(c=='H'||c=='f')break; getchar(); } } voidCreatTree(TreeNode*Node)//创建树 { inti; TreeNode*NewNode; NewNode=(TreeNode*)malloc(sizeof(TreeNode)); Node->NextNode[0]=NewNode; Node->NextNode[0]=NULL;printf("\n\t请输入出生日期: "); scanf("%s",Node->birthday); printf("\n\t请输入家庭住址: ");getchar();scanf("%s",Node->address); printf("\n\t请输入是否建在(1-是或0-否): ");scanf("%d",&(Node->death)); if(Node->death==0) { printf("\n\t请输入去世日期: ");scanf("%s",Node->livemassage); } elseif(Node->death=='1')printf("\n\t仍然建在"); printf("\n\t请输入%s的配偶的姓名(输入0代表没结婚): ",Node->Name);scanf("%s",NewNode->Name);if(strcmp(NewNode->Name,"0")! =0){printf("\t请输入配偶的出生日期: ");scanf("%s",NewNode->birthday);printf("\n\t请输入家庭住址: ");getchar();scanf("%s",NewNode->address); printf("\n\t请输入是否建在(1-是或0-否): ");scanf("%d",&(NewNode->death));if(NewNode->death==0) {printf("\n\t请输入去世日期: ");scanf("%s",NewNode->livemassage); } elseif(NewNode->death=='1')printf("\n\t仍然建在");}printf("\n\t请输入%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'; NewNode->ChildNum=0; NewNode->NextNode[0]=NULL; Node->NextNode[0]=NewNode; Node->NextNode[0]->Parent=Node;//孩子的父母for(i=1;i<=Node->ChildNum;i++) { NewNode=(TreeNode*)malloc(sizeof(TreeNode));a++;printf("\n\t请输入%s的第%d子女的名字: ",Node->Name,i);scanf("%s",NewNode->Name); printf("\n\t请输入%s的第%d子女的性别女G男B: ",Node->Name,i);getchar(); scanf("%c",&NewNode->Kind);NewNode->ChildNum=-1;NewNode->Parent=Node;Node->NextNode[i]=NewNode; CreatTree(Node->NextNode[i]);//从子女的数目开始 } } voidOutPutAll(TreeNode*Tree) { inti,flag=0; printf("\n\t---****---***---***---***---***---***---***---***---***---"); printf("\n\t姓名: %s出生日期: %s家庭住址: %s性别: %c",Tree->Name,Tree->birthday,Tree->
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 家谱 管理 系统