查看: 817|回复: 10
人类学研究对于家族很感兴趣,于是研究人员搜集了一些家族的家谱进行研究。实验中,使用计算机处理家谱。为了实现这个目的,研究人员将家谱转换为文本文件。下面为家谱文本文件的实例:
家谱文本文件中,每一行包含一个人的名字。第一行中的名字是这个家族最早的祖先。家谱仅包含最早祖先的后代,而他们的丈夫或妻子不出现在家谱中。每个人的子女比父母多缩进2个空格。以上述家谱文本文件为例,John这个家族最早的祖先,他有两个子女Robert和Nancy,Robert有两个子女Frank和Andrew,Nancy只有一个子女David。
在实验中,研究人员还收集了家庭文件,并提取了家谱中有关两个人关系的陈述语句。下面为家谱中关系的陈述语句实例:
John is the parent of Robert
David is a descendant of Robert
Robert is a sibling of Nancy
研究人员需要判断每个陈述语句是真还是假,请编写程序帮助研究人员判断。为简化程序,我们约定测试数据中出现的每个人,其子女不超过2个。
输入输入首先给出2个正整数N(2
这个没有具体的输入输出要求吗?比如:输入家族信息这个太广泛了,形式是怎样的?输出家族信息又是怎样的
ybbgjhnypm
#include #include #include typedef struct node { struct node *lch,* }B Bnode *creat() { Bnode *root =NULL; Bnode *s[20]; int i,x; printf(&input i and x:&); scanf(&%d,%d&,&i,&x); while(i != 0) { Bnode *
打酱油的!
杜树林,你这样做是不对的!!我是杜小坤老师!!以此为戒,杀鸡儆猴,你数据结构课程设计挂了,别来9栋求我,求我也没用!!
天地鹰飞跆拳道
#include &stdio.h& #include &stdlib.h& #include &malloc.h& #include typedef struct _list{ _list * } void init(list **p,int *length){ *p = (list *)malloc(sizeof(list)); (*p)-&value = NULL; (*p)-&next = NULL;
#include #include #include typedef struct list { struct list * }L List *create_list(List *data); List *insert_list(List *head, List *data); void print_list(List *head); void get_list_length(List *head); void i
void selectionSort(DataType a[], int n) { int i, j, DataT for (i = 1; i & i++){ p= 0; for (j = 1; j & n -++j) { if (a[p]
// row[1]记录了第行列的最小值,这个值应该和row[i]所在的列的最大值进行比较, // 楼主下面的代码貌似没有实现。row[i]也没有记录列号 for(i=0;i
#include #include #define Namelength 10 typedef struct CLNode{ char* int ID; struct CLNode * }child,* ptrchild CreateCList(int n) { ptrchild p,head, printf(&please input the children请高手们帮忙改个程序【c语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:552,944贴子:
请高手们帮忙改个程序收藏
以下是一个家族谱管理系统但是不能完成要求中的“永久保存”个别函数存在问题请高手们帮忙改下要求是1.
问题描述:家谱用于记录某家族历代家族成员的情况与关系,设计一个家谱管理系统实现对家谱的存储、更新、查询和统计。2.
基本要求:家庭成员的基本信息应存储在计算机中(可永久保存),成员信息包括(姓名,出生地,出生日期,死亡日期,性别,身高,学历,职业),能够将家族成员之间的关系存储在计算机中(可永久保存),能够对家谱数据进行修改、插入和删除三个操作的更新,能够按照家庭成员的基本信息和亲戚关系两种不同的方式查询家庭成员的具体情况,能够完成任一家庭的平均寿命,平均身高,男女比例,家庭平均人后的统计,并且可以将家谱以较为友好的格式显示出来。3.
测试数据:家族成员的基本信息和关系数据自定,要将所有系统功能进行测试。4. 实现提示:家庭成员基本信息用线性表表示,程序结束后存储在磁盘上,程序开始也是从磁盘读出。家庭成员之间的关系,用树形结构(家族树)表示,家族树在程序结束后存储在磁盘上,程序开始是从磁盘读出。树在内存中的存储结构:邻接表或孩子兄弟链,带双亲指针。家庭成员基本信息设置数字编号,用于唯一地标识记录。树结点用家庭成员的编号标识,通过编号建立家庭成员的基本信息与树结点的联系。树在磁盘中的存储结构是串行化结果,如“根--叶序列”,即从树根到每个叶子结点的路径,路径的排列次序表示兄弟的次序。例如,下图给出树的“根--叶序列”为:1,2,41,2,61,2,8,51,71,3,91,3,10程序代码:#include&stdio.hinclude&stdlib.hinclude&string.hinclude&math.h&typedef struct fam{
char name[20];
char bplace[50];
char sex[5];
char education[10];
char career[10];}typedef struct node{
struct node *}typedef struct {
edgenode *}inf head[100];int visit[100];int b[100];int i,j,k,m,n,r,s,t;//FILE */*注:i,j,m,n用于循环变量,k为家族总人数,t为某一成员孩子数量*//*void save(){fp=fopen("inf.txt","w+");for(i=0;i&k;i++)fwrite(&head[i],sizeof(struct fam),1,fp);fclose(fp);}*/void Save()
/*成员信息储存*/{ printf("请输入所要创建的家族人数:\n"); scanf("%d",&k); for(i=1;i&=k;i++)
head[i].number=i;
printf("请输入%d个成员姓名:\n",i);
scanf("%s",&head[i].name);
printf("请输入成员出生地:\n");
scanf("%s",&head[i].bplace);
printf("请输入成员出生日期:\n");
scanf("%d",&head[i].bdate);
printf("请输入成员死亡日期,没有请输入当前年份:\n");
scanf("%d",&head[i].ddate);
printf("请输入成员性别:\n");
scanf("%s",&head[i].sex);
printf("请输入成员身高:\n");
scanf("%d",&head[i].height);
printf("请输入成员受教育程度:\n");
scanf("%s",&head[i].education);
printf("请输入成员职业:\n");
scanf("%s",&head[i].career); }// save();}vexnode Familymem[100];
如何做到200家全球加盟店?味蜀吾老火锅给您***
void RelationCre()
/*家庭成员关系建立(邻接表法)*/{ edgenode *p; for(i=1;i&=k;i++) {
Familymem[i].vertex.number=head[i].
strcpy(Familymem[i].vertex.name,head[i].name);
strcpy(Familymem[i].vertex.bplace,head[i].bplace);
Familymem[i].vertex.bdate=head[i].
Familymem[i].vertex.ddate=head[i].
strcpy(Familymem[i].vertex.sex,head[i].sex);
Familymem[i].vertex.height=head[i].
strcpy(Familymem[i].vertex.education,head[i].education);
strcpy(Familymem[i].vertex.career,head[i].career);
Familymem[i].link=NULL; } for(i=1;i&=k;i++) {
printf("请输入第%d成员孩子的数量:\n",i);
scanf("%d",&t);
for(m=1;m&=t;m++)
printf("请输入第%d个孩子的编号及其第%d个孩子的编号,中间用逗号隔开:\n注:第0个孩子为成员本身\n",m-1,m);
scanf("%d,%d",&s,&j);
p=malloc(sizeof(edgenode));
p-&adjvex=j;
p-&next=Familyme***
Familyme***ink=p;
} }}int search()
/*查找函数(二分法)*/{ int low,mid, printf("请输入成员的序号\n"); scanf("%d",&m); low=1; high=k; while(low&=high) {
mid=(low+high)/2;
if(m==head[mid].number)
if(m&head[mid].number)
high=mid-1;
low=mid+1; }}void modify()
/*修改家庭成员信息*/{ int No; No=search(); printf("请重新输入该成员信息\n");
printf("请输入成员姓名:\n");
scanf("%s",&head[No].name);
printf("请输入成员出生地:\n");
scanf("%s",&head[No].bplace);
printf("请输入成员出生日期:\n");
scanf("%d",&head[No].bdate);
printf("请输入成员死亡日期,没有请输入0:\n");
scanf("%d",&head[No].ddate);
printf("请输入成员性别:\n");
scanf("%s",&head[No].sex);
printf("请输入成员身高:\n");
scanf("%d",&head[No].height);
printf("请输入成员受教育程度:\n");
scanf("%s",&head[No].education);
printf("请输入成员职业:\n");
scanf("%s",&head[No].career);
printf("修改成功!"); }void insert()
/*插入家庭成员信息(后插法)*/{ int No; No=search();
for(i=k;i&=No+1;i--) {
head[i+1].number=head[i].
strcpy(head[i+1].name,head[i].name);
strcpy(head[i+1].bplace,head[i].bplace);
head[i+1].bdate=head[i].
head[i+1].ddate=head[i].
strcpy(head[i+1].sex,head[i].sex);
head[i+1].height=head[i].
strcpy(head[i+1].education,head[i].education);
strcpy(head[i+1].career,head[i].career); }
printf("请输入成员姓名:\n");
scanf("%s",&head[No+1].name);
printf("请输入成员出生地:\n");
scanf("%s",&head[No+1].bplace);
printf("请输入成员出生日期:\n");
scanf("%d",&head[No+1].bdate);
printf("请输入成员死亡日期,没有请输入0:\n");
scanf("%d",&head[No+1].ddate);
printf("请输入成员性别:\n");
scanf("%s",&head[No+1].sex);
printf("请输入成员身高:\n");
scanf("%d",&head[No+1].height);
printf("请输入成员受教育程度:\n");
scanf("%s",&head[No+1].education);
printf("请输入成员职业:\n");
scanf("%s",&head[No+1].career);
}void del()
/*删除家庭成员信息*/{ int No; No=search(); for(i=No;i&=k;i++) {
head[i].number=head[i+1].
strcpy(head[i].name,head[i+1].name);
strcpy(head[i].bplace,head[i+1].bplace);
head[i].bdate=head[i+1].
head[i].ddate=head[i+1].
strcpy(head[i].sex,head[i+1].sex);
head[i].height=head[i+1].
strcpy(head[i].education,head[i+1].education);
strcpy(head[i].career,head[i+1].career); }}void Update()
/*更新家庭成员信息*/{
void form();
printf("请选择\n1.修改2.插入3.删除\n");
scanf("%d",&i);
case 1:modify();printf("修改成功!");form();
case 2:insert();printf("插入成功!");form();
case 3:del();printf("删除成功!");form();
}}void BasicInfo()
/*家庭基本成员信息*/{///fp=fopen("inf.txt","rb");printf("编号\t姓名\t出生地\t出生日期
性别\t身高\t学历\t职业\n"); for(i=1;i&=k;i++) {
fread(&head[i],sizeof(struct fam),1,fp);
printf("%d\t",head[i].number);
printf("%s\t",head[i].name);
printf("%s\t",head[i].bplace);
printf("%d
",head[i].bdate);
printf("%d
",head[i].ddate);
printf("%s\t",head[i].sex);
printf("%d\t",head[i].height);
printf("%s\t",head[i].education);
printf("%s\t\n",head[i].career); }// fclose(fp);}void bfs()
//广度遍历代码//{ edgenode *p; int q[100],f=0,r=0; for(i=1;i&=k;i++)
visit[i]=0;
visit[1]=1;
printf("%s(%s)\n",Familymem[1].vertex.name,Familymem[1].vertex.sex);
p=Familymem[j].
if(!visit[p-&adjvex])
visit[p-&adjvex]=1;
printf("%s(%s)",Familymem[p-&adjvex].vertex.name,Familymem[p-&adjvex].vertex.sex);
q[r++]=p-&
printf("\n");
}}void dfsg(int i)
/*家庭成员关系*/
edgenode *p;
printf("%s(%s)\t",Familymem[i].vertex.name,Familymem[i].vertex.sex);
p=Familymem[i].
printf("\n");
dfsg(p-&adjvex);
printf("\n");}void dfs(){ for(i=1;i&=k;i++) {
dfsg(i); }}void FamilySta()
/*家庭成员具体情况*/{ void select(void);
printf("请选择\n1.查看家庭成员的基本信息\n2.查看亲戚关系\n");
printf("请输入您的选择:\n");
scanf("%d",&i);
case 1:BasicInfo();printf("返回上层菜单,请输入7\n返回首层菜单请输入8\n");
scanf("%d",&n);
while(n!=0)
case 7:FamilySta();
case 8:form();select();
default:{printf("您的输入有误,请重新输入:\n");scanf("%d",&n);}
case 2:dfs();printf("返回上层菜单,请输入7\n返回首层菜单请输入8\n");
scanf("%d",&n);
while(n!=0)
case 7:FamilySta();
case 8:form();select();
default:{printf("您的输入有误,请重新输入:\n");scanf("%d",&n);}
default:{printf("您的输入有误,请重新输入:\n");scanf("%d",&n);}FamilySta();
int TTL(){ j=0; for(i=1;i&=k;i++) {
j+=(head[i].ddate-head[i].bdate); } m=j/k; return(m);}int ***T(){ j=0; for(i=1;i&=k;i++) {
j+=(head[i].height); } m=j/k; return(m);}int Male(){
int j=0; char a[10]="男"; for(i=1;i&=k;i++) {
if(a==head[i].sex)
return(j);}int Female(){
int j=0; char a[10]="女"; for(i=1;i&=k;i++) {
if(a==head[i].sex)
return(j);}int Child(){ j=0; for(i=1;i&=k;i++) {
j+=b[i]; } m=j/k; return(m);}void Statistic(){
void form();
printf("需要进行1.平均寿命的统计2.平均身高的统计3.男女比例4.家庭平均人后的统计\n");
scanf("%d",&i);
case 1:j=TTL();printf("家庭平均寿命为:%d",j);printf("返回上层菜单,请输入7\n返回首层菜单请输入8\n");
scanf("%d",&n);
while(n!=0)
case 7:Statistic();
case 8:form();select();
default:{printf("您的输入有误,请重新输入:\n");scanf("%d",&n);}
case 2:j=***T();printf("家庭平均身高为:%d",j);printf("返回上层菜单,请输入7\n返回首层菜单请输入8\n");
scanf("%d",&n);
while(n!=0)
case 7:Statistic();
case 8:form();select();
default:{printf("您的输入有误,请重新输入:\n");scanf("%d",&n);}
case 3:j=Male();printf("男性人数为:%d\n",j);m=Female();printf("女性人数为:%d\n",m);printf("故男女比例为:%d:%d\n",j,m);printf("返回上层菜单,请输入7\n返回首层菜单请输入8\n");
scanf("%d",&n);
while(n!=0)
case 7:Statistic();
case 8:form();select();
default:{printf("您的输入有误,请重新输入:\n");scanf("%d",&n);}
case 4:j=Child();printf("家庭平均人后为:%d\n",j);printf("返回上层菜单,请输入7\n返回首层菜单请输入8\n");
scanf("%d",&n);
while(n!=0)
case 7:Statistic();
case 8:form();select();
default:{printf("您的输入有误,请重新输入:\n");scanf("%d",&n);}
default:{printf("您的输入有误,请重新输入:\n");scanf("%d",&n);}Statistic();
}}void form(){
void select();
printf("\t\t***************************************\n");
printf("\t\t\t\t家谱管理系统\n");
printf("\t\t 1.创建家谱\n");
printf("\t\t 2.家庭成员关系建立\n");
printf("\t\t 3.查看家庭成员的具体情况\n");
printf("\t\t 4.更新家谱\n");
printf("\t\t 5.家庭统计\n");
printf("\t\t***************************************\n");
printf("请输入您的选择:\n");
select();}void select()
/*选择菜单*/{
scanf("%d",&i);
case 1:Save();printf("创建完毕!\n");form();
case 2:RelationCre();printf("创建完毕!\n");form();
case 3:FamilySta();
case 4:Update();
case 5:Statistic();
default:{printf("您的输入有误,请重新输入:\n");scanf("%d",&n);}select();
/*主菜单*/{
乱七八槽啊。。。。。。。。。。。实在是没耐心看。。
登录百度帐号推荐应用导读:1系统功能概述.................................,1.1系统功能.................................,该家谱管理系统将信息用文件的方法进行存储管理,该家谱管理系统将各个家庭的信息以文件的形式存储,该家谱管理系统还将各个成员的信息以及成员之间的关系存储在二叉树上,摘要本文设计了一个对数据输入,输出,储存,查找的多功能软件,本文需要保存
要 本文设计了一个对数据输入,输出,储存,查找的多功能软件,本文需要保存家族的基本信息,包括姓名及它们的关系,但是由于家族信息很巨大而且关系很复杂所以采用二叉树来表示它们的关系。并且具有保存文件的功能,以便下次直接使用先前存入的信息。家谱的功能是查询家族每个人的信息,并且输出它们的信息,还要具有查询输出功能。 本文采用二叉树来存取家族的基本信息,头结点作为父亲节点,他的左孩子为他的妻子,妻子结点的右孩子为他的孩子,依次存储每个家庭的信息。可以查找每个父亲的孩子和每个人的所有祖先。
关键词: 二叉树
1 系统功能概述...................................................... 1 1.1
系统功能 ................................................... 1 图2 成员二叉树功能模块图........................................ 4 1.2
总体功能模块 ............................................... 4 2 系统各功能模块的详细设计.......................................... 4 2.1功能选择..................................................... 4 2.2信息输入..................................................... 6 2.3信息输出..................................................... 7 2.4信息存盘..................................................... 7 2.5信息清盘..................................................... 8 2.6信息查询..................................................... 8 2.7源程序...................................................... 10 3设计结果与分析 ................................................... 16 3.1菜单函数功能测试............................................ 16 4.2输入功能函数测试............................................ 16 3.3输出功能函数测试............................................ 17 3.4清盘功能函数测试............................................ 17 3.5存盘功能函数测试............................................ 17 3.6查询功能函数测试............................................ 18 总结............................................................... 19 参考文献........................................................... 20
1 系统功能概述 1.1
系统功能 实现的方法是先定义一个二叉树,该二叉树上的每个结点由三个元素组成:姓名、指向它左孩子的指针、以及指向它右孩子的指针构成。该家谱管理系统将信息用文件的方法进行存储管理,再从文件中将成员信息以递归的方法创建二叉树。该输入成员信息的方法是将父亲结点存上父亲的信息,然后父亲结点的左孩子存上母亲的信息,母亲结点的右孩子存上孩子的信息。 (1)定义结构体 结构体为表示一个对象的不同属性提供了连贯一致的方法,结构体类型的说明从关键词struct开始,成员可以由各种数据类型混合构成,成员甚至还可以是数组或者其他类型的结构,但是,结构体中不能包含自身定义类型的成员。本文定义了两个结构体,分别是家族成员和二叉树结点的结构体。代码如下: typedef struct fnode {
char father[NAMEWIDTH];
char wife[NAMEWIDTH];
char son[NAMEWIDTH]; }FamT typedef struct tnode
char name[NAMEWIDTH]; struct tnode *lchild,* }BT (2) 二叉树的建立 二叉树的结点有三个域,数据域和两个指针域,数据域用来存放数据,两个指针域分别存放指向该结点左右孩子的指针。并且还有个root结点,称二叉树的根节点。代码如下: BTree *CreatBTree(char *root,FamType fam[],int n)
} (3)家族成员信息的输入 依次输入一个家庭的父亲、母亲和孩子的姓名。并将它们保存在相应的文件里。 (4)家族成员信息的输出 依次输出每个家庭的父亲、母亲和孩子的姓名。 (5)查找某人的儿子
首先输入父亲的姓名,在二叉树中查找是否有此人,如果没有就输出不存在这样的父亲。如果有就先查看它的左孩子是否存在,不存在就输出这个父亲没有 2 int i=0,j; BTree *bt,*p; bt=(BTree *)malloc(sizeof(BTree)); strcpy(bt->name,root); bt->lchild=bt->rchild=NULL; while(i
i++; if(i
} return(bt); p=(BTree *)malloc(sizeof(BTree)); p->lchild=p->rchild=NULL; strcpy(p->name,fam[i].wife); bt->lchild=p; for(j=0;j
if(strcmp(fam[j].father,root)==0) {
} p->rchild=CreatBTree(fam[j].son,fam,n); p=p-> 妻子,如果存在就查找左孩子的右孩子,没有右孩子就输出这个父亲没有孩子,存在就输出右孩子的姓名,即为查找到的儿子。 (6)查找某人的祖先 采用后序非递归遍历方法输入从根结点到*s结点的路径,首先输入一个成员的姓名,用一个栈存入查找的路径,当找到时栈中的元素即为它的所有祖先。 该家谱管理系统将各个家庭的信息以文件的形式存储,具体步骤如下图: 文件
图1 文件存储功能模块图 保存 输入父亲、母亲和儿子的姓名 输入
该家谱管理系统还将各个成员的信息以及成员之间的关系存储在二叉树上,具体存储方式如下图:
儿子1 母亲 父亲 儿子2
3 包含总结汇报、党团工作、办公文档、考试资料、教学教材、文档下载以及C语言二叉树家谱管理系统等内容。本文共5页
相关内容搜索