C手机通讯录课程设计报告书.docx
《C手机通讯录课程设计报告书.docx》由会员分享,可在线阅读,更多相关《C手机通讯录课程设计报告书.docx(31页珍藏版)》请在冰点文库上搜索。
C手机通讯录课程设计报告书
学号11710115
天津城建大学
高级程序设计语言C++课程设计
设计说明书
通讯录管理系统
起止日期:
2013年12月5日至2013年12月12日
学生姓名
路江飞
班级
11卓越七班
成绩
指导教师(签字)
计算机与信息工程学院
2013年12月12日
天津城建大学
课程设计任务书
2013—2014学年第一学期
计算机与信息工程学院11卓越专业11卓越七班班级
课程设计名称:
高级程序设计语言C++课程设计
设计题目:
通讯录管理系统
完成期限:
自2013年12月5日至2013年12月12日共1周
设计依据、要求及主要内容(可另加附页):
设计依据:
c++程序设计
设计要求:
通过这次课程设计,需要对C++的各个环节知识形成一个有结构的整体,可以熟练的对C++知识进行综合应用,同时达到对已学知识的全面复习。
主要内容:
一、通讯录信息包括:
姓名、地址、手机(支持多个手机)、电子邮箱
二、支持以下功能:
●添加联系人
●按姓名查找并修改或删除联系人
●支持模糊查询
⏹输入姓名中的一个字,显示所有匹配联系人信息
指导教师(签字):
系(教研室)主任(签字):
批准日期:
2013年6月30日
课程设计进度计划表
序号
起止日期
计划完成内容
实际完成情况
检查日期
检查人签名
1
2013-12-5
完成课程设计任务书
2
2013-12-6
初步完成程序设计,调试程序
3
2013-12-7
-2013-12-11
继续修改调试程序以及完善程序设计
4
2013-12-12
课程设计答辩,完成并提交
指导教师批准,并签名:
2013年6月30日
通讯录管理系统
1、设计目的
.通过实验实现对通讯录系统的管理操作;
.进一步掌握和利用C++进行程设计的能力;
.进一步理解和运用结构化程序设计的思想和方法;
.初步掌握开发一个小型实用系统的基本方法;
.学会利用流程图或N-S图表示算法;
.掌握书写程设计开发文档的能力(书写课程设计报告);
2、总体设计
3、详细设计:
3.1、程序具体功能:
1、排序
利用冒泡排序,根据链表中的联系人的姓名进行排序。
主要用于修改联系人,修改的可能是联系人的名字,为保证链表中的联系人是按姓名排序,需要对联系人进行整体排序;添加联系人时,为降低代码的时间复杂度,将联系人插入到合适位置来实现链表的有序。
2、添加联系人
将要插入的联系人的姓名和链表中联系人的姓名依次进行比较,将联系人姓名插入到合适的位置,插入后保存联系人到文件并提示添加成功。
3、查找
从键盘上输入联系人名字中的字(一个或多个),根据输入的字,将通讯录中所有联系人姓名和该字进行匹配,从而输出所有包含该字的联系人的信息。
4、删除
根据要删除的姓名,和链表中的联系人姓名一一比较,找到后提示是否确定将联系人的信息删除,选择确定则删除联系人信息并提示删除成功,否则放弃删除操作。
删除后保存剩下的联系人到文件。
5、修改
将要修改的姓名和链表中的联系人姓名一一比较,找到要修改的联系人后,显示修改的选项,包括修改姓名,修改地址,修改手机号,修改邮箱和修改完毕选项。
修改完毕后对将联系人进行排序,保证链表中的联系人按姓名有序排列,同时保存联系人到文件并提示修改成功。
6、统计
统计联系人的个数。
7、保存
将链表里的联系人保存到文件里。
8、浏览
将保存在文件里的联系人读取出来,带有相应的界面,实现联系人信息的遍历。
3.2、调试分析
调试前先初始化一个链表,链表包含5个联系人记录。
1.调试排序
用冒泡排序法将链表按照姓名进行排序,运行程序,观察链表是否排序成功。
2.添加联系人调试
根据联系人的姓名进行插入,调试包括将联系人添加到开始位置,中间位置和最后位置,添加后将所有联系人信息输出,运行程序,观察是否调试成功。
3.查找调试
输入要查找联系人姓名的一部分,看能不能将所有包含该输入字符串的联系人输出来。
4.删除调试
首先遍历所有联系人信息,分别调试删除开始位置,中间位置,最后位置的联系人,观察是否将联系人正确删除。
5.修改调试
修改调试包括修改姓名、手机号、地址、邮箱的调试以及同时修改多个属性的调试,修改后遍历所有联系人,观察是否修改成功。
如果修改了姓名,还要观察修改后是否进行了相应的排序。
6.统计调试
数一下遍历输出的联系人,观察是否和统计出来的相同。
同时还要测试删除、添加后统计出的数是不是正确的。
7.保存调试
运行程序后,打开保存联系人的文件夹,观察文件的内容是否正确。
8.浏览调试
运行程序,观察是不是文件中的联系人正确读出。
9.界面调试
运行程序,观察界面是否满意,如果不满意,一直调试到满意为止。
10.异常处理调试
运行程序,从键盘上随便输入数据,观察程序是否出现bug。
11.通讯录为空调试
当通讯录为空时,对于执行查询操作、修改操作、删除操作、浏览所有联系人操作、以及查看联系人个数操作,系统均提示“通讯录为空!
”。
4、源程序和运行结果
4.1、源程序
头文件(a.h):
#include
usingnamespacestd;
template
structNode
{
DataTypedata;
Node*next;
};
classPerson
{
public:
charname[10];//姓名
charaddress[15];//地址
stringphone;//手机号码
stringmail;//邮箱
Person()
{}
Person(char*nam,char*addr,stringphone,stringmail)
{
strcpy(name,nam);
strcpy(address,addr);
this->phone=phone;
this->mail=mail;
}
};
template
classTelebook
{
public:
Telebook();//无参构造函数
Telebook(DataTypea[],intn);//有参构造函数
~Telebook(){};//析构函数
voidmain_menu();//主菜单界面
voidset_menu();//修改菜单界面
voiddelete_menu();//修改菜单界面
voidsort();//按姓名进行排序
voidset();//修改记录
voidlenth();//记录的个数
voidadd();//增加记录
voidsearch();//模糊查询
voiddelet();//删除记录
voidprintdata();//遍历记录
voidsave();//保存记录
private:
Node*first;
};
源文件(telebook.cpp):
#include
#include
#include
#include
#include"a.h"
usingnamespacestd;
template
Telebook:
:
Telebook()//无参构造函数
{
first=newNode;
first->next=NULL;
}
template
Telebook:
:
Telebook(DataTypea[],intn)//有参构造函数
{
Node*r,*s;
first=newNode;
r=first;
for(inti=0;i{
s=newNode;
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
template
voidTelebook:
:
main_menu()
{
cout<<"*********************************************************"<cout<<"*欢迎使用手机通讯录*"<cout<<"*********************************************************"<cout<<"*1.显示主菜单*"<cout<<"*2.增加联系人*"<cout<<"*3.删除联系人*"<cout<<"*4.浏览联系人*"<cout<<"*5.修改联系人*"<cout<<"*6.查看联系人的个数*"<cout<<"*7.查询*"<cout<<"*0.退出*"<cout<<"*********************************************************"<}//主菜单
template
voidTelebook:
:
set_menu()
{
cout<<"*************************************"<cout<<"*1.修改姓名*"<cout<<"*2.修改地址*"<cout<<"*3.修改手机号*"<cout<<"*4.修改邮箱*"<cout<<"*0.修改完毕*"<cout<<"*************************************"<}
template
voidTelebook:
:
delete_menu()
{
cout<<"*************************************"<cout<<"*您确定要删除该记录吗?
*"<cout<<"*1.确定*"<cout<<"*2.取消*"<cout<<"*************************************"<}
template
voidTelebook:
:
sort()//排序
{
Node*p=first->next;
Node*q=p->next;//q为p的下一个节点
Node*end=NULL;
while(first->next!
=end)
{
p=first->next;
q=p->next;
while(p->next!
=end)
{
if(strcmp((p->data).name,(q->data).name)>0)
{
DataTypetemp;
temp=p->data;
p->data=q->data;
q->data=temp;
}
p=q;
q=q->next;
}
end=p;//end为每次排序后的尾节点
}
}
template
voidTelebook:
:
set()//修改记录
{
Node*p=first->next;
if(p==NULL)
{
cout<<"通讯录为空!
"<return;
}
intt;
boolflag=true;
charna[10],addr[20];
stringph,ma;
charnam[10];
cout<<"请输入姓名:
";
cin>>nam;
while(p!
=NULL)
{
if(strcmp((p->data).name,nam)==0)
{
set_menu();
while(flag)
{
cout<<"请选择您的操作(0-4):
";
if(cin>>t){}//检验异常
else
{
cout<<"输入错误!
"<cin.sync();//清空流
cin.clear();//清除流错误标记
continue;
}
switch(t)
{
case1:
cout<<"请输入修改后的姓名:
";
cin>>na;
strcpy((p->data).name,na);
break;
case2:
cout<<"请输入修改后的地址:
";
cin>>addr;
strcpy((p->data).address,addr);
break;
case3:
cout<<"请输入修改后的手机号:
";
cin>>ph;
(p->data).phone=ph;
break;
case4:
cout<<"请输入修改后的邮箱:
";
cin>>ma;
(p->data).mail=ma;
break;
case0:
flag=false;
cout<<"修改成功!
"<sort();//修改成功后要排序
return;
default:
cout<<"输入错误!
";
break;
}
}
}
else
p=p->next;
}
if(p==NULL)
cout<<"要修改的联系人不存在"<}
template
voidTelebook:
:
lenth()//查看记录的个数
{
Node*p=first;
intcount=0;
while(p->next!
=NULL)
{
count++;
p=p->next;
}
if(count==0)
cout<<"通讯录为空!
"<else
cout<<"一共有"<"<}
template
voidTelebook:
:
add()//按姓名增加记录
{
Node*s=newNode;
Node*p=first->next;
Node*q=first;//p指向q的前一个对象
DataTypea;
cout<<"请输入姓名:
";
cin>>a.name;
cout<<"请输入地址:
";
cin>>a.address;
cout<<"请输入手机号:
";
cin>>a.phone;
cout<<"请输入邮箱:
";
cin>>a.mail;
if(p==NULL)
{
s->data=a;
first->next=s;
s->next=NULL;
cout<<"添加成功!
"<return;
}
while(p!
=NULL)
{
if(strcmp((p->data).name,a.name)<0)
{
q=p;
p=p->next;
}
else
{
s->data=a;
s->next=p;
q->next=s;
cout<<"添加成功!
"<return;
}
}
if(p==NULL)//处理插在最后一个位置的情况
{
s->data=a;
q->next=s;
s->next=NULL;
cout<<"添加成功!
"<}
}
template
voidTelebook:
:
search()//模糊查询
{
Node*p=first->next;
if(p==NULL)
{
cout<<"通讯录为空!
"<return;
}
stringnam;
boolm=false;
cout<<"请输入查询的姓名:
";
cin>>nam;
cout<<"--------------------------------------------------------------------------"<cout<<"|";
cout<cout<<"--------------------------------------------------------------------------"<while(p!
=NULL)
{
strings=(p->data).name;
string:
:
size_typepos=s.find(nam,0);//查找字符串中某个子串出现的位置
if(pos!
=-1)
{
cout<:
left);
cout<<"|";
cout<data).name<<"|"<data).address<<"|"
<data).phone<<"|"<data).mail<<"|"<cout<<"-------------------------------------------------------------------------"<m=true;
}
p=p->next;
}
if(m==false)
cout<<"未找到任何联系人!
"<}
template
voidTelebook:
:
delet()//删除记录
{
intt=0;
boolflag=true;
Node*p=first->next;
Node*q;
if(p==NULL)
{
cout<<"通讯录为空!
"<return;
}
charnam[10];
cout<<"请输入删除的名字:
";
cin>>nam;
delete_menu();
while(flag)
{
cout<<"请输入选项(1/2):
";
if(cin>>t){}//检验异常
else
{
cout<<"输入错误!
"<cin.sync();//清空流
cin.clear();//清除流错误标记
continue;
}
switch(t)
{
case1:
if(strcmp((p->data).name,nam)==0)
{
first->next=p->next;
cout<<"删除成功!
"<deletep;
return;
}
else
{
while(p!
=NULL)
{
if(strcmp((p->data).name,nam)==0)
{
q->next=p->next;
cout<<"删除成功!
"<deletep;
return;
}
q=p;
p=p->next;
}
}
if(p==NULL)
cout<<"删除的联系人不存在!
"<return;
case2:
return;
default:
cout<<"输入错误!
"<break;
}
}
}
template
voidTelebook:
:
printdata()//浏览记录
{
Node*p=first;
first->next=NULL;
ifstreaminfile("123.txt",ios:
:
in);
if(!
infile)
{
cout<<"联系人浏览失败!
"<return;
}
stringph,ma;
charnam[10],addr[20];
while(infile.good())//判断文件是否被读完
{
infile>>nam>>addr>>ph>>ma;
D