您的当前位置:首页正文

家谱系统

2023-01-07 来源:意榕旅游网
《数据结构的课程设计》

报告

题目:家谱管理系统设计与实现

班级: 1612401

学号: *********

姓名: ***

指导老师: **

完成日期: 2014.1.3

目 录

一.需求分析.

二.程序主要功能.

三.程序运行平台.

四.程序类说明.

五. 运行分析

六. 存在的不足与对策.

七.体验感悟

八. 程序源代码.

需求分析 实现具有下列功能的家谱管理系统。

程序主要功能 (1)输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。

(2)实现数据的存盘和读盘。 (3)以图形方式显示家谱。

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

(5)按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。 (6)按照出生日期查询成员名单。 (7)输入两人姓名,确定其关系。 (8)某成员添加孩子。

(9)删除某成员(若其还有后代,则一并删除)。 (10)修改某成员信息。

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

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

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

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

(15)存储结构:根据系统功能要求自行设计,但是要求相关数据要存储在数据文件中。测试数据:要求使用1、全部合法数据;2、局部非法数据。进行程序测试,以保证程序的稳定。

程序运行平台

该程序是用VC++6.0制做的,使用Microsoft Visual C++ 6.0运行该程序,具体操作是:打开Microsoft Visual C++ 6.0,菜单栏里点文件→打开工作区→找到“图书管理系统.dsw”这个文件→打开,或者在资源管理器中双击该文件,此时,VC++6.0会自动打开,并载入该系统相关资源,点击Run命令菜单或者或用快捷键Ctrl+F5运行该程序。

程序类说明 函数分析:

void setupinfo(per person[30]) //创建信息

void displayhome(per person[30],int &n2) 显示家谱

void displaylive(per person[30],int &n2) 现今健在的成员 void displayinfo(per person[30],int &n2) //显示代数 void namesearch(per person[30],int &n2) 姓名查询 void birtfdaysearch(per person[30],int &n2)生日查询 void addchild(per person[30],int &n2)添加孩子 void editmember(per person[30],int &n2)修改信息 void clear(per person[30],int &n2)删除成员

void FixRelation(per person[30],int &n2)//输入两人姓名,确定其关系 void display(per person[30],int &n1)交互界面

运行分析 ; 显示家谱

姓名查找

生日排序

生日查找

比较关系

存在的不足与对策 由于自身能力有限,所以没有设计提示当天生日的健在成员。

在设计过程中由于设计者的编程功底欠缺,因此学习过程较为艰辛,需要解决的问题也比较多。在以后的学习中,应该循序渐进,不可急于求成,先打好基础,这样才能更好地发展。

体验感悟 在编写程序的过程中,深切的体会到自身能力还有待提高,通过大规模的查询网上资料

与相关书籍我学习到了很多以前不知道的编程方法与各种奇妙的函数语句时,提高了自己对程序设计本身的兴趣,更加乐意去学习这方面的新的东西,并在不断地自我挑战中收获着,或知识技能,或信心勇气。希望自己在今后的学习中可以更好的完善自我。

程序源代码

#include

#include #include #include #include struct per{ int father; 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'; father=-10; generation=0; numberchild=0; } };

void setupinfo(per person[30]) //创建信息 {

int i,j,k;

char choose; choose='y';

fstream fp(\"person.txt\ i=0;

while(toupper(choose)=='Y') {

cout<<\" 姓名 : \";

cin.getline(person[i].name,20);

cout<<\" 生日(日期样式为1999.01.02) : \"; cin.getline(person[i].brith,20); cout<<\" 婚否y/n :\";

cin>>person[i].marry;

while(toupper(person[i].marry)!='Y'&&toupper(person[i].marry)!='N') { cout<<\" 你输入错误,请你重新输入!!\"<>person[i].marry; }

cin.ignore(); cout<<\" 地址 : \";

cin.getline(person[i].address,20); cout<<\" 是否健在y/n :\";

cin>>person[i].live; //是否死亡

while(toupper(person[i].live)!='Y'&&toupper(person[i].live)!='N') { cout<<\" 你输入错误,请你重新输入!!\"<>person[i].live; }

cin.ignore();

if(toupper(person[i].live)=='N') { cout<<\" 死亡日期(日期样式为1999.01.02) :\"; 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); }

cout<cout<<\"请问是否继续添加y/n\"<cin>>choose; cin.ignore(); i++; } for(j=0;j} }

person[j].father=k;

for(j=0;jfor(k=0;k}

for(j=0;jfp.write((char*)(person+j),sizeof(*person)); fp.close(); //关闭文件夹

cout<void displayhome(per person[30],int &n2) //调用函数的参数 传递的是一个参数地址 { 代数

int i,j,max; char again;

cout<for(i=0;imax=person[i].generation; for(j=i+1;jfor(i=1;i<=max;i++) {

cout<<\" 第\"<for(j=0;jcout<cout<cout<<\" 你是否想继续查看?请输入y/n!\"<>again;

if(toupper(again)=='Y') //就是判断输入得是否为y或Y {

cout<if(toupper(again)=='N')

exit(0); //终止程序的执行

}

void displaylive(per person[30],int &n2) { int i; cout<for(i=1;i<=n2;i++) { if(person[i].live!='N'&&person[i].live!='n') cout<}

cout<void displayinfo(per person[30],int &n2) //显示代数 {

int i,gen,j=0; char again;

cout<cout<<\" 请你输入你要查询的代数 : \"; cin>>gen;

cout<for(i=0;iif(person[i].generation!=gen) j++; }

if(j==n2) //判断是否找到

cout<<\" 你要查的代数还没有\"<for(i=0;iif(person[i].generation==gen) { cout<<\" 姓名 : \"<婚否

:

\"<

\"<<<\" 址 :\"<<<\" 是否健在 : \"<if(person[i].live=='N'||person[i].live=='n') cout<<\" 死亡日期 : \"<cout<cout<<\" 你是否想继续查看?请输入y/n\"<cin>>again; if(toupper(again)=='Y') { cout<void namesearch(per person[30],int &n2) { int i,j=0,k; char again,name[20]; cout<cin.getline(name,20);

for(i=0;iif(strcmp(person[i].name,name)!=0) j++; }

cout<cout<<\" 你要查询的人没有\"<for(i=0;iif(strcmp(person[i].name,name)==0) { cout<<\" 姓名 : \"<

\"<<<\" 婚否 : \"<if(person[i].live=='N'||person[i].live=='n') cout<<\" 死亡日期 : \"<cout<if(person[i].generation==1) cout<<\" 他是这个家的根,没有父亲\"<\"<<<\" 婚否 : \"<else { cout<<\" 他有\"<for(k=0;k出第生

日几

名期代

: : :

\"<<<\" \"<<<\"

\"<n')

if(person[person[i].child[k]].live=='N'||person[person[i].child[k]].live=='

cout<<\"

:

\"<>again; if(toupper(again)=='Y') { cout<void birtfdaysearch(per person[30],int &n2) { char begbir[20],endbir[20],again; int i,flag=0; cout<cin.getline(begbir,20);

cout<<\" 终止时间是 : \"; cin.getline(endbir,20); cout<if(strcmp(person[i].brith,begbir)>=0&&strcmp(person[i].brith,endbir)<= { }

cout<<\" 姓名 : \"<cout<}

cout<cout<<\" 在这段时间内没有人生日\"<cin>>again; if(toupper(again)=='Y') { cout<void addchild(per person[30],int &n2) { int i; char again; fstream file(\"person.txt\ cout<cout<<\" 姓名 : \";

cin.getline(person[n2].name,20);

cout<<\" 生日(日期样式为1999.01.02) : \"; cin.getline(person[n2].brith,20); cout<<\" 婚否y/n :\";

cin>>person[n2].marry;

while(toupper(person[n2].marry)!='Y'&&toupper(person[n2].marry)!='{

cout<<\" 你输入错误,请你重新输入!!\"<>person[n2].marry; }

cin.ignore();

cout<<\" 地址 : \";

cin.getline(person[n2].address,20); cout<<\" 是否健在y/n :\";

cin>>person[n2].live;

while(toupper(person[n2].live)!='Y'&&toupper(person[n2].live)!='N') {

cout<<\" 你输入错误,请你重新输入!!\"<cin>>person[n2].live; }

cin.ignore();

if(toupper(person[n2].live)=='N') {

cout<<\" 死亡日期(日期样式为1999.01.02) :\"; 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); }

for(i=0;iif(strcmp(person[n2].parent,person[i].name)==0) { person[n2].father=i; break; } }

//if(i==n2){cout<<\"输入信息有误!!\"<for(i=0;iif(strcmp(person[n2].parent,person[i].name)==0) { person[n2].father=i;

} }

break;

file.write((char*)&person[n2],sizeof(person[n2])); file.close();

file.open(\"person.txt\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/n\"<cin>>again; if(toupper(again)=='Y') { cout<void editmember(per person[30],int &n2) { int i,flag=0,choice; char name[20],again; fstream file(\"person.txt\ cout<cin.getline(name,20); cout<if(strcmp(person[i].name,name)==0) { flag=1; break; } }

if(flag==0)

cout<<\" 家谱中没有这个人!!\"<if(flag==1) { cout<<\"\\请你选择你要修改的项!!\"<>choice; while

(choice!=1&&choice!=2&&choice!=3&&choice!=4&&choice!=5&&choice!=6) { cout<<\"you enter wrong!\"<>choice; } cin.ignore(1,'\\n'); switch(choice) { case 1: cout<cin.getline(person[i].name,20); break;

case 2: cout<cin.getline(person[i].address,20);

break;

case 3: cout<cin>>person[i].marry;

break;

case 4: cout<cin.getline(person[i].brith,20);

break;

case 5: cout<cin>>person[i].live;

break;

case 6: cout<cin.getline(person[i].dietime,20);

break; }

for(int j=0;jcout<cout<<\" 你是否想继续查看?请输入y/n\"<cin>>again; if(toupper(again)=='Y') { cout<void sortbirthday(per person[30],int &n2) { per person1; int i,j; char again; cout<=0) { person1=person[i]; person[i]=person[j]; person[j]=person1; } } for(i=0;i>again;

if(toupper(again)=='Y') {

cout<生日 : return; } if(toupper(again)=='N') exit(0); }

void clear(per person[30],int &n2){ fstream fp(\"person.txt\ int k,j,l,h=0,i=n2; char name[20],again; cout<<\" 请你输入你想删除的成员的名字 : \"; cin.getline(name,20); for(k=0;kif(person[k].numberchild!=0){ for(j=0;jfp.close(); //关闭文件夹

fstream inputFile(\"person.txt\if(!inputFile) {

cout<<\"文件不存在!\"<exit(0); } int count=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)); } }

n2=count;

inputFile.close();//关闭文件

cout<<\" 你是否想继续查看?请输入y/n\"<cin>>again; if(toupper(again)=='Y') { cout<void FixRelation(per person[30],int &n2)//输入两人姓名,确定其关系 {

int levo,levt,i,flag=0;

char levone[20],levtwo[20],name[20],again; if(n2<=1){ cout<<\"该家谱,无法使用此功能!\"<printf(\"请输入第一个人的姓名\\n\"); scanf(\"%s\ strcpy(levone,name);

for(i=0;iif(strcmp(person[i].name,name)==0) { flag=1; break; } }

if(flag==0) {

cout<<\" 家谱中没有这个人!!\"<return; }

levo=person[i].generation;; flag=0;

printf(\"请输入第二个人的姓名\\n\");

scanf(\"%s\ strcpy(levtwo,name); for(i=0;ireturn; }

levt=person[i].generation;

if(levo < levt){ if((levt-levo)==1)printf(\"\%s 是 %s 的 父辈\\n\ else if((levt-levo)==2)printf(\"\%s 是 %s 的 爷爷辈\\n\

else printf(\"\%s 比 %s 大 %d 辈\\n\

} else if(levo > levt){ if((levo-levt)==1)printf(\"\%s 是 %s 的 父辈\\n\ else if((levo-levt)==2)printf(\"\%s 是 %s 的 爷爷辈\\n\

else

printf(\"\%s 比 %s 大 %d 辈\\n\

else if(levo == levt)

printf(\"\\%s 和 %s 平辈\\n\

cout<cout<<\" 你是否想继续查看?请输入y/n\"<cin>>again; if(toupper(again)=='Y') { cout<void display(per person[30],int &n1) { int choice;

while(1) { cout<<\"\家族关系查询系统\"<cout<<\"2.显示第n代人的所有信息\"<cout<<\"9.比较任意两成员的关系\"<cin>>choice; while (choice>9||choice<0) { cout<<\"输入错误!请重新输入。\"<cin>>choice; }

cin.ignore(1,'\\n'); cout<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:clear(person,n1); break; case 9:FixRelation(person,n1); break; } } }

void main() { per person[30]; int count=0; fstream inputFile(\"person.txt\ if(!inputFile) { cout<<\"文件不存在!\"<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<<\" 请建立家谱\"<displaylive(person,count); display(person,count);

因篇幅问题不能全部显示,请点此查看更多更全内容