这是实训时候完全自己写的,输入出生日期的时候一定按要求去输入(以防出错),下面是老师给我们的要求:
●建立输入文件以存放最初家谱中各成员的信息。
● 成员的信息中均应包含以下内容:
●姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)
●也可附加其它信息、但不是必需的。
● 能对修改后的家谱存盘以备以后使用。
●能从文件中读出已有的家谱,形成树状关系。
●家谱建立好之后,以图形方式显示出来。
●显示第 n代所有人的信息。
●按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
●按照出生日期查询成员名单。
●输入两人姓名,确定其关系。
●某人添加孩子。
●删除某人(若其还有后代,则一并删除)。
●修改某人信息。
●按出生日期对家谱中所有人排序。
●打开一家谱时,若家谱中某人的生日在打开家谱的那一天,应给出提示。
下面是程序代码(用文本过滤一下粘贴到工程中就可用):
#include #include #include #include #define OK 1 #define FALSE 0 #define ERROR -1 typedef int status; typedef struct { int num;//孩子个数 char name[20];///姓名 char sex;//性别 //bool is_spouse;//配偶是否存在 char spouse[20];//配偶的姓名,性别取反 }DataType; typedef struct TNode{ DataType data;//数据域 struct TNode* nextstr[10];//指针域,指向孩子 struct TNode* parent;//指针域,指向父亲 }PedTNode,*PedTree;//家谱树 void OutMenu();//输出家谱菜单 void CreateNewPedTreeNode(PedTree Tree);//创建孩子,递归调用 void CreatePedTree(PedTree Tree);//创建Pedigree树 void OutOneInfor(PedTree Tree);//递归调用实现输出整个家谱树 void OutAllPedTree(PedTree Tree);//输出整个家谱信息 //PedTree SearchPedTree(PedTree Tree,char Name[]);//在树中查找 bool SearchPedTree(PedTree Tree,char Name[],PedTree* DrawTree);//在树中查找 bool SearchPedTree2(PedTree Tree,char Name[],PedTree* DrawTree);//在树中查找配偶是否匹配 void ShowMenu1(PedTree Tree);//显示要查找人的信息 //void ShowSelfInfor(PedTree Tree,char Name[],int Length);//显示个人信息 void ShowMenu2();//显示添加信息的菜单 int AddNewInfor(PedTree Tree);//添加新的家谱信息 void AddChildInfor(PedTree Tree);//添加子女的信息 void AddPouseInfor(PedTree Tree);//添加配偶信息 int ChangeInfor(PedTree Tree);//修改家谱信息 void ShowMenu3();//显示修改信息的菜单 int main() { char choice; system("color 1f"); PedTNode TreeNode; PedTree Tree=&TreeNode; bool flag=false;//标志是否执行建立家谱 //PedTree Tree=NULL; while(1) { fflush(stdin);//清除键盘缓冲区 system("cls"); OutMenu(); printf("\\n"); printf("\\请您选择:"); choice=getchar(); switch(choice) { case '1': if(!flag) { CreatePedTree(Tree);//创建Pedigree树 flag=true; } else { printf("\\n\\家谱不能多次建立\\n"); printf("\\n\\按任意键继续:"); fflush(stdin); getch(); } break; case '2': if(flag) ShowMenu1(Tree);//显示要查找人的信息 else { printf("\\n\\家谱未建立,请您先建立家谱\\n"); printf("\\n\\按任意键继续:"); fflush(stdin); getch(); } break; case '3': if(flag) AddNewInfor(Tree);//添加新的家谱信息 else { printf("\\n\\家谱未建立,请您先建立家谱\\n"); printf("\\n\\按任意键继续:"); fflush(stdin); getch(); } break; case '4': if(flag) OutAllPedTree(Tree);//输出整个家谱信息 else { printf("\\n\\家谱未建立,请您先建立家谱\\n"); printf("\\n\\按任意键继续:"); fflush(stdin); getch(); } break; case '5': if(flag) ChangeInfor(Tree);//修改家谱信息 else { printf("\\n\\家谱未建立,请您先建立家谱\\n"); printf("\\n\\按任意键继续:"); fflush(stdin); getch(); } break; case '6': return 0; } } //return 0; } void OutMenu() { printf("\\* * * * * * * * * * * * * * * * * * * * * * *\\n"); printf("\\* *\\n"); printf("\\* 家谱信息管理菜单 *\\n"); printf("\\* *\\n"); printf("\\* 1:输入家谱信息 *\\n"); printf("\\* 2:查找并输出某人信息 *\\n"); printf("\\* 3:添加新的家庭成员 *\\n"); printf("\\* 4:输出整个家谱信息 *\\n"); printf("\\* 5:修改某个人的信息 *\\n"); printf("\\* 6:退出整个程序 *\\n"); printf("\\* *\\n"); printf("\\* * * * * * * * * * * * * * * * * * * * * * *\\n"); } void CreatePedTree(PedTree Tree)//创建Pedigree树 { fflush(stdin);//清除键盘缓冲区 system("cls"); /*Tree=(PedTree)malloc(sizeof(PedTNode)); if(!Tree) { printf("Insufficient Memory!\\n"); exit(-1); }*/ printf("\\请输入姓名:"); scanf("%s",Tree->data.name); printf("\\请输入性别(G女B男):"); //scanf("%c",&(Tree->data.sex)); fflush(stdin); (Tree->data.sex)=getchar(); printf("\\请输入%s子女的个数:",Tree->data.name); scanf("%d",&(Tree->data.num)); printf("\\请输入%s配偶的名字(配偶不存在,请输入):",Tree->data.name); scanf("%s",Tree->data.spouse); if(strcmp(Tree->data.spouse,"0")==0 && Tree->data.num!=0) { printf("\\%s的配偶不存在,不能有孩子!\\n",Tree->data.name); Tree->data.num=0; } Tree->parent=NULL; for(int i=0;i { printf("\\n"); PedTree ChildTree=(PedTree)malloc(sizeof(PedTNode)); if(!ChildTree) { printf("Insufficient Memory!\\n"); exit(-1); } Tree->nextstr[i]=ChildTree;//指向子女 printf("\\请输入%s的第%d个子女的姓名:",Tree->data.name,i+1); scanf("%s",ChildTree->data.name); printf("\\请输入%s的第%d个子女的性别(G女B男):",Tree->data.name,i+1); fflush(stdin);//清除键盘缓冲区 scanf("%c",&(ChildTree->data.sex)); printf("\\请输入%s的第%d个子女的个数:",Tree->data.name,i+1); scanf("%d",&(ChildTree->data.num)); printf("\\请输入%s的第%d个子女的配偶的姓名(配偶不存在,请输入):",Tree->data.name,i+1); scanf("%s",ChildTree->data.spouse); if(strcmp(ChildTree->data.spouse,"0")==0 && ChildTree->data.num!=0) { printf("\\%s的配偶不存在,不能有孩子!\\n",ChildTree->data.name); ChildTree->data.num=0; } ChildTree->parent=Tree;//将孩子指向父母 CreateNewPedTreeNode(ChildTree); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\n\\- - - - 家谱建造成功- - - - - \\n"); printf("\\n\\按任意键继续:"); getch(); } void CreateNewPedTreeNode(PedTree Tree)//创建孩子,递归调用 { for(int i=0;i { printf("\\n"); PedTree ChildTree=(PedTree)malloc(sizeof(PedTNode)); if(!ChildTree) { printf("\\Insufficient Memory!\\n"); exit(1); } Tree->nextstr[i]=ChildTree;//指向子女 printf("\\请输入%s的第%d个子女的姓名:",Tree->data.name,i+1); scanf("%s",ChildTree->data.name); printf("\\请输入%s的第%d个子女的性别(G女B男):",Tree->data.name,i+1); fflush(stdin);//清除键盘缓冲区 scanf("%c",&(ChildTree->data.sex)); printf("\\请输入%s的第%d个子女的个数:",Tree->data.name,i+1); scanf("%d",&(ChildTree->data.num)); printf("\\请输入%s的第%d个子女的配偶的姓名(配偶不存在,请输入):",Tree->data.name,i+1); scanf("%s",ChildTree->data.spouse); if(strcmp(ChildTree->data.spouse,"0")==0 && ChildTree->data.num!=0) { printf("\\%s的配偶不存在,不能有孩子!\\n",ChildTree->data.name); ChildTree->data.num=0; } ChildTree->parent=Tree;//将孩子指向父母 CreateNewPedTreeNode(ChildTree); } } void OutAllPedTree(PedTree Tree)//输出整个家谱信息 { fflush(stdin);//清除键盘缓冲区 system("cls"); printf("\\n\\n\\整个家谱主要的信息如下:\\n"); printf("\\---***---***---***---***---***---***---\\n"); //puts(Tree->data.name); printf("\\姓名:%s ",Tree->data.name); if(Tree->data.sex=='b'||Tree->data.sex=='B') { printf("性别:男\\n"); printf("\\太太姓名:%s\\n",Tree->data.spouse); } else { printf("性别:女\\n"); printf("\\丈夫姓名:%s\\n",Tree->data.spouse); } for(int i=0;i { printf("\\第%d个子女的姓名:%s ",i+1,(Tree->nextstr[i])->data.name); if(((Tree->nextstr[i])->data.sex)=='b'||((Tree->nextstr[i])->data.sex)=='B') printf("性别:男\\n"); else printf("性别:女\\n"); } for(int j=0;j { //if((Tree->nextstr[j])->data.num!=0) OutOneInfor(Tree->nextstr[j]); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\按任意键继续:"); getch(); } void OutOneInfor(PedTree Tree)//递归调用实现输出整个家谱树 { printf("\\---***---***---***---***---***---***---\\n"); printf("\\姓名:%s ",Tree->data.name); if(Tree->data.sex=='b'||Tree->data.sex=='B') { printf("性别:男\\n"); printf("\\太太姓名:%s\\n",Tree->data.spouse); } else { printf("性别:女\\n"); printf("\\丈夫姓名:%s\\n",Tree->data.spouse); } for(int i=0;i { printf("\\第%d个子女的姓名:%s ",i+1,(Tree->nextstr[i])->data.name); if(((Tree->nextstr[i])->data.sex)=='b'||((Tree->nextstr[i])->data.sex)=='B') printf("性别:男\\n"); else printf("性别:女\\n"); } for(int j=0;j //if((Tree->nextstr[j])->data.num!=0) OutOneInfor(Tree->nextstr[j]); } void ShowMenu1(PedTree Tree)//显示要查找人的信息 { PedTree TempTree=NULL; char Name[20]; fflush(stdin);//清除键盘缓冲区 system("cls"); printf("\\请输入你要查找的人的姓名:"); scanf("%s",Name); /*if((TempTree=SearchPedTree(Tree,Name))!=NULL)*/ if(SearchPedTree(Tree,Name,&TempTree))//在树中查找 { printf("\\n\\n\\----*----*----*----*----*----*----*----*----*----*----\\n"); if(TempTree->parent!=NULL) { printf("\\姓名:%s ",TempTree->data.name); if((TempTree->data.sex)=='b'||(TempTree->data.sex)=='B') printf("性别:男\\n"); else printf("性别:女\\n"); //输出父母亲的姓名 if((TempTree->parent->data.sex)=='b'||(TempTree->parent->data.sex)=='B') { printf("\\父亲姓名:%s \\n",TempTree->parent->data.name); printf("\\母亲姓名:%s \\n",TempTree->parent->data.spouse); } else { printf("\\父亲姓名:%s \\n",TempTree->parent->data.spouse); printf("\\母亲姓名:%s \\n",TempTree->parent->data.name); } } else { printf("\\姓名:%s ",TempTree->data.name); if((TempTree->data.sex)=='b'||(TempTree->data.sex)=='B') printf("性别:男\\n"); else printf("性别:女\\n"); } //输出配偶信息 if((TempTree->data.sex)=='b'||(TempTree->data.sex)=='B') printf("\\太太姓名:%s \\n",TempTree->data.spouse); else printf("\\丈夫姓名:%s \\n",TempTree->data.spouse); //输出孩子信息 if((TempTree->data.num)!=0) printf("\\孩子信息:\\n"); for(int j=0;j { PedTree ChildTree; ChildTree=TempTree->nextstr[j]; printf("\\姓名:%s ",ChildTree->data.name); if((ChildTree->data.sex)=='b'||(ChildTree->data.sex)=='B') printf("性别:男\\n"); else printf("性别:女\\n"); } printf("\\----*----*----*----*----*----*----*----*----*----*----\\n\\n"); }//if(SearchPedTree(Tree,Name,&TempTree))//在树中查找 else if(SearchPedTree2(Tree,Name,&TempTree))//在配偶中查找 { printf("\\n\\n\\----*----*----*----*----*----*----*----*----*----*----\\n"); printf("\\n\\你要找的人已找到,信息如下:\\n"); printf("\\姓名:%s ",TempTree->data.spouse); if((TempTree->data.sex)=='b'||(TempTree->data.sex)=='B') { printf("性别:女\\n"); printf("\\n\\她已成为本家族的媳妇,所以父母信息不存在家谱中\\n"); printf("\\n\\丈夫姓名:%s\\n",TempTree->data.name); } else { printf("性别:男\\n"); printf("\\n\\他入赘本家族,所以父母信息不存在家谱中\\n"); printf("\\n\\太太姓名:%s\\n",TempTree->data.name); } printf("\\----*----*----*----*----*----*----*----*----*----*----\\n\\n"); }//else if(SearchPedTree2(Tree,Name,&TempTree))//在配偶中查找 else { printf("\\n\\n\\----*----*----*----*----*----*----*----*----*----*----\\n\\n"); printf("\\***该家谱图中没有%s这个人的信息请确认是否输入正确***\\n\\n",Name); printf("\\----*----*----*----*----*----*----*----*----*----*----\\n\\n"); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\按任意键继续:"); getch(); } bool SearchPedTree(PedTree Tree,char Name[],PedTree* DrawTree)//在树中查找 { //if(strcmp(Tree->data.name,Name)==0) // return Tree; //else //{ // for(int i=0;i // { // if(SearchPedTree(Tree->nextstr[i],Name)==NULL) // SearchPedTree(Tree->nextstr[i],Name);//没找到继续找 // else // return Tree->nextstr[i]; // } // return NULL; //} if(strcmp(Tree->data.name,Name)==0) { *DrawTree=Tree; return true; } else { for(int i=0;i { if(SearchPedTree(Tree->nextstr[i],Name,DrawTree)) return true; } return false; } } bool SearchPedTree2(PedTree Tree,char Name[],PedTree* DrawTree)//在树中查找配偶是否匹配 { if(strcmp(Tree->data.spouse,Name)==0) { *DrawTree=Tree; return true; } else { for(int i=0;i { if(SearchPedTree2(Tree->nextstr[i],Name,DrawTree)) return true; } return false; } } int AddNewInfor(PedTree Tree)//添加新的家谱信息 { fflush(stdin);//清除键盘缓冲区 char choice; while(1) { fflush(stdin);//清除键盘缓冲区 system("cls"); ShowMenu2();//显示添加信息的菜单 printf("\\n"); printf("\ 请您选择:"); choice=getchar(); switch(choice) { case '1': AddChildInfor(Tree);//添加子女的信息 break; case '2': AddPouseInfor(Tree);//添加配偶信息 break; case '3': return 0; } } } void AddChildInfor(PedTree Tree)//添加子女的信息 { fflush(stdin);//清除键盘缓冲区 system("cls"); char Name[20]; PedTree TempTree=NULL; printf("\\n\\请输入要添加子女的父母的名字:"); scanf("%s",Name); /*if((TempTree=SearchPedTree(Tree,Name))==NULL)*/ if(SearchPedTree(Tree,Name,&TempTree)||SearchPedTree2(Tree,Name,&TempTree))//在树中查找 { if(strcmp(TempTree->data.spouse,"0")!=0) { PedTree ChildTree; int num=TempTree->data.num; TempTree->nextstr[num]=(PedTree)malloc(sizeof(PedTNode));//父母指向孩子 ChildTree=TempTree->nextstr[num]; if(!ChildTree) { printf("\\Insufficient Memory!\\n"); exit(1); } printf("\\n\\请输入要填家的子女的姓名:"); scanf("%s",ChildTree->data.name); fflush(stdin);//清除键盘缓冲区 printf("\\n\\请输入添加子女的性别(女G 男B):"); scanf("%c",&(ChildTree->data.sex)); (TempTree->data.num)++;//父母孩子数加1 ChildTree->parent=TempTree;//孩子指向父母 strcpy(ChildTree->data.spouse,"0");//将配偶初始为 printf("\\n\\n\\- - - - 子女信息添加成功- - - - - \\n"); } else { printf("\\n\\配偶不存在,不能添加子女信息\\n"); } } else { printf("\\n\\n\\不存在该父母!\\n"); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\按任意键继续:"); getch(); } void AddPouseInfor(PedTree Tree)//添加配偶信息 { fflush(stdin);//清除键盘缓冲区 system("cls"); char Name[20]; bool flag=false; PedTree TempTree=NULL; printf("\\n\\请输入要添加人的配偶的名字:"); scanf("%s",Name); if(!SearchPedTree(Tree,Name,&TempTree))//在树中查找 { printf("\\n\\n\\不存在该人!\\n"); flag=true; } else { if(strcmp(TempTree->data.spouse,"0")==0) { printf("\\n\\请入要填加的人的姓名:"); scanf("%s",TempTree->data.spouse); } else { printf("\\n\\n\\配偶已存在!\\n"); flag=true; } } fflush(stdin);//清除键盘缓冲区 if(!flag) printf("\\n\\n\\- - - - 配偶信息添加成功- - - - - \\n"); printf("\\n\\按任意键继续:"); getch(); } void ShowMenu2()//显示添加信息的菜单 { printf("\\n\\n\\-----****----请选择你的操作----****-----\\n\\n"); printf("\ ----****----1.添加某个人的子女的信息----****----\\n"); printf("\ ----****----2.添加某个人的配偶的信息----****----\\n"); printf("\\n\ ----****---***---3.退出---***----****-----\\n"); } int ChangeInfor(PedTree Tree)//修改家谱信息 { fflush(stdin);//清除键盘缓冲区 system("cls"); char Name[20]; char choice;// char tempch; char TempName[20]; PedTree TempTree; printf("\\n\\请输入要修改人的姓名:"); scanf("%s",Name); if(SearchPedTree(Tree,Name,&TempTree)) { PedTree TempParent=TempTree->parent; while(1) { fflush(stdin);//清除键盘缓冲区 system("cls"); ShowMenu3(); printf("\\n"); printf("\\请您选择:"); choice=getchar(); switch(choice) { case '1': //printf("\\n\\"); printf("\\n\\请输入要修改人的姓名:(不需要修改输入)\\n\\"); scanf("%s",TempName); if(strcmp(TempName,"0")!=0) { strcpy(TempTree->data.name,TempName); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\请输入要修改人的性别:(不需要修改输入)\\n\\"); scanf("%c",&tempch); if(tempch!='0') TempTree->data.sex=tempch; printf("\\n\\----****---***---信息修改成功---***----****-----"); fflush(stdin);//清除键盘缓冲区 printf("\\n\\按任意键继续:"); getch(); break; case '2': if(TempTree->parent==NULL) printf("\\n\\这是家谱中最顶端得人,不存在父母的信息!\\n"); else { printf("\\n\\请输入该人的父母的姓名:(不需要修改输入)\\n\\"); scanf("%s",TempName); if(strcmp(TempName,"0")!=0) { strcpy(TempParent->data.name,TempName); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\请输入该人的父母的性别:(不需要修改输入)\\n\\"); scanf("%c",&tempch); if(tempch!='0') TempParent->data.sex=tempch; printf("\\n\\----****---***---信息修改成功---***----****-----"); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\按任意键继续:"); getch(); break; case '3': if(TempTree->parent==NULL) printf("\\n\\这是家谱中最顶端得人,不存在兄弟姐妹的信息!\\n"); //PedTree TempParent=TempTree->parent; else { for(int i=1;i { printf("\\n\\请输入%s 修改后的姓名:(不需要修改输入)\\n\\",TempParent->nextstr[i]->data.name); scanf("%s",TempName); if(strcmp(TempName,"0")!=0) { strcpy(TempParent->nextstr[i]->data.name,TempName); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\请输入%s 修改后的性别:(不需要修改输入)\\n\\",TempParent->nextstr[i]->data.name); scanf("%c",&tempch); if(tempch!='0') TempParent->nextstr[i]->data.sex=tempch; } printf("\\n\\----****---***---信息修改成功---***----****-----"); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\按任意键继续:"); getch(); break; case '4': if(TempTree->data.num<=0) { printf("\\n\\%s还没有子女,请先添加\\n",TempTree->data.name); } else { for(int i=0;i { printf("\\n\\请输入%s 修改后的姓名:(不需要修改输入)\\n\\",TempTree->nextstr[i]->data.name); scanf("%s",TempName); if(strcmp(TempName,"0")!=0) { strcpy(TempTree->nextstr[i]->data.name,TempName); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\请输入%s 修改后的性别:(不需要修改输入)\\n\\",TempTree->nextstr[i]->data.name); scanf("%c",&tempch); if(tempch!='0') TempTree->nextstr[i]->data.sex=tempch; } printf("\\n\\----****---***---信息修改成功---***----****-----"); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\按任意键继续:"); getch(); break; case '5': if(strcmp(TempTree->data.spouse,"0")==0) { printf("\\n\\%s还没有配偶,请先添加\\n",TempTree->data.name); } else { printf("\\n\\请输入%s 修改后的姓名:(不需要修改输入)\\n\\",TempTree->data.spouse); scanf("%s",TempName); if(strcmp(TempName,"0")!=0) { strcpy(TempTree->data.spouse,TempName); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\请输入%s 修改后的性别:(不需要修改输入)\\n\\",TempTree->data.spouse); scanf("%c",&tempch); if(tempch!='0') TempTree->data.sex=tempch; } printf("\\n\ ----****---***---信息修改成功---***----****-----"); fflush(stdin);//清除键盘缓冲区 printf("\\n\\按任意键继续:"); getch(); break; case '6': return 0; } } } else { printf("\\n\\找不到你要查找的人!\\n"); } fflush(stdin);//清除键盘缓冲区 printf("\\n\\按任意键继续:"); getch(); } void ShowMenu3()//显示修改信息的菜单 { printf("\\n\\n\\-----****----请选择你的操作----****-----\\n\\n"); printf("\ ----****------1.修改个人的信息--------****----\\n"); printf("\ ----****------2.修改父母的信息--------****----\\n"); printf("\ ----****------3.修改兄弟姐妹的信息----****----\\n"); printf("\ ----****------4.修改子女的信息--------****----\\n"); printf("\ ----****------5.修改配偶的信息--------****----\\n"); printf("\\n\ ----****---***---6.退出---***----****-----\\n"); //getch(); }下载本文