版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、WORD格式家族关系查询系统1 课程设计介绍1.1 课程设计工程简介家谱是一种以表谱形式, 记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书载体。家谱是中国特有的文化遗产,是中华民族的三大文献之一,属珍贵的人文资料,对于历史学,民俗学,人口学,社会学和经济学的深入研究,均有不可替代的重要功能。本工程对家谱管理进展简单的模拟,以实现查看祖先和子孙个人信息 、插入家族成员等功能。1.2 课设题目分析本程序的实质是完成对家谱成员信息的建立、查找、插入等功能。可以首先定义家族成员的数据构造,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。本程
2、序包含以下几个模块( 1建立家族关系树。 此模块将构建一个家族关系, 对数据初始化,构造关系树并录入数据一遍后续程序使用。( 2添加新成员。 此模块将添加一个新成员, 实现对家族关系的修改。( 3家族关系的查询。此模块将实现对家族不同关系的查询( 4主程序模块。 此模块实现整个程序的进入和进出, 以及各种初始化处理。( 51.3 课程题目原理与数据构造因为家族的成员之间存在一个对多个的层次构造关系, 所以不能用线性表来表示和实现。家谱从形状上看像一颗倒长的树,所以用树构造来表示比较适宜。树形构造是一类非常重要的非线性数据构造,直观看来树是以分支关系定义的层次构造。因此本课程设计可以采用的数据构
3、造有树状构造和队列。树状构造采用三叉链表来实现,队列采用链式队列实现。专业资料整理WORD格式1专业资料整理WORD格式家族关系查询系统1.4 功能分析说明图家族关系查询系统打添员 按建关开加立一一系退一个个查出个家家找系家族庭各统族关成个关系员家系庭成查查查查查查查查找找找找找找找找一一成成一成一成个员员个个员个员成祖是成成的成的员先第员员堂员子的路几双的兄的孙祖径代亲兄弟孩后先弟子代专业资料整理WORD格式2专业资料整理WORD格式家族关系查询系统2 分析与实现2.1根本数据构造和栈队的操作2.1.1结点根本数据构造和链队的定义/* 家族关系树实现 */#include <strin
4、g.h>#include <malloc.h>#include<limits.h>#include<stdio.h>#include<stdlib.h>#include<io.h>#include<math.h>#include<process.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR -1#define INFEASIBLE -1typedef char DataType;#define MAXNUM 20typedef struc
5、t TriTNode/* 树的三叉链表存储构造 */ DataType dataMAXNUM;struct TriTNode *parent; /* 双亲 */struct TriTNode *lchild; /* 左孩子 */struct TriTNode *rchild; /* 右孩子 */TriTree;typedef struct Node/* 队列的结点构造 */TriTree *info;struct Node *next;Node;typedef struct/* 队列类型定义 */struct Node *front;/* 头指针 */专业资料整理WORD格式3专业资料整理WO
6、RD格式家族关系查询系统struct Node *rear;/* 尾指针 */LinkQueue;DataType fnameMAXNUM,family50MAXNUM;/*全局变量*/2.1.2链队的根本操作LinkQueue *LQueueCreateEmpty( )/* 建立一个空队列 */ LinkQueue *plqu=(LinkQueue *)malloc( sizeof(LinkQueue); if (plqu!=NULL)plqu->front=plqu->rear=NULL;elseprintf( "内存缺乏! n");return NULL;
7、return plqu;int LQueueIsEmpty(LinkQueue *plqu)/* 判断表示队列是否为空队列 */return(plqu->front=NULL);void LQueueEnQueue(LinkQueue *plqu,TriTree *x)/* 进队列 */Node *p=(Node *)malloc( sizeof(Node);if (p=NULL)printf( "内存分配失败! n");elsep->info=x;p->next=NULL;if (plqu->front=NULL) /* 原来为空队 */plqu-
8、>front=p;elseplqu->rear->next=p;plqu->rear=p;专业资料整理WORD格式4专业资料整理WORD格式家族关系查询系统int LQueueDeQueue(LinkQueue *plqu,TriTree *x)/* 出队列 */Node *p;if (plqu->front=NULL)printf( "队列空! n");return ERROR;elsep=plqu->front;x=p->info;plqu->front=plqu->front->next;free(p);re
9、turn OK;TriTree *LQueueGetFront(LinkQueue *plqu) /* 在非空队列中求队头元素 */return(plqu->front->info);2.2 建立家族关系2.2.1建立家族关系并存入文件根本思想: 首先输入家族关系的名称,以此名称为文件名,建立文本文件接下来按层次输入结点信息,输入一个在文件中写入一行同时将输入的信息保存到二位字符数组 family 中。字符数组 family 是全局变量,存储临时信息 . 注意,输入时每个结点信息占一行, 一个结点有多个专业资料整理WORD格式5专业资料整理WORD格式家族关系查询系统兄弟,以“ 作
10、为兄弟完毕标志,结点假设无孩子,直接以“ 代替。依次输入各节点信息,以“ #作为完毕标志。最后使用函数 CreateTriTree 建立家族关系树 .lixianliguoyuliguojunliguoqiangliyongzhiliyongruiliyongmingliwendeliwenjiaTriTree *Create(DataType familynameMAXNUM) /* 建立家族关系并存入文件 */int i=0;/* i 控制 family 数组下标 */DataType ch,strMAXNUM;/* ch 存储输入的 y或n,str存储输入的字符串 */TriTree *
11、t;FILE *fp;strcpy(fname,familyname);/* 以家族名为文本文件名存储*/strcat(fname,".txt" );fp=fopen(fname,"r" );/* 以读取方式翻开文件 */if(fp)/* 文件已存在 */fclose(fp);printf( "%s 的家族关系已存在!重新建立请按“ Y,直接翻开请按“Nn",familyname);ch=getchar();getchar();/* 接收回车 */if (ch='N'|ch='n')专业资料整理WORD
12、格式6专业资料整理WORD格式家族关系查询系统t=Open(familyname);/* 直接翻开 */return t;if(!fp|ch='Y'|ch='y')/* 重新建立,执行以下操作*/fp=fopen(fname,"w" );/* 以写入方式翻开文件,不存在那么新建 */printf( "请按层次输入结点,每个结点信息占一行n");printf( "兄弟输入完毕以“ 为标志,完毕标志为 “ #n. ");gets(str);fputs(str,fp);fputc('n',fp
13、);strcpy(familyi,str);/* 将成员信息存储到字符数组中*/i+;/* family 数组下标后移 */while(str0!= '#')printf( ". ");/* 以点提示符提示继续输入*/gets(str);fputs(str,fp);/* 写到文件中,每个信息占一行*/fputc('n',fp);strcpy(familyi,str); /* 将成员信息存储到字符数组中*/i+;/* family 数组下标后移 */fclose(fp);/*关闭文件 */t=TriTreeCreate(); /* 根据 fam
14、ily 数组信息创立三叉树 */ printf( "家族关系已成功建立! n");return t;/* 返回树 */2.2.2建立家族关系树专业资料整理WORD格式7专业资料整理WORD格式家族关系查询系统根本思想 :采用指针数组作为指针, 保存输入的结点地址。队列的尾指针指向当前结点。头指针指向当前结点的双亲结点。输入的结点信息已存储在字符数组family中。将信息复制到字符串数组“ ch中,如果 "ch" 不是“ ,那么建立一个新结点。假设新结点是第一个结点,那么它是根结点,将其入队,指针 tree 指向这个根节点; 如果不是根结点, 那么将当前结
15、点到双亲结点上,即当前结点的双亲指针就是队头元素,然后将当前结点入队列。接着判断flag的值,如果 flag=0 ,表示当前结点没有左孩子,那么当前结点就是双亲的左孩子。否那么,当前结点就是双亲的右孩子。用指针root 指向刚刚入队的结点。继续复制数组 family的下个元素。如果“ ch 是。那么flag=0因为“ 后面的第一个孩子为左孩子,同时判断“ 是否是第一次出现,如果是第一次,那么令标志star=1 ;如果不是第一次出现。那么出队列, root 指向队头元素实际上root 总是指向双亲结点。继续复制 family的下一个元素。知道遇到“#完毕。函数返回指针 tree 。/* 建立家族
16、关系树 */TriTree *TriTreeCreate()TriTree *t,*x=NULL,*tree,*root=NULL;LinkQueue *q=LQueueCreateEmpty();/* 建立一个空的队列,存储指向树的指针 */int i=0,flag=0,start=0;DataType strMAXNUM;/* 存放 family 数组*息 */strcpy(str,familyi);/* 复制 */i+;/* family 数组下标后移 */while(str0!= '#')/* 没遇到完毕标志继续循环*/while(str0!= '')/
17、*没遇到兄弟输入完毕标志继续*/if (root=NULL)/* 空树 */root=(TriTree *)malloc( sizeof(TriTree); /* 申请空间 */strcpy(root->data,str);专业资料整理WORD格式8专业资料整理WORD格式家族关系查询系统root->parent=NULL;root->lchild=NULL;root->rchild=NULL;LQueueEnQueue(q,root);/* 将root存入队列 */tree=root;else/* 不为空树 */t=(TriTree *)malloc( sizeof(
18、TriTree); /* 申请空间*/strcpy(t->data,str);t->lchild=NULL;t->rchild=NULL;t->parent=LQueueGetFront(q);/* 当前结点的双亲为队头元素 */LQueueEnQueue(q,t);/* 入队 */if (!flag)/* flag 为,当前结点没有左孩子*/root->lchild=t;else/* flag 为,当前结点已有左孩子*/root->rchild=t;root=t;/* root 指向新的结点 t */flag=1;/* 标记当前结点已有左孩子*/strcp
19、y(str,familyi);i+;if (start!=0)/* 标记不是第一次出现“ */LQueueDeQueue(q,x);/* 出队 */if (q->front!=NULL)root=LQueueGetFront(q);/* root 为队头元素 */start=1;/* 标记已出现过“ */flag=0;/*“ 后面的结点一定为左孩子*/strcpy(str,familyi);专业资料整理WORD格式9专业资料整理WORD格式家族关系查询系统i+;return tree;/* 返回树 */2.3 翻开一个家族关系首先输入家族关系名,以家族名为文件名翻开文件,如果家族关系不存
20、在,返回空;如果存在,文件翻开,读取文件。将文件的每行信息依次存储在数组 family 【】中。/* 翻开一个家族关系 */TriTree *Open(DataType familynameMAXNUM)int i=0,j=0;DataType ch;FILE *fp;TriTree *t;strcpy(fname,familyname);/* 以家族名为文本文件名存储*/strcat(fname,".txt" );fp=fopen(fname,"r" );/* 以读取方式翻开文件 */if(fp=NULL)/* 文件不存在 */printf( &quo
21、t;%s 的家族关系不存在! n",familyname); return NULL;elsech=fgetc(fp);/*按字符读取文件 */while(ch!=EOF)/* 读到文件尾完毕 */if (ch!='n')/* ch 不为一个结点信息的结尾*/familyij=ch;/* 将文件信息存储到 family 数组中 */j+;else专业资料整理WORD格式10专业资料整理WORD格式家族关系查询系统familyij= '0'/* 字符串完毕标志 */i+;/* family 数组行下标后移 */j=0;/* family 数组列下标归零
22、*/ch=fgetc(fp);/* 继续读取文件信息 */fclose(fp);/*关闭文件 */t=TriTreeCreate(family);/* 调用函数建立三叉链表 */printf( "家族关系已成功翻开!n");return t;2.4 在家族关系中查找一个成员是否存在用递归算法实现。如果树空,返回 NULL。如果根节点就是要查找的成员,返回根节点;否那么,递归查找它的左右子树。/* 查找一个成员是否存在 */TriTree *Search(TriTree *t,DataType str)TriTree *temp;if(t=NULL)/* 如果树空那么返回 N
23、ULL */return NULL;elseif (strcmp(t->data,str)=0) /* 如果找到返回该成员指针*/return t;else/* 如果没找到遍历左右子树进展查找*/temp=Search(t->lchild,str); /* 递归查找 */if (temp)/*结点不空那么查找 */return(Search(t->lchild,str);elsereturn(Search(t->rchild,str);2.5向家族中添加一个新成员专业资料整理WORD格式11专业资料整理WORD格式家族关系查询系统根本思想:添加的新成员要根据其双亲确定其
24、在家族中的位置。首先判断该双亲是否在此家族关系中,假设存在那么查找其双亲,将新结点插入其双亲的最后一个孩子之后;假设没有孩子,那么直接作为左孩子插入。以写入的方式翻开文件,如果成功翻开,那么更新 family 数组中的信息,并查找新成员的双亲所在位置和其对应的“ 个数,如果“ 个数小于双亲位置,那么添加“ 实质相等,新成员不插入到最后“ 之前。最后将 family 数组*息写入文件保存,关闭文件。/* 添加一个新成员 */void Append(TriTree *t)int i=0,j,parpos=1,curpos,num,end=0,count=-1;DataType chiMAXNUM,
25、parMAXNUM; /* 存储输入的孩子和其双亲结点 */TriTree *tpar,*temp;FILE *fp;printf( "请输入要添加的成员和其父亲,以回车分隔! n. "); gets(chi);printf( ". ");/* 以点提示符提示继续输入*/gets(par);tpar=Search(t,par); /*查找双亲结点是否存在 */if(!tpar)printf( "%s 该成员不存在! n");else/* 存在那么添加其孩子 */temp=(TriTree *)malloc( sizeof(TriTre
26、e); /* 申请空间 */temp->parent=tpar;strcpy(temp->data,chi);temp->lchild=NULL;/* 新结点左右孩子置空 */temp->rchild=NULL;if (tpar->lchild)/* 成员存在左孩子 */tpar=tpar->lchild; /* 遍历当前成员左孩子的右子树*/while(tpar->rchild)/* 当前结点右孩子存在 */tpar=tpar->rchild;/* 继续遍历右孩子 */tpar->rchild=temp;/* 将新结点添专业资料整理WOR
27、D格式12专业资料整理WORD格式家族关系查询系统加到所有孩子之后 */else/* 没有孩子那么直接添加 */tpar->lchild=temp;fp=fopen(fname,"w" );/* 以写入方式翻开文件 */if (fp)while(strcmp(par,familyi)!=0&&familyi0!='#')if (familyi0!= '')/* 查找双亲在数组中位置 */parpos+;/* parpos计数 */i+;/* family 数组行下标后移 */i=0;/* family 数组行下标归 */
28、while(familyi0!= '#')if (familyi0= '')/* 查找“ 的个数,第一个不计 */count+;/* count 累加个数 */if (count=parpos)/* 说明此“ 与其前一个“之前为 par的孩子 */curpos=i;/* curpos计当前位置 */i+;/* family 数组行下标后移 */if (count<parpos)/*“ 数小于 parpos数 */num=parpos-count; /* 添加“ 个数为 num */ for(j=i;j<=i+num;j+) /* 从数组末尾添加“ *
29、/strcpy(familyj, "0" );strcpy(familyi+num+1, "#0");/*“移#到数组末尾 */strcpy(familyi+num-1,chi);/* 在最后一个“ 前添加新成员 */end=1;/* end为时标记已添加 */else专业资料整理WORD格式13专业资料整理WORD格式家族关系查询系统for(j=i;j>=curpos;j-)/* 当前位置到数组最后的全部信息后移一行*/strcpy(familyj+1,familyj); strcpy(familycurpos,chi); /* 将新结点存储到“
30、 的前一行 */if (end=1) /* 假设end为,那么数组末尾下标后移num位*/i=i+num;for(j=0;j<=i+1;j+)/* 将数组所有信息写入文件*/fputs(familyj,fp);fputc('n',fp);/* 一个信息存一行 */fclose(fp);/* 关闭文件 */printf( "添加新成员成功! n");elseprintf( "添加新成员失败! n");2.6家族成员关系的相关查询2.6.1查找一个家族的鼻祖判断输入的*是否在该家族中存在,如果存在,那么返回该家族的根节点信息。/* 查找
31、一个家族的祖先 */void Ancesstor(TriTree *t)/* 返回树的根结点信息 */printf( "该家族的祖先为 %sn",t->data);专业资料整理WORD格式14专业资料整理WORD格式家族关系查询系统2.6.2查找一个成员的所有祖先路径查找一个成员的所有祖先路径,需要从它的双亲一直向上查找到根结点。根本思想:对与结点 t ,先判断它是否是根结点 根节点的双亲是NULL,如果是根结点,直接输出它本身;如果不是,查找它的双亲指针指向的结点,将双亲信息输出。继续查找,直到找到根结点。/* 查找一个成员的所有祖先*/void Ancesstor
32、Path(TriTree *t)if(t->parent=NULL)/* 假设该成员为祖先,那么直接输出*/printf( "%s 无祖先! n",t->data);else/* 否那么继续查找祖先 */printf( "%s 所有祖先路径: %s",t->data,t->data); while(t->parent!=NULL) /* 假设当前成员的双亲不是祖先,那么继续查找 */printf( " -> %s",t->parent->data); /* 访问当前成员的双亲 */t=t
33、->parent;/* 继续循环查找 */printf( "n" );2.6.3查找一个成员的双亲根本思想:先判断结点 t 是否是根结点,过不是根结点,直接输出该结点双亲指针的结点信息;假设是根结点,输出提示信息,结点无双亲。专业资料整理WORD格式15专业资料整理WORD格式家族关系查询系统/* 查找一个成员的双亲 */void Parent(TriTree *t)if(t->parent!=NULL)/* 假设该成员为祖先,那么无双亲*/printf( "%s 的双亲为 %sn",t->data,t->parent->d
34、ata); elseprintf( "%s 无双亲! n",t->data);2.6.4确定一个成员是第几代确定一个成员是第几代,只要知道从它本身到根结点包括的祖先个数就可。因而对于跟结点 t ,从它本身开场一直向上查找到根结点,查找的过程中用变量 count 初值为 1计数,最后输出 count 。/*确定一个成员是第几代 */void Generation(TriTree *t)intcount=1;/*计数 */DataType strMAXNUM;strcpy(str,t->data);/*存储当前信息 */while (t->parent!=NU
35、LL) /* 查找其双亲 */ count+;/*累加计数 */t=t->parent;printf("%s 是第 %d 代! n" ,str,count);2.6.5查找一个成员的兄弟一个成员的为其双亲除了该成员以外的所有孩子。根本思想:对于结点 t ,先判断它是否是跟结点,假设是根结点,那么无兄弟;假设不是根结点,那么找到结点 t 的双亲。接着判断双亲的左孩子和左孩子的兄弟是否都存在假设只有左孩子,左孩子就是要查找的这个成员,如果都不存在,那么无兄弟;如果专业资料整理WORD格式16专业资料整理WORD格式家族关系查询系统都存在,对双亲的左孩子操作。假设左孩子不是
36、要查找的这个成员,那么将结点信息输出。接下来查找左孩子的右兄弟,判断当前结点是否是要查找的这个成员,假设不是,那么将结点信息输出,继续查找当前结点的右兄弟,直到 NULL为止。/* 查找一个成员的兄弟 */void Brothers(TriTree *t,DataType str)/*查找兄弟 */if(t->parent!=NULL)/*假设该结点是祖先,那么无兄弟 */t=t->parent;*/* 该结点的兄弟即为其双亲除该成员以外的所有孩子if (t->lchild&&t->lchild->rchild)/*当前结点的左孩子及其右孩子都存在
37、 */printf( "%s的所有兄弟有: " ,str);t=t->lchild;while(t)/* 遍历当前成员左孩子的右子树 */if (strcmp(t->data,str)!=0)/*遍历右子树,选择输出 */printf( "%s ",t->data); /*访问当前结点 */t=t->rchild;printf( "n");elseprintf( "%s 无兄弟! n",str);elseprintf( "%s 无兄弟! n",str);2.6.6查找一个
38、成员的堂兄弟一个成员的堂兄弟为其双亲的双亲结点的所有孩子的孩子该成员除外 .专业资料整理WORD格式17专业资料整理WORD格式家族关系查询系统根本思想:如果结点 t 的双亲和双亲的双亲 爷爷都存在,首先考虑爷爷的左孩子。如果爷爷的左孩子不是结点 t 的双亲,那么爷爷还有其他孩子。现对爷爷的左孩子的左孩子访问,如果不是结点 t 就输出。同样,对爷爷左孩子的左孩子的右孩子、右孩子的右孩子一直访问下去,直到无右孩子为止。如果爷爷还有其他孩子,那么就对爷爷的左孩子的右孩子、爷爷的左孩子的右孩子的右孩子 - 即对爷爷的其他孩子做一样的处理。/* 查找一个成员的堂兄弟 */void Consin(Tri
39、Tree *t)int flag=0;TriTree *ch=t;TriTree *temp;if(t->parent&&t->parent->parent)/* 当前结点的双亲及其双亲都存在 */t=t->parent->parent->lchild;/* 当前结点等于其祖先的第一个孩子 */while(t)/* 存在那么继续查找 */if (strcmp(t->data,ch->parent->data)!=0)/* 不是同一结点 */if (t->lchild)/* 当前结点存在左孩子 */temp=t->
40、lchild;while(temp)/* 遍历当前结点左孩子的右子树 */if (strcmp(temp->data,ch->data)!=0)if (!flag)/* 第一次输入时先输出下句 */printf( "%s 的所有堂兄弟有:" ,ch->data);printf( "%s",temp->data);/* 访问当专业资料整理WORD格式18专业资料整理WORD格式家族关系查询系统前成员 */flag=1;temp=temp->rchild;/* 继续遍历右孩子 */t=t->rchild;/* 继续遍历右孩
41、子 */printf( "n" );if(!flag)/* 标志没有输出结点 */printf( "%s 无堂兄弟! n",ch->data);2.6.7查找一个成员的所有孩子一个成员的所有孩子包括左孩子和左孩子的右孩子、左孩子的右孩子的右孩子 - 直到右孩子为空为止。根本思想:首先判断结点 t 是否有左孩子,如果没有,输出没有孩子;如果有左孩子,输出左孩子的信息,然后判断左孩子的右孩子是否为空,假设不为空存在右孩子,输出左孩子的右孩子的信息,接着循环判断结点是否有右孩子,有就输出,直到右孩子为空。/* 查找一个成员的所有孩子*/void Chil
42、dren(TriTree *t)/* 遍历左孩子 */if(t->lchild)/* 当前结点存在左孩子 */printf( "%s 的所有孩子有: ",t->data);t=t->lchild;/* 遍历当前成员左孩子的右子树*/while(t)/* 不空 */printf( "%s",t->data);/* 访问当前成员 */t=t->rchild;专业资料整理WORD格式19专业资料整理WORD格式家族关系查询系统printf( "n" );elseprintf( "%s 无孩子! n&q
43、uot;,t->data);/* 中序遍历一棵树 */void InOrder(TriTree *t)if(t)/* 二叉树存在 */InOrder(t->lchild);/*中序遍历左子树 */printf( "%s",t->data);/* 访问成员 */InOrder(t->rchild);/* 中序遍历右子树 */2.6.8查找一个成员的子孙后代一个成员的子孙后代就是其左子树上的所有结点,所以对其左子树进展中序遍历即可。/* 查找一个成员的子孙后代*/void Descendants(TriTree *t)/* 遍历左孩子 */if(t-&g
44、t;lchild)/* 当前结点存在左孩子 */printf( "%s 的所有子孙后代有: ",t->data); InOrder(t->lchild); /* 中序遍历当前结点的左右子树 */ printf( "n" );elseprintf( "%s 无后代! n",t->data);2.7各软件之间的调用方式该软件各个模块的调用主要是通过声明函数,和定义函数专业资料整理WORD格式20专业资料整理WORD格式家族关系查询系统再通过主函数调用实现的。主函数:/* 主控函数 */int main(int argc,
45、char* argv)DataType strMAXNUM= "0",input40;int i,j,flag,start=0,pos,tag1,tag2;TriTree *temp,*tree=NULL;while(1)printf( "t 欢迎使用家族关系查询系统!n");printf( "t 请输入与之匹配的函数和参数,如parent(C)n");printf( "t 1. 新建一个家庭关系:Create(familyname)参数为字符串 n");printf( "t 2. 翻开一个家庭关系:Op
46、en(familyname)参数为字符串 n");printf( "t 3. 添加新成员的信息:Append()无参数 n");printf( "t 4. 查找一个成员的祖先:Ancesstor(name)参数为字符串 n");printf( "t 5. 查找一个成员的祖先路径:AncesstorPath(name) 参数为字符串 n");printf( "t 6. 确定一个成员是第几代:Generation(name)参数为字符串 n");printf( "t 7. 查找一个成员的双亲:Par
47、ent(name)参数为字符串 n");printf( "t 8. 查找一个成员的兄弟:Brothers(name)参数为字符串 n");printf( "t 9. 查找一个成员的堂兄弟:Consin(name)参数为字符串 n");printf( "t10.查找一个成员的孩子:Children(name)参数为字符串 n");printf( "t11.查找一个成员的子孙后代:Descendants(name)参数为字符串 n");printf( "t12.退出系统:Exit()无参数 n&qu
48、ot; ");专业资料整理WORD格式21专业资料整理WORD格式家族关系查询系统gets(input);/* input 数组存放输入的函数和参数*/j=0,tag1=0,tag2=0;for(i=0;i<strlen(input);i+) /* 循环 input数组 */if (inputi= '(')/* 左括号之前为函数名 */pos=i;/* pos标记左括号位置 */tag1=1;/* 标记是否匹配到左括号 */if (inputi+1= ')')/* 假设下一个字符不为右括号*/tag2=1;/* 标记为 */if (tag1=1&&tag2!=1)/* 左括号和右括号之前为参数 */strj=tolower(inputi+1); /* 将参数存放到 str数组*/j+;/* 并转化为小写字母 */inputi=tolower(inputi);/* 将函数名转化为小写字母 */if (!tag1) /* 假设没匹配到左括号,说明只有函数无参数*/pos=i;/* 标记为数组末尾 */i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中职第二学年(老年护理)实操技能阶段测试题及答案
- 2025年大学健康教育与促进(健康促进方法)试题及答案
- 2025年中职会计(税务会计)试题及答案
- 2025年高职计算机应用(数据处理技术)试题及答案
- 2025年中职电梯安装与维修保养(电梯安装技术)试题及答案
- 2025年高职养老服务应用(应用技术)试题及答案
- 2025年中职第二学年(环境监测技术)环境监测实训试题及答案
- 2025年高职(环境监测技术)化学分析实务试题及答案
- 2025年中职(物流设备基础综合实训)实操试题及答案
- 2025年大学植物生物学(植物分类)试题及答案
- 地坪漆施工方案范本
- 2025宁波市甬北粮食收储有限公司公开招聘工作人员2人笔试参考题库及答案解析
- 民政局笔试题及答案
- 二零二五版中医师承关系合同书
- 个人护理健康知识与技巧
- 《微积分与线性代数》课件
- 锅炉三大安全附件69课件讲解
- (湘美版)五年级上册书法指导练习教案
- 学习方法总结高效学习的技巧与方法
- 综合医院心身疾病诊治
- 港口安全生产管理模版
评论
0/150
提交评论