C++课程设计-简单的通讯录管理_第1页
C++课程设计-简单的通讯录管理_第2页
C++课程设计-简单的通讯录管理_第3页
C++课程设计-简单的通讯录管理_第4页
C++课程设计-简单的通讯录管理_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、南京航空航天大学C+语言程序设计课程设计实验报告题目:简单的通讯录管理班级: 0110301班 学号: 011030121 姓名: 刘新铨 成绩: 指导教师: 潘梅园 日期: 年 月 日报告内容一、程序功能二、课题分析三、设计中的问题与解决方法四、感想和心得五、源程序代码(含注释)六、典型测试数据组(含输入数据和输出结果)(一)程序功能增加记录,可选择增加数目删除记录,可选择删除多个或单个或全部显示所有记录,十个一屏按姓名查找一个记录按姓名查找并更改记录从一个正文文件读取记录把目前的记录存入一个正文文本更改排序关键字并排序(二)课题分析此课程设计的数据里面包含每个人的姓名,电话号码以及E-ma

2、il地址等信息,并且每个人的数据默认以姓名为关键字,按照升序排放,排序方式可修改,同时为了减少执行“添加”“删除”等过,与复杂和繁琐的操作,采用单向链表来进行数据的存储与操作。同时需要一个文本文件来存储联系人信息,数据可从该文本文件中导出。(三)设计中遇到的问题及解决办法1.从文本文件中载入数据时,出现不能读的情况,解决办法是分情况,写程序分别进行处理。2.从文本文件中载入数据时,出现不同类数据合并现象,原因是数据之间无空格,解决方法是增大字段占用宽度。3.修改排序关键字时出现错误,解决办法:依次从原链表中摘除结点,按要求的顺序添加到新链表中,最后将首尾结点指针指向新链表。(四)感想和心得 通

3、过这次的课程设计我明白了学习程序设计语言必须要勤做实验,通过实验总结经验。我发现编写一个大一点的程序多么复杂,要掌握好C+就必须向老师说的那样,多操作,不然说平就提不高。有很多东西你了解了,但当你去编写时,就会不断暴露出我们自己的问题,所以平时遇到的一些小问题一定要重视,越是基础的知识越要理解透彻,比如指针与数组方面的知识,一旦没有弄清楚,在设计程序时就会吃亏。这次的课设中,我遇到了很多的问题,有的通过思考或查看书本解决了,有的还留在脑子里,只有通过孜孜不倦的求索我们才会有进步,不懂的思考就不能真正的掌握一门知识。这次的试验给予了我警示,他让我明白我掌握的知识还欠缺,对于继承与派生这一章的知识

4、,我以为自己勉强掌握了,这次试验后我发现我掌握的还不够。基类的保护成员公有继承到派生类,类外是否可以通过对象来访问呢,原先我以为是可以的,经过这次程序设计我知道我错了。总之,我觉得做学问不应该马虎,对于所学一定要有深入的理解,这也是我这次课设得到的启示。(五)源程序代码(含注释)#include#include#include#include#include #include#define len sizeof(class node)/定义一个宏len 大小为node的字节长度class node/定义一个面向对象的类char name10;int officephone;int homeph

5、one;char mobilephone15;char email20;node *next;/指向下一个类的指针public:node(char *n=dd,int o=0,int h=0,char *m=0,char *e=0)/缺省构造函数strcpy(name,n);strcpy(mobilephone,m);strcpy(email,e);officephone=o;homephone=h;void show()/定义一个打印的接口函数couttnametofficephonethomephonetmobilephonetemailnext=p;tailptr=p;/先使p加在尾指针

6、后p-next=NULL;/再使尾指针指向pvoid addsort(node *p)/将p按照关键字的顺序插入if(!headptr) /如果链表为空headptr=tailptr=p;/使头尾指针指向pp-next=NULL;/再使p的下个指针为空elsenode *p1=headptr,*p2=headptr;if(tag=1)/当关键字为姓名时if(strcmp(headptr-name,p-name)=0)/如果p的姓名为链表内最大值p-next=headptr;/使p变为头指针headptr=p;/并让头指针指向pelsewhile(p2-next&strcmp(p2-name,p

7、-name)next;if(strcmp(p2-name,p-name)next=p2;/将p插入p1与p2之间p1-next=p;if(tag=2)/当关键字为办公室电话时if(headptr-officephone=p-officephone)/如果p的办公室电话是链表内最大的p-next=headptr;/将p变为头指针headptr=p;/并将头指针指向pelsewhile(p2-next&p2-officephoneofficephone)p1=p2;p2=p2-next;if(p2-officephoneofficephone) addtail(p);/如果到链表尾都未找到位置,则

8、将p加到链表尾elsep-next=p2;/则将p插到p1与p2之间p1-next=p;node *lookup(char *n)/按姓名查找并返回该结点指针node *p=headptr;/定义一个指向链表头的指针pwhile(p)/当p不为空时循环if(!strcmp(p-name,n) return p; /找到姓名与实参相同的结点时返回结点指针p=p-next;/不相同则向下循环return NULL;/直到链表尾都未找到就返回空void Delete(char *n)node *p1=headptr,*p2;/定义2指针,一个指向链表头if(!strcmp(headptr-name,

9、n)/如果指定姓名在链表头headptr=headptr-next;/头指针向下挪delete p1;cout该姓名已删除next;/使p2指向链表第二个结点while(strcmp(p2-name,n)&p2-next)/当p2的姓名不是指定姓名时且p2的下个指针不是空时循环p1=p2;/使p1与p2相邻着向下寻找p2的姓名为指定姓名的结点p2=p2-next;if(!strcmp(p2-name,n)p1-next=p2-next;delete p2;cout该姓名已删除endl;else coutn没找到该姓名next;p1-next=NULL;addsort(p1);void show

10、all()/显示全部结点node *p=headptr;int i=1;system(cls);/先清屏while(p)/当p不为空时循环coutishow();/输出结点p=p-next;/指针指向下一个结点if(!(i+%10)system(pause);system(cls);void settag(int t)/置tag的值tag=t;int gettag() return(tag);node *getheadptr()return(headptr);void deleteall()/删除所有结点node *p;/定义一个指针pwhile(headptr)/当头指针不为空时循环p=he

11、adptr;/是p指向现在的链表头headptr=headptr-next;/头指针指向链表第二个结点delete p;/删除链表第一个结点 addrlist()/析构函数node *p;/定义一个指针pwhile(headptr)/当头指针不为空时循环p=headptr;/是p指向现在的链表头headptr=headptr-next;/头指针指向链表第二个结点delete p;/删除链表第一个结点void createlist(char *filename)/从二进制文件读取结点node *p50;/定义50个node指针int i=0;fstream in(filename,ios:in|

12、ios:binary);/定义一个二进制文件流对象in 并使ios标志位为读入if(!in)/如果无法打开则退出函数cout不能打开该文件:filenameendl;exit(1);p0=new node;/为p0申请空间while(in.read(char*)pi,len)/如果文件内还有结点数据,则len长度打开,并写入pi指针,再把pi指针按排序关键字插入链表pi+1=new node;addsort(pi+);in.close();void writetofile(char *filename)/将链表写入二进制文件node *p=headptr;fstream out(filenam

13、e,ios:out|ios:binary);/定义一个二进制文件流out并使ios标志位为输出if(!out)cout不能打开该文件:filenamenext;out.close();/关闭文件流outvoid outtxt(char *file)node *p=headptr;int n=1;fstream out(file,ios:out);if(!out)cout不能打开该文件:fileendl;exit(1);while(p)outn+t(*p).namet(*p).officephonet(*p).homephonet(*p).mobilephonet(*p).emailnext;o

14、ut.close();int menu_select()char *m9=1.add record,2.delete record,3.display all record,4.query,5.modify record,6.add from a text file,7.write to a textfile,8.sort,9.quit;char *c;c=new char50;do system(cls);for( int i=0;i9;i+)couttmiendl;coutChoicec;while(c09|c1);/输入不是选项代码则重新输入return(c0-0);void add(a

15、ddrlist &a)/增加记录node *p50;char n200,m200,e200;int o,h,t;cout输入将创建的记录数t;cout请依次输入姓名,办公室电话,住宅电话,手机号码,email地址endl;for(int i=0;inohme;pi=new node;/为pi申请大小为node的空间pi-setname(n); pi-setofficephone (o);pi-sethomephone (h);pi-setmobilephone (m);pi-setemail (e);a.addsort (pi); /按照tag有序的插入p到链表void del(addrlis

16、t &a)/删除记录node *q;q=a.getheadptr();if(!q) cout空链表endl;elseint s=1,i=0;char t,*n,*m4=1. Delete One Record,2. Delete Records,3. Delete All Record,4. quit;/定义4个选项字符串dosystem(cls);for(i=0;i4;i+)couttmit;while(t4);n=new char;if(t=2)/选择删除多个时,输入要删除个数到scout请输入要删除的记录的个数s;for(i=0;is;i+)/循环s次,s默认为1if(t=4|t=3)

17、break;/如果选择全删或退出,不循环cout请输入要删除的姓名n;a.Delete(n);if(t=3) a.deleteall();/选择全删则使用函数全部删除void showall(addrlist &a)/显示所有的记录node *q;/定义一个指向链表的指针q=a.getheadptr();if(!q) cout空链表endl;/如果链表为空输出“空链表”elsea.showall();void query(addrlist &a)/按姓名查找一个记录node *q;q=a.getheadptr();if(!q) cout空链表endl;/如果是空链表则输出“空链表”elsech

18、ar *n;node *p;cout请输入要查找的姓名n;p=a.lookup (n);/输入姓名,并按姓名查找if(p) p-show ();/如果找到就输出结点数据else cout没找到该姓名endl;/如果没找到输出没找到void modify(addrlist &a)/按姓名修改记录node *q;/定义一个指针,使其指向链表q=a.getheadptr();if(!q) cout空链表endl;/如果是空链表输入“空链表”elsechar k,*n,*m6=1. Modify Name,2. Modify Office Phone,3. Modify Home Phone,4. M

19、odify Mobilephone,5. Modify Email,6. quit;node *p;cout请输入要修改的姓名n;p=a.lookup (n);/输入姓名并按其查找do/循环至正确输入,并在错误输入时清屏,并重新输入system(cls);p-show();for(int i=0;i6;i+)couttmik;while(k6);switch(k)case 1:char na20;cout请输入姓名na;p-setname(na);if(a.gettag ()=1) a.sort(1); ;break;case 2:int o;cout请输入办公室电话 o;p-setoffic

20、ephone (o);if(a.gettag ()=2) a.sort(2); ;break;/输入代码为2时利用输入的办公室电话修改结点,并在排序关键字为办公室电话时,重新排序case 3:int h;cout请输入住宅电话h;p-sethomephone (h); ;break;case 4:char m20;cout请输入手机号码m;p-setmobilephone (m); ;break;case 5:char e20;coutemail地址e;p-setemail (e); ;break;default:;void addfromtxtfile(addrlist &a)/从文件导入记

21、录char name20,mobilephone20,email20,n80;int officephone,homephone,s;node *p;/定义一个指针,使其指向链表cout请输入要打开的文件名endl;cin.get();cin.getline(n,80);fstream in(n,ios:in|ios:nocreate);if(!in)cout不能打开该文件:nsnameofficephonehomephonemobilephoneemail)p=new node(name,officephone,homephone,mobilephone,email);a.addsort(p

22、);in.close();void writetotxtfile(addrlist &a)char *n;n=new char;cout请输入想要增加的文件名n;a.outtxt(n);void sort(addrlist &a)node *q;q=a.getheadptr();if(!q) cout空链表endl;/如果链表为空,输出“空链表”elseint t,m;t=a.gettag();/取得tag的值if(t=1) cout按姓名排序endl;/利用tag值输出当前的排序关键字if(t=2) cout按办公电话排序endl;cout是否修改关键字1.是2.否m;if(m=1)/选择修

23、改时,利用当前排序关键字,更改关键字并按照关键字排序if(t=1)a.settag (2);a.sort (2);if(t=2)a.settag(1);a.sort(1);if(t=2) cout现在关键字为:按姓名排序endl;if(t=1) cout现在关键字为:按办公电话排序endl;void quit(addrlist &a)/退出系统a.writetofile (addrlist.dat);/在退出前将记录写入文件void main()/主函数int choice=0;/定义选项代码的存储整数,默认为0addrlist a;a.createlist(addrlist.dat);whi

24、le(choice!=9) choice=menu_select();switch(choice)case 1:add(a);system(pause);break; /代码为1时,调用add函数case 2:del(a);system(pause);break;/代码为2时,调用del函数case 3:showall(a);system(pause);break;/代码为3时,调用showall函数case 4:query(a);system(pause);break;/代码为4时,调用query函数case 5:modify(a);system(pause);break;/代码为5时,调用

25、modif函数case 6:addfromtxtfile(a);system(pause);break;/代码为6时,调用addfromtxtfile函数case 7:writetotxtfile(a);system(pause);break;/代码为7时,调用writetotxtfile函数case 8:sort(a);system(pause);break;/代码为8时,调用sort函数case 9:quit(a);break;/代码为9时,调用quit函数default:;(六)典型测试数据组(含输入数据和输出结果)运行程序:1.add record2.delete record3.di

26、splay all record4.query5.modify record6.add from a text file7.write to a textfile8.sort9.quitChoice:1输入将创建的记录数2请依次输入姓名,办公室电话,住宅电话,手机号码,email地址WZ请按任意键继续. . .(清屏)1.add record2.delete record3.display all record4.query5.modify record6.add from a text file7.write to a textfile8.sort9.quitChoice:3(清屏)1Wan

27、g4564564562zhang123123 123请按任意键继续. . .(清屏)1.add record2.delete record3.display all record4.query5.modify record6.add from a text file7.write to a textfile8.sort9.quitChoice:8按姓名排序是否修改关键字1.是2.否1现在关键字为:按办公室电话排序请按任意键继续. . .(清屏)1.add record2.delete record3.display all record4.query5.modify record6.add f

28、rom a text file7.write to a textfile8.sort9.quitChoice:3(清屏)1zhang123123 1232Wang456456456请按任意键继续. . .(清屏)1.add record2.delete record3.display all record4.query5.modify record6.add from a text file7.write to a textfile8.sort9.quitChoice:4请输入要查找的姓名wangwang456456456请按任意键继续. . .(清屏)1.add record2.delete record3.displa

温馨提示

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

评论

0/150

提交评论