家谱管理系统的源代码

合集下载

大二家谱程序代码

大二家谱程序代码

大二家谱程序代码一、大二族谱数据库1、数据库名称:Dna//大拿/干细胞2、主键*与主要字段:idea*//俺的/思想、概念、计划aim//阿弥/目标、愿望;idea needbiz//鼻子/自白pho//佛/头像3、初始值idea:9901aim:"愿大二学府以大二文化为教学大纲,旨在培养国公一样、代代相传、德智体全面发展的劳动者。

"Biz:国公:{}姓:吴,名:国,号:公,字:玉明,座右铭:公为天下.大二文化奠基人,大二学府暨国公大学缔造者.主要著作:《大二文化》Pho:国公头像二、显示页面'编辑.遥感Idea'String=select.objet(String)//Top1/文本New=Edit.String(New)//创新/编辑Idea=request.querystring(Idea)//思想/遥感'注意1 首选idea0 //idea列初选值=封锁Max=unlock, else locking (Max) //Max=解除封锁,否则封锁;If cursor into Top1, idea0=Max(idea0)//首选If idea0 ! = "9901" , idea1=Max(idea1);If idea1 ! = "0", idea2 +=Max(idea9)//If idea1 ! = "0", 右Max'注意2 idea0 分类& idea1选择值禁用'(1)初选值"9901"=吴玉明……4T//父类'(2)idea0=class(idea0,3)//左可选值分3类if idea0>"049." thenif idea0>"065." thenidea0=class(3)//分页符(17/13/17/13)60位/子类elseidea0=class(2)//分隔符(16位)/f类end ifelseidea0=class(1)//塻(49位)/F类'(3)idea1可选值禁用(char/disables)if idea0=class(2) then idea1=char()7if idea0=class(3) then idea1=char()6&7go>>Long=Idea("9901") //常量Sel=Idea("Sel")//变量for (i=4; i<14; i++);sel = i;sel = i+1;break cout<<amend <>'%=Idea%<%="9901"% =locking > Else <% If sel=1 Then %=sel% Else response.write rs "Amend" > End If//Amend 俺们的:未注册"Aim"<>:<%If sel=1 Then Response.write rs("Aim") %>Else<%=Long%><End If%> "Biz"<>:<%If sel=1 Then Response.write rs("Biz") %><%=Long>Else%><End If%> "Pho"<>:<%If sel=1 &Pho="1" Then Response.write rs(pho/"Sel") %>Else<%=Response.write rs("9901")%><End If%>三、注册、修改页面(略)四、搜索页面:(略)链接。

家谱管理系统(含源代码)

家谱管理系统(含源代码)

家谱管理系统——©语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。

排答疑和辅导。

完整代码:#include<stdio.h>#include<stdlib.h>#include<string.h>intMATEFLAG=0;//是否入赘或嫁入这家的,1表示为是,0表示否typedefstructTreeNode//树节点定义{intNum;//保存此人儿女个数charName[20];//保存此人姓名charKind;//保存此人性别,男M,女FstructTreeNode*NextNode[20];〃保存此人的儿女,NextNode[0]里存放配偶的地址structTreeNode*Parent;//保存此节点的父节点}TreeNode;voidCreatTree(TreeNode*Tree);//创建树voidOutPutAll(TreeNode*升66);//输出树TreeNode*SearchTree(TreeNode*Tree,charname[],intlength); voidMainMenu(TreeNode*Tree);voidSubMenue1(TreeNode*Tree);voidSubMenue2(TreeNode*Tree);voidChange(TreeNode*Tree);voidAddNew(TreeNode*Tree);voidOutPutMessage(TreeNode*Tree,charname[],intlength);//主函数voidmain(){TreeNode*Tree;//产生根节点Tree=(TreeNode*)malloc(sizeof(TreeNode));Tree->Parent=NULL;strcpy(Tree->Name,"0");MainMenu(Tree);//显示主菜单}//添加新的成员voidAddNew(TreeNode*Tree){SubMenue2(Tree);//添加新成员界面}//显示添加家庭信息的界面voidSubMenue2(TreeNode*Tree){charc;intnum;charname[20];TreeNode*NewNode;getchar();while(1){system("cls");printf("请选择你的操作%");printf("A:添加某个人的子女的信息\n");printf("B:添加某个人配偶的信息\n");printf("C:退出\n");printf("请选择相应功能:\n");c=getchar();switch(c){case'A'://添加子女信息printf("请输入那个人的名字:3");scanf("%s",name);Tree二SearchTree(Tree,name,20);//在家谱里查找这个人if(Tree==NULL){ printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);break;}if(Tree->Parent==NULL&&Tree->NextNode[0]==NULL||Tree->Parent!=NULL &&Tree->Name!=Tree->Parent->NextNode[0]->Name){printf("至今还没有配偶请先添加配偶\n",Tree->Name);break;}if(Tree->Parent==NULL&&(Tree->Num>20||Tree->Num<0))Tree->Num=0;if(MATEFLAG==1)Tree=Tree->Parent;NewNode=(TreeNode*)malloc(sizeof(TreeNode));printf("请输入添加人员姓名:\n");scanf("%s",NewNode->Name);printf("请输入添加人员性别女F男M:\n");scanf("%1s",&NewNode->Kind);num=Tree->Num;NewNode->NextNode[0]=(TreeNode*)malloc(sizeof(TreeNode)); NewNode->NextNode[0]=NULL;NewNode->Num=0;NewNode->Parent=Tree;Tree->NextNode[num+1]=NewNode;Tree->Num=Tree->Num+1;printf("子女的信息添加成功\n");break;case'B':printf("请输入那个人的名字:3");scanf("%s",name);Tree=SearchTree(Tree,name,20);if(Tree->Parent!=NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0] ->Name)==0||Tree->NextNode[0]!=NULL){printf("已经有了配偶\n");break;}if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认\n",name); break;}NewNode=(TreeNode*)malloc(sizeof(TreeNode));printf("请输入添加人员姓名:\n");scanf("%s",NewNode->Name);printf("请输入添加人员性别女F男M:\n");scanf("%1s",&NewNode->Kind);NewNode->Parent=Tree;Tree->NextNode[0]=NewNode;break;case'C':printf("本项服务到此结束\n");break;case'\n':break;default:printf("对不起!你的选择错误\n");break;}if(c=='C'||c=='c')break;printf("请按Enter键继续操作3");getchar();getchar();}}//修改某个人的信息voidChange(TreeNode*Tree){charname[20];TreeNode*NewNode;printf("请输入你要修改的人的信息:\n");scanf("%s",name);NewNode=SearchTree(Tree,name,20);if(NewNode==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);return;}else{SubMenue1(NewNode);}}//输出副菜单voidSubMenue1(TreeNode*Tree){charc;intflag,i;charname[20];charParent[2][20];TreeNode*NewNode;getchar();while(1){system("cls");printf("请选择你的操作%");printf("A:修改个人的信息\n");printf("B:修改父母的信息\n");printf("C:修改兄弟姐妹的信息\n");printf("D:修改子女的信息\n");printf("E:修改配偶的信息\n");printf("F:退出\n");c=getchar();switch(c){case'A':printf("请输入修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n");scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Name,name);printf("是否要修改性别:如果需要就输入‘1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if(flag==1){if(Tree->Kind=='F'||Tree->Kind=='f')Tree->Kind='M';elseTree->Kind='F';}printf("个人信息修改成功\n");break;case'B':if(Tree->Parent==NULL)//判断是不是头节点{printf("是这个家谱图里最顶端的人没有父母信息!\n",name);break;}if(MATEFLAG==1)//判断是不是入赘或加入此间的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf("她是嫁入此间的所以父母信息不在家谱内包括\n");}else{printf("他是入赘此间的所以父母信息不在家谱内包括\n");}break;}if(Tree->Parent->Kind=='F'||Tree->Parent->Kind=='f'){strcpy(Parent[0],"¥亲");strcpy(Parent[1],"父亲");}else{strcpy(Parent[0],"父亲");strcpy(Parent[1],"¥亲");}printf("请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Parent[0]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);printf("请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Parent[1]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->NextNode[0]->Name,name);printf("父母的信息修改成功\n");break;case'C':NewNode=Tree->Parent;if(NewNode==NULL)//判断是不是头节点{printf("是这个家谱图里最顶端的人没有兄弟姐妹信息!\n",name);break;}if(MATEFLAG==1)//判断是不是入赘或嫁入这家的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf("她是嫁入此间的所以兄弟姐妹信息不在家谱内包括\n"); }else{printf("他是入赘此间的所以兄弟姐妹信息不在家谱内包括\n"); }break;}if(NewNode->Num==1){printf("没有兄弟姐妹\n");break;}else{for(i=1;i<=NewNode->Num;i++){if(NewNode->NextNode[i]->Name!=Tree->Name){printf("请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",NewNode->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(NewNode->NextNode[i]->Name,name);printf("是否要修改性别:如果需要就输入‘1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if(flag==1){if(NewNode->NextNode[i]->Kind=='G'||NewNode->NextNode[i]->Kind=='g ')NewNode->NextNode[i]->Kind='B';elseNewNode->NextNode[i]->Kind='G';}}}}printf("兄弟姐妹的信息修改成功\n");break;case'D':if(Tree->Num==0){printf("至今还没有子女\n");break;}if(Tree->Parent!=NULL)if(strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0)//如果他是入赘或者是嫁入的就需用配偶节点完成修改{Tree=Tree->Parent;}for(i=1;i<=Tree->Num;i++){printf("请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Tree->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[i]->Name,name);printf("是否要修改性别:如果需要就输入’1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if(flag==1){if(Tree->NextNode[i]->Kind=='F'||Tree->NextNode[i]->Kind=='f') Tree->NextNode[i]->Kind='M';elseTree->NextNode[i]->Kind='F';}}printf("子女的信息修改成功\n");break;case'E':if(Tree->Parent!=NULL){if(Tree->NextNode[0]==NULL&&strcmp(Tree->Name,Tree->Parent->NextNode [0]->Name)!=0){printf("至今还没有配偶\n");break;}if(strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0){printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->Parent->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);}else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->Name,name);}}else{if(Tree->NextNode[0]==NULL)printf("至今还没有配偶\n");else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->Name,name);}}printf("配偶的信息修改成功\n");break;case'F':printf("本项服务到此结束\n");break;case'\n':break;default:printf("对不起!你的选择错误\n");break;}if(c=='F'||c=='f')break;printf("请按Enter键继续操作3");getchar();getchar();}}//输出主菜单voidMainMenu(TreeNode*Tree){charc;//用于接受用户输入的选项charname[20];while(1){5丫5{6巾("03");//清屏printf("***********★★欢迎进入家谱管理系统★★★★★★★★★★★\n\n\n");printf("♦♦菜单**\n\n");printf("•输入家谱信息1\n");printf("•查找家族成员2\n");printf("•添加家族成员3\n");printf("•输出家谱信息4\n");printf("•修改成员信息5\n");printf("•退出6\n");printf("\n\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^★★★★★\n"); printf("请选择相应的功能:\n");c=getchar();switch(c){case'1':TreeNode*NewNode;NewNode=(TreeNode*)malloc(sizeof (TreeNode));//建立新节点printf("请输入姓名:");scanf ("%s",Tree->Name);//给节点姓名赋值printf("请输入性别(女F,男M):");getchar();//给性别赋值scanf("%c",&(Tree->Kind));//Tree->Parent=NewNode;Tree->Parent=NULL ;CreatTree(Tree);printf("家谱图已经建立成功\n");printf("请按Enter键继续操作3");getchar();break;case'2':if(strcmp(Tree->Name,"0")=0){printf("家谱图还未建立请先建立%");getchar();break;}printf("请输入你要查找的人的姓名:\n");scanf("%s",name);OutPutMessage(SearchTree(Tree,name,20),name, 20);getchar();break;case'3':if(strcmp(Tree->Name,"0")=0){printf("家谱图还未建立请先建立㈠");getchar();break;}AddNew(Tree);getchar();break;case'4':if(strcmp(Tr ee->Name,"0")==0){printf("家谱图还未建立请先建立\n");getchar();break;}printf("整个家谱的主要信息如下:\n");OutPutAll(Tree);getchar();break;case'5':if(strcmp(Tree->Name,"0")==0){printf("家谱图还未建立请先建立%");getchar();break;}Change(Tree);getchar();break;case'6':printf("本程序结束,欢迎下次使用。

家谱管理系统的源代码

家谱管理系统的源代码

#include<iostream.h>#include<string.h>#include<fstream.h>#include<stdlib.h>struct per{int data;char name[20];char brith[20];char marry;char address[20];char live;char dietime[20];char parent[20];int generation;int child[10];int numberchild;per(){for(int i=0;i<20;i++)name[i]='\0';for(i=0;i<20;i++)brith[i]='\0';for(i=0;i<20;i++)address[i]='\0';for(i=0;i<20;i++)dietime[i]='\0';for(i=0;i<10;i++)child[i]=0;for(i=0;i<20;i++)parent[i]='\0';live='\0';marry='\0';data=-10;generation=0;numberchild=0;}};void setupinfo(per person[]);void display(per person[],int&);void displayhome(per person[],int&);void displayinfo(perperson[],int&);void namesearch(per person[],int&);void birtfdaysearch(per person[],int&);void addchild(per person[],int&);void editmember(per person[],int&);void sortbirthday(per person[],int&);void main(){per person[36];int count=0;fstreaminputFile("person.txt",ios::in|ios::o ut|ios::binary);if(!inputFile){cout<<"文件不存在!"<<endl;exit(0);}inputFile.read((char*)&person[co unt],sizeof(person[count]));//从文件中读取指定大小的字节函数read(),读取字节函数while(!inputFile.eof()) //当文件没有读取完毕,进行循环{if(person[count].name[0]!='\0')//当名字不为空时{count++; //统计人数inputFile.read((char*)(person+count ),sizeof(*person));}}inputFile.close();//关闭文件if(count<1) //如果家谱图里面没人{cout<<" 家谱不存在,请你建立一个家谱!!"<<endl;setupinfo(person);}display(person,count);}void setupinfo(per person[36]) //创建信息{int i,j,k;fstreamoutputfile("person.txt",ios::in|ios::out|ios::binary|ios::app); //打开文件for(i=0;i<5;i++){cout<<" 姓名 : ";cin.getline(person[i].name,20);cout<<" 生日(日期样式为xxxx/xx/xx) : ";cin.getline(person[i].brith,20);cout<<" 婚否(输入Y或y或N或n) :";cin>>person[i].marry;while(toupper(person[i].marry)!='Y' &&toupper(person[i].marry)!='N'){cout<<" 你输入错误,请你重新输入!!"<<endl;cout<<" 婚否(输入Y或y或N或n) :";cin>>person[i].marry;}cin.ignore();cout<<" 地址 : ";cin.getline(person[i].address,20);cout<<" 是否健在(输入Y或y或N或n) :";cin>>person[i].live; //是否死亡while(toupper(person[i].live)!='Y'& &toupper(person[i].live)!='N'){cout<<" 你输入错误,请你重新输入!!"<<endl;cout<<" 婚否(输入Y或y或N 或n) :";cin>>person[i].live;}cin.ignore();if(toupper(person[i].live)=='N'){cout<<" 死亡日期(日期样式为xxxx/xx/xx) :";cin.getline(person[i].dietime,20);/ / 输入死亡日期}cout<<" 属于第几代 : ";cin>>person[i].generation;cin.ignore();if(person[i].generation!=1) //不是第一代{cout<<" 他(她)的父亲 : ";cin.getline(person[i].parent,20); //cin.getline是读取字符串函数 20是读取字符串的个数}cout<<endl;}for(j=0;j<i;j++){if(person[j].generation==1)person[j].data=-1;//****************************}for(j=0;j<i;j++){for(k=0;k<i;k++){if(strcmp(person[j].parent,person[k].name)==0) //比较2个字符串是否相同,实质是找某个人的父亲person[j].data=k;}}for(j=0;j<i;j++){for(k=0;k<i;k++){if(strcmp(person[j].parent,person[k].name)==0){person[k].child[person[k].numberchild]=j;person[k].numberchild++; //找某个人的孩子}}}for(j=0;j<i;j++)outputfile.write((char*)(person+j), sizeof(*person)); //写文件outputfile.close(); //关闭文件夹system("cls");}void display(per person[36],int &n1){int choice;while(1) //循环式一直进行的{cout<<endl<<endl<<endl;cout<<"\t\t 家族关系查询系统"<<endl;cout<<"\t\t1. 显示家谱"<<endl;cout<<"\t\t2. 显示第n代人的所有信息"<<endl;cout<<"\t\t3. 按照姓名查询某成员的信息"<<endl;cout<<"\t\t4. 按照出生日期查询成员名单"<<endl;cout<<"\t\t5. 某成员添加孩子"<<endl;cout<<"\t\t6. 修改某成员信息"<<endl;cout<<"\t\t7. 按生日日期对家谱中的所有人进行排序"<<endl;cout<<"\t\t8. 退出系统"<<endl;cout<<"\t\t 输入选择:"<<endl;cout<<"\t\t 请输入1-8之间的数"<<endl;cin>>choice;while(choice!=1&&choice!=2&&choice!=3&&cho ice!=4&&choice!=5&&choice!=6&&choice!=7&&choice!=8){cout<<"you enter wrong!"<<endl;cout<<"please enter again!"<<endl;cin>>choice;}cin.ignore(1,'\n'); //跳过一个字符,含义是忽略一行system("cls");switch(choice){case 1: displayhome(person,n1); break;case 2: displayinfo(person,n1); break;case 3: namesearch(person,n1); break;case 4: birtfdaysearch(person,n1); break;case 5: addchild(person,n1); break;case 6: editmember(person,n1); break;case 7: sortbirthday(person,n1); break;case 8: exit(0);}}}void displayhome(per person[36],int &n2) //调用函数的参数传递的是一个参数地址{int i,j,max;char again;cout<<endl<<endl;for(i=0;i<n2-1;i++){max=person[i].generation;for(j=i+1;j<n2;j++){if(person[i].generation<person[j].g eneration)max=person[j].generation; //找出最大的代数}}for(i=1;i<=max;i++){cout<<" 第"<<i<<"代的成员有 : ";for(j=0;j<n2;j++){if(person[j].generation==i)cout<<person[j].name<<" ";//输出每一代的人}cout<<endl;}cout<<endl<<endl;cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl;cin>>again;if(toupper(again)=='Y') //就是判断输入得是否为y或Y{system("cls");return;}if(toupper(again)=='N')exit(0); //终止程序的执行}void displayinfo(per person[36],int &n2) //显示代数{int i,gen,j=0;char again;cout<<endl<<endl;cout<<" 请你输入你要查询的代数 : ";cin>>gen;cout<<endl; //换行for(i=0;i<n2;i++){if(person[i].generation!=gen)j++;}if(j==n2) //判断是否找到cout<<" 你要查的代数还没有!!!"<<endl<<endl;for(i=0;i<n2;i++){if(person[i].generation==gen){cout<<" 姓名: "<<person[i].name<<endl<<" 出生日期: "<<person[i].brith<<" 第几代: "<<person[i].generation<<endl<<" 婚否: "<<person[i].marry<<" 地址 :"<<person[i].address<<endl<<" 是否健在: "<<person[i].live<<endl;if(person[i].live=='N'||person[i].liv e=='n')cout<<" 死亡日期: "<<person[i].dietime<<endl;cout<<endl<<endl;}}cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl;cin>>again;if(toupper(again)=='Y'){system("cls");return;}if(toupper(again)=='N')exit(0);}void namesearch(per person[36],int &n2){int i,j=0,k;char again,name[20];cout<<endl<<endl;cout<<" 请你输入你想要查询的人的姓名 : ";cin.getline(name,20);for(i=0;i<n2;i++){if(strcmp(person[i].name,name)!=0)j++;}cout<<endl<<endl;if(j==n2)cout<<" 你要查询的人没有!!!"<<endl<<endl;for(i=0;i<n2;i++){if(strcmp(person[i].name,name)==0){cout<<" 姓名: "<<person[i].name<<endl<<" 出生日期: "<<person[i].brith<<" 第几代: "<<person[i].generation<<endl<<" 婚否: "<<person[i].marry<<" 地址 :"<<person[i].address<<endl<<" 是否健在: "<<person[i].live<<endl;if(person[i].live=='N'||person[i].liv e=='n')cout<<" 死亡日期:"<<person[i].dietime<<endl;cout<<endl<<endl;if(person[i].generation==1)cout<<" 他是这个家的根,没有父亲!!!!"<<endl<<endl;else{cout<<" 他(她)父亲的信息 : "<<endl;cout<<" 姓名: "<<person[person[i].data].name<<endl<<" 出生日期: "<<person[person[i].data].brith<<" 第几代: "<<person[person[i].data].generation< <endl<<" 婚否: "<<person[person[i].data].marry<<" 地址:"<<person[person[i].data].address <<endl<<" 是否健在: "<<person[person[i].data].live<<endl;if(person[person[i].data].live=='N' ||person[person[i].data].live=='n')cout<<" 死亡日期: "<<person[person[i].data].dietime<<en dl;cout<<endl<<endl;}if(person[i].numberchild==0)cout<<" 他没有孩子!!!"<<endl<<endl;else{cout<<" 他有"<<person[i].numberchild<<"个孩子,他们的信息 :"<<endl<<endl;for(k=0;k<person[i].numberchild;k++ ){cout<<" 姓名: "<<person[person[i].child[k]].name<<e ndl<<" 出生日期: "<<person[person[i].child[k]].brith<<" 第几代: "<<person[person[i].child[k]].generat ion<<endl<<" 婚否: "<<person[person[i].child[k]].marry<<" 地址:"<<person[person[i].child[k]].add ress<<endl<<" 是否健在: "<<person[person[i].child[k]].live;if(person[person[i].child[k]].live= ='N'||person[person[i].child[k]].live =='n')cout<<" 死亡日期 : "<<person[person[i].child[k]].dietime<<endl;cout<<endl<<endl;}}}}cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl;cin>>again;if(toupper(again)=='Y'){system("cls");return;}if(toupper(again)=='N')exit(0);}void birtfdaysearch(perperson[36],int &n2){charbegbir[20],endbir[20],again;int i,flag=0;cout<<endl<<endl;cout<<" 请你输入两个时间,格式为****/**/**!"<<endl;cout<<" 起始时间是 : ";cin.getline(begbir,20);cout<<" 终止时间是 : ";cin.getline(endbir,20);cout<<endl<<endl;for(i=0;i<n2;i++){if(strcmp(person[i].brith,begbir)>= 0&&strcmp(person[i].brith,endbir)<=0) {cout<<" 姓名: "<<person[i].name;cout<<" 生日:"<<person[i].brith;flag=1;cout<<endl;}}cout<<endl<<endl;if(flag==0)cout<<" 在这段时间内没有人生日!!!"<<endl<<endl;cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl;cin>>again;if(toupper(again)=='Y'){system("cls");return;}if(toupper(again)=='N')exit(0);}void addchild(per person[36],int &n2){int i;char again;fstreamfile("person.txt",ios::in|ios::out|io s::binary|ios::app);cout<<endl<<endl;cout<<" 请输入孩子的信息!!!"<<endl<<endl<<endl;cout<<" 姓名 : ";cin.getline(person[n2].name,20);cout<<" 生日(日期样式为xxxx/xx/xx) : ";cin.getline(person[n2].brith,20)cout<<" 婚否(输入Y或y或N或n) :";cin>>person[n2].marry;while(toupper(person[n2].marry)! ='Y'&&toupper(person[n2].marry)!='N') {cout<<" 你输入错误,请你重新输入!!"<<endl;cout<<" 婚否(输入Y或y或N或n) :";cin>>person[n2].marry;}cin.ignore();cout<<" 地址 : ";cin.getline(person[n2].address,2 0);cout<<" 是否健在(输入Y或y或N或n) :";cin>>person[n2].live;while(toupper(person[n2].live)!= 'Y'&&toupper(person[n2].live)!='N') {cout<<" 你输入错误,请你重新输入!!"<<endl;cout<<" 婚否(输入Y或y或N或n) :";cin>>person[n2].live;}cin.ignore();if(toupper(person[n2].live)=='N' ){cout<<" 死亡日期(日期样式为xxxx/xx/xx) :";cin.getline(person[n2].dietime,20);}cout<<" 属于第几代 : ";cin>>person[n2].generation;cin.ignore();if(person[n2].generation!=1){cout<<" 他(她)的父亲 : ";cin.getline(person[n2].parent,20);}cout<<endl;for(i=0;i<n2;i++){if(strcmp(person[n2].parent,person[ i].name)==0){person[n2].data=i;break;}}file.write((char*)&person[n2],si zeof(person[n2]));file.close();file.open("person.txt",ios::in|i os::out|ios::binary);file.seekp(i*sizeof(per),ios::be g);person[i].child[person[i].number child]=n2;person[i].numberchild++;file.write((char*)&person[i],siz eof(per));file.close();n2++;cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl;cin>>again;if(toupper(again)=='Y'){system("cls");return;}if(toupper(again)=='N')exit(0);}void editmember(per person[36],int &n2){int i,flag=0,choice;char name[20],again;fstreamfile("person.txt",ios::in|ios::out|io s::binary);cout<<endl<<endl;cout<<" 请你输入你想修改的成员的名字 : ";cin.getline(name,20);cout<<endl<<endl;for(i=0;i<n2;i++){if(strcmp(person[i].name,name)==0){flag=1;break;}}if(flag==0)cout<<" 家谱中没有这个人!!"<<endl<<endl<<endl;if(flag==1){cout<<"\t\t请你选择你要修改的项!!"<<endl;cout<<"\t\t 1. 姓名"<<endl;cout<<"\t\t 2. 地址"<<endl;cout<<"\t\t 3. 婚否"<<endl;cout<<"\t\t 4. 生日"<<endl;cout<<"\t\t 5. 是否死亡"<<endl;cout<<"\t\t 6. 死亡日期"<<endl;cout<<"\t\t 请输入1-6之间的数"<<endl;cout<<"\t\t 输入选择 : ";cin>>choice;while(choice!=1&&choice!=2&&choice!=3&&cho ice!=4&&choice!=5&&choice!=6){cout<<"you enter wrong!"<<endl;cout<<"please enter again!"<<endl;cin>>choice;}cin.ignore(1,'\n');switch(choice){case 1: cout<<endl<<" 请你输入新名字 : ";cin.getline(person[i].name,20);file.seekp(i*sizeof(per),ios::beg);//file.write((char*)&person[i],sizeof(p er));break;case 2: cout<<endl<<" 请输入新的地址 : ";cin.getline(person[i].address,20);//file.seekp(i*sizeof(per),ios::beg);//file.write((char*)&person[i],sizeof(p er));break;case 3: cout<<endl<<" 请你输入新的是否结婚 : ";cin>>person[i].marry;//file.seekp(i*sizeof(per),ios::beg);file.write((char*)&person[i],sizeof(p er));break;case 4: cout<<endl<<" 请你输入新的生日 : ";cin.getline(person[i].brith,20);//file.seekp(i*sizeof(per),ios::beg);//file.write((char*)&person[i],sizeof(p er));break;case 5: cout<<endl<<" 请你输入新的是否死亡 : ";cin>>person[i].live;//file.seekp(i*sizeof(per),ios::beg);//file.write((char*)&person[i],sizeof(p er));break;case 6: cout<<endl<<" 请你输入新的死亡日期 : ";cin.getline(person[i].dietime,20);//file.seekp(i*sizeof(per),ios::beg);//file.write((char*)&person[i],sizeof(p er));break;}for(int j=0;j<n2;j++)file.write((char*)&person[j],sizeof (per));}cout<<endl<<endl;cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl;cin>>again;if(toupper(again)=='Y'){system("cls");return;}if(toupper(again)=='N')exit(0);}void sortbirthday(per person[36],int &n2){per person1;int i,j;char again;cout<<endl<<endl;for(i=0;i<n2-1;i++)for(j=i+1;j<n2;j++){if(strcmp(person[i].brith,person[j].brith)>=0){person1=person[i];person[i]=person[j];person[j]=person1;}}for(i=0;i<n2;i++)cout<<" 姓名: "<<person[i].name<<" 生日: "<<person[i].brith<<endl;cout<<endl<<endl;cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl;cin>>again;if(toupper(again)=='Y'){system("cls");return;}if(toupper(again)=='N')exit(0);}。

数据结构大作业之家谱管理系统

数据结构大作业之家谱管理系统

C++实现的数据结构大作业之家谱管理系统欢迎界面:主菜单:其他一些运行结果不在一一列举,一面篇幅过长。

这个家谱管理系统,支持键盘操作,所有的操作都可以用键盘完成,如选择功能、退出等。

代码的实现使用的是c++11标准,与旧标准或有不同。

类的头文件:#include<iostream>#include<string>using std::string;using std::ostream;using std::istream;struct BirthDay{//生日结构变量int year=0;int month=0;int day=0;};class Member{friend class FamilySystem;friend ostream&operator<<(ostream&out,const Member&m);//输出成员信息到控制台friend istream&operator>>(istream&, Member&m);//从文件中读入成员信息public:Member()=default;//使用默认合成构造函数void setE();//通过控制台输入给成员赋值~Member()=default;//使用默认合成析构函数Member*pson=nullptr;//指向儿子的指针Member*pbro=nullptr;//指向兄弟的指针private://成员的各种数据string name="未知";string birthPlace="未知";BirthDay birthDay;string sex="未知";float height=0;int age=0;string education="未知";string job="未知";string father="未知";};class FamilySystem{public:FamilySystem()=default;//使用默认合成构造函数~FamilySystem(){delete root;}bool fileInit();//从文件中读取数据int menu();//显示菜单(功能)bool addMem();//增加成员bool deleteMem();//删除成员bool demandMem();//查询bool demandAve();//查询家庭整体情况bool modifyMem();//修改成员bool showFamily();//展示整个家谱bool saveFile();//保存信息到文件中,将使用两个文件,一个保存成员信息,一个保存家谱整体信息Member*root=nullptr;//家谱数结构的根节点指针?private:int total=0;//总人数float aveAge=0;//平均年龄float aveHeight=0;//平均身高float aveMember=0;//家庭平均人数float ratio=0;//男女比例void calculate();//计算平均值等Member*seek(string);//查找是否存在成员void display(Member*,int);//先序遍历树,用于显示所有成员};extern string gets();//用于接收键盘的输入类的函数及相关操作函数的实现#include<iomanip>#include<vector>#include<fstream>#include<sstream>#include<conio.h>#include"SystemClass.h"using std::cin;using std::cout;using std::endl;using std::setw;using std::vector;using std::ios;using std::ifstream;using std::ofstream;using std::istringstream;string gets(){//从控制台获取字符等信息string s;while(int n=_getch()){if(n==27){throw27;break;}else if(n==13){cout<<endl;break;}else if(n==8){s.pop_back();cout<<"\b \b";}else{cout<<char(n);s.push_back(char(n));}}return s;}//与BirthDay相关的函数istream&operator>>(istream&in,BirthDay&b){//从文件中读取生日的信息in>>b.year>>b.month>>b.day;return in;}ostream&operator<<(ostream&out,BirthDay&b){ out<<b.year<<" "<<b.month<<" "<<b.day;return out;}//与Member相关的函数void Member::setE(){try{istringstream sin;cout<<setw(20)<<"请输入成员信息:\n"<<endl<<setw(20)<<"姓名:";sin.str(gets());sin>>name;cout<<endl<<setw(20)<<"出生地:"; sin.str(gets());sin.clear();sin>> birthPlace;cout<<endl<<setw(20)<<"生日:"; sin.str(gets());while(true){sin.clear();sin>>birthDay.year>>birthDay.month>>birthDay.day;if(!sin||birthDay.year>2014|| birthDay.month>12||birthDay.day>31){cout<<"输入错误,请重新输入:";sin.str(gets());}else break;}cout<<endl<<setw(20)<<"性别:";sin.str(gets());sin.clear();while(sin>>sex){if(sex=="male"||sex=="female"|| sex=="男"||sex=="女")break;else{cout<<"性别必须是male、female、男或者女,请重新输入:";sin.str(gets());sin.clear();}}cout<<endl<<setw(20)<<"身高(厘米):"; sin.str(gets());sin.clear();while(!(sin>>height)){cout<<"输入错误,请重新输入:";sin.str(gets());sin.clear();}cout<<endl<<setw(20)<<"年龄:";sin.str(gets());sin.clear();while(!(sin>>age)||age>300){cout<<"输入错误,请重新输入:"<<endl;sin.str(gets());sin.clear();}cout<<endl<<setw(20)<<"学历:";sin.str(gets());sin.clear();sin>>education;cout<<endl<<setw(20)<<"工作:";sin.str(gets());sin.clear();sin>>job;cout<<endl<<setw(20)<<"父亲:";sin.str(gets());sin.clear();sin>>father;}catch(int ex){throw ex;}return;}ostream&operator<<(ostream&out,const Member &m){out<<endl<<setw(25)<<"该成员信息如下:" <<endl<<endl<<setw(25)<<"姓名: "<<<<endl<< endl<<setw(25)<<"出生地: "<<m.birthPlace <<endl<<endl<<setw(25)<<"生日: "<<m.birthDay.year <<" "<<m.birthDay.month<<" "<<m.birthDay.day<<endl<<endl<<setw(25)<<"性别: "<<m.sex<<endl<< endl<<setw(25)<<"身高(厘米): "<<m.height <<endl<<endl<<setw(25)<<"年龄: "<<m.age<<endl<< endl<<setw(25)<<"学历: "<<cation<< endl<<endl<<setw(25)<<"工作: "<<m.job<<endl<< endl<<setw(25)<<"父亲: "<<m.father<< endl;return out;}istream&operator>>(istream&in,Member&m){in>>>>m.birthPlace>>m.birthDay>>m.sex>>m.height>>m.age>>cation>>m.job>>m.father;return in;}//FamilySystem的成员函数int FamilySystem::menu(){cout<<"\n\n";cout<<" ---------------------------\n";cout<<" | |\n";cout<<" | 系统菜单 |\n";cout<<" | |\n";cout<<" | 1.查询成员 |\n";cout<<" | |\n";cout<<" | 2.查询家庭整体情况 |\n";cout<<" | |\n";cout<<" | 3.添加成员 |\n";cout<<" | |\n";cout<<" | 4.删除成员 |\n";cout<<" | |\n";cout<<" | 5.修改成员信息 |\n";cout<<" | |\n";cout<<" | 6.显示整个家谱 |\n";cout<<" | |\n";cout<<" | 按ESC退出系统 |\n";cout<<" | |\n";cout<<" ---------------------------\n";cout<<" ";int n=0;while(1){n=_getch();if(n==27)break;if(n>=49&&n<=54)break;cout<<"\n请按下1、2、3、4、5、6选择或按ESC键退出!"<<endl;}return n;}bool FamilySystem::fileInit(){ifstream infile;//打开存储成员信息的文件,读入成员信息infile.open("Members.txt",ios::in|ios::_Nocreate);if(!infile){return false;}vector<Member*>genely;//保存这一代成员的指针vector<Member*>next;//保存下一代成员的指针Member*temp=new Member;//临时保存输入的成员信息root=temp;//第一个赋给rootgenely.push_back(root);next.push_back(root);while(infile>>*temp){//将成员放入家族树中,成员的父亲必须是这一代的成员for(auto i=genely.begin();i!= genely.end();++i){if((*i)->name==temp->father){if((*i)->pson==nullptr)(*i)->pson=temp;else{Member*p=(*i)->pson;while(p->pbro!=nullptr)p=p->pbro;p->pbro=temp;}next.push_back(temp);temp=nullptr;break;}}//若成员的父亲不是这一代的成员,则将next赋予genely,迭进下一代if(temp!=nullptr){genely=next;//迭进下一代next.clear();//清空nextfor(auto i:genely){//将成员放入家族树中if(i->name==temp->father){i->pson=temp;next.push_back(temp);temp=nullptr;break;}}}//动态创建临时成员变量,用于存储输入的下一个成员的信息temp=new Member;}infile.close();//关闭存储成员信息的文件//若文件中没有成员信息,将root置为空if(root->name=="未知")root=nullptr;//打开存储家庭总体信息的文件,读入信息infile.open("Wholes.txt",ios::in|ios::_Nocreate);if(!infile){return false;}infile>>total>>aveAge>>aveHeight>> aveMember>>ratio;infile.close();//关闭文件return true;}Member*FamilySystem::seek(string nam){ //若家谱树为空,返回空指针if(root==nullptr)return nullptr;//若root不为空,继续查找Member*store=nullptr;//存储返回的指针vector<Member*>genely;//存储这一代的指针genely.push_back(root);vector<Member*>next;//存储下一代的指针for(;;){//循环查找//在这一代中查找,若找到,跳到最后for(auto p:genely){if(p->name==nam){store=p;goto End;}}//判断下一代是否为空,若为空,跳到最后int jubge=0;for(auto p:genely){if(p->pson!=nullptr)++jubge;}if(jubge==0)goto End;//找到下一代for(auto p:genely){Member*temp=p->pson;if(temp==nullptr)continue;else{next.push_back(temp);while(temp->pbro!=nullptr){next.push_back(temp->pbro);temp=temp->pbro;}}}genely=next;next.clear();}End:return store;}bool FamilySystem::addMem(){cout<<"3.添加成员.\n";Member*temp=new Member;try{temp->setE();//输入成员信息}catch(int){return false;}//检查其父亲是否存在Member*jubge=seek(temp->father);if(root==nullptr)root=temp;else if(jubge==nullptr){cout<<"\n 家谱中没有此人父亲的信息!无法插入!";cout<<"\n 请确认此人是否此家族中的人!";}else{if(seek(temp->name)!=nullptr){cout<<"\n\n 此人已存在于家谱中!" <<endl;}else{cout<<" 按ENTER确定添加并返回菜单\n 按ESC取消添加并返回菜单";for(;;){int j=_getch();if(j==27){delete temp;break;}if(j==13){if(jubge->pson==nullptr)jubge->pson=temp;else{Member*p=jubge->pson;while(p->pbro!=nullptr)p=p->pbro;p->pbro=temp;}cout<<"\n 保存成功!\n";break;}}}}cout<<"\n按ESC键返回菜单";for(;;){if(_getch()==27)break;}return true;}bool FamilySystem::deleteMem(){cout<<"4.删除成员.\n\n";cout<<" 请输入姓名:";string na;try{istringstream sin(gets());sin>>na;}catch(int){goto end;}Member*temp=seek(na);if(temp==nullptr)cout<<"\n\n 家谱中没有此人!\n\n";else{if(temp->pson!=nullptr){cout<<"\n\n 此人有后代!若删除此人其后代将同时被删!";cout<<"\n\n 按ENTER继续\n 按ESC退出";for(;;){int j=_getch();if(j==27)return false;if(j==13)break;}}Member*p=seek(temp->father);if(p==nullptr)root=nullptr;else if(temp==p->pson)p->pson=nullptr;else{while(p->pbro!=temp){p=p->pbro;}p->pbro=nullptr;}cout<<"\n\n 删除成功!\n\n";}cout<<"\n按ESC键返回菜单";for(;;){if(_getch()==27)break;}end:return true;}bool FamilySystem::demandMem(){cout<<"1.查询成员.\n\n";cout<<" 请输入姓名:";string na;try{istringstream sin(gets());sin>>na;}catch(int){goto end;}Member*m=seek(na);if(m!=nullptr)cout<<*m;else cout<<"\n\n 对不起,家谱中没有此人的信息!\n\n";cout<<"\n按ESC键返回菜单";for(;;){if(_getch()==27)break;}end:return true;}void FamilySystem::calculate(){//若家谱树为空,将各总体值置零if(root==nullptr){total=0;aveAge=0;aveHeight=0;aveMember=0;ratio=0;return;}//若root不为空,继续vector<Member*>genely;//存储这一代的指针genely.push_back(root);vector<Member*>next;//存储下一代的指针int girl=0;//女性数int family=0;//家庭数total=0;aveAge=0;aveHeight=0;//initializefor(;;){//循环叠加各所需总体数据//在这一代中for(auto p:genely){++total;aveAge+=p->age;aveHeight+=p->height;if(p->sex=="female"||p->sex=="女")++girl;}//判断下一代是否为空,若为空,跳到最后int jubge=0;for(auto p:genely){if(p->pson!=nullptr){++jubge;++family;}}if(jubge==0)goto cal;//找到下一代for(auto p:genely){Member*temp=p->pson;if(temp==nullptr)continue;else{next.push_back(temp);while(temp->pbro!=nullptr){next.push_back(temp->pbro);temp=temp->pbro;}}}genely=next;//迭进下一代next.clear();//清空next}//计算最后结果cal:total=total;aveAge/=total;aveHeight/=total;if(family==0)family=1;aveMember=static_cast<float>(total)/ static_cast<float>(family);if(girl!=0)ratio=static_cast<float>(total-girl)/ static_cast<float>(girl);else ratio=0;//退出return;}bool FamilySystem::demandAve(){calculate();cout<<"2.查询家庭整体情况.\n";cout<<endl<<endl;cout<<setw(30)<<"家庭的整体情况如下:\t" <<endl<<endl<<endl;cout<<setw(30)<<"总人数:\t"<<total<< endl<<endl<<endl;cout<<setw(30)<<"平均年龄:\t"<<aveAge <<endl<<endl<<endl;cout<<setw(30)<<"平均身高:\t"<< aveHeight<<endl<<endl<<endl;cout<<setw(30)<<"家庭平均人数:\t"<< aveMember<<endl<<endl<<endl;cout<<setw(30)<<"男女比例:\t"<<ratio;if(ratio!=0)cout<<" : 1"<<endl;else cout<<endl;cout<<"\n\n按ESC键返回菜单";for(;;){if(_getch()==27)break;}return true;}bool FamilySystem::modifyMem(){cout<<"5.修改成员信息.\n\n";cout<<" 请输入姓名:";string na;try{istringstream sin(gets());sin>>na;}catch(int){goto rend;}Member*temp=seek(na);if(temp==nullptr){cout<<"\n\n 家谱中没有此人的信息!\n";goto end;}cout<<"\n 选择修改项:\n\n";cout<<" 1.姓名 2.出生地点 3.生日\n\n";cout<<" 4.性别 5.身高6.年龄\n\n";cout<<" 7.学历 8.工作\n\n";cout<<" 按ESC键退出修改\n\n";for(;;){int get=_getch();if(get==27)break;switch(get){case49:cout<<"\n 姓名原为:"<<temp->name;cout<<"\n 请输入更改:";cin>> temp->name;if(temp->pson==nullptr)break;else{string na=temp->name;temp=temp->pson;temp->father=na;while(temp->pbro!=nullptr){temp=temp->pbro;temp->father=na;}break;}case50:cout<<"\n 出生地点原为:"<< temp->birthPlace;cout<<"\n 请输入更改:";cin>> temp->birthDay;break;case51:cout<<"\n 生日原为:"<<temp->birthDay;cout<<"\n 请输入更改:";cin>> temp->birthDay;break;case52:cout<<"\n 性别原为:"<<temp->sex;cout<<"\n 请输入更改:";cin>>temp->sex;while(temp->sex!="male"&&temp->sex!= "female"&&temp->sex!="男"&&temp->sex!="女"){cout<<"输入错误,性别必须为male、female、男或女!\n请重新输入:";cin>>temp->sex;}break;case53:cout<<"\n 身高原为:"<<temp->height;cout<<"\n 请输入更改:";cin>> temp->height;break;case54:cout<<"\n 年龄原为:"<<temp->age;cout<<"\n 请输入更改:";cin>> temp->age;break;case55:cout<<"\n 学历原为:"<<temp->education;cout<<"\n 请输入更改:";cin>> temp->education;break;case56:cout<<"\n 工作原为:"<<temp->job;cout<<"\n 请输入更改:";cin>> temp->job;break;default:;}cout<<" 修改成功!";}end:cout<<"\n\n按ESC键返回菜单";for(;;){if(_getch()==27)break;}rend:return true;}void FamilySystem::display(Member*r,int n){ string blank="";for(int i=0;i!=n;++i)blank+=" ";cout<<blank<<r->name<<endl;if(r->pson!=nullptr)display(r->pson,n+6);if(r->pbro!=nullptr)display(r->pbro,n);return;}bool FamilySystem::showFamily(){cout<<"6.显示整个家谱.\n\n";if(root==nullptr)cout<<"\n\n 家谱为空!\n\n";else display(root,0);//escapecout<<"\n\n按ESC键返回菜单";for(;;){if(_getch()==27)break;}return true;}bool FamilySystem::saveFile(){ofstream outfile;//打开保存家庭信息的文件,并写入信息outfile.open("Wholes.txt",ios::out);if(!outfile){return false;}calculate();outfile<<total<<" "<<aveAge<<" "<<aveHeight<<" "<<aveMember<<" "<< ratio;outfile.close();//打开保存家庭成员信息的文件并写入信息outfile.open("Members.txt",ios::out);if(!outfile){return false;}vector<Member*>genely;//保存一代成员的指针genely.push_back(root);while(1){//输出这一代成员的信息for(auto p:genely){if(p!=nullptr){outfile<<p->name<<" "<<p->birthPlace<<" "<<p->birthDay<<" "<<p->sex<<" "<<p->height<<" "<<p->age<<" "<<p->job<<" "<<p->education<< " "<<p->father<<endl;}}//计算这一代成员的儿女的人数//若这一代都没有儿女,则退出int jubge=0;for(auto p:genely){if(p!=nullptr){if(p->pson!=nullptr)++jubge;}}if(jubge==0)break;//找到下一代的成员,即这一代的儿女vector<Member*>next;for(auto p:genely){Member*temp=p->pson;if(temp!=nullptr){next.push_back(temp);while(temp->pbro!=nullptr){next.push_back(temp->pbro);temp=temp->pbro;}}}genely=next;//迭进下一代next.clear();}return true;}主函数及欢迎界面的实现#include<time.h>#include"SystemClass.h"using std::cout;using std::endl;using std::flush;int main(){//显示系统欢迎界面void welcome();system("color 02");//将系统背景颜色置为黑色,前景暗绿色welcome();//画面停留3秒const time_t start=time(0);while(1){time_t current=time(0);if(current-start==3)break;}FamilySystem genealogy;//程序唯一的一个家谱对象//从文件中读取出家庭成员的信息,若读取不成功,则强制退出程序if(!genealogy.fileInit()){system("cls");//输出错误信息for(int i=0;i!=10;++i)cout<<"\n";string str=" ";cout<<str<<"读取文件时发生错误,程序将终止!\n\n"<<str<<"即将强制退出···"<<flush;//5秒后退出const time_t start=time(0);while(1){time_t current=time(0);if(current-start==5)exit(1);//异常退出}}//程序核心功能while(1){system("cls");//清屏system("color 02");int n=genealogy.menu();//显示菜单if(n==27)break;//按ESC键退出switch(n){case49:system("cls");genealogy.demandMem();break;//选择菜单项1case50:system("cls");genealogy.demandAve();break;//选择菜单项2 case51:system("cls");genealogy.addMem(); break;//选择菜单项2case52:system("cls");genealogy.deleteMem();break;//选择菜单项3 case53:system("cls");genealogy.modifyMem();break;//选择菜单项5 case54:system("cls");genealogy.showFamily();break;//选择菜单项6 default:;}}//保存信息到文件中,若发生错误,则当前所做修改不保存并强制退出程序if(!genealogy.saveFile()){system("cls");//输出错误信息for(int i=0;i!=12;++i)cout<<"\n";cout<<"保存文件时发生错误,所有工作将丢失!\n即将强制退出···"<<flush;//5秒后退出const time_t start=time(0);while(1){time_t current=time(0);if(current-start==5)exit(1);//异常退出}}//显示即将退出cout<<"\n\n 3秒后退出系统···";const time_t end=time(0);while(1){time_t current=time(0);if(current-end==3)break;}//正常退出return0;}void welcome(){//显示欢迎界面char*wel[]={"***********************************************************************\n","* *\n","* *\n","**\n","* ******** * * **** * ** ** *\n","* * * * * * * ** * * * *\n","* * * * * * ** * * * *\n","* ******* ******* * * ** * * *\n","* * * * * ** * * *\n","* * * * ** * * * *\n","* * * * ** *** ****** *** *\n","* *\n","* ******** ** ** ******** *************** * * *\n","* * * * * * * ** * * * * *\n","* * * * * ** * * * * *\n","* ******** * ******** ******** * * * *\n","* * * * ** * * * *\n","* * * * ** * * *\n","* ******** *** ******** ********** * * *\n","* *\n","* *\n","* *\n","***********************************************************************\n"};cout<<endl;for(const auto&i:wel)cout<<" "<<i;return;}。

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

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

项目名称:家谱系统的设计与实现学生姓名:学号:班级:指导教师: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为初始化函数的流程图,主要是对二叉树中数据域置空,对二叉树中的数据进行初始化。

家谱管理系统(含源代码)

家谱管理系统(含源代码)

家谱管理系统——C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。

排答疑和辅导。

完整代码:#include <stdio.h>#include <stdlib.h>#include <string.h>int MATEFLAG=0; //是否入赘或嫁入这家的,1表示为是,0表示否typedef struct TreeNode//树节点定义{int Num; //保存此人儿女个数char Name[20]; //保存此人姓名char Kind; //保存此人性别,男M,女Fstruct TreeNode * NextNode[20]; //保存此人的儿女,NextNode[0]里存放配偶的地址struct TreeNode * Parent; //保存此节点的父节点}TreeNode;void CreatTree(TreeNode *Tree);//创建树void OutPutAll(TreeNode *Tree);//输出树TreeNode * SearchTree(TreeNode *Tree,char name[],int length);void MainMenu(TreeNode *Tree);void SubMenue1(TreeNode * Tree);void SubMenue2(TreeNode *Tree);void Change(TreeNode * Tree);void AddNew(TreeNode * Tree);void OutPutMessage(TreeNode * Tree,char name[],int length);//主函数void main(){TreeNode *Tree;//产生根节点Tree=(TreeNode *)malloc(sizeof(TreeNode));Tree->Parent =NULL;strcpy(Tree->Name,"0");MainMenu(Tree);//显示主菜单}//添加新的成员void AddNew(TreeNode * Tree){SubMenue2(Tree);//添加新成员界面}//显示添加家庭信息的界面void SubMenue2(TreeNode *Tree){char c;int num;char name[20];TreeNode * NewNode;getchar();while(1){system("cls");printf("请选择你的操作\n");printf("A:添加某个人的子女的信息\n");printf("B:添加某个人配偶的信息\n");printf("C:退出\n");printf("请选择相应功能:\n");c=getchar();switch(c){case 'A': //添加子女信息printf("请输入那个人的名字:\n");scanf("%s",name);Tree=SearchTree(Tree,name,20);//在家谱里查找这个人if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);break;}if(Tree->Parent==NULL&&Tree->NextNode[0]==NULL||Tree->Parent!=NULL&&Tree->N ame!=Tree->Parent->NextNode[0]->Name){printf("至今还没有配偶请先添加配偶\n",Tree->Name);break;}if(Tree->Parent==NULL&&(Tree->Num>20||Tree->Num<0))Tree->Num=0;if(MATEFLAG==1)Tree=Tree->Parent;NewNode=(TreeNode *)malloc(sizeof(TreeNode));printf("请输入添加人员姓名:\n");scanf("%s",NewNode->Name);printf("请输入添加人员性别女F男M:\n");scanf("%1s",&NewNode->Kind);num=Tree->Num;NewNode->NextNode[0]=(TreeNode *)malloc(sizeof(TreeNode));NewNode->NextNode[0]=NULL;NewNode->Num=0;NewNode->Parent=Tree;Tree->NextNode[num+1]=NewNode;Tree->Num=Tree->Num+1;printf("子女的信息添加成功\n");break;case 'B':printf("请输入那个人的名字:\n");scanf("%s",name);Tree=SearchTree(Tree,name,20);if(Tree->Parent!=NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0||Tree->NextNode[0]!=NULL){printf("已经有了配偶\n");break;}if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认\n",name);break;}NewNode=(TreeNode *)malloc(sizeof(TreeNode));printf("请输入添加人员姓名:\n");scanf("%s",NewNode->Name);printf("请输入添加人员性别女F男M:\n");scanf("%1s",&NewNode->Kind);NewNode->Parent=Tree;Tree->NextNode[0]=NewNode;break;case 'C':printf("本项服务到此结束\n");break;case '\n':break;default:printf("对不起!你的选择错误\n");break;}if (c=='C'||c=='c')break;printf("请按Enter键继续操作\n");getchar();}}//修改某个人的信息void Change(TreeNode * Tree){char name[20];TreeNode * NewNode;printf("请输入你要修改的人的信息:\n");scanf("%s",name);NewNode=SearchTree(Tree,name,20);if(NewNode==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);return;}else{SubMenue1(NewNode);}}//输出副菜单void SubMenue1(TreeNode * Tree){char c;int flag,i;char name[20];char Parent[2][20];TreeNode * NewNode;getchar();while(1){system("cls");printf("请选择你的操作\n");printf("A:修改个人的信息\n");printf("B:修改父母的信息\n");printf("C:修改兄弟姐妹的信息\n");printf("D:修改子女的信息\n");printf("E:修改配偶的信息\n");printf("F:退出\n");c=getchar();switch(c){printf("请输入修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n"); scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Name,name);printf("是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if (flag==1){if(Tree->Kind=='F'||Tree->Kind=='f')Tree->Kind='M';else Tree->Kind='F';}printf("个人信息修改成功\n");break;case 'B':if(Tree->Parent==NULL) //判断是不是头节点{printf("是这个家谱图里最顶端的人没有父母信息!\n",name);break;}if (MATEFLAG==1) //判断是不是入赘或加入此间的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf("她是嫁入此间的所以父母信息不在家谱内包括\n");}else{printf("他是入赘此间的所以父母信息不在家谱内包括\n");}break;}if(Tree->Parent->Kind=='F'||Tree->Parent->Kind=='f'){strcpy(Parent[0],"母亲");strcpy(Parent[1],"父亲");}else{strcpy(Parent[0],"父亲");strcpy(Parent[1],"母亲");}printf("请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Parent[0]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);printf("请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Parent[1]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->NextNode[0]->Name,name);printf("父母的信息修改成功\n");break;case 'C':NewNode=Tree->Parent;if(NewNode==NULL) //判断是不是头节点{printf("是这个家谱图里最顶端的人没有兄弟姐妹信息!\n",name);break;}if (MATEFLAG==1) //判断是不是入赘或嫁入这家的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf("她是嫁入此间的所以兄弟姐妹信息不在家谱内包括\n");}else{printf("他是入赘此间的所以兄弟姐妹信息不在家谱内包括\n");}break;}if(NewNode->Num==1){printf("没有兄弟姐妹\n");break;}else{for(i=1;i<=NewNode->Num;i++){if(NewNode->NextNode[i]->Name!=Tree->Name){printf("请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",NewNode->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(NewNode->NextNode[i]->Name,name);printf("是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if (flag==1){if(NewNode->NextNode[i]->Kind=='G'||NewNode->NextNode[i]->Kind=='g') NewNode->NextNode[i]->Kind='B';else NewNode->NextNode[i]->Kind='G';}}}}printf("兄弟姐妹的信息修改成功\n");break;case 'D':if(Tree->Num==0){printf("至今还没有子女\n");break;}if (Tree->Parent !=NULL)if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0) //如果他是入赘或者是嫁入的就需用配偶节点完成修改{Tree=Tree->Parent;}for(i=1;i<=Tree->Num;i++){printf("请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Tree->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[i]->Name,name);printf("是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if (flag==1){if(Tree->NextNode[i]->Kind=='F'||Tree->NextNode[i]->Kind=='f')Tree->NextNode[i]->Kind='M';else Tree->NextNode[i]->Kind='F';}}printf("子女的信息修改成功\n");break;case 'E':if(Tree->Parent!=NULL){if(Tree->NextNode[0]==NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)!=0){printf("至今还没有配偶\n");break;}if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0){printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->Parent->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);}else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->Name,name);}}else{if(Tree->NextNode[0]==NULL)printf("至今还没有配偶\n");else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->Name,name);}}printf("配偶的信息修改成功\n");break;case 'F':printf("本项服务到此结束\n");break;case '\n':break;default:printf("对不起!你的选择错误\n");break;}if (c=='F'||c=='f')break;printf("请按Enter键继续操作\n");getchar();getchar();}}//输出主菜单void MainMenu(TreeNode *Tree){char c;//用于接受用户输入的选项char name[20];while(1){system("cls");//清屏printf("★★★★★★★★★★★★★欢迎进入家谱管理系统★★★★★★★★★★★\n\n\n");printf(" ◆◆菜单◆◆ \n\n");printf(" ●输入家谱信息---------------------1\n");printf(" ●查找家族成员---------------------2\n");printf(" ●添加家族成员---------------------3\n");printf(" ●输出家谱信息---------------------4\n");printf(" ●修改成员信息---------------------5\n");printf(" ●退出-----------------------------6\n");printf("\n\n★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");printf("请选择相应的功能:\n");c=getchar();switch(c){case '1': TreeNode * NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode));//建立新节点printf("请输入姓名:"); scanf("%s",Tree->Name);//给节点姓名赋值printf("请输入性别(女F,男M):"); getchar();//给性别赋值scanf("%c",&(Tree->Kind)); // Tree->Parent=NewNode; Tree->Parent=NULL; CreatTree(Tree); printf("家谱图已经建立成功\n"); printf("请按Enter键继续操作\n"); getchar(); break; case '2': if(strcmp(Tree->Name,"0")==0) { printf("家谱图还未建立请先建立\n"); getchar(); break; } printf("请输入你要查找的人的姓名:\n"); scanf("%s",name); OutPutMessage(SearchTree(Tree,name,20),name,20); getchar(); break; case '3': if(strcmp(Tree->Name,"0")==0) { printf("家谱图还未建立请先建立\n"); getchar(); break; } AddNew(Tree); getchar(); break; case '4': if(strcmp(Tree->Name,"0")==0) { printf("家谱图还未建立请先建立\n"); getchar(); break; }printf("整个家谱的主要信息如下:\n");OutPutAll(Tree);getchar();break;case '5':if(strcmp(Tree->Name,"0")==0){printf("家谱图还未建立请先建立\n");getchar();break;}Change(Tree);getchar();break;case '6':printf("本程序结束,欢迎下次使用。

家谱管理系统项目简介

家谱管理系统项目简介

引言概述家谱管理系统是一个基于计算机技术的家族谱系追溯与记录工具,它的主要目标是帮助用户轻松地管理家族的谱系信息,并提供便捷的查询和维护功能。

家谱管理系统的应用范围广泛,可以适用于家族组织、家族企业、家族文化传承等方面。

本文将针对家谱管理系统进行详细的介绍和分析,包括系统架构、功能模块、技术实现等方面的内容。

正文内容1. 系统架构1.1 客户端1.1.1 用户界面家谱管理系统的客户端采用友好的图形用户界面,用户可以通过界面操作完成家谱信息的添加、查询、修改等操作。

1.1.2 数据存储客户端需要提供本地数据存储功能,用于存储用户的家谱信息。

可以通过文件存储或数据库存储的方式实现。

1.2 服务器端1.2.1 数据库管理服务器端需要建立一套完善的数据库管理系统,用于存储和管理用户的家族谱系数据,保障数据的安全性和稳定性。

1.2.2 业务逻辑处理服务器端需要实现家谱信息的增删改查等基本业务逻辑处理,包括数据的校验、数据的关联处理等功能。

1.3 网络通信客户端和服务器端之间需要建立稳定可靠的网络通信,确保用户能够正常访问服务器端的数据。

2. 功能模块2.1 家谱信息录入模块家谱管理系统需要提供一个用户友好的家谱信息录入界面,用户可以通过该界面输入家族成员的基本信息,并建立起家族成员之间的关系网。

2.2 家谱查询模块家谱管理系统提供了强大的查询功能,用户可以通过姓名、出生日期、关系等关键字进行快速搜索和查找。

并可根据用户需求展示不同级别的家族成员。

2.3 家族统计模块家谱管理系统可以根据家族成员的属性信息进行统计分析,比如年龄分布、性别比例等,为家族成员提供全面的了解。

2.4 家族事件模块家谱管理系统可以记录家族的重要事件,比如婚姻、出生、逝世等,方便用户进行追溯和回顾。

2.5 家族文化传承模块家谱管理系统可以提供家族文化资料共享功能,让家族成员可以共同学习和传承家族的优秀文化。

3. 技术实现3.1 前端技术家谱管理系统的前端界面部分可以采用HTML、CSS、JavaScript等前端技术进行开发,实现交互式的用户界面,提升用户体验。

家谱管理系统

家谱管理系统

江西农业大学科技月月评题目:家谱管理系统小组成员:陈江、易伟、段浩然(1107)汪志民、张馨香(1113)2012、11、30目录1.问题陈述 (1)2.设计方法阐述 (1)2.1总体规划 (1)2.2功能分析与实现 (3)2.2.1主界面介绍 (3)2.2.2增加成员功能 (5)2.2.3显示家族成员信 (5)2.2.4删除功能 (6)2.2.5查询功能 (7)2.2.6查询第n代所有人得信息 (8)2.2.7修改成员信息 (8)2.2.8连接数据库 (9)2.2.9绘制图形家谱 (10)2.2.10小结 (11)3.总结 (11)4.代码 (12)5.家族成员 (46)1.问题陈述家谱用于记录某家族历代家族成员的情况与关系。

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

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

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

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

首先是考虑数据类型。

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

Class Person {String name;//姓名int age;//年龄String sex;//性别Birthday ymd;//出生日期String fatherName;String motherName;String spouseName;int childNum;int levelTemp; //代数Boolean isAlive;//是否健在}为方便计算机进行比较,在Person类的某些属性中用数字代替了某些不会改变的字符串,譬如判断是否健在(true为是,false为否)。

家谱管理系统(含源代码)x

家谱管理系统(含源代码)x

家谱管理系统——C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。

排答疑和辅导。

完整代码:#in clude<stdio.h>#in clude<stdlib.h>#in clude<stri ng.h>intMATEFLAG=O;〃是否入赘或嫁入这家的,1表示为是,0表示否tRpedefstructTreeNode// 树节点定义{intNum;//保存此人儿女个数charName[20];〃保存此人姓名charKind;//保存此人性别,男 M,女FstructTreeNodeRNeRtNode[20];〃保存此人的儿女,NeRtNode[0]里存放配偶的地址structTreeNodeRParent;〃保存此节点的父节点}TreeNode;voidCreatTree(TreeNodeRTree);// 创建树 voidOutPutAII(TreeNodeRTree);// 输出树TreeNodeRSearchTree(TreeNodeRTree,charname[],i ntle ngth);voidMai nMenu (TreeNodeRTree);voidSubMe nue1(TreeNodeRTree);voidSubMe nue2(TreeNodeRTree);voidCha nge(TreeNodeRTree);voidAddNew(TreeNodeRTree); voidOutPutMessage(TreeNodeRTree,charname[],i ntle ngth);//主函数voidmai n(){TreeNodeRTree;// 产生根节点Tree=(TreeNodeR)malloc(sizeof(TreeNode));Tree->Pare nt=NULL;strcpR(Tree->Name,"0");MainMenu(Tree);// 显示主菜单}//添加新的成员voidAddNew(TreeNodeRTree){SubMenue2(Tree);〃添加新成员界面}//显示添加家庭信息的界面voidSubMe nue2(TreeNodeRTree){charc;intnum;char name[20];TreeNodeRNewNode;getchar();while(1)sRstem("cls");printf(”请选择你的操作\n”);printf("A:添加某个人的子女的信息\n");printf("B:添加某个人配偶的信息\n");printf("C:退出 \n”);printf(”请选择相应功能:\n");c=getchar();switch(c){case'A'://添加子女信息printf(”请输入那个人的名字:\n");sca nf("%s", name);Tree=SearchTree(Tree ,n ame,20);〃在家谱里查找这个人if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);break;}if(Tree->Pare nt==NULL&&Tree->NeRtNode[0]==NULL||Tree->Pare nt!=NULL&& Tree->N ame!=Tree->Pare nt->NeRtNode[0]->Name){printf(”至今还没有配偶请先添加配偶\n",Tree->Name);break;}if(Tree->Pare nt==NULL&&(Tree->Num>20||Tree->Num<0))Tree->Num=0;if(MATEFLAG==1)Tree=Tree->Pare nt;NewNode=(TreeNodeR)malloc(sizeof(TreeNode));printf(”请输入添加人员姓名:\n");sca nf("%s",NewNode->Name);printf(”请输入添加人员性别女F男M:\n");sca nf("%1s",&NewNode->Ki nd);num=Tree->Num;NewNode->NeRtNode[0]=(TreeNodeR)malloc(sizeof(TreeNode));NewNode->NeRtNode[0]=NULL;NewNode->Num=0;NewNode->Pare nt=Tree;Tree->NeRtNode[ num+1]=NewNode;Tree->Num=Tree->Num+1;printf(”子女的信息添加成功\n");break;case'B':printf(”请输入那个人的名字:\n");sca nf("%s", name);Tree=SearchTree(Tree ,n ame,20);if(Tree->Pare nt!=NULL&&strcmp(Tree->Name,Tree->Pare nt->NeRtNode[0]->Name)==0||T ree->NeRtNode[0]!=NULL)printf(”已经有了配偶\n”);break;}if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认\n",name); break;}NewNode=(TreeNodeR)malloc(sizeof(TreeNode));printf(”请输入添加人员姓名:\n");sca nf("%s",NewNode->Name);printf(”请输入添加人员性别女F男M:\n");sca nf("%1s",&NewNode->Ki nd);NewNode->Pare nt=Tree;Tree->NeRtNode[0]=NewNode;break;case'C':printf(”本项服务到此结束\n");break;case'\n':break;default:printf("对不起!你的选择错误\n");break;}if(c==C||c=='c')break;printf(”请按Enter键继续操作\n");getchar();getchar();}}//修改某个人的信息voidCha nge(TreeNodeRTree){char name[20];TreeNodeRNewNode;printf(”请输入你要修改的人的信息:\n");sca nf("%s", name);NewNode=SearchTree(Tree ,n ame,20);if(NewNode==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误 return;\n ”, name); }else{SubMe nu e1(NewNode);}}//输出副菜单voidSubMe nue1(TreeNodeRTree){charc;in tflag,i;char name[20];charPare nt[2][20];TreeNodeRNewNode;getchar();while(1){sRstem("cls");printf(”请选择你的操作\n”);printf("A:修改个人的信息\n");printf("B:修改父母的信息\n”);printf("C:修改兄弟姐妹的信息\n");printf("D:修改子女的信息\n");printf("E:修改配偶的信息\n”);printf("F:退出 \n");c=getchar();switch(c){case'A':printf(”请输入修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n"); sca nf("%s", name);if(strcmp( name,"0")!=0)strcpR(Tree->Name, name);printf(”是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");sca nf("%d", &flag);if(flag==1){if(Tree->K in d=='F'||Tree->Ki nd=='f)Tree->Ki nd='M';elseTree->K in d='F';}printf(”个人信息修改成功\n");break;case'B':if(Tree->Pare nt==NULL)〃判断是不是头节点{printf(”是这个家谱图里最顶端的人没有父母信息!\n",name);break;}if(MATEFLAG==1)〃判断是不是入赘或加入此间的{if(Tree->K in d=='F'||Tree->Ki nd=='f)printf(”她是嫁入此间的所以父母信息不在家谱内包括\n");}else{printf(”他是入赘此间的所以父母信息不在家谱内包括\n");}break;}if(Tree->Pare nt->K in d=='F'||Tree->Pare nt->K in d=='f){strcpR(Parent[O],"母亲");strcpR(Parent[1],"父亲");}else{strcpR(Parent[O],"父亲");strcpR(Parent[1],"母亲");}printf(”请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Pare nt[O]);sca nf("%s", name);if(strcmp( name,"O")!=O)strcpR(Tree->Pare nt->Name, name);printf(”请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Pare nt[1]);sca nf("%s", name);if(strcmp( name,"0")!=0)strcpR(Tree->Pare nt->NeRtNode[0]->Name, name);printf(”父母的信息修改成功\n");break;case'C':NewNode=Tree->Pare nt;if(NewNode==NULL)〃判断是不是头节点{printf(”是这个家谱图里最顶端的人没有兄弟姐妹信息!\n",name);break;}if(MATEFLAG==1)〃判断是不是入赘或嫁入这家的{if(Tree->K in d=='F'||Tree->Ki nd=='f){printf(”她是嫁入此间的所以兄弟姐妹信息不在家谱内包括\n");}else{printf(”他是入赘此间的所以兄弟姐妹信息不在家谱内包括\n");break;}if(NewNode->Num==1){printf(”没有兄弟姐妹\n”);break;}else{for(i=1;i<=NewNode->Num;i++){if(NewNode->NeRtNode[i]->Name!=Tree->Name){printf(”请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter 键继续 \n”,NewNode->NeRtNode[i]->Name);sea nf("%s", name);if(strcmp( name,"O")!=O) strcpR(NewNode->NeRtNode[i]->Name, name); printf(”是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");sca nf("%d", &flag);if(flag==1){if(NewNode->NeRtNode[i]->K in d=='G'||NewNode->NeRtNode[i]->Ki nd=='g') NewNode->NeRtNode[i]->Ki nd='B: elseNewNode->NeRtNode[i]->Ki nd='G'; }}}}printf(”兄弟姐妹的信息修改成功\n");break;case'D':if(Tree->Num==O){printf(”至今还没有子女\n");break;}if(Tree->Pare nt!=NULL)if(strcmp(Tree->Name,Tree->Pare nt->NeRtNode[0]->Name)==0)〃如果他是入赘或者是嫁入的就需用配偶节点完成修改{Tree=Tree->Pare nt;}for(i=1;i<=Tree_>Num;i++){printf(”请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Tree->NeRtNode[i]->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)printf(”是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter 键继续 \n");sca nf("%d", &flag);if(flag==1){if(Tree->NeRtNode[i]->Ki nd=='F'||Tree->NeRtNode[i]->Ki nd=='f)Tree->NeRtNode[i]->Ki nd='M';elseTree->NeRtNode[i]->Kin d='F';}}printf(”子女的信息修改成功\n");break;case'E':if(Tree->Pare nt!=NULL){if(Tree->NeRtNode[0]==NULL&&strcmp(Tree->Name,Tree->Pare nt->NeRtNode[0]->Name)!=0) {printf(”至今还没有配偶\n”);break;}if(strcmp(Tree->Name,Tree->Pare nt->NeRtNode[0]->Name)==0){printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter 键继续 \n\t",Tree->Parent->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)strcpR(Tree->Pare nt->Name, name);}else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter 键继续 \n\t",Tree->NeRtNode[0]->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)strcpR(Tree->NeRtNode[0]->Name, name);}}else{if(Tree->NeRtNode[0]==NULL)printf("至今还没有配偶\n”);else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter 键继续 \n\t",Tree->NeRtNode[0]->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)}}printf(”配偶的信息修改成功\n");break;case'F':printf(”本项服务到此结束\n");break;case'\n':break;default:printf("对不起!你的选择错误\n");break;}if(c=='F'||c=='f)break;printf(”请按Enter键继续操作\n");getchar();getchar();}}//输出主菜单voidMai nMen u(TreeNodeRTree){chare;//用于接受用户输入的选项char name[20];while(1){sRstem("cls");〃清屏printf(” ★★★★★★★★★★★★★欢迎进入家谱管理系统★★★★★★★★★★★ \n\n\n");printf(” ♦♦菜单・・ \n\n”);printf(”输入家谱信息 ----------- 1\n");printf(”查找家族成员 ----------- 2\n");printf(”添加家族成员 ----------- 3\n");printf("输出家谱信息 ------------ 4\n");printf("修改成员信息 ------------ 5\n");printf(” 退出 ---------------- 6\n");printf("\n\n ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n");printf(”请选择相应的功能:\n");c=getchar();switch(c){case'1':TreeNodeRNewNode;NewNode=(TreeNodeR)malloc(sizeof(TreeNode));〃建立新节点printf("请输入姓名:");scanf("%s",Tree->Name);〃给节点姓名赋值printf(”请输入性别(女F男M):");getchar();// 给性另U 赋值scanf("%c",&(Tree->Kind));//Tree->Parent=NewNode;Tree- >Parent=NULL;CreatTree(Tree);printf("家谱图已经建立成功 \n”);printf(” 请按 Enter 键继续操作 \n");getchar();break;case'2':if(strcmp(Tree->Name,"0")==0){pri ntf("家谱图还未建立请先建立\n");getchar();break;}pri ntf(" 请输入你要查找的人的姓名:\n");scanf("%s",name);OutPutMessage(SearchTree(Tree,name,20),name,20);getchar();break;c ase'3':if(strcmp(Tree->Name,"0")==0){pri ntf(" 家谱图还未建立请先建立\n");getchar();break;}AddNew(Tree);getchar();break;case'4':if(strcmp(Tree- >Name,"0")==0) {printf("家谱图还未建立请先建立 \n");getchar();break;}printf(”整个家谱的主要信息如下:\n");OutPutAll(Tree);getchar();break; case'5': if(strcmp(Tree->Name,"0")==0){printf(”家谱图还未建立请先建立 \n");getchar();break;}Chan ge(Tree);getchar(); break; case'6': printf(”本程序结束,欢迎下次使用。

数据结构_家谱管理系统

数据结构_家谱管理系统

数据结构_家谱管理系统家谱是记录一个家族的血缘关系和历史的重要文化遗产。

传统的家谱管理方式通常是以纸质形式存在,随着科技的发展,数字化的家谱管理系统逐渐兴起。

本篇文章将介绍一个基于数据结构的家谱管理系统的设计与实现。

一、需求分析家谱管理系统的主要功能包括:1. 家族成员的添加、删除和修改;2. 家族成员之间的关系建立与维护;3. 家族成员信息的查询与展示;4. 家族历史的记录与维护。

二、系统设计1. 数据结构选择在设计家谱管理系统时,我们可以选择不同的数据结构来存储家族成员的信息和关系。

常见的数据结构有链表、树和图等。

考虑到家族成员之间具有明确的父子关系,我们选择使用树这一数据结构来存储家族成员的信息。

2. 树的设计与实现家谱管理系统中的树可以采用多叉树的结构,每一个节点表示一个家族成员,节点之间的边表示父子关系。

每一个节点包含成员的基本信息,如姓名、性别、出生日期等。

此外,我们可以添加一些额外的字段来记录其他相关信息,如职业、教育背景等。

3. 树的操作家谱管理系统需要实现一些基本的树操作,包括:- 添加成员:根据家族成员的父子关系,在树中添加新的节点。

- 删除成员:删除指定节点及其子节点。

- 修改成员信息:更新指定节点的信息。

- 查询成员信息:根据成员的姓名或者其他关键字,在树中进行遍历查找。

- 显示家族树:以树的结构展示整个家族的成员关系。

三、系统实现家谱管理系统可以使用编程语言来实现,如Java、Python等。

以下是一个简单的Java代码示例:```javaclass FamilyMember {String name;String gender;String birthdate;// 其他成员信息字段List<FamilyMember> children;public FamilyMember(String name, String gender, String birthdate) { = name;this.gender = gender;this.birthdate = birthdate;this.children = new ArrayList<>();}public void addChild(FamilyMember child) {this.children.add(child);}// 其他成员操作方法}class FamilyTree {FamilyMember root;public FamilyTree(FamilyMember root) {this.root = root;}// 其他树操作方法}public class GenealogyManagementSystem {public static void main(String[] args) {// 创建家族成员FamilyMember grandpa = new FamilyMember("Grandpa", "Male", "1950-01-01");FamilyMember father = new FamilyMember("Father", "Male", "1975-01-01");FamilyMember mother = new FamilyMember("Mother", "Female", "1980-01-01");FamilyMember child1 = new FamilyMember("Child1", "Male", "2000-01-01");FamilyMember child2 = new FamilyMember("Child2", "Female", "2005-01-01");// 建立成员关系grandpa.addChild(father);grandpa.addChild(mother);father.addChild(child1);father.addChild(child2);// 创建家族树FamilyTree familyTree = new FamilyTree(grandpa);// 其他操作}}```四、系统扩展与优化1. 数据存储:可以将家族成员的信息存储在数据库中,以便实现更复杂的查询和统计功能。

数据结构课设-家谱管理系统

数据结构课设-家谱管理系统

数据结构课程设计——家谱管理系统一、问题描述问题名称:电子家谱问题内容:用树形的形式表示某家族的家谱,每个树结点表示一个家族成员,成员基本信息如下,具体属性自行确定。

1、姓名2、性别3、出生地4、配偶5、电话6、家庭住址7、职业8、简历9、其他系统实现功能:1、家谱信息1.1、输入1.2、修改1.3、删除2、查询2.1、某家谱成员的所有子孙的集合2.2、某家谱成员的所有祖先的集合2.3、某家谱成员的所有同辈成员的集合2.4、求某家谱成员的所有上一辈成员的集合2.5、给出两个家谱成员,确定他们的关系2.6、其他查询3、统计功能3.1、统计家谱成员的总人数3.2、统计从事某种职业的人数3.3、综合统计其他功能要求:1、用文件保存家谱信息2、图形方式显示家谱2二、系统总体设计(模块结构图)建立家谱读取文件保存家谱添加结点修改结点删除结点程序入口输出家谱统计基本查询关系查询祖先列表两人关系三、算法和数据结构设计数据结构的设计:使用兄弟孩子父亲表示法数据结构由如下的结构体组成1.1、日期的结构struct Date{int year; //年int month; //月int day; //日};1.2、成员信息的结构struct Info{char name[max_char_num];//姓名char birthplace[max_char_num];//出生地点Date birthdate;//结构date定义的出生日期Date deathdate;//结构date定义的死亡日期char sex[max_char_num];//性别char wife_or_husband[max_char_num];//配偶char phone[max_array_num];//电话char address[max_char_num];//家庭住址char resume[max_char_num];//简历//其他信息如下int height;//高度char occupation[max_char_num];//职业3char education[max_char_num];//受教育程度char top_headship[max_char_num];//最高职位char parentname[max_char_num];//父亲姓名,用于添加节点时用int Depth;//二叉树深度,输出二叉树时用};1.3、结点的结构typedef struct CSNode{Info data; //个人信息类型结构CSNode *firstchild,*nextsibling,*parent; //csnode的第一个孩子节点,下一个兄弟节点,双亲节点}*person;数据结构设计体会:使用树的按层遍历的方法找出某人的祖先的集合,但在从文件重建家谱的部分又碰到了困难,如何保存文件可是既节省空间又节省重建家谱的时间。

家族族谱系统

家族族谱系统

宁波大红鹰学院信息工程学院课程设计报告项目名称:家族族谱系统项目组长:王佩珂项目成员:王陈健马溯滨童炳班级名称:10计科1专业名称:计算机科学与技术完成时间:2012.12.19信息工程学院制目录一、案例描述...................................................................................................................... - 1 -1、总体描述................................................................................................................ - 1 -2、模块描述................................................................................................................ - 1 -二、设计思路...................................................................................................................... - 1 -三、程序设计...................................................................................................................... - 1 -1、数据结构描述........................................................................................................ - 1 -2、主函数及其流程图................................................................................................ - 1 -3、源程序.................................................................................................................... - 2 -四、调试与分析.................................................................................................................. - 4 -1开始运行程序......................................................................................................... - 10 -2 增加信息................................................................................................................ - 10 -五、设计总结.................................................................................................................... - 12 -1、完成情况.............................................................................................................. - 12 -2、心得体会.............................................................................................................. - 12 -一、案例描述1、总体描述输入家族成员情况,建立树结构,统计家族成员人数,能查询家族成员辈份情况。

家谱管理系统1(1)

家谱管理系统1(1)

家谱管理系统1(1) -标准化文件发布号:(9556-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII《软件综合设计》家谱管理系统院系:计算机科学技术学院二系班级:计11 – 2班姓名:刘文秀(15)合作者:姜雪(05) 、岳奉宜(33)指导教师:薛曼玲2013 年 12 月 01 日《软件综合设计》任务书一、题目:家谱管理系统二、设计要求(1)刘文秀(组长)、姜雪和岳奉宜组成课程设计小组。

(2)小组成员分工协作完成。

要求每个成员有自己相对独立的模块,,同时要了解其他组员完成的内容。

(3)查阅相关资料,自学具体课题中涉及到的新知识。

(4)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。

(5)所设计的系统应有菜单、动画和音乐。

(6)按要求写出课程设计报告,并于设计结束后1周内提交。

其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求分析、总体设计、详细设计、程序的调试与测试、总结与体会、结束语、程序清单(带中文注释)、参考文献等。

报告一律用A4纸打印,正文的中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。

1级标题中文字体为黑体,西文字体为Time New Roma,采用三号字;段落为居中、段前18磅、段后12磅、行距采用“固定值”18磅,首行缩进:无,段中不分页,与下段同页。

仅一级标题上目录。

三、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在400行有效程序行以上,不得抄袭。

四、课程设计工作计划2013年12月2日,指导教师讲课,学生根据题目准备资料,需求分析;2013年12月3日,设计小组进行总体方案设计和任务分工;2013年12月4日~2013年12月10日,每人完成自己承担的程序模块并通过独立编译;2013年12月11日~12日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;2013年12月13日,验收、开始撰写课程设计报告;2013年12月18日前,提交课程设计报告和软件。

家谱管理系统

家谱管理系统

家谱管理系统一、需求分析本系统实现以下功能:1). 输入文件以存放最初家谱中各成员的信息。

成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)也可附加其它信息、但不是必需的。

2). 实现数据的存盘和读盘。

3). 以图形方式显示家谱。

4). 显示第n 代所有人的信息。

5). 按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。

6). 按照出生日期查询成员名单。

7). 输入两人姓名,确定其关系。

8). 某成员添加孩子。

9). 删除某成员(若其还有后代,则一并删除)。

10).修改某成员信息。

11).按出生日期对家谱中所有人排序。

12).打开一家谱时,提示当天生日的健在成员。

测试要求:1).建立至少30个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。

2).对界面的要求是:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。

二、设计概要1、抽象数据类型兄弟孩子树的定义如下:ADT CSNode{数据对象:person是兄弟孩子树中的每一个节点,T是整个树的统一体数据关系:R1={<person i-1,person i>|<person i-1,person i>表示person i-1和person i之间有血缘关系}基本操作:CSNode *CreatTree(fstream &outfile);初始条件:已经打开了文本文件PersonInfo.txt操作结果:创建一个兄弟孩子树T,并把从文件中的数据送到树中,关闭文件。

void CreatParent_step(CSNode *parent);初始条件:兄弟孩子树T已经存在操作结果:对所有的孩子节点添加指向父亲的指针void InOrderTraverse(CSNode *T);初始条件:兄弟孩子树T已经存在操作结果:对T进行中序遍历。

bool Today_Brithday(CSNode *T);初始条件:兄弟孩子树T已经存在操作结果:根据计算机系统的时间判断几天是否有人过生日,并显示他们的名字。

C语言二叉树家谱管理系统

C语言二叉树家谱管理系统

摘要本文设计了一个对数据输入,输出,储存,查找的多功能软件,本文需要保存家族的基本信息,包括姓名及它们的关系,但是由于家族信息很巨大而且关系很复杂所以采用二叉树来表示它们的关系。

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

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

本文采用二叉树来存取家族的基本信息,头结点作为父亲节点,他的左孩子为他的妻子,妻子结点的右孩子为他的孩子,依次存储每个家庭的信息。

可以查找每个父亲的孩子和每个人的所有祖先。

关键词:二叉树家谱结点目录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开始,成员可以由各种数据类型混合构成,成员甚至还可以是数组或者其他类型的结构,但是,结构体中不能包含自身定义类型的成员。

家谱管理系统的源代码

家谱管理系统的源代码

#include〈iostream。

h> #include〈string。

h>#include〈fstream.h〉#include〈stdlib。

h〉struct per{int data;char name[20];char brith[20];char marry;char address[20];char live;char dietime[20]; char parent[20];int generation;int child[10];int numberchild;per(){for(int i=0;i〈20;i++)name[i]=’\0';for(i=0;i<20;i++)brith[i]=’\0';for(i=0;i<20;i++)address[i]='\0';for(i=0;i<20;i++)dietime[i]=’\0';for(i=0;i〈10;i++)child[i]=0;for(i=0;i〈20;i++)parent[i]='\0';live='\0’;marry=’\0’;data=—10;generation=0;numberchild=0;}};void setupinfo(per person[]);void display(per person[],int&);void displayhome(per person[],int&);void displayinfo(per person[],int&);void namesearch(per person[],int&);void birtfdaysearch(per person[],int&);void addchild(per person[],int&);void editmember(per person[],int&);void sortbirthday(per person[],int&);void main(){per person[36];int count=0;fstream inputFile(”person。

家谱管理系统数据结构

家谱管理系统数据结构

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<conio.h>#define MAXS 100#define Elemtype chartypedef struct BiTNode{int mark;int level;char name[50];char birthday[50];char address[MAXS];Elemtype data;struct BiTNode *lc,*rc; }BiTNode,*BiTree;char nametemp[50];//姓名char birthdaytemp[50];//生日char addresstemp[MAXS];//地址char ch;int leveltemp;int Nth;char searchdata[50];char searchname[50];int count;BiTree temp;BiTree CreateBiTree(FILE *fp);void PrintInfo(BiTree T);void PreOrderTS(BiTree T);void ShowNth(BiTree T);void SearchByName(BiTree T);void SearchByBirthday(BiTree T);void AddChild(BiTree T);void DeleteByName(BiTree T);void searchmenu();void menu();void insystem();void closefile();#include"my.h"void SearchByName(BiTree T)//按照姓名查询,输出成员信息{if(T){if(T->lc){if(T->lc->rc){temp=T->lc->rc;while(temp){if(strcmp(temp->name,searchname)==0){count++;printf("\n此人的信息为: \n");PrintInfo(temp);printf("此人父兄的信息为: \n");PrintInfo(T);if(temp->lc->rc){printf("此人孩子的信息为: \n");temp=temp->lc->rc;while(temp){PrintInfo(temp);temp=temp->rc;}}return;}elsetemp=temp->rc;}}}SearchByName(T->lc);SearchByName(T->rc);}else{printf("请先建立家庭关系\n");return;}}void SearchByBirthday(BiTree T)//按照出生日期查询成员名单{if(T){if(strcmp(T->birthday,searchdata)==0){PrintInfo(T);count++;}}}void AddChild(BiTree T)//某成员添加孩子{if(T){if(strcmp(T->name,searchname)==0){count++;temp=(BiTree)malloc(sizeof(BiTNode));printf("请输入添加孩子的姓名:\n");scanf("%s",temp->name);printf("请输入添加孩子的出生年月:(格式形如: 2010-1-1)\n");scanf("%s",temp->birthday);printf("请输入添加孩子的家庭住址:\n");scanf("%s",temp->address);temp->level=T->level+1;temp->rc=T->lc->rc;temp->lc=NULL;T->lc->rc=temp;printf("孩子添加成功\n");return;}AddChild(T->lc);AddChild(T->rc);}else{printf("请先建立家庭关系\n");return;}}void DeleteByName(BiTree T)//删除某成员(若其还有后代,则一并删除){if(T){if(strcmp(T->name,searchname)==0){count++;T=NULL;return;}DeleteByName(T->lc);DeleteByName(T->rc);}}BiTree CreateBiTree(FILE *fp){if(!feof(fp)){BiTree T;T=(BiTree)malloc(sizeof(BiTNode));fscanf(fp,"%s %s %s\n",nametemp,birthdaytemp,addresstemp);fscanf(fp,"%d",&leveltemp);if((strcmp(nametemp,"n")==0)&&(strcmp(birthdaytemp,"n")==0)&&(strcmp(addresstemp,"n")==0)) {T=NULL;return T;}else{strcpy(T->name,nametemp);strcpy(T->birthday,birthdaytemp);strcpy(T->address,addresstemp);T->level=leveltemp+1;printf("读取成功\n");T->lc=CreateBiTree(fp);T->rc=CreateBiTree(fp);return T;}}elsereturn NULL;}#include"my.h"void main(){BiTree T;int choice;FILE *fp;T=NULL;fp=fopen("F:\\family.txt","r");insystem();while(1){system("cls");menu();printf("请根据菜单进行选择所需操作:");while(scanf("%d",&choice)!=1){fflush(stdin);printf("\n---输入错误---\n\n");printf("请重新输入正确选择:");}fflush(stdin);switch(choice){case 1:T=CreateBiTree(fp);system("pause");break;case 2:count=0;printf("请输入要添加孩子父母的姓名:\n");scanf("%s",searchname);AddChild(T);if(count==0)printf("没有这个人\n");system("pause");break;case 3:count=0;printf("请输入要删除成员的姓名: ");scanf("%s",searchname);DeleteByName(T);if(count==0)printf("没有这个人\n");system("pause");break;case 4:searchmenu();printf("请输入选择:\n");system("pause");break;case 5:PreOrderTS(T);system("pause");break;case 6:closefile();case 7:printf("请输入需要查询第几代人: ");count=0;scanf("%d",&Nth);ShowNth(T);if(count==0)printf("第%d代尚未有人。

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

#include<iostream.h>#include<string.h>#include<fstream.h>#include<stdlib.h>struct per{int data;char name[20]; char brith[20];char marry;char address[20]; char live;char dietime[20]; char parent[20];int generation;int child[10];int numberchild;per(){for(int i=0;i<20;i++)name[i]='\0';for(i=0;i<20;i++)brith[i]='\0';for(i=0;i<20;i++)address[i]='\0';for(i=0;i<20;i++)dietime[i]='\0';for(i=0;i<10;i++)child[i]=0;for(i=0;i<20;i++)parent[i]='\0';live='\0';marry='\0';data=-10;generation=0;numberchild=0;}};void setupinfo(per person[]);void display(per person[],int&); void displayhome(per person[],int&); void displayinfo(per person[],int&); void namesearch(per person[],int&);void birtfdaysearch(per person[],int&);void addchild(per person[],int&);void editmember(per person[],int&);void sortbirthday(per person[],int&);void main(){per person[36];int count=0;fstreaminputFile("person.txt",ios::in|ios::out|ios::binar y);if(!inputFile){cout<<"文件不存在!"<<endl;exit(0);}inputFile.read((char*)&person[count],sizeof (person[count]));//从文件中读取指定大小的字节函数read(),读取字节函数while(!inputFile.eof()) //当文件没有读取完毕,进行循环{if(person[count].name[0]!='\0')//当名字不为空时{count++; //统计人数inputFile.read((char*)(person+count),sizeof( *person));}}inputFile.close();//关闭文件if(count<1) //如果家谱图里面没人{cout<<" 家谱不存在,请你建立一个家谱!!"<<endl;setupinfo(person);}display(person,count);}void setupinfo(per person[36]) //创建信息{int i,j,k;fstreamoutputfile("person.txt",ios::in|ios::out|ios::bina ry|ios::app); //打开文件for(i=0;i<5;i++){cout<<" 姓名: ";cin.getline(person[i].name,20);cout<<" 生日(日期样式为xxxx/xx/xx) : ";cin.getline(person[i].brith,20);cout<<" 婚否(输入Y或y或N或n) :";cin>>person[i].marry;while(toupper(person[i].marry)!='Y'&&toup per(person[i].marry)!='N'){cout<<" 你输入错误,请你重新输入!!"<<endl;cout<<" 婚否(输入Y或y或N或n) :";cin>>person[i].marry;}cin.ignore();cout<<" 地址: ";cin.getline(person[i].address,20);cout<<" 是否健在(输入Y或y或N或n) :";cin>>person[i].live; //是否死亡while(toupper(person[i].live)!='Y'&&touppe r(person[i].live)!='N'){cout<<" 你输入错误,请你重新输入!!"<<endl;cout<<" 婚否(输入Y或y或N或n) :";cin>>person[i].live;}cin.ignore();if(toupper(person[i].live)=='N'){cout<<" 死亡日期(日期样式为xxxx/xx/xx) :";cin.getline(person[i].dietime,20);// 输入死亡日期}cout<<" 属于第几代: ";cin>>person[i].generation;cin.ignore();if(person[i].generation!=1) //不是第一{cout<<" 他(她)的父亲: ";cin.getline(person[i].parent,20);//cin.getline是读取字符串函数20是读取字符串的个数}cout<<endl;}for(j=0;j<i;j++){if(person[j].generation==1)person[j].data=-1;//****************************}for(j=0;j<i;j++){for(k=0;k<i;k++){if(strcmp(person[j].parent,person[k].name)= =0) //比较2个字符串是否相同,实质是找某个人的父亲person[j].data=k;}}for(j=0;j<i;j++){for(k=0;k<i;k++){if(strcmp(person[j].parent,person[k].name)= =0){person[k].child[person[k].numberchild]=j;person[k].numberchild++; //找某个人的孩子}}for(j=0;j<i;j++)outputfile.write((char*)(person+j),sizeof(*p erson)); //写文件outputfile.close(); //关闭文件夹system("cls");}void display(per person[36],int &n1){int choice;while(1) //循环式一直进行的{cout<<endl<<endl<<endl;cout<<"\t\t 家族关系查询系统"<<endl;cout<<"\t\t1. 显示家谱"<<endl;cout<<"\t\t2. 显示第n代人的所有信息"<<endl;cout<<"\t\t3. 按照姓名查询某成员的信息"<<endl;cout<<"\t\t4. 按照出生日期查询成员名单"<<endl;cout<<"\t\t5. 某成员添加孩子"<<endl;cout<<"\t\t6. 修改某成员信息"<<endl;cout<<"\t\t7. 按生日日期对家谱中的所有人进行排序"<<endl;cout<<"\t\t8. 退出系统"<<endl;cout<<"\t\t 输入选择:"<<endl;cout<<"\t\t 请输入1-8之间的数"<<endl;cin>>choice;while(choice!=1&&choice!=2&&choice!=3&&choi ce!=4&&choice!=5&&choice!=6&&choice!= 7&&choice!=8){cout<<"you enter wrong!"<<endl;cout<<"please enter again!"<<endl;cin>>choice;}cin.ignore(1,'\n'); //跳过一个字符,含义是忽略一行system("cls");switch(choice){case 1: displayhome(person,n1); break;case 2: displayinfo(person,n1); break;case 3: namesearch(person,n1); break;case 4: birtfdaysearch(person,n1); break;case 5: addchild(person,n1); break;case 6: editmember(person,n1); break;case 7: sortbirthday(person,n1); break;case 8: exit(0);}}}void displayhome(per person[36],int &n2) //调用函数的参数传递的是一个参数地址{int i,j,max;char again;cout<<endl<<endl;for(i=0;i<n2-1;i++){max=person[i].generation;for(j=i+1;j<n2;j++){if(person[i].generation<person[j].generation )max=person[j].generation;//找出最大的代数}}for(i=1;i<=max;i++){cout<<" 第"<<i<<"代的成员有: ";for(j=0;j<n2;j++){if(person[j].generation==i)cout<<person[j].name<<" "; //输出每一代的人}cout<<endl;}cout<<endl<<endl;cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl; cin>>again;if(toupper(again)=='Y') //就是判断输入得是否为y或Y{system("cls");return;}if(toupper(again)=='N')exit(0); //终止程序的执行}void displayinfo(per person[36],int &n2) //显示代数{int i,gen,j=0;char again;cout<<endl<<endl;cout<<" 请你输入你要查询的代数: ";cin>>gen;cout<<endl; //换行for(i=0;i<n2;i++){if(person[i].generation!=gen)j++;}if(j==n2) //判断是否找到cout<<" 你要查的代数还没有"<<endl<<endl;for(i=0;i<n2;i++){if(person[i].generation==gen){cout<<" 姓名: "<<person[i].name<<endl<<" 出生日期: "<<person[i].brith<<" 第几代: "<<person[i].generation<<endl<<" 婚否: "<<person[i].marry<<" 地址:"<<person[i].address<<endl<<" 是否健在: "<<person[i].live<<endl;if(person[i].live=='N'||person[i].live=='n')cout<<" 死亡日期: "<<person[i].dietime<<endl;cout<<endl<<endl;}}cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl; cin>>again;if(toupper(again)=='Y'){system("cls");return;}if(toupper(again)=='N')exit(0);}void namesearch(per person[36],int &n2) {int i,j=0,k;char again,name[20];cout<<endl<<endl;cout<<" 请你输入你想要查询的人的姓名: ";cin.getline(name,20);for(i=0;i<n2;i++){if(strcmp(person[i].name,name)!=0)j++;}cout<<endl<<endl;if(j==n2)cout<<" 你要查询的人没有"<<endl<<endl;for(i=0;i<n2;i++){if(strcmp(person[i].name,name)==0){cout<<" 姓名: "<<person[i].name<<endl<<" 出生日期: "<<person[i].brith<<" 第几代: "<<person[i].generation<<endl<<" 婚否: "<<person[i].marry<<" 地址:"<<person[i].address<<endl<<" 是否健在:"<<person[i].live<<endl;if(person[i].live=='N'||person[i].live=='n')cout<<" 死亡日期: "<<person[i].dietime<<endl;cout<<endl<<endl;if(person[i].generation==1)cout<<" 他是这个家的根,没有父亲"<<endl<<endl;else{cout<<" 他(她)父亲的信息: "<<endl;cout<<" 姓名: "<<person[person[i].data].name<<endl<<" 出生日期: "<<person[person[i].data].brith<<" 第几代: "<<person[person[i].data].generation<<endl<<" 婚否: "<<person[person[i].data].marry<<" 地址:"<<person[person[i].data].address<<endl<<" 是否健在: "<<person[person[i].data].live<<endl;if(person[person[i].data].live=='N'||person[p erson[i].data].live=='n')cout<<" 死亡日期: "<<person[person[i].data].dietime<<endl;cout<<endl<<endl;}if(person[i].numberchild==0)cout<<" 他没有孩子"<<endl<<endl;else{cout<<" 他有"<<person[i].numberchild<<"个孩子,他们的信息:"<<endl<<endl;for(k=0;k<person[i].numberchild;k++){cout<<" 姓名: "<<person[person[i].child[k]].name<<endl<<" 出生日期: "<<person[person[i].child[k]].brith<<" 第几代: "<<person[person[i].child[k]].generation<<en dl<<" 婚否: "<<person[person[i].child[k]].marry<<" 地址:"<<person[person[i].child[k]].address<<e ndl<<" 是否健在: "<<person[person[i].child[k]].live;if(person[person[i].child[k]].live=='N'||perso n[person[i].child[k]].live=='n')cout<<" 死亡日期: "<<person[person[i].child[k]].dietime<<endl;cout<<endl<<endl;}}}}cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl; cin>>again;if(toupper(again)=='Y'){system("cls");return;}if(toupper(again)=='N')exit(0);}void birtfdaysearch(per person[36],int &n2) {char begbir[20],endbir[20],again;int i,flag=0;cout<<endl<<endl;cout<<" 请你输入两个时间,格式为****/**/**!"<<endl;cout<<" 起始时间是: ";cin.getline(begbir,20);cout<<" 终止时间是: ";cin.getline(endbir,20);cout<<endl<<endl;for(i=0;i<n2;i++){if(strcmp(person[i].brith,begbir)>=0&&strc mp(person[i].brith,endbir)<=0){cout<<" 姓名: "<<person[i].name;cout<<" 生日: "<<person[i].brith;flag=1;cout<<endl;}}cout<<endl<<endl;if(flag==0)cout<<" 在这段时间内没有人生日"<<endl<<endl;cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl; cin>>again;if(toupper(again)=='Y'){system("cls");return;}if(toupper(again)=='N')exit(0);}void addchild(per person[36],int &n2){int i;char again;fstreamfile("person.txt",ios::in|ios::out|ios::binary|ios:: app);cout<<endl<<endl;cout<<" 请输入孩子的信息"<<endl<<endl<<endl;cout<<" 姓名: ";cin.getline(person[n2].name,20);cout<<" 生日(日期样式为xxxx/xx/xx) : ";cin.getline(person[n2].brith,20);cout<<" 婚否(输入Y或y或N或n) :"; cin>>person[n2].marry;while(toupper(person[n2].marry)!='Y'&&to upper(person[n2].marry)!='N'){cout<<" 你输入错误,请你重新输入!!"<<endl;cout<<" 婚否(输入Y或y或N或n) :";cin>>person[n2].marry;}cin.ignore();cout<<" 地址: ";cin.getline(person[n2].address,20);cout<<" 是否健在(输入Y或y或N或n) :";cin>>person[n2].live;while(toupper(person[n2].live)!='Y'&&toup per(person[n2].live)!='N'){cout<<" 你输入错误,请你重新输入!!"<<endl;cout<<" 婚否(输入Y或y或N或n) :";cin>>person[n2].live;}cin.ignore();if(toupper(person[n2].live)=='N'){cout<<" 死亡日期(日期样式为xxxx/xx/xx) :";cin.getline(person[n2].dietime,20);}cout<<" 属于第几代: ";cin>>person[n2].generation;cin.ignore();if(person[n2].generation!=1){cout<<" 他(她)的父亲: ";cin.getline(person[n2].parent,20);}cout<<endl;for(i=0;i<n2;i++){if(strcmp(person[n2].parent,person[i].name) ==0){person[n2].data=i;break;}}file.write((char*)&person[n2],sizeof(person [n2]));file.close();file.open("person.txt",ios::in|ios::out|ios::bin ary);file.seekp(i*sizeof(per),ios::beg);person[i].child[person[i].numberchild]=n2; person[i].numberchild++;file.write((char*)&person[i],sizeof(per)); file.close();n2++;cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl; cin>>again;if(toupper(again)=='Y'){system("cls");return;}if(toupper(again)=='N')exit(0);}void editmember(per person[36],int &n2) {int i,flag=0,choice;char name[20],again;fstreamfile("person.txt",ios::in|ios::out|ios::binary); cout<<endl<<endl;cout<<" 请你输入你想修改的成员的名字: ";cin.getline(name,20);cout<<endl<<endl;for(i=0;i<n2;i++){if(strcmp(person[i].name,name)==0){flag=1;break;}}if(flag==0)cout<<" 家谱中没有这个人!!"<<endl<<endl<<endl;if(flag==1){cout<<"\t\t请你选择你要修改的项!!"<<endl;cout<<"\t\t 1. 姓名"<<endl;cout<<"\t\t 2. 地址"<<endl;cout<<"\t\t 3. 婚否"<<endl;cout<<"\t\t 4. 生日"<<endl;cout<<"\t\t 5. 是否死亡"<<endl;cout<<"\t\t 6. 死亡日期"<<endl;cout<<"\t\t 请输入1-6之间的数"<<endl;cout<<"\t\t 输入选择: ";cin>>choice;while(choice!=1&&choice!=2&&choice!=3&&choi ce!=4&&choice!=5&&choice!=6){cout<<"you enter wrong!"<<endl;cout<<"please enter again!"<<endl;cin>>choice;}cin.ignore(1,'\n');switch(choice){case 1: cout<<endl<<" 请你输入新名字: ";cin.getline(person[i].name,20);// file.seekp(i*sizeof(per),ios::beg); //file.write((char*)&person[i],sizeof(per));break;case 2: cout<<endl<<" 请输入新的地址: ";cin.getline(person[i].address,20); // file.seekp(i*sizeof(per),ios::beg); //file.write((char*)&person[i],sizeof(per));break;case 3: cout<<endl<<" 请你输入新的是否结婚: ";cin>>person[i].marry;// file.seekp(i*sizeof(per),ios::beg); //file.write((char*)&person[i],sizeof(per));break;case 4: cout<<endl<<" 请你输入新的生日: ";cin.getline(person[i].brith,20);// file.seekp(i*sizeof(per),ios::beg); //file.write((char*)&person[i],sizeof(per));break;case 5: cout<<endl<<" 请你输入新的是否死亡: ";cin>>person[i].live;// file.seekp(i*sizeof(per),ios::beg); //file.write((char*)&person[i],sizeof(per));break;case 6: cout<<endl<<" 请你输入新的死亡日期: ";cin.getline(person[i].dietime,20); // file.seekp(i*sizeof(per),ios::beg); //file.write((char*)&person[i],sizeof(per));break;}for(int j=0;j<n2;j++)file.write((char*)&person[j],sizeof(per));}cout<<endl<<endl;cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl; cin>>again;if(toupper(again)=='Y'){system("cls");return;}if(toupper(again)=='N')exit(0);}void sortbirthday(per person[36],int &n2) {per person1;int i,j;char again;cout<<endl<<endl;for(i=0;i<n2-1;i++)for(j=i+1;j<n2;j++){if(strcmp(person[i].brith,person[j].brith)>=0 ){person1=person[i];person[i]=person[j];person[j]=person1;}}for(i=0;i<n2;i++)cout<<" 姓名: "<<person[i].name<<" 生日: "<<person[i].brith<<endl;cout<<endl<<endl;cout<<" 你是否想继续查看?如果继续请输入Y或y,否则输入N或n!"<<endl; cin>>again;if(toupper(again)=='Y'){system("cls");return;}if(toupper(again)=='N')exit(0);}。

相关文档
最新文档