数据结构课程设计之简易家谱 报告

合集下载

家谱管理系统设计与实现

家谱管理系统设计与实现

课程设计报告课程名称《数据结构》课题名称排序综合专业班级学号姓名联系方式指导教师20 11 年 12 月 21 日目录1. 问题陈述 (3)2.设计方法阐述 (3)2.1总体规划 (3)2.2功能构想 (4)2.2.1增加成员 (4)2.2.2修改成员资料 (5)2.2.3删除成员 (6)2.2.4打开家谱 (7)2.2.5新建家谱 (8)2.2.6保存家谱 (10)2.2.7查看某代信息 (11)2.2.8按姓名查找 (12)2.2.9按生日查找 (12)2.2.10查看成员关系 (13)2.2.11按出生日期排序 (14)2.3板块整合 (15)2.4调试分析 (19)3.总结 (19)4. 测试结果 (20)1.问题陈述家谱用于记录某家族历代家族成员的情况与关系。

现编制一个家谱资料管理软件,实现对一个家族所有的资料进行收集整理。

支持对家谱的存储、更新、查询、统计等操作。

并用计算机永久储存家族数据,方便随时调用。

2.设计方法阐述2.1总体规划在动手编制程序之前,先要做好程序的规划,包括程序储存数据所用的结构,数据类型等等,只有确定了数据类型和数据结构,才能在此基础上进行各种算法的设计和程序的编写。

首先是考虑数据类型。

在家谱中,家族成员是最基本的组成部分,对于家族管理中,已经不能再进行细分了,所以选定家族成员作为数据的基本类型,并在程序中定义COperationFamilytree 类。

其中COperationFamilytree 类的各种属性可以根据需要进行添加或删除,从日常生活应用的角度出发,制定了COperationFamilytree 类中包含了一下属性:char name[MAX_CHARNUM]; //姓名Date birthday; //出生日期In tsex; //性别char addr[MAX_CHARNUM]; //基本资料int live; //健在否Date deathday; //死亡日期int ChildNums(Person pNode) ; //返回pNode孩子数intInSiblingPos(Person pNode); //返回pNode在其兄弟中的排行为方便计算机进行比较,在familytree类的某些属性中用数字代替了某些不会改变的字符串,譬如性别(1代表男,0代表女)、判断是否健在(1为是,0为否)。

数据结构课程设计之简易家谱 报告

数据结构课程设计之简易家谱 报告

编号:学号:201140410119课程设计教学院计算机学院课程名称数据结构课程设计题目简易家谱系统专业计算机科学与技术班级(1)班姓名陈建辉同组人员周海涛,石义沣,明廷柱指导教师程细才2013 年 1 月8 日目录一概述 (2)1.课程设计的目的 (2)2.课程设计的要求 (2)二总体方案设计 (3)1.简单家谱系统整体设计思路 (3)2.简单家谱系统的主要特点及功能 (5)三详细设计 (7)1. 查询全部的家谱成员信息 (7)2.确定指定成员在家族中的辈份 (7)3.在家谱中添加新成员,并追加到文件中 (9)四程序的调试与运行结果说明 (12)1.实验结果截图: (12)2.调试时遇到的问题 (12)五课程设计总结 (13)附录一:程序源代码 (16)附录二:参考文献 (25)一概述1.课程设计的目的1.理解和掌握该课程中的有关基本概念,程序设计思想和方法。

2.培养综合运用所学知识独立完成课题的能力。

3.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。

4.掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。

2.课程设计的要求设计要求:输入家族成员情况,建立树结构,统计家族成员人数,能查询家族成员辈份情况。

系统功能:1. 输入、修改与删除家谱信息功能2. 查询功能:1)某家谱成员的所有子孙的集合2)某家谱成员的所有祖先的集合3)某家谱成员的所有同辈成员的集合4)求某家谱成员的所有上一辈成员的集合5)给出两个家谱成员,确定他们的关系二总体方案设计1.简单家谱系统整体设计思路此次课程设计的整体思路是采用遍历算法,整个树的定义使用两个结构体来表示,一个结构体专门用于存放每一个节点的信息,另一个节点中定义了三个指针域,分别为父指针域(兄长指针域),兄弟指针域,子指针域,整个树的输入采用文件导入的方式,首先将文件导入到树中,文件包含每一个家族成员的信息,以及一个标志位flag,标志位的值为0,1,2,0表示此节点没有兄弟节点,1表示此节点至少有一个子节点,2表示此节点至少有一个兄弟节点,使用的算法是先定义一个链式队列,将文件中第一个节点的内容读取放入开辟的树的节点的空间里,然后将树节点放入队列中,此时队列不为空,以队列不为空为判断条件,进行while循环,判断flag的值,循环体中再进行文件读取,循环中进行判断,若flag为0,则继续判断队列是否为空,为空就结束循环,若不为空,则继续出队列,取标志位进行判断,若标志位为1,则生成新节点,用刚刚出列的节点的子指针域进行指向新节点,新节点的父指针域指向出列的节点,剩余的域为空,然后将新生成的节点插入到队列中,若flag为1,则进行兄弟节点的插入,继续循环,若flag不为0,则在进行判断,若为2,则继续进行兄弟节点的插入,以此类推,根据文件的读取,将树生成,本程序中所有的算法都基于以上所介绍的算法。

数据结构家谱课程设计报告

数据结构家谱课程设计报告

家谱(3-1)本程序共实现了6 个功能分别为:1. 读出家谱并显示2. 确定指定成员在家族中的辈份3. 输出指定辈的所有成员4. 在家谱中添加新成员,并追加到文件中5. 输出指定家庭的所有成员6. 退出本系统1. 读出家谱并显示存储结构用栈,按照先显示双亲,然后显示其所有孩子的顺序显示所有的家庭成员。

2. 确定指定成员在家族中的辈份用求成员所在的二叉树中的层数(按层遍历二叉树)来确定,这里采用的是递归算法3. 输出指定辈的所有成员此处定义了一个新的结构体类型(增加存储节点所在的层数),定义如下:struct{ BTNode *q;int loc; //存结点所在的层数}qu[10];并用一个队列来比较显示同辈份的所有成员。

4. 在家谱中添加新成员,并追加到文件中首先,输入一个新成员的名字;然后,输入其双亲;之后,再添加到整个存储二叉链表中。

然后,再将新的存储结构写回到文件中。

二叉链表的结点类型为:typedef struct node{ElemType data[10]; struct node *child; struct node *brother;}BTNode;//存放成员的名字 //其孩子指针 //其兄弟指针5. 输出指定家庭的所有成员首先,设一个栈,并设一个标记位,先置 1; 然后,找到输入的要待显示的成员,将标记位置0;再次,显示其孩子和兄弟,挨次下去直到显示完其所有的亲戚。

6. 退出本系统通过一个输入字符 q 来控制,每完成一个功能,系统提示是否要继续操作:当 q 为“Y ”或者“y ”时,显示菜单,程序继续执行;当 q 为其他字符时,程序执行结束,退出本系统。

通过一个 do-while 语句来控制各个模块的选择和实现。

void display(BTNode *b) {BTNode *q[10]; //定义一个栈 int front,rear; int k;BTNode *p; p=b;k=0;front=-1;rear=0;q[rear]=p; //头结点先入栈 while(front<rear) { front++; p=q[front];printf("%s",p->data ); //头结点出栈,并显示 printf("("); disbr(p->child); printf(")\n");if(p->child!=NULL) //显示其孩子 {rear++;q[rear]=p->child; }if(p->brother!=NULL) //显示其兄弟 {rear++;q[rear]=p->brother; } }}int generation(BTNode *b,int h,ElemType x[]) //用递归的思想{ int i;if(b==NULL)return(0);i=strcmp(b->data,x);if(i==0)//比较是否相等return(h);int L=generation(b->child,h+1,x);if(L==0)L=generation(b->brother,h,x);return(L);}void layer(BTNode *t,int m){ struct //定义一个新的结点类型,在孩子兄弟存储结构的基础上添加一个数据域存其所在层数{BTNode *q;int loc;}qu[10];int front,rear;BTNode *p;p=t;k=0;front=-1;rear=0;qu[rear].q=p;qu[rear].loc=1;if( qu[rear].loc==m) printf("%c",p->data); while(front<rear){ front++;p=qu[front].q;if(p->child!=NULL)//找到m辈的即输出//通过站查找所有m辈的结点并输出{rear++;qu[rear].q=p->child;qu[rear].loc=qu[front].loc+1;if(m== qu[rear].loc)printf("%s ",p->child->data);}if(p->brother!=NULL){rear++;qu[rear].q=p->brother;qu[rear].loc=qu[front].loc;if( qu[rear].loc==m)printf("%s ",p->brother->data);}}}void add(BTNode *&b,ElemType y[],ElemType x[]) {char filename[20]=" ";FILE *fp;BTNode *p,*q;int i;p=FindNode(b,y);q=(BTNode *)malloc(sizeof(BTNode));for(i=0;x[i]!='\0';i++)q->data[i]=x[i];q->data[i]='\0';q->child=q->brother=NULL;if(p->child ==NULL)p->child=q;else{ p=p->child;while(p->brother!=NULL)p=p->brother ;p->brother=q;}display(b);printf("向文件中读入新家谱\n");printf("\n input a filename:");scanf("%s",&filename);if((fp=fopen(filename,"w"))==NULL){puts("\n can't open the file.");exit(0);} elseDispBTNode(b,fp);fclose (fp);}void DispBTNode(BTNode *b,FILE *fp){char a[10];if(b!=NULL){while(b->data[i]!='\0'){a[i]=b->data[i];i++;}a[i]='\0';fputs(a,fp); //写入文件if(b->child!=NULL || b->brother!=NULL){fputs(s,fp);DispBTNode(b->child,fp); //递归写入其孩子if (b->brother!=NULL){fputs(p,fp);DispBTNode(b->brother,fp);}//递归写入其兄弟fputs(t,fp);}}}void dispfamily(BTNode *b,ElemType x[]) { BTNode *p;BTNode *q[MaxSize];int top=-1,tap=1;if(b!=NULL){top++;q[top]=b;while(top>-1){p=q[top];top-- ;if(strcmp(p->data,x)==0){top=-1;//查找这人}if(p->child!=NULL){top++;q[top]=p->child;if(tap==0){display(p->child); //显示其孩子return ;}}if(p->brother!=NULL){top++;q[top]=p->brother;if(tap==0){display(p->brother); //显示其兄弟return ;}}}}}此处通过一个输入字符q 来控制,当q 为“Y”或者“y”时,显示菜单,程序继续执行,当q 为其他字符时,程序执行结束,退出本系统。

数据结构课程设计论文及代码—家谱系统的设计与实现

数据结构课程设计论文及代码—家谱系统的设计与实现

项目名称:家谱系统的设计与实现学生姓名:学号:班级:指导教师:2011年12月23日目录1系统需求分析 (1)1.1问题分析 (1)1.2任务意义 (1)2 设数据结构设计及用法说明 (2)3 详细设计和编码 (3)3.1初始化 (3)3.2功能选择 (4)3.3信息输入 (7)3.4信息输出 (7)3.5信息存盘 (8)3.6信息清盘 (9)3.7信息查询 (10)4 实验结果 (13)4.1菜单函数功能测试 (13)4.2输入功能函数测试 (13)4.3输出功能函数测试 (13)4.4清盘功能函数测试 (13)4.5存盘功能函数测试 (14)4.6查询功能函数测试 (15)致谢 (17)参考文献 (18)附录:源代码 (19)武汉长江工商学院-1系统需求分析1.1 问题分析从课程设计的题目要求可以知道,我需要设计一个对数据输入,输出,储存,查找的多功能软件,我选择用二叉树来保存家族的基本信息,包括姓名及它们的关系,但是由于家族信息很巨大而且关系很复杂所以采用二叉树来储存它们的信息及输出它们的关系。

并且具有保存文件的功能,以便下次直接使用先前存入的信息。

1.2 任务意义家谱的功能是查询家族每个人的信息,并且输出它们的信息,还要具有查询输出功能。

这样复习了一下查询。

插入。

删除函数的应用。

并复习了上学期c语言的文件储存及调用功能,子函数和递归调用功能,熟练运用这些函数。

2系统数据结构设计及用法说明采用文件保存信息,并且从文件中输出原先保存的信息,用结构体fnode来储存家族的信息,采用递归的方法从fam中创建一个空二叉树,然后初始化二叉树。

采用InputFam函数添加信息,OutputFam函数输出信息,DelAll函数删除家族的全部记录,SaveFile函数保存添加的信息,FindNode函数查找节点。

图2 数据存储结构图相应的存储结构代码为:typedef struct fnode{char father[NAMEWIDTH];char wife[NAMEWIDTH];char son[NAMEWIDTH];char brother[NAMEWIDTH];}FamType;typedef struct tnode{char name[NAMEWIDTH];struct tnode *lchild,*rchild;}BTree;3 详细设计和编码3.1初始化图3-1为初始化函数的流程图,主要是对二叉树中数据域置空,对二叉树中的数据进行初始化。

家谱管理系统设计报告

家谱管理系统设计报告

目录第一章绪论............................................... 错误!未定义书签。

第二章需求分析........................................... 错误!未定义书签。

题目..................................................... 错误!未定义书签。

设计任务................................................. 错误!未定义书签。

数据测试................................................. 错误!未定义书签。

第三章概要设计........................................... 错误!未定义书签。

设计思想............................................. 错误!未定义书签。

实现方法............................................. 错误!未定义书签。

第四章详细设计........................................... 错误!未定义书签。

功能构想................................................. 错误!未定义书签。

界面设计................................................. 错误!未定义书签。

增加成员................................................. 错误!未定义书签。

添加子女............................................ 错误!未定义书签。

添加配偶............................................ 错误!未定义书签。

数据结构_家谱管理系统

数据结构_家谱管理系统

数据结构_家谱管理系统【数据结构_家谱管理系统】一、引言家谱是记录家族成员关系的重要文献,传统的家谱管理方式已经无法满足现代社会的需求。

为了更好地管理家族信息,提高家族成员之间的联系和交流,我们设计并开发了一款家谱管理系统。

本文将详细介绍该系统的设计和实现。

二、系统概述家谱管理系统是一个基于数据结构的软件应用,旨在帮助用户管理家族成员的信息,包括姓名、性别、出生日期、配偶、子女等。

系统提供了多种功能,包括添加、删除、修改、查询、统计等操作,方便用户对家谱信息进行维护和管理。

三、系统设计1. 数据结构选择在家谱管理系统中,我们选择了树这种数据结构来表示家族关系。

每个节点代表一个家庭成员,节点之间通过指针连接,形成家族的层级结构。

2. 数据模型设计家族成员的信息可以通过一个结构体来表示,包括姓名、性别、出生日期等字段。

每个节点除了包含成员信息外,还包含指向配偶的指针和指向子女的指针。

3. 系统功能设计家谱管理系统提供了以下功能:(1) 添加成员:用户可以输入成员信息,系统根据用户输入创建一个新的节点,并将其插入到适当的位置。

(2) 删除成员:用户可以指定要删除的成员,系统会删除该成员及其所有子孙节点。

(3) 修改成员信息:用户可以选择要修改的成员,然后输入新的信息进行更新。

(4) 查询成员信息:用户可以通过姓名、出生日期等条件查询成员信息。

(5) 统计家族人数:系统可以统计家族的总人数、男性人数、女性人数等信息。

四、系统实现1. 数据结构实现我们使用C语言来实现家谱管理系统。

通过定义一个节点结构体,使用指针来连接各个节点,实现家族关系的表示和管理。

2. 功能实现(1) 添加成员:根据用户输入的信息,创建一个新节点,并将其插入到适当的位置。

插入操作需要遍历树来找到合适的位置。

(2) 删除成员:根据用户指定的成员,删除该节点及其所有子孙节点。

删除操作需要递归地遍历树。

(3) 修改成员信息:根据用户选择的成员,更新其信息。

数据结构课程设计模版—家谱

数据结构课程设计模版—家谱

课程设计名称:数据结构系:学生姓名:班级:学号:成绩:指导教师:开课时间:学年学期一.设计题目家谱的设计与实现(树,查找)二.主要内容家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、删除等功能。

可。

基本功能如下:(1)家谱祖先数据的录入(树的根结点)。

(2)家庭成员的添加:即添加某一人的儿女,儿女的数目由控制台端给出,然后输入相应的儿女姓名(此处儿女的姓名不能重名)。

(3)家庭成员的修改:可以修改某一成员的姓名。

(4)家庭成员的查询:查询某一成员在家族中的辈分(第几代),并能查询此成员的所有子女及这一辈的所有成员。

(5)家庭成员的删除:删除此成员时,若其有后代,将删除其所有后代成员。

三.课题设计的基本思想,原理和算法描述(包括课题所用数据结构,界面设计、输入/输出设计,功能模块设计,符号说明等)基本思想:四、运行示例及结果分析(截图分析)主函数CreatTree(t)创建树的根结点AddTreeNode(t)添加成员结change(t)修改信息Search(t)结点的查找Deleate(t)删除结点DisplayJP(t)显示家谱exit(0)退出确定上一代,再添加子女Display(q)此人信息Dis_Generation(t,q)此人辈分Dis_Children(q)此人子女Dis_Brother(t,q,Generation(t,q))同辈分成员五、调试和运行程序过程中产生的问题及采取的措施六、总结和展望(400字以上)七、参考资料(格式为:[序号]作者.书名.出版社,出版年份如:[1] 李建学等著.数据结构课程设计案例精编.清华大学出版社,2007[2] 唐宁九等主编.数据结构与算法(C++版)实验和课程设计教程. 清华大学出版社,2008)。

家谱管理实验报告

家谱管理实验报告

Project 3 家谱管理一、题目用树型结构实现家族成员信息管理,(如建立、删除、查询、统计、打印等)二、数据结构与算法1.定义树结点node {string name;node *left;node *right;string sex;//male or femaleint num;//结点编号node() {name = "";left = right = NULL;num = 0;sex = "male";}};2.定义class tree{};实现不同对树的操作其中,以static int count记录节点总数;以static int height记录树高度;以node* root作为头指针;以node* arr[maxnode]将每个节点的指针记录在数组里。

3.对于该树的操作:a. 创建树:首先此project中树由男性为根结点。

男性的左孩子是其兄弟,右孩子是其第一任妻子,第一任妻子的右孩子是其第二任妻子,每个妻子的左孩子是其与这位妻子的孩子。

如此递归生成家谱。

输入时,用0表示左孩子,1表示右孩子,以1010等的字符串输入结点位置来创造结点。

创建后用函数cheak来检验创造的树是否正确,具体来说就是避免创建树时出现有结点没有父结点的情况。

b.删除结点:以结点的name成员搜索结点,删除结点及其子树。

c.查询结点:以结点的name成员搜索结点,打印该结点的父母兄弟、妻子、男孩。

d.统计函数:统计家谱总数。

本project中通过#define定义打印屏幕宽度screen_width为96,最多结点maxnode为32,因此树高度不超过5层,总数count不超过32. (linux下测试,终端宽度可以任意,windows下的话只能是80)e.打印:采用广度优先搜索遍历来打印树。

三、测试数据、结果及分析1.界面(注:单词“member”拼写错误已在代码中改正)2.初始化家族成员(注:初始化人数须大于1.)3.功能菜单(基于2中初始化的成员):(1)输出整棵树中的成员其中未存储成员的树的节点用“no”来表示。

家谱系统实验报告(3篇)

家谱系统实验报告(3篇)

第1篇一、实验背景家谱系统作为一种重要的文化遗产,承载着家族的历史与文化。

随着信息化时代的到来,传统的家谱记录方式已无法满足现代社会的需求。

因此,设计一款家谱系统,以数字化、网络化、智能化为特点,对于传承家族文化、加强家族联系具有重要意义。

二、实验目的1. 熟悉家谱系统设计与开发的基本流程。

2. 掌握家谱系统的功能模块设计方法。

3. 提高编程能力,掌握相关技术。

4. 分析家谱系统的应用价值,为家族文化传承提供技术支持。

三、实验内容1. 家谱系统需求分析家谱系统主要包括以下功能模块:(1)基本信息管理:包括家族成员的基本信息、婚姻状况、子女信息等。

(2)家谱树展示:以树状图形式展示家族成员之间的关系。

(3)查询功能:根据姓名、出生年月、地区等条件查询家族成员。

(4)编辑功能:对家族成员信息进行添加、修改、删除等操作。

(5)统计分析:对家族成员进行年龄、性别、婚姻状况等统计分析。

2. 家谱系统功能模块设计(1)基本信息管理模块设计一个用户界面,包括输入框、下拉菜单、按钮等元素。

用户可以在此界面输入家族成员信息,包括姓名、性别、出生年月、婚姻状况、子女信息等。

(2)家谱树展示模块采用树状图展示家族成员之间的关系。

树状图采用递归方式生成,每个节点代表一个家族成员,节点之间通过线条表示关系。

(3)查询功能模块设计一个查询界面,用户可以输入查询条件,系统根据条件在数据库中检索家族成员信息,并将结果展示在列表中。

(4)编辑功能模块在基本信息管理模块的基础上,增加修改、删除等操作。

用户可以选择要编辑的家族成员,对信息进行修改或删除。

(5)统计分析模块设计一个统计分析界面,展示家族成员的年龄、性别、婚姻状况等统计数据。

用户可以选择统计范围和统计指标,系统根据条件进行统计并展示结果。

3. 家谱系统实现采用Java语言和MySQL数据库实现家谱系统。

主要技术包括:(1)Java编程语言:用于实现家谱系统的各个功能模块。

家谱运算数据结构课程设计

家谱运算数据结构课程设计

家谱运算数据结构课程设计本篇文章将介绍家谱运算数据结构课程设计的相关内容。

家谱运算数据结构是一种非常有用的数据结构,它可以用来表示家族关系,并且可以进行各种基于家族关系的操作。

首先,我们需要了解家谱运算数据结构的基本概念和定义。

家谱是一个家族的树形关系。

在这个家族中,每个人都有一个父亲和一个母亲,这些人构成了家谱的节点。

因此,我们可以将家谱看做是一个树形结构,其中每个节点表示一个家族成员。

此外,我们还需要定义一些家族成员之间的关系,比如父亲和儿子、兄弟等等。

在家谱运算数据结构中,我们需要实现一些基本的操作,比如查找某个家族成员、添加新的家族成员、删除家族成员以及查询某个家族成员的亲戚关系等等。

这些基本操作可以通过使用家谱运算数据结构中的不同算法来实现。

在实现家谱运算数据结构的过程中,我们需要使用一些核心的数据结构和算法,比如树、二叉树、图、深度优先搜索、广度优先搜索等等。

这些核心数据结构和算法都是需要深入理解和掌握的。

在完成课程设计时,我们可以选择使用不同的编程语言和工具来实现家谱运算数据结构,比如C++、Java、Python等等。

此外,我们还可以使用一些数据可视化工具来展示家谱结构,使其更加直观和易懂。

最后,我们需要深刻认识到家谱运算数据结构的实际应用价值。

家谱运算数据结构不仅可以用于记录家族关系,还可以应用于许多其他领域,比如社交网络、信息检索、知识图谱等等。

因此,深入理解和掌握家谱运算数据结构对我们今后的学术和职业发展都具有非常重要的意义。

数据库家谱课程设计报告

数据库家谱课程设计报告

课程设计(论文)任务书软件学院学院软件+会计专业2012—班一、课程设计(论文)题目二、课程设计(论文)工作自2013 年 12 月 30 日起至 2014 年 1 月 5 日止三、课程设计(论文) 地点: 创新大楼软件实训中心机房四、课程设计(论文)内容要求:1.本课程设计的目的⑴训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题;⑵初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;⑶提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学生的理论知识,提升编程水平。

2.课程设计的任务及要求1)基本要求:⑴要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编写上机程序和上机调试等若干步骤完成题目,最终写出完整的报告;⑵在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率;⑶程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;⑷每位同学需提交可独立运行的程序和规范的课程设计报告。

2)课程设计论文编写要求⑴理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订;⑵课程设计报告(论文)包括中文目录、设计任务、需求分析、概要设计、详细设计、编码实现、调试分析、课设总结、谢辞、参考文献、附录等;⑶设计部分应包含系统功能模块图,调试分析应包括运行截图等。

3)课程设计评分标准:⑴学习态度:10分;⑵系统设计:20分;⑶编程调试:20分;⑷回答问题:20分;⑸论文撰写:30分。

4)参考文献:⑴严蔚敏,吴伟民. 数据结构(C语言版)[M]. 清华大学出版社. 2010.3⑵严蔚敏,吴伟民. 数据结构题集(C语言版)[M]. 清华大学出版社. 1999.2⑶何钦铭,冯燕等. 数据结构课程设计[M]. 浙江大学出版社. 2007.85)课程设计进度安排⑴准备阶段(4学时):选择设计题目、了解设计目的要求、查阅相关资料;⑵程序模块设计分析阶段(4学时):程序概要设计、详细设计;⑶代码编写调试阶段(8学时):程序模块代码编写、调试、测试;⑷撰写论文阶段(4学时):总结课程设计任务和设计内容,撰写课程设计论文。

数据结构家谱实验报告

数据结构家谱实验报告

数据结构家谱实验报告
以下是一个数据结构家谱实验报告的模板,可以根据实际情况进行修改和完善:
数据结构家谱实验报告
一、实验目的
本次实验的目的是设计并实现一个家谱数据结构,以展示家族成员之间的关系。

二、实验内容
1. 设计家谱的数据结构,包括节点和边的表示。

2. 实现家谱的基本操作,如添加、删除、查找节点。

3. 按家族关系遍历家谱。

4. 测试所实现的家谱数据结构。

三、实验结果
1. 成功设计了家谱的数据结构,使用邻接表表示节点和边的关系。

2. 实现了家谱的基本操作,可以添加、删除和查找节点。

3. 能够按照家族关系遍历家谱,展示家族成员之间的关系。

4. 通过编写测试用例,验证了所实现的家谱数据结构的正确性。

四、实验总结
通过本次实验,我对数据结构的应用有了更深入的理解。

在设计和实现家谱数据结构的过程中,我运用了邻接表这一数据结构来表示节点和边的关系,并且实现了家谱的基本操作。

通过按家族关系遍历家谱,我成功展示了家族成员之间的关系。

本次实验提高了我的编程能力和问题解决能力。

数据结构课程设计报告

数据结构课程设计报告

武汉工商学院课程设计报告课程名称:数据结构课程设计设计题目:家谱信息管理系统专业:计算机科学与技术班级:17计科本2班姓名:郑权学号:17403048 指导老师:朱涵完成时间:2018/10/1课程设计任务书课程名称:数据结构课程设计设计题目:家谱信息管理系统专业:计算机科学与技术班级:17计科本2班课程设计成绩评价表指导教师:年月日目录1.引言 (1)2.系统需求分析 (1)2.1 程序的功能 (1)2.2 系统界面 (1)2.3 数据初始化 (1)2.4 系统的功能模块图 (3)3. 数据结构设计及用法说明 (4)3.1分析系统设计数据结构 (4)3.2设计数据的存储方式 (4)4. 详细设计与代码描述 (5)4.1功能模块说明和算法实现 (5)1程序主入口初始运行 (5)2程序主界面主菜单 (5)(3)等待用户输入界面功能选择及执行 (6)4.2功能执行算法实现 (6)(1)树的添加 (7)(2)树的层次遍历 (9)5.系统运行及测试 (11)5.1 初始录入数据 (11)5.2 运行及截图 (11)1添加成员运行及截图 (11)2查找某人的所有孩子运行及截图 (12)(3)查找某人的双亲运行及截图 (13)(4)查找某人的所有祖先运行及截图 (13)(5)查找某人的所有兄弟运行及截图 (14)6.体会与总结 (15)6.1系统的优点 (15)6.2系统的缺点 (15)参考文献 (16)附录(源程序清单) (17)1抽象出类 (17)1.1 Person类 (17)1.2 Object类 (19)2 链表的实现 (20)3 有关树的算法的封装类 (26)4 界面类 (29)4.1 界面类头文件用来定义方法 (29)4.2 界面类实现文件 (30)5 预编译头文件pch.h (37)6 主函数 (37)1.引言家谱是现代人们怀旧的重要部分,因此,家谱管理系统会很快进入人们的生活。

本文系统采用C++语言开发家谱信息管理系统,运用树形结构存储信息,使工作人员的工作效率得以提高,减轻以往繁杂的工作量,将其从传统的家谱管理方式中彻底解脱出来,并克服了传统方式中记载家族信息的媒介的不足。

数据结构课程设计—家谱系统

数据结构课程设计—家谱系统

一.前言1 项目简介家谱(或称族谱)是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书体裁。

家谱是中国特有的文化遗产,是中华民族的三大文献(国史,地志,族谱)之一,属珍贵的人文资料,对于历史学、民俗学、人口学、社会学和经济学的深入研究,均有其不可替代的独特功能。

2系统功能本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息、插入家族成员、删除家族成员等功能。

本项目的实质是完成对家谱成员信息的建立、查找、插入、修改、删除等功能,可以首先定义家族成员的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。

一.需求分析1.系统需求本系统是家谱管理系统,顾名思义,是用来管理家族资料的,要实现建立新家谱,查找家谱文件,增加家族成员,修改家族成员,删除家族成员和查找家族成员等基本功能。

家谱管理系统是给家族长辈管理家族资料用的,对电脑的操作不一定熟悉,所以操作界面一定要友好,一定要方便,dos界面的操作一般比较枯燥,综合各种原因,要用MFC实现可视化的界面。

2.环境需求硬件:acer ASPIRE 4740GI5处理器2G内存320G硬盘软件:vs 2008二.总体设计3.1 总体设计框架建立家谱读取文件保存家谱添加结点修改结点删除结点程序入口输出家谱基本查询关系查询配偶信息图1系统总体设计模块结构图3.2 数据结构设计关于树形的结构:在树形结构的选择上,根据实际中多子女的现象选择一般树,考虑到家谱中成员可能存在的不定成员数问题,抛弃了以数组为基础的一般树方案,决定用链表来实现。

树形结构的外存保存。

为了提高效率,树形结构在程序初始化时由外存文件一次读入内存,此后不管插入还是修改,删除都不再对外存的树结构保存文件进行操作,只在内存中处理,程序退出时对外存树结构文件进行一次更新。

也就是说,不管在程序运行中中对家谱结构进行多少种,多少次的操作,外存的树结构文件始终只会被程序访问两次。

数据结构课程设计(家族关系查询系统).doc

数据结构课程设计(家族关系查询系统).doc

数据结构课程设计(家族关系查询系统).1 课程设计介绍1.1课程设计项目简介家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书载体。

家谱是中国特有的文化遗产,是中华民族的三大文献之一,属珍贵的人文资料,对于历史学,民俗学,人口学,社会学和经济学的深入研究,均有不可替代的重要功能。

本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息、插入家族成员等功能。

1.2课设题目分析本程序的实质是完成对家谱成员信息的建立、查找、插入等功能。

可以首先定义家族成员的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。

本程序包含以下几个模块(1)建立家族关系树。

此模块将构建一个家族关系,对数据初始化,构造关系树并录入数据一遍后续程序使用。

(2)添加新成员。

此模块将添加一个新成员,实现对家族关系的修改。

(3)家族关系的查询。

此模块将实现对家族不同关系的查询(4)主程序模块。

此模块实现整个程序的进入和进出,以及各种初始化处理。

(5)1.3课程题目原理与数据结构因为家族的成员之间存在一个对多个的层次结构关系,所以不能用线性表来表示和实现。

家谱从形状上看像一颗倒长的树,所以用树结构来表示比较合适。

树形结构是一类非常重要的非线性数据结构,直观看来树是以分支关系定义的层次结构。

因此本课程设计可以采用的数据结构有树状结构和队列。

树状结构采用三叉链表来实现,队列采用链式队列实现。

1.4功能分析说明图家族关系查询系统退出系统打开一个家族关系按关系查找各个家庭成员建立一个家族关系添加一个家庭成员查找一个成员的兄弟查找一个成员的祖先查找成员的子孙后代查找一个成员的孩子查找成员的堂兄弟查找成员祖先路径查找成员是第几代查找一个成员双亲2 分析与实现2.1 基本数据结构和栈队的操作 2.1.1 结点基本数据结构和链队的定义/*家族关系树实现*/#include #include #include#include#include#include#include#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR -1#define INFEASIBLE -1typedef char DataType;#define MAXNUM 20typedef struct TriTNode/* 树的三叉链表存储结构*/{ DataType data[MAXNUM]; struct TriTNode *parent;/* 双亲*/ struct TriTNode *lchild;/* 左孩子*/ struct TriTNode *rchild;/* 右孩子*/}TriTree;typedef struct Node/* 队列的结点结构*/{ TriTree *info; struct Node *next;}Node;typedef struct/* 链接队列类型定义*/{ struct Node-省略部分-h(flag) /* 根据flag标记调用函数*/ { case 1: tree=Create(str); break; case 2: tree=Open(str); break; case 3: Append(tree); break; case 4: Ancesstor(tree); break; case 5: AncesstorPath(temp); break; case 6: Parent(temp); break; case 7: Generation(temp); break; case 8: Brothers(temp,str); break; case 9: Consin(temp); break; case 10: Children(temp); break; case 11: Descendants(temp); break; case 12:exit(OK); } } return 0;}3 调试结果调试运行后,显示主界面1) 新建一个家族关系2)添加一个新成员3)查找一个成员的兄弟4)查找一个成员的堂兄弟5)查找一个成员的双亲6)查找一个成员的孩子7)查找一个成员是第几代8)查找一个成员的祖先路径9)查找一个成员的子孙后代4 结果分析本程序巧妙地将家族关系信息转化为二叉树信息,利用队列来创建三叉链表,存储家族关系信息,能够将信息存入文件中,以便下次访问,能对当前家族添加新成员,实现动态查询。

数据结构课程设计总结报告 家族关系查询系统

数据结构课程设计总结报告 家族关系查询系统

郑州轻工业学院课程设计任务书题目家族关系查询系统专业、班级软件外包11-01 学号姓名主要内容、基本要求、主要参考资料等:主要内容:建立家族关系数据库,实现对家族成员关系的相关查询。

基本要求:(1)建立家族关系并能存储到文件中;(2)实现家族成员的添加。

(3)可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信息。

课程设计按照教学要求需要一周时间完成,总共要上机调试程序10小时。

对每个题目要有需求分析,在需求分析中,将题目中要求的功能进行叙述分析,并且设计解决此问题的数据存储结构,设计或叙述解决此问题的算法,描述算法建议使用流程图,进行算法分析指明关键语句的时间复杂度。

给出实现功能的一组或多组测试数据,程序调试后,将按照此测试数据进行测试的结果列出来。

源程序要按照写程序的规则来编写。

要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。

程序能够运行,要有基本的容错功能。

尽量避免出现操作错误时出现死循环;主要参考资料:数据结构(C语言版),在网上查询的相关资料及部分代码完成期限:2013.6.18-2013.6.20指导教师签名:课程负责人签名:2013年 6 月18 日郑州轻工业学院本科数据结构课程设计总结报告设计题目:家族关系查询系统学生姓名:系别:计算机与通信工程专业:软件外包班级:学号:指导教师:2013年6 月20 日一、设计题目(任选其一)家族关系查询系统二、运行环境(软、硬件环境)电脑及Visual C++ 6.0三、算法设计的思想随着社会发展,人们使用纸质的家谱已经非常不方便而且不利于在家谱里进行添加和修改。

而用算法设计一个家族关系查询系统则可以解决这个问题。

数据结构的二叉树刚好满足家谱的基本结构。

首先建立一个文件作为家谱,然后在文件中输入字符串,实现了在文件中按照数据的逻辑关系进进输入便可建立相应的三叉链表。

然后就是进行数据的存储、删除及查找工作。

四、 算法的流程图家谱的创建:修改家谱:成员查询:五、算法设计分析本次设计研究的是建立家族关系,实现对家族成员关系相关查询的问题。

数据结构家谱课程设计报告

数据结构家谱课程设计报告

家谱管理系统姓名:田鑫磊学号:1514020421(1)功能部分:本程序共实现了6个功能分别为:1.读出家谱并显示2.确定指定成员在家族中得辈份3.输出指定辈得所有成员4.在家谱中添加新成员,并追加到文件中5.输出指定家庭得所有成员6、退出本系统(2)各功能得算法思想:1.读出家谱并显示存储结构用栈,按照先显示双亲,然后显示其所有孩子得顺序显示所有得家庭成员。

2.确定指定成员在家族中得辈份用求成员所在得二叉树中得层数(按层遍历二叉树)来确定,这里采用得就是递归算法3.输出指定辈得所有成员此处定义了一个新得结构体类型(增加存储节点所在得层数),定义如下:struct{BTNode*q;int loc;//存结点所在得层数}qu[10];并用一个队列来比较显示同辈分得所有成员.4.在家谱中添加新成员,并追加到文件中首先,输入一个新成员得名字;然后,输入其双亲;之后,再添加到整个存储二叉链表中。

然后,再将新得存储结构写回到文件中。

二叉链表得结点类型为:typedefstruct node{ElemType data[10]; //存放成员得名字struct node *child;//其孩子指针struct node *brother;//其兄弟指针}BTNode;5.输出指定家庭得所有成员首先,设一个栈,并设一个标记位,先置1;然后,找到输入得要待显示得成员,将标记位置0;再次,显示其孩子与兄弟,依次下去直到显示完其所有得亲戚。

6.退出本系统通过一个输入字符q来控制,每完成一个功能,系统提示就是否要继续操作: 当q为“Y”或者“y”时,显示菜单,程序继续执行;当ﻩq为其她字符时,程序执行结束,退出本系统。

三、详细设计:通过一个do—while语句来控制各个模块得选择与实现。

1.读出家谱并显示void display(BTNode *b){BTNode*q[10]; //定义一个栈int front,rear;int k;BTNode *p;p=b;k=0;front=-1;rear=0;q[rear]=p; //头结点先入栈while(front〈rear){front++;p=q[front];ﻩprintf("%s",p->data ); //头结点出栈,并显示printf("(”);ﻩdisbr(p->child);printf(")\n");if(p-〉child!=NULL) //显示其孩子{ﻩrear++;q[rear]=p->child;ﻩ}if(p->brother!=NULL) //显示其兄弟{ﻩrear++;q[rear]=p->brother;}}}2.确定指定成员在家族中得辈分int generation(BTNode *b,int h,ElemType x[])ﻩ//用递归得思想{ int i;if(b==NULL)return(0);i=strcmp(b-〉data,x); //比较就是否相等if(i==0)return(h);int L=generation(b->child,h+1,x);if(L==0)L=generation(b->brother,h,x);return(L);}3、输出指定辈得所有成员void layer(BTNode *t,intm){ struct //定义一个新得结点类型,在孩子兄弟存储结构得基础上添加一个数据域存其所在层数ﻩ{BTNode *q;ﻩ int loc;}qu[10];int front,rear;BTNode *p;p=t;k=0;front=—1;rear=0;qu[rear]、q=p;qu[rear]、loc=1;if( qu[rear]、loc==m) //找到m辈得即输出printf("%c",p—〉data);while(front〈rear)//通过站查找所有m辈得结点并输出{ front++;p=qu[front]、q;if(p—>child!=NULL)ﻩ{rear++;qu[rear]、q=p—〉child;qu[rear]、loc=qu[front]、loc+1;if(m== qu[rear]、loc)ﻩ printf(”%s ”,p—>child—>data);ﻩ}if(p->brother!=NULL){rear++;qu[rear]、q=p->brother;qu[rear]、loc=qu[front]、loc;if( qu[rear]、loc==m)printf(”%s ",p—>brother—>data);ﻩ}}}4、在家谱中添加新成员,并追加到文件中voidadd(BTNode *&b,ElemType y[],ElemTypex[]){char [20]="”;FILE *fp;ﻩBTNode *p,*q;int i;p=FindNode(b,y);q=(BTNode *)malloc(sizeof(BTNode));ﻩfor(i=0;x[i]!='\0';i++)ﻩq->data[i]=x[i];ﻩﻩq->data[i]=’\0’;q—>child=q-〉brother=NULL;ﻩif(p—〉child ==NULL)ﻩﻩp—>child=q;ﻩelseﻩ{p=p-〉child;ﻩﻩwhile(p->brother!=NULL)ﻩﻩﻩp=p—>brother ;p->brother=q;}display(b);printf("向文件中读入新家谱\n");printf("\n input a :");ﻩ scanf("%s",&);ﻩif((fp=fopen(,”w”))==NULL){puts(”\n can't open the file、”);exit(0);}elseDispBTNode(b,fp);fclose (fp);}void DispBTNode(BTNode *b,FILE *fp){char a[10];int i=0;ﻩif(b!=NULL)ﻩ{while(b->data[i]!='\0'){ﻩ a[i]=b->data[i];ﻩﻩﻩi++;ﻩ}ﻩa[i]='\0’;fputs(a,fp); //写入文件ﻩif(b->child!=NULL|| b->brother!=NULL)ﻩ{ﻩﻩf puts(s,fp);ﻩDispBTNode(b-〉child,fp);//递归写入其孩子ﻩﻩﻩif (b—〉brother!=NULL)ﻩﻩ{ﻩﻩfputs(p,fp);DispBTNode(b->brother,fp); //递归写入其兄弟ﻩﻩﻩ}ﻩfputs(t,fp);}ﻩ}}5、输出指定家庭得所有成员void dispfamily(BTNode *b,ElemType x[]){BTNode*p;BTNode *q[MaxSize];int top=-1,tap=1;if(b!=NULL){top++;q[top]=b;while(top〉—1){p=q[top];top-—;if(strcmp(p—〉data,x)==0) //查找此人{top=-1;tap=0;}if(p-〉child!=NULL){top++;q[top]=p-〉child;if(tap==0){display(p-〉child); //显示其孩子 return ;ﻩ }}if(p->brother!=NULL){top++;q[top]=p—>brother;if(tap==0){display(p—>brother);//显示其兄弟return ;}}}}}6、退出本系统此处通过一个输入字符q来控制,当q为“Y”或者“y”时,显示菜单,程序继续执行,当q为其她字符时,程序执行结束,退出本系统。

数据结构课程设计家谱

数据结构课程设计家谱

数据结构课程设计家谱一、课程目标知识目标:1. 理解并掌握数据结构中树状结构的基本概念与性质;2. 学会使用家谱树作为具体实例,掌握其构建、遍历及搜索等基本操作;3. 掌握家谱树在数据结构中的应用场景,理解其在解决实际问题中的优势。

技能目标:1. 能够运用所学知识,独立构建家谱树,并进行相关操作;2. 能够通过分析家谱树的特点,编写相应的遍历和搜索算法;3. 能够将家谱树应用于实际问题的解决,提高编程解决问题的能力。

情感态度价值观目标:1. 培养学生对数据结构学习的兴趣,激发学生主动探究家谱树等树状结构的积极性;2. 培养学生的团队协作意识,鼓励学生在学习过程中互相交流、共同进步;3. 增强学生的数据结构与实际应用联系的意识,培养学生的创新思维和问题解决能力。

本课程针对高年级学生,结合数据结构学科特点,注重理论与实践相结合,旨在提高学生运用数据结构解决实际问题的能力。

课程围绕家谱树展开,以实用性为导向,充分考虑学生的认知水平和兴趣,分解课程目标为具体可衡量的学习成果,为后续教学设计和评估提供依据。

二、教学内容本章节教学内容主要包括以下几部分:1. 树状结构基本概念:介绍树的基本概念、性质以及相关术语,如根节点、叶子节点、子树、深度、高度等。

2. 家谱树构建:以实际家谱为案例,讲解如何将现实问题抽象为家谱树,并运用数据结构知识进行构建。

3. 树的遍历:介绍树的遍历方法,包括前序遍历、中序遍历和后序遍历,分析各种遍历方法在家谱树中的应用。

4. 树的搜索:讲解树的基本搜索算法,如深度优先搜索和广度优先搜索,以及在家谱树中的应用实例。

5. 家谱树应用实例:分析家谱树在实际问题中的应用,如查找家族成员关系、计算家族成员辈分等。

教学内容依据教材相关章节,结合课程目标进行组织。

具体教学安排如下:1. 第一课时:树状结构基本概念及家谱树构建;2. 第二课时:树的遍历方法及其在家谱树中的应用;3. 第三课时:树的搜索算法及其在家谱树中的应用;4. 第四课时:家谱树应用实例分析和编程实践。

数据结构家谱管理系统范本

数据结构家谱管理系统范本

数据结构家谱管理系统范本在当今数字化的时代,管理和保存家族信息变得越来越重要。

一个高效的数据结构家谱管理系统能够帮助我们更好地记录家族成员的关系、个人信息以及家族的历史。

接下来,让我们详细探讨一下这样一个系统的范本。

首先,让我们来明确一下这个系统的主要目标和功能。

其核心目标是提供一个集中、准确且易于维护的平台,用于存储和查询家族信息。

主要功能应包括:家族成员信息的录入与编辑、成员之间关系的定义和展示、家族历史事件的记录、以及强大的查询和搜索功能。

在设计数据结构时,我们需要考虑如何有效地存储家族成员的信息。

可以创建一个“家族成员”表,其中包含诸如姓名、出生日期、出生地、逝世日期(若有)、照片(路径)等基本字段。

为了表示成员之间的关系,我们可以再创建一个“关系”表,记录每个成员与其亲属(如父母、配偶、子女等)的关联。

对于界面设计,应追求简洁明了、易于操作的风格。

首页可以展示家族树的概览,以直观的方式呈现家族成员之间的关系。

用户点击某个成员节点,能够查看该成员的详细信息,并可以进行编辑或添加新的信息。

在录入家族成员信息时,系统应提供友好的输入界面,并进行必要的数据验证,以确保输入信息的准确性和完整性。

例如,出生日期的格式应该符合规范,姓名不能为空等。

为了方便查询,系统应支持多种查询方式。

用户可以通过姓名、出生日期范围、籍贯等条件进行搜索,快速找到所需的家族成员信息。

在家谱管理系统中,数据的安全性和备份也是至关重要的。

用户的登录和操作权限应该得到严格控制,只有授权人员能够进行数据的修改和删除。

同时,定期对数据进行备份,以防止数据丢失。

此外,系统还可以提供一些扩展功能,比如生成家族报告,以图表或文档的形式展示家族的人口分布、年龄结构等信息;或者与社交媒体平台集成,方便与家族成员分享家族历史和最新动态。

在实际开发过程中,选择合适的编程语言和数据库管理系统也非常关键。

常见的编程语言如 Java、Python 等都能够胜任,而数据库可以选择 MySQL、SQL Server 等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编号:学号:201140410119课程设计教学院计算机学院课程名称数据结构课程设计题目简易家谱系统专业计算机科学与技术班级(1)班姓名陈建辉同组人员周海涛,石义沣,明廷柱指导教师程细才2013 年 1 月8 日目录一概述 (2)1.课程设计的目的 (2)2.课程设计的要求 (2)二总体方案设计 (3)1.简单家谱系统整体设计思路 (3)2.简单家谱系统的主要特点及功能 (5)三详细设计 (7)1. 查询全部的家谱成员信息 (7)2.确定指定成员在家族中的辈份 (7)3.在家谱中添加新成员,并追加到文件中 (9)四程序的调试与运行结果说明 (12)1.实验结果截图: (12)2.调试时遇到的问题 (12)五课程设计总结 (13)附录一:程序源代码 (16)附录二:参考文献 (25)一概述1.课程设计的目的1.理解和掌握该课程中的有关基本概念,程序设计思想和方法。

2.培养综合运用所学知识独立完成课题的能力。

3.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。

4.掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。

2.课程设计的要求设计要求:输入家族成员情况,建立树结构,统计家族成员人数,能查询家族成员辈份情况。

系统功能:1. 输入、修改与删除家谱信息功能2. 查询功能:1)某家谱成员的所有子孙的集合2)某家谱成员的所有祖先的集合3)某家谱成员的所有同辈成员的集合4)求某家谱成员的所有上一辈成员的集合5)给出两个家谱成员,确定他们的关系二总体方案设计1.简单家谱系统整体设计思路此次课程设计的整体思路是采用遍历算法,整个树的定义使用两个结构体来表示,一个结构体专门用于存放每一个节点的信息,另一个节点中定义了三个指针域,分别为父指针域(兄长指针域),兄弟指针域,子指针域,整个树的输入采用文件导入的方式,首先将文件导入到树中,文件包含每一个家族成员的信息,以及一个标志位flag,标志位的值为0,1,2,0表示此节点没有兄弟节点,1表示此节点至少有一个子节点,2表示此节点至少有一个兄弟节点,使用的算法是先定义一个链式队列,将文件中第一个节点的内容读取放入开辟的树的节点的空间里,然后将树节点放入队列中,此时队列不为空,以队列不为空为判断条件,进行while循环,判断flag的值,循环体中再进行文件读取,循环中进行判断,若flag为0,则继续判断队列是否为空,为空就结束循环,若不为空,则继续出队列,取标志位进行判断,若标志位为1,则生成新节点,用刚刚出列的节点的子指针域进行指向新节点,新节点的父指针域指向出列的节点,剩余的域为空,然后将新生成的节点插入到队列中,若flag为1,则进行兄弟节点的插入,继续循环,若flag不为0,则在进行判断,若为2,则继续进行兄弟节点的插入,以此类推,根据文件的读取,将树生成,本程序中所有的算法都基于以上所介绍的算法。

关于IO的设计:考虑到题目要求家谱信息以树形的形式一次读入内存,而个人的各种资料现在虽然条目不多,但随着程序的升级,以后可能变得越来越大。

我把树形结构和个人信息记录的文档分为两个文件保存在外存中,一个文件串行化地记录家谱树的结构信息,保存少量个人信息作为识别标志;另一个文件保存完整的个人信息,所有的个人信息以线性记录的方式记录在其中。

当程序运行要读入家谱结构时,只读入保存少量记录的文件并建立起树形结构。

索引时,以树形中的少量信息为依据在另一个文件中找到全部的各人信息资料。

这样的好处主要有两点:1. 由于树形结构是串行化记录于外存,一个节点记录多次,信息大量冗余,如果树形节点中保留全部信息,必将造成大量的空间浪费;只保存作为索引的少量信息在树形结构中,节约了空间。

2. 由于结构的精简,在家谱初始化时读入内存需要的时间相应减少,节约了装载时间。

这样做存在的问题:每次执行修改,添加,删除,查询时都要直接访问外存来取得或写入数据。

内外存访问上的巨大时间差的存在,使得进行这些操作相对来说并不显得很高效。

关于树形的结构:在树形结构的选择上,根据实际中多子女的现象选择一般树,考虑到家谱中成员可能存在的不定成员数问题,抛弃了以数组为基础的一般树方案,决定用链表来实现。

树形结构的外存保存。

为了提高效率,树形结构在程序初始化时由外存文件一次读入内存,此后不管插入还是修改,删除都不再对外存的树结构保存文件进行操作,只在内存中处理,程序退出时对外存树结构文件进行一次更新。

也就是说,不管在程序运行中中对家谱结构进行多少种,多少次的操作,外存的树结构文件始终只会被程序访问两次。

关于功能的设计(以基本要求为准):1.插入:用户按提示输入资料,在树形中插入节点,在个人完整记录文件中添加插入人的所有信息并保存。

2.删除:用户输入被删除人的识别关键字(即名字),在树形结构中删除此人,在个人记录文件中不处理。

3.修改:用户输入被删除任的识别关键字(即名字),从个人完整记录文件中读出该人所有信息供用户进行修改,然后写回。

4.查询:完成了关键字查找部分和关系查找部分,读出个人全部信息并显示。

关于个人资料单元:由于树形节点要涉及到大量的逻辑操作,要用到一些运算符的重载,个人资料在树形单元定义为class类,而写入文件的单元存萃是数据,定义为简单的struct类。

定义为struct和class类,使得不管是树形结构插入删除还是IO都是对整个结构体进行的操作,这样,如果要往结构体中添加若干个新信息条目或取消一些不必要的信息条目,需要修改的代码非常之少,方便了以后的升级。

2.简单家谱系统的主要特点及功能本系统的主要特点是算法简洁,易于阅读,用户交互界面良好。

主要实现功能:1.确定指定成员在家族中的辈份2.输出指定辈的所有成员3.在家谱中添加新成员,并追加到文件中4.输出指定家庭的所有成员5.退出本系统各功能的算法思想:1.读出家谱并显示存储结构用栈,按照先显示双亲,然后显示其所有孩子的顺序显示所有家庭成员。

2.确定指定成员在家族中的辈份用求成员所在的二叉树中的层数(按层遍历二叉树)来确定,这里采用的是递归算法3 .输出指定辈的所有成员此处定义了一个新的结构体类型(增加存储节点所在的层数),定义如下: typedef struct cc{struct cc *child, *next;//next指向同辈份的人物char Name[];}JPNode;并用一个队列来比较显示同辈分的所有成员。

4.在家谱中添加新成员,并追加到文件中首先,输入一个新成员的名字;然后,输入其双亲;之后,再添加到整个存储二叉链表中。

然后,再将新的存储结构写回到文件中。

二叉链表的结点类型为:typedef struct node{ElemType data[10]; //存放成员的名字 struct node *child; //其孩子指针 struct node *brother; //其兄弟指针 }BTNode;5.输出指定家庭的所有成员首先,设一个栈,并设一个标记位,先置1;然后,找到输入的要待显示的成员,将标记位置0;再次,显示其孩子和兄弟,依次下去直到显示完其所有的亲戚。

6.退出本系统。

三详细设计1. 查询全部的家谱成员信息该部分程序所完成的具体功能是把贾府中所有的成员信息按照辈份依次显示出来,首先从贾无名开始,然后下一辈份的贾演、贾源等……最后是贾蓉的信息。

每个辈份之间都有间隔。

设计思想:利用队列遍历所有的结点,在遍历的同时依次输出每个结点的值(即为家庭成员的信息)。

代码如下:void Dis_Family(JPNode *p){char name[NAME_length];JPNode *here = NULL;printf("请输入该家庭的首个成员:"); scanf("%s",name);here = Find_Name(p,name);if(here == NULL){ printf("无该家庭!\n"); return;}printf("\n");DispJP(here);}2.确定指定成员在家族中的辈份该部分代码所完成的具体功能是查询某一个家庭成员的信息。

首先手动输入你要查询的那个成员的名字,然后利用队列依次查找该成员的信息,如果该家谱中存在这个成员则输出该成员的有关信息;如果家谱中不存在该成员,则输出提示信息:家谱中无此人!设计思想:有两个函数,一个函数(queryElemt)利用队列遍历所有的节点,在遍历的同时即可查找所输入的成员是否存在该家谱中;另外一个函数(queryElemtoFamily)用于输入你要查找的成员的辈分和输出查找的结果。

代码如下:int beifen(JPNode *p, char name[]){static int n = 1;static int level = 0;if(p == NULL )return level;if(Equal(p->Name,name) == 1)return (level=n);n++; beifen(p->child,name);n--; beifen(p->next,name); //向右查询n不必加(先加后减)!return level;}void Bei_Fen(JPNode *p){char name[NAME_length];int n=0;printf("请输入要查明辈分的人的姓名:"); scanf("%s",name);n = beifen(p,name);if(n == 0)printf("该家族中无此人!\n");else printf("\n %s 是 %s 家族中的第%d辈 \n",name,p->Name,n); }/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*输出指定辈的所有成员*/void chabei(JPNode *p, int bei){static int n = 1;static int tag = 0;if(p == NULL )return;if(bei == n){tag = 1;printf("%s ",p->Name);}n++; chabei(p->child,bei);n--; chabei(p->next,bei); //向右查询n不必加(先加后减)!if(tag == 0)printf("该家族中还没有这一辈呢....\n");}void Disp_Pei(JPNode *p){int bei;printf("\n你想要查看那一辈的成员:");scanf("%d",&bei);printf("\n....该家族中辈分为%d的成员有....\n\n",bei);chabei(p,bei);printf("\n");}3.在家谱中添加新成员,并追加到文件中该部分程序所完成的具体功能是:输入你要添加人的名字,比如吴长,他会被添加到文件中。

相关文档
最新文档