简单电话本程序.C++报告.doc_第1页
简单电话本程序.C++报告.doc_第2页
简单电话本程序.C++报告.doc_第3页
简单电话本程序.C++报告.doc_第4页
简单电话本程序.C++报告.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象程序设计课程设计报告要求1. 问题要求及任务描述1.1 题目:电话簿管理程序1.2 主要任务:考虑到电话簿里联系人同名的情况:在删除和修改功能里当出现同名时,得让用户自己选择要删除或更改哪个联系人(同名不同人),这时就得给这些同名的联系人标识,即编号。一开始想到的两个方法是:一、用整型数组的方法,再用查找功能,查找到一条就把这条通讯录itemk的k赋值给整型数组元素,退出查找后再利用item整型数组元素来进行删除或修改。二、是用指向通讯录itemk的指针数组,这个方法是直接把通讯录itemk的地址直接赋给指针数组,再利用指针来进行删除和修改。后来考虑到如果没有同名联系人或者很少,那这样定义数组会浪费很多内存空间,所以便想到利用动态数组来处理同名联系人的问题。2. 解决问题的主要思路和方法2.1 关键问题:A.同名联系人怎么根据用户需要删除或修改其中的同名的联系人。B.在选择修改时,用户选定要修改的项目,输入内容后怎么把修改的内容赋给要修改的联系人而其它内容保持不变?2.2 拟采用解决问题的方法:A.利用动态数组,用数组标识同名联系人,给同名联系人编码,输出编码给用户选择。B对于关键问题里的C问题:办法就是再定义几个变量,把不变的值赋给变量,再用enter函数即可,想法倒挺简单,但刚开始没往这方向想,老是想着有没有个参数定义办法是可以这样赋值的,耗了些时间在这上面。2.3 主要算法和处理流程图:供用户选择时,主要用了switch()函数来实现,如修改联系人时要修改姓名,电话,qq,还是地址?这时就是用switch()函数来实现的。当然,用的最多的就是for循环,它的作用很大很多,如修改函数里的判断重名联系人的人数,等等。关键数据流程图:开始1. 添加联系人输入姓名输入号码输入QQ输入地址调用Address类中的Enter函数调用Address类中的Set函数结束开始2修改联系人输入要修改的联系人For 循环确定同名联系人的人数snum定义动态数组来标识同名联系人t=? t=0调用changein()函数输出“无此联系人”赋值,再调用Address的enter()函数结束3. 程序实现3.1 程序实现时应考虑的问题:主菜单1.enter()4.save()8.exit()2.del()3.list()5.load()6.find()7.change()sure()address.enter(.)address.clear()address.set()switch()changein()switch()address.enter()save()switch()coutaddress.get()cout3.2 主要源代码及说明:Ostream&operator(ostream &output,address& addr) /重载,直接用cout输出通讯录,方便后面通讯录的输出。outputsetiosflags(ios:left)setw(21)addr.getname()setw(21)addr.getphone()setw(16)addr.getq()setw(81)addr.getwhere();return output;/添加联系人void book:enter()string name,phone,q,where;for (int t=0;titemnum;t+)if (findfree(t)!=-1)cout电话簿中有num条通信录endl;coutname;coutphone;coutq;coutwhere;num+;break;else continue;if(t=itemnum)cout通讯录已满!endl;elseitemt.enter(name,phone,q,where);itemt.set(); /将这条通讯录状态置为非空,别漏了!/删除联系人void book:del()string s;int b,t=0,snum=0;if(! num) cout电话簿为空!endl;else cout电话簿中有num条通信录endl;cout请输入姓名:s;/区分同名联系人for(int k=0;kitemnum;k+) if(!itemk.isempty()&itemk.getname()=s) snum+;/同名的联系人的人数int *p=new intsnum;/申明动态数组,节省存储空间for( k=0;kitemnum;k+) if(!itemk.isempty()&itemk.getname()=s) pt=k; t+;/标识同名联系人if(t=0) cout无此联系人!endl; else if(t=1) coutsetiosflags(ios:left)setw(21)姓名setw(21)电话setw(16)QQsetw(81)地址endl; coutitemp0endl; sure(p0,s); else coutsetiosflags(ios:left)setw(8)编号setw(21)姓名setw(21)电话setw(16)QQsetw(81)地址endl; for(int l=0;lt;l+) /有同名联系人时显示出同名联系人里的每条通讯录,并输出编码供用户选择 coutl+1 itemplendl; coutb; sure(pb-1,s); delete p; /记得释放存储空间/是否确认删除联系人void book:sure(int b,string nm)char n;coutn;if(n=1)itemb.clear();/将通讯录状态置空即是删除联系人 num-;/删除联系人后,通讯录条数减1cout已经删除nm的通信录endl;elsecout已取消!endl;cin.get();/显示联系人void book:list()address listitemnum,temp;int k;if(!num)cout电话簿为空!endl;elsecout电话簿中有num条通信录endl;for(int i=0;iitemnum;i+)listi=itemi;coutk;/显示方式选择switch (k)case 1:for(int i=0;ii;j-) /刚开始用了“j=itemnum”,出现的问题是:添加联系人之后再按显示通信录时,联系人出现了,但是不能再重新输入,写着“press any key to continue”,细节问题,注意! if(listj.getname()listj-1.getname() temp=listj; listj=listj-1; listj-1=temp; coutsetiosflags(ios:left)setw(21)姓名setw(21)电话setw(16)QQsetw(81)地址endl; for(int t=0;titemnum;+t) /也可以用t+,for循环里它们是一样的 if(!listt.isempty() coutlisttendl;break;case 2: /同理case 3: /同理/保存void book:save() ofstream file;char fname41;coutfname;file.open(fname,ios:out);if(!file)cout打开文件失败!endl;cin.get();else for(int i=0;iitemnum;i+)if(file&!file.eof()file.write(reinterpret_cast(&itemi),sizeof(address);cout保存成功!endl;file.close();/读取void book:load() ifstream file;char fname41;coutfname;file.open(fname,ios:in);if(!file)cout打开文件失败!endl;cin.get();elsenum=0;for(int i=0;iitemnum;i+)if(file&!file.eof()file.read(reinterpret_cast(&itemi),sizeof(address);if(!itemi.isempty()num+; cout读取成功!endl;file.close();/查找联系人void book:find()string n,p,q ;int m=0,t;if(!num)cout电话本为空!endl;elsecout1.按姓名查找 2.按电话查找 3.按qq查找 请输入查找的方式:t;/查找方式选择switch (t)case 1:cout请输入要查找的联系人的姓名:n; for(int k=0;kitemnum;k+) if(!itemk.isempty()&itemk.getname()=n) coutitemkendl; m+; if(m=0)cout无此联系人!endl;m=0;break;case 2: /同理case 3: /同理default: break;/修改联系人void book:change() int snum=0,t=0,b;string n;coutn;for(int k=0;kitemnum;k+)if(!itemk.isempty()&itemk.getname()=n)snum+;/区分同名联系人int *s=new intsnum;for( k=0;kitemnum;k+)if(!itemk.isempty()&itemk.getname()=n)st=k;t+;if(t=0)cout无此联系人!endl;else if(t=1)coutsetiosflags(ios:left)setw(21)姓名setw(21)电话setw(16)QQsetw(81)地址endl; coutitems0endl;/注意!是s0changein(s0); /注意!因为是同个类中,所以直接写函数名即可,不能写成book.changein()!else coutsetiosflags(ios:left)setw(8)编号setw(21)姓名setw(21)电话setw(16)QQsetw(81)地址endl;for(int l=0;lt;l+) /注意!这里要小心,不能写成l=t,因为前面的“t+”使得这里要减去1!不然的话运行到这里会显示程序出错,无法继续。 coutl+1 itemslendl; coutb;changein(sb-1); /要注意,是用b-1!delete s;/释放存储空间/修改子函数void book:changein(int b)string nn,ph,qq,ad;int q;char m; do cout修改此联系人的:1.姓名;2.电话;3.QQ;4.地址q;/选择修改 switch (q) case 1: coutnn; ph=itemb.getphone(); qq=itemb.getq(); ad=itemb.getwhere(); itemb.enter(nn,ph,qq,ad); cout修改成功!修改后如下:endl; coutsetiosflags(ios:left)setw(21)姓名setw(21)电话setw(16)QQsetw(81)地址endl; coutitembendl; break; case 2: /同理 case 3: /同理 case 4: /同理 default:break; coutm;while(m!=n);4. 测试4.1 测试结果及分析:主菜单:1.添加联系人:2.删除联系人:3.显示联系人:显示方式:(1).姓名显示:(2).电话显示:(3).QQ显示:4.电话簿存盘:5.读出电话簿:6.查找联系人:(1).姓名查找:(2).电话查找:(3).qq查找:7.修改联系人:(1).修改电话:(2).修改qq:(3).修改地址:(4).修改姓名:8.退出:5. 小结5.1本问题解决方法及程序实现小结:A.添加和删除联系人是根据它的状态(即是否为空)来进行的,增加联系人(或删除联系人)时最后得加上set( )(或clear( ))以使通讯录状态置为非空(或空),不然程序会大乱,使得要添加的联系人没添上,要删除的又没删除。还有就是“num+”,“num- -”也千万不能遗漏。B.删除和修改联系人时定义的动态数组,要记得适时释放存储空间。C.犯了很多细节问题,如修改函数里的一个for循环里:for(int l=0;lt;l+) coutl+1 itemslendl;这里的“lt”,一开始我把它写成了“l=t”,运行时会出现“程序出错”对话

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论