




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构的课程设计报告题目:家谱管理系统设计与实现 班级: 1612401 学号: 161240113 姓名: 张修鸣 指导老师: 孙涵 完成日期: 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运行该程序。trl计分析能程序类说明函数分析:void setupinfo(per person30) /创建信息void displayhome(per person30,int &n2) 显示家谱void displaylive(per person30,int &n2) 现今健在的成员 void displayinfo(per person30,int &n2) /显示代数void namesearch(per person30,int &n2) 姓名查询void birtfdaysearch(per person30,int &n2)生日查询void addchild(per person30,int &n2)添加孩子void editmember(per person30,int &n2)修改信息void clear(per person30,int &n2)删除成员void FixRelation(per person30,int &n2)/输入两人姓名,确定其关系 void display(per person30,int &n1)交互界面运行分析; 显示家谱姓名查找生日排序生日查找比较关系存在的不足与对策由于自身能力有限,所以没有设计提示当天生日的健在成员。在设计过程中由于设计者的编程功底欠缺,因此学习过程较为艰辛,需要解决的问题也比较多。在以后的学习中,应该循序渐进,不可急于求成,先打好基础,这样才能更好地发展。体验感悟在编写程序的过程中,深切的体会到自身能力还有待提高,通过大规模的查询网上资料与相关书籍我学习到了很多以前不知道的编程方法与各种奇妙的函数语句时,提高了自己对程序设计本身的兴趣,更加乐意去学习这方面的新的东西,并在不断地自我挑战中收获着,或知识技能,或信心勇气。希望自己在今后的学习中可以更好的完善自我。程序源代码#include#include#include#include#includestruct perint father; char name20;char brith20;char marry;char address20;char live;char dietime20;char parent20;int generation;int child10;int numberchild;per()for(int i=0;i20;i+)namei=0;for(i=0;i20;i+)brithi=0;for(i=0;i20;i+)addressi=0;for(i=0;i20;i+)dietimei=0;for(i=0;i10;i+)childi=0;for(i=0;i20;i+)parenti=0;live=0;marry=0;father=-10;generation=0;numberchild=0;void setupinfo(per person30) /创建信息int i,j,k;char choose;choose=y;fstream fp(person.txt,ios:in|ios:out|ios:binary|ios:app); i=0;while(toupper(choose)=Y)cout 姓名 : ;cin.getline(,20);cout 生日(日期样式为1999.01.02) : ;cin.getline(personi.brith,20);coutpersoni.marry;while(toupper(personi.marry)!=Y&toupper(personi.marry)!=N)cout 你输入错误,请你重新输入!endl;coutpersoni.marry;cin.ignore();cout 地址 : ;cin.getline(personi.address,20);coutpersoni.live; /是否死亡while(toupper(personi.live)!=Y&toupper(personi.live)!=N)cout 你输入错误,请你重新输入!endl;coutpersoni.live;cin.ignore();if(toupper(personi.live)=N)cout 死亡日期(日期样式为1999.01.02) :;cin.getline(personi.dietime,20);/ 输入死亡日期coutpersoni.generation;cin.ignore();if(personi.generation!=1) /不是第一代cout 他的父亲 : ;cin.getline(personi.parent,20); coutendl;cout请问是否继续添加y/nchoose; cin.ignore();i+; for(j=0;ji;j+)if(personj.generation=1)personj.father=-1; for(j=0;ji;j+)for(k=0;ki;k+)if(strcmp(personj.parent,)=0) /比较2个字符串是否相同,实质是找某个人的父亲personj.father=k;for(j=0;ji;j+)for(k=0;ki;k+)if(strcmp(personj.parent,)=0)personk.childpersonk.numberchild=j;personk.numberchild+; /找某个人的孩子for(j=0;ji;j+)fp.write(char*)(person+j),sizeof(*person); fp.close(); /关闭文件夹coutendl; void displayhome(per person30,int &n2) /调用函数的参数 传递的是一个参数地址int i,j,max;char again;coutendlendl;if(n2=1)max=1;elsefor(i=0;in2-1;i+)max=personi.generation;for(j=i+1;jn2;j+)if(personi.generationpersonj.generation)max=personj.generation; /找出最大的代数for(i=1;i=max;i+)cout 第i代的成员有 : ;for(j=0;jn2;j+)if(personj.generation=i) ; /输出每一代的人coutendl;coutendlendl;cout 你是否想继续查看?请输入y/n!again;if(toupper(again)=Y) /就是判断输入得是否为y或Ycoutendl;return;if(toupper(again)=N)exit(0); /终止程序的执行void displaylive(per person30,int &n2) int i;coutendlendl; cout现今健在的成员:;for(i=1;i=n2;i+)if(personi.live!=N&personi.live!=n) ; /输出每一代的人coutendlendl;return;void displayinfo(per person30,int &n2) /显示代数int i,gen,j=0;char again;coutendlendl;coutgen;coutendl; /换行for(i=0;in2;i+)if(personi.generation!=gen)j+;if(j=n2) /判断是否找到cout 你要查的代数还没有!endlendl;for(i=0;in2;i+)if(personi.generation=gen)cout 姓名 : endl 出生日期 : personi.brith 第几代 : personi.generationendl 婚否 : personi.marry 地址 :personi.addressendl 是否健在 : personi.liveendl; if(personi.live=N|personi.live=n)cout 死亡日期 : personi.dietimeendl;coutendlendl;cout 你是否想继续查看?请输入y/nagain;if(toupper(again)=Y)coutendl;return;if(toupper(again)=N)exit(0);void namesearch(per person30,int &n2)int i,j=0,k;char again,name20;coutendlendl;cout 请你输入你想要查询的人的姓名 : ;cin.getline(name,20);for(i=0;in2;i+)if(strcmp(,name)!=0)j+;coutendlendl;if(j=n2)cout 你要查询的人没有!endlendl;for(i=0;in2;i+)if(strcmp(,name)=0)cout 姓名 : endl 出生日期 : personi.brith 第几代 : personi.generationendl 婚否 : personi.marry 地址 :personi.addressendl 是否健在 : personi.liveendl; if(personi.live=N|personi.live=n)cout 死亡日期 : personi.dietimeendl;coutendlendl;if(personi.generation=1)cout 他是这个家的根,没有父亲!endlendl;elsecout 他父亲的信息 : endl;cout 姓名 : endl 出生日期 : personpersoni.father.brith 第几代 : personpersoni.father.generationendl 婚否 : personpersoni.father.marry 地址 :personpersoni.father.addressendl 是否健在 : personpersoni.father.liveendl;if(personpersoni.father.live=N|personpersoni.father.live=n)cout 死亡日期 : personpersoni.father.dietimeendl;coutendlendl;if(personi.numberchild=0)cout 他没有孩子!endlendl;elsecout 他有personi.numberchild个孩子,他们的信息 :endlendl;for(k=0;kpersoni.numberchild;k+)cout 姓名 : endl 出生日期 : personpersoni.childk.brith 第几代 : personpersoni.childk.generationendl 婚否 : personpersoni.childk.marry 地址 :personpersoni.childk.addressendl 是否健在 : personpersoni.childk.live;if(personpersoni.childk.live=N|personpersoni.childk.live=n)cout 死亡日期 : personpersoni.childk.dietimeendl;coutendlendl;cout 你是否想继续查看?请输入y/nagain;if(toupper(again)=Y)coutendl;return;if(toupper(again)=N)exit(0);void birtfdaysearch(per person30,int &n2) char begbir20,endbir20,again;int i,flag=0;coutendlendl;cout 请你输入两个时间,格式为1999.01.02!endl;cout 起始时间是 : ;cin.getline(begbir,20);cout 终止时间是 : ;cin.getline(endbir,20);coutendlendl;for(i=0;i=0&strcmp(personi.brith,endbir)=0)cout 姓名 : ;cout 生日 : personi.brith;flag=1;coutendl;coutendlendl;if(flag=0)cout 在这段时间内没有人生日!endlendl;cout 你是否想继续查看?请输入y/nagain;if(toupper(again)=Y)coutendl;return;if(toupper(again)=N)exit(0);void addchild(per person30,int &n2) int i;char again;fstream file(person.txt,ios:in|ios:out|ios:binary|ios:app);coutendlendl;cout 请输入孩子的信息!endlendlendl;cout 姓名 : ;cin.getline(,20);cout 生日(日期样式为1999.01.02) : ;cin.getline(personn2.brith,20);coutpersonn2.marry;while(toupper(personn2.marry)!=Y&toupper(personn2.marry)!=N)cout 你输入错误,请你重新输入!endl;coutpersonn2.marry;cin.ignore();cout 地址 : ;cin.getline(personn2.address,20);coutpersonn2.live;while(toupper(personn2.live)!=Y&toupper(personn2.live)!=N)cout 你输入错误,请你重新输入!endl;coutpersonn2.live;cin.ignore();if(toupper(personn2.live)=N)cout 死亡日期(日期样式为1999.01.02) :;cin.getline(personn2.dietime,20);coutpersonn2.generation;cin.ignore();if(personn2.generation!=1)cout 他的父亲 : ;cin.getline(personn2.parent,20);for(i=0;in2;i+)if(strcmp(personn2.parent,)=0)personn2.father=i;break;/if(i=n2)cout输入信息有误!endlendl;return;coutendl;for(i=0;in2;i+)if(strcmp(personn2.parent,)=0)personn2.father=i;break;file.write(char*)&personn2,sizeof(personn2);file.close();file.open(person.txt,ios:in|ios:out|ios:binary);file.seekp(i*sizeof(per),ios:beg);personi.childpersoni.numberchild=n2;personi.numberchild+;file.write(char*)&personi,sizeof(per);file.close();n2+;cout 你是否想继续查看?请输入y/nagain;if(toupper(again)=Y)coutendl;return;if(toupper(again)=N)exit(0);void editmember(per person30,int &n2)int i,flag=0,choice;char name20,again;fstream file(person.txt,ios:in|ios:out|ios:binary);coutendlendl;cout 请你输入你想修改的成员的名字 : ;cin.getline(name,20);coutendlendl;for(i=0;in2;i+)if(strcmp(,name)=0)flag=1;break;if(flag=0)cout 家谱中没有这个人!endlendlendl;if(flag=1) couttt请你选择你要修改的项!endl; cout 1.姓名endl; cout 2.地址endl; cout 3.婚否endl; cout 4.生日endl; cout 5.是否死亡endl; cout 6.死亡日期choice; while (choice!=1&choice!=2&choice!=3&choice!=4&choice!=5&choice!=6) coutyou enter wrong!endl; coutplease enter again!choice; cin.ignore(1,n); switch(choice) case 1: coutendl 请你输入新名字 : ; cin.getline(,20);break; case 2: coutendl 请输入新的地址 : ; cin.getline(personi.address,20);break; case 3: coutendlpersoni.marry;break; case 4: coutendl 请你输入新的生日 : ; cin.getline(personi.brith,20);break; case 5: coutendlpersoni.live;break; case 6: coutendl 请你输入新的死亡日期 : ; cin.getline(personi.dietime,20);break; for(int j=0;jn2;j+)file.write(char*)&personj,sizeof(per);coutendlendl;cout 你是否想继续查看?请输入y/nagain;if(toupper(again)=Y)coutendl;return;if(toupper(again)=N)exit(0);void sortbirthday(per person30,int &n2)per person1;int i,j;char again;coutendlendl;for(i=0;in2-1;i+)for(j=i+1;j=0)person1=personi;personi=personj;personj=person1;for(i=0;in2;i+)cout 姓名 : 生日 : personi.brithendl;coutendlendl;cout 你是否想继续查看?请输入y/nagain;if(toupper(again)=Y)coutendl;return;if(toupper(again)=N)exit(0);void clear(per person30,int &n2)fstream fp(person.txt,ios:out);int k,j,l,h=0,i=n2;char name20,again;cout 请你输入你想删除的成员的名字 : ;cin.getline(name,20);for(k=0;ki;k+)if(strcmp(name,)=0)break;if(personk.father=-1)fp.write(,0);elseh=0;for(l=0;lpersonpersonk.father.numberchild;l+) if(personpersonk.father.childl=k)continue; personpersonk.father.childh=personpersonk.father.childl;h+;personpersonk.father.numberchild-; personpersonk.father.childh=NULL; if(personk.numberchild!=0)for(j=0;ji;j+)h=0;if(j=k)h=1;for(l=0;lpersonk.numberchild;l+)if(j=personk.childl)h=1;if(h=0)fp.write(char*)(person+j),sizeof(*person); elsefor(j=0;ji;j+)if(j!=k)fp.write(char*)(person+j),sizeof(*person); n2-;fp.close(); /关闭文件夹fstream inputFile(person.txt,ios:in|ios:out|ios:binary);if(!inputFile) cout文件不存在!endl; exit(0);int count=0;inputFile.read(char*)&personcount,sizeof(personcount);/从文件中读取指定大小的字节函数read(),读取字节函数while(!inputFile.eof() /当文件没有读取完毕,进行循环if(0!=0)/当名字不为空时count+; /统计人数inputFile.read(char*)(person+count),sizeof(*person);n2=count;inputFile.close();/关闭文件cout 你是否想继续查看?请输入y/nagain;if(toupper(again)=Y)coutendl;return;if(toupper(again)=N)exit(0); void FixRelation(per person30,int &n2)/输入两人姓名,确定其关系 int levo,levt,i,flag=0; char levone20,levtwo20,name20,again; if(n2=1)cout该家谱,无法使用此功能!endl;return ; printf(请输入第一个人的姓名n); scanf(%s,name); strcpy(levone,name); for(i=0;in2;i+)if(strcmp(,name)=0)flag=1;break;if(flag=0)cout 家谱中没有这个人!endlendlendl;return; levo=personi.generation;flag=0; printf(请输入第二个人的姓名n); scanf(%s,name); strcpy(levtwo,name); for(i=0;in2;i+)if(strcmp(,name)=0)flag=1;break;if(flag=0)cout 家谱中没有这个人!endlendlendl;return; levt=personi.generation; if(levo levt)if(levo-levt)=1)printf(t%s 是 %s 的 父辈n,levtwo,levone);else if(levo-levt)=2)printf(t%s 是 %s 的 爷爷辈n,levtwo,levone); else printf(t%s 比 %s 大 %d 辈n,levtwo,levone,levo-levt); else if(levo = levt) printf(tt%s 和 %s 平辈n,levone,levtwo);coutendlendl;cout 你是否想继续查看?请输入y/nagain;if(toupper(again)=Y)coutendl;return;if
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新能源行业绿色制造技术创新与产业链协同发展报告
- 2025年氢能基础设施建设投融资策略与案例分析报告
- 工业互联网平台微服务架构性能测试报告2025:微服务性能优化与系统性能监控
- 2025年废弃矿井资源再利用技术路径与产业模式产业竞争格局报告
- 个人培训借款合同
- 顺丰快递用工合同模板7篇
- 物流运输承包经营合同7篇
- 2025年检验医学科临床检验技能操作评估模拟考试卷答案及解析
- 2025中国北京同仁堂(集团)有限责任公司部分子企业经营层成员市场化选聘笔试题库历年考点版附带答案详解
- 2025中国中化控股有限责任公司校园招聘2336人网申截止31日笔试题库历年考点版附带答案详解
- 保障性租赁住房房屋维修保养方案
- 信访诉求书撰写指南2025
- 医生法律法规知识培训课件
- 农村处理矛盾纠纷课件
- 公证在绿色金融中的应用-洞察阐释
- 药品发放登记管理制度
- 2025年眼镜定配工(高级)理论知识培训题库(含答案)
- 出租房合伙人合同协议书
- 2025年中考历史总复习《中国历史》八年级上册知识要点汇编
- 铁路信号设计与施工铁路信号电缆配线09课件
- 2025年广西公需科目答案02
评论
0/150
提交评论