数据结构课程设计报告

发布 2022-10-05 19:15:28 阅读 8297

1.问题阐述:

广州作为广东的省会,是经济政治文化中心,相对来说,外来流动人员多,对公安机关的管理造成成了一定程度上的困难,而传统的家谱通常是纸质的,查询更新比较麻烦,因此,由纸质家谱向电子转化,把家谱电子化,对管理有很大的帮助,不能仅降低成本,而且可以提高效率。

本家谱管理系统用于记录某家族历代家族成员的情况与关系。实现一个计算机软件,可以实现以下功能:

1.1支持对家谱的建立与删除,建立一个新的家谱或者从磁盘里建立一个新的家谱。

1.2支持对家谱的存储,可以永久保存在磁盘里。

1.3.支持对家谱进行修改更新,可以添加新成员,删除成员,修改成员的信息。

1.4支持对家谱的树形打印,可以形象地了解整个家族的情况,以及对每个成员详细情况的打印。

1.5支持根据不同的信息对家谱进行查询,包括姓名,出生地,出生日期,死生日期,性别,身高,受教育程度,职位,最高职位,亲威关系来查找。

1.6 支持对家谱的统计,可以清楚的了解这个家族的情况。

1. 8 在控制台下,支持鼠标的操作,让操作更加便利。

2.设计方法阐述。

2.1 程序设计时数据类型的实现。

每个家庭成员都有自己独特的特征,必须对成员的数据用一个集合来保存。这程序中,定义了info 数据类型,具体数据成员如下:

struct info

char name [max_char_num];/名字。

char sex [max_char_num];/性别。

date birthdate;//出生日期。

char birthplace[max_char_num];/出生地点。

bool death;//是否健在。

bool marriage;//是否结婚。

date deathdate;//死亡日期。

int height;//身高。

char id [max_char_num];/身份证号。

char occupation [max_char_num];/职位。

char education [max_char_num];/受教育程度。

char top_headship [max_char_num];.最高职位。

char parentname [max_char_num];/父亲名字。

char wifename[max_char_num];/母亲的名字。

int depth;//二叉树的深度,为输出二叉树做准备。

int y ;/输出时此节点的y坐标。

而且还定义了date类型作为日期的结构,如下:

struct date

int year;

int month;

int day;

2.2 程序设计过程时数据结构以及存结构的实现。

本程序采用了树的结构,但是却有自己的独到之处,每个节点的定义如下:

typedef struct csnode

info data;

csnode * firstchild,*nextsibling,*parent;

*person;

里面有成员的信息有数据data,还有三个指针,分别指向第一个儿子节点,下一个兄弟节点节,以及父亲节点。这样不仅可以建立家谱树,而且还节省了不必要的指针空间。在存入磁盘时,可以按先序遍历树来存家谱的信息,采用顺序存储的结构。

结构示意图见图1,图2.

图1 节点的指针示意图。

图 2 树的结构示意图。

2.3 程序设计过程中的功能实现结构设计。

为了实现家谱里面对家谱进行管理的功能,定义了一个genealogy 类,里机的成员函数结构图如下:

图 3 genealogy类成员函数结构图。

2.4 程序设计过程中的流程图。

图 4 设计的流程图。

2.5 函数的主页面图。

图 5 运行时的主页面图。

2.6 所遇到的问题与解决方法。

2.6.1 对同名同姓的成员的处理。

在一个家族中,出现同名同姓的情况并不少见,要是处理不好,在插入的时候很容易出现问题,要是出现父亲节点有同名同姓的,就不知该插入谁那里,如何才能区别出来呢?

首先在输入的时候,必须要输入每个人的id号,这是惟一的,当输入的id号与家谱中已经存在的成员相同时,就会提醒你重新输入,由下面的函数可以查找是否有相同的id号:

void findbyid(int & sum,person & t,person &tname,char * name)

其次,在插入的时候就当然不是以父亲节点的姓名来寻找,而是以它的id号来查找。

2.6.2 插入与删除的问题。

先解决删除的问题,删除的时候,先通过名字以及id找到要删除的节点,然后主要分为两类:

a. 要删除的节点t是父亲节点的第一个儿子节点,此时只把此节点的nextsibling指针和parent指针均设为null,然后再通过后序遍历删除此节点 ;

b. 要删除的节点t不是父亲节点的第一个出儿子节点,刚用temp记下此节点的前一个兄弟节点,然后temp->nextsibling =t->nextsibling ;

t->nextsibling =null;t->parent =null;

插入的时候,对于兄弟节点,按出生日期排列,出生日期早的排在前面。

2.6.3输出树形结构的时候,对画图线的解决问题。

对输出树形家谱时,主要是对节点进行了分类。可以分为以下四类:

a. 根节点,前面不画任何线;

b. 第一个儿子节点,如果要是没有兄弟节点,前面画‘─’否则前面画‘┮’

c. 最后一个儿子节点,前面画‘┕’

d. 既不是第一个儿子节点,也不是最后一个儿子节点,前面画‘┝’

这些规则确定出来以后,**也就随之实现了,但是运行的时候却出现问题,会出现乱码,刚开始的时候,十分困惑,不知道出什么问题了?后来看了控制台界面控制,才发现,原来是**页设置出问题了,我们用的中文windows操作系统的默认**页是简体中文(936),在该**页面下值超过128的单字符在windows nt/xp是显示不出来的。

setconsoleoutputcp(936); 设置**页为简体中文。

setconsoleoutputcp(437); 设置**页为ms-dos美语/英语。

我把**页设为好以后ms-dos美语/英语,问题就迎刃而解了。

还有一个问题就是缓冲区大小的设置问题,根据树的深度来设置大小,就不会造成缓冲区过小而自动换行的情况。

树形打印的效果图如下:

2.6.3 对函数的类型不明确。

void preordertr**erse(fstream &f,person& t ,void (*visit)(fstream &f,person &t));先序遍历家谱树,为保存和显示家谱树做准备。

经过反复试验,终于发现,其实,是定义visit函数的时候,不应该定义为genealogy的成员函数,当定义为成员函数时会出现如下的错误:postordertr**erse' :cannot convert parameter 2 from 'void (struct csnode *&to 'void (_cdecl *)struct csnode *&

3.总结与体会。

经过这次大作业的的实践,让我不仅巩固了上学期学习的数据结构的知识,而且在设计界面的时候,还去学习了api,控制台窗口界面控制的知识,让我开阔了视野,增长了知识,了解了windows的函数的调用的机制。

在一个个问题解决的过程中,让我学到了很多知识,这些是理论知识上很难得来的,只有通过实践,才能体会到这些不起眼的小问题。

工要善其事,必先利其器”,刚开始做的时候,想先决定用什么工具来做,做到的怎样的程度,在决定的过程中,自己走了弯路,没有理解课程设计的要求,想做api来做,结果是先去学习了api的知识,众多陌生的函数让我的思绪比较混乱,后来才清楚,只能用控制台函数来实现界面的设计,这样思路就清晰多了,控制台的函数就那么二十多个,我了解了每个函数的功能以后,就着手做了。

在编程的过程中,心中要有大局观,由简到烦,由功能单样到多样,逐步渐近,最后让整个软件的功能充实起来。还要注意,程序的结构要清晰,定义函数名的时候,还要尽量有其意义,让人一看程序名就知道它的功能,易读好懂。这样,不仅方便别人读懂自己的程序,而且可以更好地检查程序,当**多到几千行的时候,检查错误,如果**的结构不好,易读性不强的话,难度就相当高了。

总之,实践出真知,这次实践让我真正把理论跟实践结合起来,让我学习到很多通过书本无法学到的知识。

数据结构课程设计报告

东莞理工学院城市学院。题目 二叉排序树 专业 计算机科学与技术 本 年级 2010级计算机科学与技术专业 1 班。个人姓名 何振江。指导教师 张娟老师 时间 2010至2011第二学期第18周 地点 实验楼615机房 东莞理工学院城市学院计算机与信息科学系制。2011年 6月。实习报告的内容。一 问...

数据结构课程设计报告

设计一个校园导游程序,为来访的客人提供信息查询服务。1 设计学校的校园平面图。选取若干个有代表性的景点抽象成一个无向带权图 无向网 以图中顶点表示校内各景点,边上的权值表示两景点之间的距离。2 存放景点代号 名称 简介等信息供用户查询。3 为来访客人提供图中任意景点相关信息的查询。4 为来访客人提供...

数据结构课程设计报告

河北科技大学。课程设计报告。学生姓名学号。专业班级。课程名称数据结构。学年学期 2 012 2 013学年第 2 学期指导教师 黄春茹。2 0 13年 6 月。课程设计成绩评定表。一 数据结构课程设计目标。二 问题描述。三 需求分析。四 概要设计。五 详细设计。六 软件说明书 给出软件如何使用,使用...