




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、文件结构总共5个文件:systemhead.h所有的系统头文件全在这里面sqstring.h字符串类的声明以及实现sqstring- length: int =0+ data50: char+ sqstring():+ sqstring(ch: char ):+ sqstring(t: sqstring &):+ sqstring():+ copy(ch: char*): void+ copy(t: sqstring): void+ getlength():int + empty():bool+ getstring():void+ delete(i: int &): void+ compare
2、(t: sqstring): int+ equal(s: sqstring): booladdressbook.h通讯录类的定义及实现dlinklist.h双链表的定义及实现addressbook-main.cpp主函数模块结构总共有4个类:dnode链表结构体、sqstring字符串、addressbook通讯录、dlinklist双链表uml类示图如下:addressbook+ name: sqstring+ state: sqstring+ city: sqstring+ street: sqstring+ code: sqstring+ cellphone: sqstring+ qq:
3、 sqstring+ email: sqstring+ display(): void+ getin(): bool+ copy(temp: addressbook): void+ format(n: int): voiddlinklist:dnode+ data: addressbook+ former: dnode *+ next: dnode *dlinklist- ofile: ofstream- ifstream: ifile- tempfile: ofstream- now_time: systemtime;- length: int = 0+ head: dnode*+ temp
4、: dnode*+ dlinklist()+ dlinklist()+ empty(): bool+ getlength(): int+ display(temp: dnode *): void+ search(temp: sqstring): int+ getelem(i: int): addressbook+ insert(s: dnode *): void+ enter(): bool+ delete(i: int): bool+ delete(d: dnode *): bool+ save(): bool+ load(): bool【设计题目】【设计目的】用数据结构中的双向链表作数据结
5、构,结合c语言基本知识。编写一个通讯录管理系统。以把所学数据结构知识应用到实际软件开发中去。【设计内容】本系统应完成一下几方面的功能:1、输入信息enter();2、显示信息display( );3、查找以姓名作为关键字 search( );4、删除信息delete( );5、存盘save ( );6、装入load( ) ;【设计要求】每条信息至包含:姓名(name )街道(street)城市(city)邮编(eip)国家(state)作为一个完整的系统,应具有友好的 界面 和较强的 容错能力上机能正常运行,并写出课程设计 报告源代码如下:/第一个文件:systemhead.h/系统头文件#i
6、nclude #include #include #include #include #include #include using namespace std;/第一个文件:systemhead.h结束/第二个文件:addressbook-main-booynal.cpp#include systemhead.h#include dlinklist.h/声明/欢迎void welcome();/菜单void menu(int menu);/i的取值0到5,0为主菜单,其余为各自的子菜单/选择int choose();/获取用户的选择,并返回字符型的选择/执行/根据选择执行相应的操作,/第一个
7、参数为主选项取值范围为0-9,第二个为子选项(1-x),子选项为0时表示没有int run(int choose,int subchoose);/编辑int edit(dlinklist:dnode *p);/结束void exit();/程序退出bool issaved=true;/void main()/程序入口/调用执行welcome();while(true)menu(0);run(choose(),0);/欢迎void welcome()int i;system(cls);coutnnntt 欢迎进入 通讯录管理系统 !endlnnnnnnttt 系统载入中;for(i=0;i3;i
8、+)sleep(300);cout。;coutbbbbbb;for(i=10;i=100;i=i+10)cout i% ;sleep(100);if(i!=100)coutbbbbb;elsesleep(500);coutbbbbb;system(color 2);cout成功!endl;system(color d);sleep(100);/菜单void menu(int menu)switch(menu)case 0:system(cls);coutntt通讯录管理系统【主菜单】nnnttt1、增加信息nttt2、显示信息nttt3、按姓名查找nttt4、全部删除nttt5、保存信息ntt
9、t9、退出程序nntt请选择:;break;case 1:/增加信息coutt可选项:ntt1、编辑该信息ntt2、删除该信息ntt3、继续增加ntt9、返回【主菜单】ntt;break;case 2:/显示信息coutt可选项:ntt1、上一个ntt2、下一个ntt3、编辑该项ntt4、删除该项ntt9、返回【主菜单】nchoose;/用字符数组,增强容错能力getchar();/读取最后按下的回车符for(i=0,j=0;choosei!=0;i+)if(!(choosei=0&choosei=9)/处理非法字符j+;/j记录着非法字符个数choosei=choosei+j;i-;/因为循
10、环向前滚动了一个,/所以循环变量也要向前滚动一个,其实就是屏蔽for语句中的i+语句/合法字符可能有多个,但只取第一个return (int)*choose-48;/执行int run(int choose,int subchoose)int i;char ch;sqstring name;dlinklist:dnode *p;switch(choose)case 1:/增加信息issaved=false;switch(subchoose)case 0:case 3:/0和3都是增加信息system(cls);coutttt通讯录 管理系统【增加信息】endl;if(dhead.enter()
11、=false)cout!提示:nt新增信息被拒绝!nt请检查信息是否完整、或者是否错误。;sleep(500);coutnntt请重新输入。endl;system(pause);run(1,0);system(cls);coutttt通讯录 管理系统【增加信息】former);menu(1);/【增加信息】的子菜单run(1,choose();break;case 1:/编辑新增信息edit(dhead.head-former);break;case 2:/删除新增的信息system(cls);coutttt通讯录 管理系统【删除新增的信息】endl;coutnt你选择的是:【删除新增的信息】
12、former);/显示coutformer);/删除coutnt删除成功!nendl;elseif(ch=n|ch=n)coutnt你取消了删除信息,该信息没有被删除!nendl;elsecoutnt很抱歉,nt未能识别你的选择,nt该信息没有被删除!nendl;system(pause);break;case 9:/返回【主菜单】return 0;/进入下一次循环default:/未能识别coutnt很抱歉,nt未能识别你的选择,n;sleep(500);coutntt程序将自动跳转到 【主菜单】。next;if(dhead.empty()system(cls);coutttt通讯录 管理系
13、统【显示信息】endl;coutnt没有什么可显示的,可能是还没有创建信息!nt现在要创建吗?(y|n)endl;ch=getchar();getchar();if(ch=y|ch=y)run(1,0);elsecoutnt返回【主菜单】中。endl;sleep(700);break;/结束run()语句while(p!=dhead.head)coutnnnttt读取信息中。endl;sleep(300);system(cls);coutttt通讯录 管理系统【显示信息】endl;coutt编号:i/dhead.getlength();if(i=dhead.getlength()coutttt
14、t这是最后一个endl;else if(i=1)couttttt这是第一个endl;elsecouttttt后面还有dhead.getlength()-i个former=dhead.head)i=dhead.getlength();p=dhead.head-former;elsei-;p=p-former;else if(ch=2)/下一个if(p-next=dhead.head)i=1;p=dhead.head-next;elsei+;p=p-next;elseswitch(ch)case 3:/编辑该项issaved=false;system(cls);coutttt通讯录 管理系统【编辑
15、该项】endl;coutnt你选择的是:【编辑该项】endl;edit(p);break;case 4:/删除该项issaved=false;system(cls);coutttt通讯录 管理系统【删除该项】endl;coutnext;i=1;coutnt删除成功!endl;sleep(300);elsecoutnt未知错误,删除失败!,endl;else if(ch=n|ch=n)coutnt你取消了删除,记录没有做任何更改!endl;elsecoutnt很抱歉,nt未能识别你的选择,nt记录没有做任何更改!nendl;break;case 9:/返回主菜单return 0;default:
16、coutnt很抱歉,nt未能识别你的选择endl;/swtich(subchoose)/while()break;case 3:/按姓名查找system(cls);coutttt通讯录 管理系统【查找信息】endl;coutnt你选择的是:【按姓名查找】nendl;cout请输入要查找的名字:;name.getstring();if(i=dhead.search(name)!=0)/查找到的结点存放到dhead.temp中cout找到信息:t第i个endl;dhead.display(dhead.temp);elsecoutnt很抱歉,未能找到名字为:name.data 的记录!nendl;s
17、ystem(pause);menu(3);break;case 4:/删除信息issaved=false;system(cls);coutttt通讯录 管理系统【删除信息】endl;coutnt!提示:nnt该信息删除后可以在addressbook.bak中找到备份记录!nnt是否确认删除以上信息:(y|n);ch=getchar();getchar();if(ch=y|ch=y)if(dhead.delete(0)/参数为0表示全部删除coutnt删除成功!endl;i=0;sleep(1000);elsecoutnt未知错误,删除失败!endl;sleep(1000);else if(ch
18、=n|ch=n)coutnt你取消了删除,记录没有做任何更改!endl;elsecoutnt很抱歉,nt未能识别你的选择,nt记录没有做任何更改!nendl;break;case 5:/保存信息if(dhead.save()system(cls);coutnnnnntt保存成功!endl;issaved=true;sleep(1000);elsecoutnt保存失败!endl;break;case 9:/退出exit();break;default:coutnt很抱歉,nt未能识别你的选择,请【重新选择】:endl;system(pause);/暂停/编辑项目int edit(dlinklis
19、t:dnode *p)while(true)system(cls);coutttt通讯录 管理系统【编辑信息】endl;coutt编辑endl;dhead.display(p);coutt1、姓名t2、国家t3、城市t4、街道nt5、邮编t6、手机t7、qqt8、emailnt9、返回endl;switch(choose()case 1:coutdata.name.getstring();p-data.format(1);/格式化字符串break;case 2:coutdata.state.getstring();p-data.format(2);/格式化字符串break;case 3:cou
20、tdata.city.getstring();p-data.format(3);/格式化字符串break;case 4:coutdata.street.getstring();p-data.format(4);/格式化字符串break;case 5:coutdata.code.getstring();p-data.format(5);/格式化字符串break;case 6:coutdata.cellphone.getstring();p-data.format(6);/格式化字符串break;case 7:coutdata.qq.getstring();p-data.format(7);/格式
21、化字符串break;case 8:coutdata.email.getstring();p-data.format(8);/格式化字符串break;case 9:return 0;default:coutnt很抱歉,nt未能识别你的选择nendl;break;/switch(choose()/while(true)/结束void exit()/检查是否保存更改char ch;system(cls);if(!issaved)coutnt是否保存更改?(y|n);ch=getchar();if(ch=y|ch=y)run(5,0);/保存coutntt正在注销。endl;elsecout你取消了保
22、存!endl;coutntt正在注销。former=head-next=head;length=0;head-data.name.data0=0;head-data.state.data0=0;head-data.city.data0=0;head-data.street.data0=0;head-data.code.data0=0;head-data.cellphone.data0=0;head-data.qq.data0=0;head-data.email.data0=0;/检测磁盘上是否存在备份记录ifile.open(addressbook.dat,ios_base:in);if(!i
23、file)/写入错误记录getlocaltime(&now_time);tempfile.open(record.log,ios_base:app);tempfilenow_time.wyear/now_time.wmonth/now_time.wday/now_time.whour:now_time.wminute:now_time.wsecond 打开备份文件addressbook.dat失败,可能是还没有创建endl;ofile.open(addressbook.dat,ios_base:out);if(ofile)ofile.close();tempfilenow_time.wyear
24、/now_time.wmonth/now_time.wday/now_time.whour:now_time.wminute:now_time.wsecond 备份文件addressbook.dat已经重新创建!next=head;/长度int dlinklist:getlength()/长度,获取双链表的长度return length;/显示void dlinklist:display(dnode *temp)/输出指定结点的信息temp-data.display();/查找int dlinklist:search(sqstring name)/查找,按姓名在双链表里面查找dnode *p=
25、head-next;int i=1;while(p!=head)if(p-data.name.equal(name)break;p=p-next;i+;/whileif(p=head)/未找到,返回0return 0;/成功找到了,返回相对位置,temp返回指针位置temp=p;return i;/取元素addressbook dlinklist:getelem(int i)/取元素,获取双链表的第i个元素int n=0;dnode *p=head;addressbook temp;if(empty()return temp;/返回空结点while(p!=head-former&nnext;n
26、+;if(p!=head-former&ndata;elsereturn temp;/插入void dlinklist:insert(dnode *s)/尾插法插入结点,新增记录if(empty()/空链表的情况/s就是第一个结点head-next=head-former=s;s-former=s-next=head;else/非空链表的情况,/s就是新的尾结点s-next=head;s-former=head-former;head-former-next=s;head-former=s;length+;/录入bool dlinklist:enter()/增加结点dnode *p=head,
27、*s=(dnode*)malloc(sizeof(dnode);if(s-data.getin()/从键盘录入信息insert(s);/插入结点sreturn true;else return false;/删除bool dlinklist:delete(int i)/删除,按位置删除双链表中第i个结点,i等于0表示删除全部int n=0;dnode *p=head,*q;if(i=0)/全部删除p=head-next;q=head-next-next;while(p!=head)free(p);p=q;q=q-next;head-next=head-former=head;length=0;
28、return true;while(p!=head-former&nnext;n+;if(p!=head-former&nformer-next=p-next;p-next-former=p-former;free(p);length-;return true;elsetempfile.open(record.log,ios_base:app);if(tempfile)getlocaltime(&now_time);tempfilenow_time.wyear/now_time.wmonth/now_time.wday/now_time.whour:now_time.wminute:now_t
29、ime.wsecond 删除信息出现了一个错误,可能是没有找到第i个位置former-next=d-next;d-next-former=d-former;free(d);length-;return true;return false;/存盘bool dlinklist:save()/*存盘格式,每次存盘插入时间信息,以西文逗号分隔,以#开头,并且以#结束,每一条信息占一行顺序依次是姓名,国家,城市,街道,邮编,手机,qq,邮箱。示例:#小明,中国,重庆 合川,交通街,4085201052389563,txkd#*/system(if exist addressbo
30、ok.bak del addressbook.bak -q);system(ren addressbook.dat addressbook.bak);ofile.open(addressbook.dat,ios_base:out);if(ofile)/当文件正常打开时,才执行以下语句if(empty()return false; dnode *p=head-next;getlocaltime(&now_time);ofilen*通讯录记录*nn/data为载入数据的起点说明endl存放顺序:姓名,国家,城市,街道,邮编,手机,qq,邮箱。endl示例:#小明,中国,重庆 合川,交通街,4085
31、201052389563,txkd#nnnow_time.wyear/now_time.wmonth/now_time.wday/now_time.whour:now_time.wminute:now_time.wsecond saved:endl;while(p!=head)ofile#/开始标记:#data.name.data,data.state.data,data.city.data,data.street.data,data.code.data,data.cellphone.data,data.qq.data,data.email.data#next;ofi
32、le.close();return true;/ifelsecout!错误:n打开存盘文件失败。n请检查磁盘是否有读取错误。endl;/写入错误记录getlocaltime(&now_time);tempfile.open(record.log,ios_base:app);tempfilenow_time.wyear/now_time.wmonth/now_time.wday/now_time.whour:now_time.wminute:now_time.wsecond 保存信息时出现了一个意外:打开备份文件文件失败endl;tempfile.close();return false;/装入
33、bool dlinklist:load()ifile.open(addressbook.dat,ios_base:in);dnode *s;/存放来自备份文件的数据if(ifile)/如果打开成功int i,j;/循环变量char ch100;/存放读取来自文件的一整行的数据,长度不超过90,这里取100char subch16;/存放每一项单独的数据,长度不超过13,这里取16while(ifile.good()/没有遇到任何错误信息(包括读到文件末尾)就一直往下面读ifile.getline(ch,100,n);/读取一行数据if(ch0!=#)continue;/如果没有找到数据的开始标
34、记,结束本次循环,读取下一行数据,/否则,本行就为所需数据,分析数据,添加到双链表里面s=(dnode*)malloc(sizeof(dnode);/姓名for(i=0,j=1;chj!=,&chj!=#&idata.name.copy(subch);/国家for(i=0,j+;chj!=,&chj!=#&idata.state.copy(subch);/城市for(i=0,j+;chj!=,&chj!=#&idata.city.copy(subch);/街道for(i=0,j+;chj!=,&chj!=#&idata.street.copy(subch);/邮编for(i=0,j+;chj!
35、=,&chj!=#&idata.code.copy(subch);/手机for(i=0,j+;chj!=,&chj!=#&idata.cellphone.copy(subch);/qqfor(i=0,j+;chj!=,&chj!=#&idata.qq.copy(subch);/emailfor(i=0,j+;chj!=#&idata.email.copy(subch);/完成了1个通讯录数据的读取/下面插入结点sinsert(s);/while(ifile.good()/读取完成后关闭文件:ifile.close();return true;/if(ifile)elsecout装入信息时出现了一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年乡镇退役军人服务站招聘考试热点分析
- 2025年农村医疗保障员招聘面试模拟题及答案详解
- 2025年人力资源管理实战模拟题及案例分析教程
- 2025年中成药制药生产线合作协议书
- 2025年市政工程项目建议书
- 2025年镍压延加工材项目发展计划
- 福建省莆田市某校2024-2025学年一年级上学期第一次月考数学试题
- 心内科考试试题及答案
- 抗焦虑失眠药课件
- 抗心律失常课件
- 2025年重庆市永川区社区工作者招聘考试笔试试题(含答案)
- 电气自动化基础知识课件
- 家畜繁殖员上岗证考试题库及答案
- DG-TJ08-2097-2025 地下管线探测技术标准
- 数学鲁教版九年级上学期分层计划
- 甘肃省合理用药管理办法
- 新解读《建筑工程消防施工质量验收规范 DBJ-T 15-248-2022》
- 第十三章 三角形 单元测试 2025-2026学年人教版(2024)八年级数学上册
- 女生的青春期健康教育
- 以《论语》为翼:高中生价值观构建的教学实践与探索
- 妇产科电子护理文书书写规范
评论
0/150
提交评论