东南大学短学期C++电话簿.docx
《东南大学短学期C++电话簿.docx》由会员分享,可在线阅读,更多相关《东南大学短学期C++电话簿.docx(34页珍藏版)》请在冰点文库上搜索。
![东南大学短学期C++电话簿.docx](https://file1.bingdoc.com/fileroot1/2023-6/8/087accf6-bdc1-4396-b9bf-894ef11246d8/087accf6-bdc1-4396-b9bf-894ef11246d81.gif)
东南大学短学期C++电话簿
课程设计报告
学院、系
交通学院
课程设计科目
C++程序课程设计
课程设计题目
通讯录管理系统
组长
季予
小组成员
吕文广、李文贤、郭瑞琦
指导教师
刘敏
完成时间
2012-8-23
摘要:
随着科学技术的发展,计算机领域不断取得新的研究成果。
计算机知识越来越普及,计算机的应用也越来越广泛:
它不再局限于科学研究方面,变得与我们的生活息息相关。
此例的通讯录便是日常生活中极实用的应用之一。
通讯录系统能方便用户迅速、准确的查找修改删除联系人信息,并实现把各个联系人的信息以文档保存。
本文介绍了简易通讯录管理系统在MicrosoftVisualC++6.0环境下的实现过程:
系统的分析,功能模块的设计,系统的调试和测试。
该通讯录包含的主要功能有:
联系人的添加、修改、删除、拨号、分类显示以及整表导出为txt文本,并自动实现按字母升序排列通讯录。
关键词:
MicrosoftVisualC++、通讯录、功能函数、面向对象、控制台
目录
1课题小组成员组成及分工情况
2功能需求分析
2.1通讯录界面设计
2.2添加模块
2.3查找模块
2.4删除模块
2.5修改模块
2.6显示模块
2.7拨号功能模块
2.8来电显示模块
3程序框图
4主要代码描述
4.1添加记录
4.2查找记录
4.3删除记录
4.4修改记录
4.5整表输出
4.6拨号功能
4.7来电显示
4.8控制台
5调试
6总结与心得
7致谢
(附:
程序详细代码)
1课题小组成员组成及分工情况
季予:
程序MFC实现方法、Search、Edit、Delete、Dial函数的编写。
吕文广:
程序MFC实现方法、输入输出流控制、运算符重载部分的编写。
李文贤:
Address类、Terms类、Addrbook类基础框架构造。
组织各函数。
郭瑞琦:
链表部分的排序实现、程序调试与bug修复、ppt\word报告编写。
2功能需求分析
通讯录主要应有以下功能模块:
通讯录界面、新建联系人、修改原有联系人信息、删除联系人、查找联系人、显示联系人信息及由联系人姓名进行拨号的功能。
其中联系人的姓名、通讯号码等信息可由数字和字母混编而成。
2.1通讯录界面设计
主要功能是设计通讯录的界面,能够提示用户的实际操作等。
我组采用按照序号来实现相应的操作,其中:
1添加通讯录2删除通讯录3编辑通讯录4查看通讯录5拨号6来电显示7整表输出8保存退出
2.2通讯录添加模块
主要功能是添加联系人,包括姓名、电话等信息,且添加后自动按字母顺序排列。
2.3通讯录查找模块
主要功能是在已编通讯录内查找所需删除或修改的联系人信息,并实现“查无此人”的报错功能。
2.4通讯录修改模块
主要功能是对原有联系人的个人信息进行修改更新。
2.5通讯录删除模块
主要功能是删除不再需要的联系人。
2.6通讯录显示模块
主要功能是显示已有的通讯录信息并可输出在文本文档中。
2.7通讯录拨号模块
主要功能是通过已知姓名的输入实现系统对号码的自动查找拨出。
2.8通讯录来电显示模块
主要功能是通过已知电话号码的输入实现系统对已有通讯录姓名的查找。
3程序框图
4主要代码描述
4.1添加记录
通过输入联系人的姓名、电话等向程序中写入信息,具体由重载>>实现:
istream&operator>>(istream&in,Address&a)
{
cout<<"……姓名:
";
in>>a.name;
cout<<"…手机号:
";
in>>a.tel_num;
while
(1)
{if(strlen(a.tel_num)!
=11)
{cout<<"请重新输入手机号码(11位数)"<<'\n';
in>>a.tel_num;
}
else
break;
}
cout<<"……归类\n老师类B:
同学类其他字符:
其他类>:
";
in>>a.arch;
cout<<"…E_mail:
";
in>>a.e_addr;
returnin;
}
4.2查找记录
根据姓名输入,查询原有联系人信息的地址,具体代码如下:
Terms**AddrBook:
:
Search(char*nam)
{
Terms*p,*q;
for(inti=0;i<3;i++){//逐类查找
q=ab[i];
for(p=q->link;p!
=ab[i];p=p->link){
if(!
strcmp(p->term.name,nam))//比较名字
return&q->link;//相同时返回地址
q=p;//用q保存前一个指针
}
}
return&ab[i];//搜索失败时返回表头节点
}
4.3删除记录
根据姓名输入,通过遍历全表找到原有联系人信息并删除,拥有报错功能,具体代码如下:
boolAddrBook:
:
Delete()
{
char*nam=newchar[25];
cout<<"请输入要删除的通讯录的姓名:
";
cin>>nam;//指定名字
returnDelete(nam);
}
boolAddrBook:
:
Delete(char*nam)
{
Terms*q,**p=Search(nam);
if(Search(nam)==&ab[1]||Search(nam)==&ab[2]||Search(nam)==&ab[3]){
cout<<"所找地址不存在!
\n";
returnfalse;
}//指定的名字不存在时删除失败
q=*p;
*p=(*p)->link;
deleteq;
cout<<"删除成功!
\n";
returntrue;
}
4.4编辑记录
根据姓名输入,通过遍历全表找到原有联系人信息并根据需要进行修改,拥有报错功能,具体代码如下:
voidAddress:
:
Modify()
{
char*str=newchar[25],a;
cout<<"请逐项输入新数据<不修改的数据请输入一个\"#\">:
\n";
cout<<"……姓名:
";
cin>>str;
if(strcmp(str,"#")!
=0)
strcpy(name,str);
cout<<"…手机号:
";
cin>>str;
if(strcmp(str,"#")!
=0)
strcpy(tel_num,str);
cout<<"……归类:
";
cin>>a;
if(a!
='#')
arch=a;
cout<<"…E_mail:
";
cin>>str;
if(strcmp(str,"#")!
=0)
strcpy(e_addr,str);
}
4.5整表输出的实现
把文件中的各种信息通过txt文本文档的形式保存出来,代码如下:
voidAddrBook:
:
save()
{
ofstreamoutfile("data.txt");
for(inti=0;i<3;i++)
{
for(Terms*p=ab[i]->link;p!
=ab[i];p=p->link)
{
outfile<<"……姓名:
"<term.name<<'\n'<<"…手机号:
"<term.tel_num<<'\n'<<"…E_mail:
"<<'\n'<term.e_addr<}
}
cout<<"已保存!
"<}
4.6拨号功能的实现
查找功能的简单延伸,代码如下:
boolAddrBook:
:
Dial(char*nam)
{
Terms**p=Search(nam);
if(Search(nam)==&ab[1]||Search(nam)==&ab[2]||Search(nam)==&ab[3])
{cout<<"地址不存在!
\n";
returnfalse;//指定的名字不存在时拨号失败
}charc;inti=0;
c=(*p)->term.tel_num[i];
do{
for(unsignedlongintj=0;j<19999999;j++);
cout<c=(*p)->term.tel_num[++i];
}while(c!
='\0'&&i<15);
cout<<"……拨号中>>"<returntrue;
}
4.7
来电显示功能
boolAddrBook:
:
comeshow()
{
char*come=newchar[25];
cout<<"拨入的电话:
";
cin>>come;
Terms**p=show(come);
if(show(come)==&ab[1]||show(come)==&ab[2]||show(come)==&ab[3])
{
cout<<"地址不存在!
\n";
returnfalse;//指定的名字不存在时来电显示失败
}charc;inti=0;
c=(*p)->term.name[i];
do
{
for(unsignedlongintj=0;j<19999999;j++);
cout<c=(*p)->term.name[++i];
}while(c!
='\0'&&i<15);
cout<<"给您来电……>>"<returntrue;
}
Terms**AddrBook:
:
show(char*come)
{
Terms*p,*q;
for(inti=0;i<3;i++)
{//逐类查找
q=ab[i];
for(p=q->link;p!
=ab[i];p=p->link)
{
if(!
strcmp(p->term.tel_num,come))//比较名字
return&q->link;//相同时返回地址
q=p;//用q保存前一个指针
}
}
return&ab[i];//搜索失败时返回表头节点
}
4.8
控制台命令实现。
voidmain()
{
AddrBookadrbk;
inti;
cout<<"-----------------通讯录管理系统-----------------\n";
cout<<"功能菜单:
\n";
cout<<"添加通讯录…………………………1\n";
cout<<"删除通讯录…………………………2\n";
cout<<"编辑通讯录…………………………3\n";
cout<<"查看通讯录…………………………4\n";
cout<<"拨号…………………………………5\n";
cout<<"来电显示……………………………6\n";
cout<<"整表输出在data.txt………………7\n";
cout<<"退出…………………………………8\n";
cout<for(;;)
{
cout<<"请选择功能:
";
cin>>i;
switch(i){
case1:
cin>>adrbk;break;
case2:
adrbk.Delete();break;
case3:
adrbk.Edit();break;
case4:
cout<case5:
adrbk.Dial();break;
case6:
eshow();break;
case7:
adrbk.save();break;
case8:
cout<<"是否保存数据,是请按1,否请按2"<<'\n';
cin>>i;
switch(i){
case1:
adrbk.save();break;
case2:
cout<<"没有保存数据"<<'\n';break;
}
cout<<"--------------------谢谢使用--------------------\n";
default:
return;
}
cout<}
}
5调试
控制台与添加功能
删除及报错功能
编辑功能
整表输出功能
整表输出功能(附图一)
6总结与心得
这是我上大学学习程序设计以来设计语言结果的大检查.自己动手自己发现问题,解决问题,发现自己的很多不足.平时没有掌握好的知识在这次设计中彻底暴露出来,经过不断的思考,不断查阅资料,不断上机运行,解决其中大部分问题,当然还有一些问题没有解决,我相信在以后的学习中能够解决它们.但是收获还是不小的.我不仅对C的操作有了进一步的掌握,还掌握了程序设计的风格及其注释的格式.
这次课程设计锻炼了我编写程序的能力,对以前学过的知识有了进一不的了解,特别是链表这一重要知识点。
经过这次课程设计,我体验到了自学的乐趣和成就感,我想我以后会更加热爱自己的专业,更加注重自学能力的培养,一定会把自己的专业学好.
课程设计是每一个大学生在大学生涯中都不可或缺的,它使我们在实践中了巩固了所学的知识、在实践中锻炼自己的动手能力;实习又是对每一位大学生所学专业知识的一种拓展手段,它让我们学到了很多在课堂上根本就学不到的知识,不仅开阔了自己的视野,增战了自己的见识,也为我们以后进一步走向社会打下了坚实的基础,是我们走向以后走向工作岗位的奠基石。
两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。
在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。
学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础.
7致谢
在这次课程设计中老师给了我们很大的帮助,帮我们解答疑难问题,给我们提供资料,给我们提供查阅资料的信息,引导我们该如何去思考问题,教会我们解决问题的方法.同时又鼓励我们自主学习,老师给我的不仅是知识,是帮助,更是学习的信心与智慧,在这里衷心感谢老师的耐心细心的帮助.同时也感谢和我们一起走过的同学,这是我们共同努力地结果,衷心的感谢大家对我的帮助和支持.
附录:
程序详细代码
4.3程序详细代码
#include
#include//用于字符串的比较
#include
classAddress//定义记录类
{
public:
Address()
{
name=newchar[25];
tel_num=newchar[15];
e_addr=newchar[25];
}
Address(char*n,char*tel,charar,char*eadr);
~Address()
{
delete[]name;
delete[]tel_num;
delete[]e_addr;
}
voidModify();//编辑数据
private:
char*name,*tel_num,arch,*e_addr;
friendistream&operator>>(istream&in,Address&a);//重载输入运算符
friendostream&operator<<(ostream&out,Address&a);//重载输出运算符
friendbooloperator>(Address&a,Address&b);//重载">"号
friendbooloperator==(Address&a,Address&b);//重载等于号
friendclassAddrBook;
};
Address:
:
Address(char*n,char*tel,charar,char*eadr)
{
name=newchar[25];
tel_num=newchar[15];
e_addr=newchar[25];
strcpy(name,n);
strcpy(tel_num,tel);
arch=ar;
strcpy(e_addr,eadr);
}
voidAddress:
:
Modify()
{
char*str=newchar[25],a;
cout<<"请逐项输入新数据<不修改的数据请输入一个\"#\">:
\n";
cout<<"……姓名:
";
cin>>str;
if(strcmp(str,"#")!
=0)
strcpy(name,str);
cout<<"…手机号:
";
cin>>str;
if(strcmp(str,"#")!
=0)
strcpy(tel_num,str);
cout<<"……归类:
";
cin>>a;
if(a!
='#')
arch=a;
cout<<"…E_mail:
";
cin>>str;
if(strcmp(str,"#")!
=0)
strcpy(e_addr,str);
}
istream&operator>>(istream&in,Address&a)
{
cout<<"……姓名:
";
in>>a.name;
cout<<"…手机号:
";
in>>a.tel_num;
while
(1)
{
if(strlen(a.tel_num)!
=11)
{
cout<<"请重新输入手机号码(11位数)"<<'\n';
in>>a.tel_num;
}
else
break;
}
cout<<"……归类\n老师类B:
同学类其他字符:
其他类>:
";
in>>a.arch;
cout<<"…E_mail:
";
in>>a.e_addr;
returnin;
}
ostream&operator<<(ostream&out,Address&a)
{
cout<<"……姓名:
"<cout<<"…手机号:
"<cout<<"……归类:
";
if(a.arch=='A')cout<<"老师类";
elseif(a.arch=='B')cout<<"同学类";
elsecout<<"其他类";
cout<cout<<"…E_mail:
"<returnout;
}
booloperator>(Address&a,Address&b)
{
returnstrcmp(a.name,b.name)>0;
}
booloperator==(Address&a,Address&b)
{
returnstrcmp(a.name,b.name)==0;
}
//定义通讯录链表的节点
//由于数据需要反复的插入,删除以及调整顺序,所以用链表存放
classTerms
{
public:
Terms(){link=0;}
Terms(char*n,char*tel,charar,char*eadr);
Terms(char*n,char*tel,charar,char*eadr,Terms*nxt);
Terms*InsertAfter(char*n,char*tel,charar,char*eadr);//完成在后边插入
private:
Addressterm;//记录数据
Terms*link;//指向下一节点
friendclassAddrBook;
};
Terms:
:
Terms(char*n,char*tel,charar,char*eadr):
term(n,tel,ar,eadr)
{
link=NULL;
}
Terms:
:
Terms(char*n,char*tel,charar,char*eadr,Terms*nxt):
term(n,tel,ar,eadr)
{
link=nxt;
}
Terms*Terms:
:
InsertAfter(char*n,char*tel,charar,char*eadr)
{
link=newTerms(n,tel,ar,eadr,link);//循环链表
returnlink;
}
//定义通讯录类——用三个代表头节点的循环链表分别存放三类数据
classAddrBook
{
public:
AddrBook();
boolDelete();//删除指定名字的通讯录
boolEdit();//编辑指定名字的通讯录
boolDial();//拨指定名字的人的电话
boolcomeshow();
voidsave();
private:
Terms*ab[3];
Terms**Search(char*nam);//在通讯录里查找指定名字的记录,返回指向该记录的指针的地址
Terms**show(char*come);
boolInsert();//插入记录
voidOutput()const;//输出指定的一类记录
boolDelete(char*nam);
boolEdit(char*nam);
boolDial(char*nam);
boolcomeshow(char*come);
friendostream&operator<<(ostream&out,constAddrBook&r);//重载输出
friendistream&operator>>(istream&in,AddrBook&r);//重载输入
};
AddrBook:
:
AddrBook()
{
for(inti=0;i<3;i++){
ab[i]=newTerms("\0","\0",NULL,"\0");//初始化表头节点
ab[i]->link=ab[i];//循环链表
}
}
boolAddrBook:
:
comesh