通讯录管理系统报告书.docx
《通讯录管理系统报告书.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统报告书.docx(33页珍藏版)》请在冰豆网上搜索。
通讯录管理系统报告书
《C++程序设计》课程设计
通讯录管理系统
学院信息与电气工程学院
专业电子信息工程
年级大一
学号0808140208
班级电子081
姓名蒋明阳
2009年7月
目录
一.设计项目名称
二.课程设计目的
三.需求分析及规格说明
3.1需求分析
3.2详细功能
3.3规格说明
四.概要设计
4.1通讯录管理系统说明图
4.2数据的结构和各模块分析
4.3数据保存方式及格式
4.4实现各模块功能的相应程序
五.详细设计的部分
六.调试分析及心得体会
6.1调试分析
6.2心得体会
七.使用说明
7.1运行环境
7.2系统操作说明
八.全部源代码
一.设计项目名称:
通讯录管理系统
二.课程设计目的:
通过设计一个《通讯录管理系统》,进一步熟悉C++中类的概念、基本知识和技能,类的封装、继承的实现方式。
掌握面向对象程序设计的基本思路和方法,并利用所学的基本知识和技能解决简单的面向对象的程序设计问题。
了解系统开发的需求分析、类层次设计、模块分解、编码测试、模块组装与整体调试的全过程,加深对C++的理解与VisualC++环境的使用:
逐步熟悉程序设计的方法,并养成良好的编程习惯。
三.需求分析及规格说明:
Ø3.1,需求分析:
●3.11设计一个实用的小型学生通讯录管理系统,用文件来存储学生的姓名,电话,QQ号码,邮编,地址等信息,完成对信息的添加,删除,查询,显示所有信息,退出及用双向链表来处理修改等操作.
●3.12详细功能如下:
●A.添加:
系统将提示用户输入新添加学生信息,输入到文件中,学生信息数据包括姓名,电话号码,QQ号,邮编,地址.
●B.删除:
首先由用户输入要删除的学生的姓名或者电话号码,然后调用删除函数,删除该学生的所有相关资料.
●C.显示所有人员信息:
该功能将显示已经保存的所有学生的姓名,电话,QQ号,邮编及地址.
●D.修改:
首先由用户输入要修改的学生姓名或者电话号码,然后系统用修改函数查找,显示该名同学的资料,然后系统提示用户输入需要修改的人员的相关信息.并用双向链表来实现修改功能
●E.查询:
可由用户输入要查找的学生姓名或电话号码,然后系统用查找函数查找,接着系统使用相关文件命令输出所查找的人员的全部信息.
●F.退出系统
关闭通讯录管理系统.
Ø3.2.规格说明:
●3.21:
要有一个菜单,用于选择各项功能:
其中包括:
.a:
添加新联系人;
.b:
删除联系人;
.c:
显示所有人员信息;
.d:
修改人员信息;
.e:
查询联系人;
.f:
关闭通讯录.
●3.22:
采用面向对象的程序设计方法,a,b,c,d,e,这五项菜单都调用一个函数来实现.
四.概要设计:
Ø4.1.通讯录管理系统功能说明图:
Ø4.2.数据的结构及各模块分析:
●4.21:
设计类,对象及基本数据类型:
●4.211创建一个book类,它有五个私有数据成员:
stringname;姓名
stringaddress;家庭地址
stringpersonalnumber;本人联系电话
stringclass;班级
stringuniversity;就读大学名称
stringhomepnumber家庭电话
stringmajor专业
stringpost邮编
包含七个公有成员函数:
功能如下:
charinter_face();首页
voidadd_person();添加联系人
voiddel_person();删除联系人
voidshow_all();显示所有联系人
voidalter();修改信息
voidselect();查询联系人
voidsave_new();保存新增加的联系人
在主函数main()之中,
.bookobj;创建名为obj的对象
●4.212.结构体:
structrecord
{
bookobject;object对象作为结构体record的一个成员
record*prior;定义一个指向前驱的结构体指针
record*next;定义一个指向后继的结构体指针
};
该结构体是在alter()修改函数中用来处理相关信息的修改.
●4.213.字符串变量:
str,record;
字符变量:
choose;
布尔型变量:
flag;
Ø4.3.数据保存方式以及格式:
该通讯录管理系统将把输入的人员信息保存为pbook.txt文本文件,在文件读取时系统将会把该文件中相关信息读出,并在屏幕上显示出相关信息.
Ø4.4.实现各模块功能的相应程序:
●4.41,界面:
inter_face()
{
system("cls");
cout<cout<<"\t\t★★★★★★★★★★★★★★★★★★★★
…..……
fflush(stdin);
returnchoose;
}
●4.42添加联系人:
add_person()
{
cout<…….……
.save_new()
{
ofstreamoutData("pbook.txt",ios:
:
app);
if(!
outData)
……
outData.close();
}
cout<!
!
"<system("pause");
}
●4.43删除联系人
del_person()
{
ofstreamoutData("temp.txt",ios:
:
out);
……
cout<!
!
"<}
system("pause");
}
●4.44显示所有联系人:
show_all()
{
ifstreaminData("pbook.txt",ios:
:
in);
……
cout<<"所有联系人已经全部显示出来!
!
!
"<}
system("pause");
}
●4.45修改信息
alter()
{
ifstreaminData("pbook.txt",ios:
:
in);
……
cout<!
!
"<system("pause");
}
}
●4.46查询联系人
select()
{
ifstreaminData("pbook.txt",ios:
:
in);
……
}
system("pause");
}
五.详细设计的部分:
现将“修改”功能模块详解如下:
voidbook:
:
alter()
{
ifstreaminData("pbook.txt",ios:
:
in);
//打开文件pbook.txt,进行读操作
if(!
inData)//判断文件打开是否成功
{
cout<!
!
"<//如果打开失败,输出“对不起不能打开文件!
!
!
”
system("pause");//屏幕暂停
return;
}
stringsign;//定义字符串变量sign
cout<的姓名或电话号码:
";
cin>>sign;//输入变量sign
fflush(stdin);//清空缓冲区
record*H=newrecord;
//新建结构体指针变量H,并为其分配空间
record*p=H;//使p指针指向指针H
record*q=H;//使q指针也指向指针H
boolflag=true;//定义布尔型变量flag.
while(inData>>p->object.name>>p->object.number>>
p->object.qq>>p->object.post>>p->object.address)
//读取文件中一个人的信息
{
p->next=newrecord;//建立双向链表
p=p->next;
p->prior=q;
q->next=p;
q=p;
}
p->next=NULL;//使p的next成员指向NULL.
inData.close();//关闭pbook.txt文件
p=H;//使指针变量P指向结构指针H的头节点
while(p)//当p不为空时
{
if((p->object.name==sign)||(p->object.number==sign))
//判断输入是否为空.
{
if(flag)
{
cout<"<cout<:
left)<<object.name<<""<<object.class<<""<<object.personalnumber<<""<<object.post<<""<<object.address<<objiet.homepnumber<<object.university<<object.major<//输出要修改的人的信息
flag=false;
}
cout<"<cout<<"姓名:
";
cin>>p->object.name;
fflush(stdin);
cout<<"个人联系方式:
";
cin>>p->object.personalnumber;
fflush(stdin);
cout<<"家庭地址:
";
cin>>p->object.adress;
fflush(stdin);
cout<<"邮编:
";
cin>>p->object.post;
fflush(stdin);
cout<<"家庭电话:
";
cin>>p->object.homepnumber;
fflush(stdin);
cout<<”就读大学”;
cin>>p->object.university;
fflush(stdin);
cout<<”班级”
cin>>p->object.class
fflush(stdin);
cout<<”专业”;
cin>>p->object.major
break;
//根据提示进行修改
}
p=p->next;//使结构体指针p指向该指针的末尾
}
if(flag)
{
cout<!
!
";
cout<system("pause");
return;
}
else
{
ofstreamout("pbook.txt",ios:
:
out);
//打开文件pbook.txt,进行写操作
if(!
out)//判断文件打开是否成功打开
{
cout<!
!
不能打开文件!
!
!
!
"<system("pause");
return;
}
p=H;//使结构体指针p指向被修改的人的记录的首地址.
while(p)//如果p不为空,则执行以下语句
{
out<:
left)<object.name
<<""<object.number
<<""<object.qq
<<""<object.post
<<""<object.address<将修改后的信息保存到原来位置
p=p->next;//使用p指针指向其本身的末尾
}
out.close();//关闭pbook.txt文件
cout<!
!
"<system("pause");//屏幕暂停
}
}
六.调试分析及心得体会:
Ø6.1.调试分析:
●6.11函数:
fflush(stdin);
功用:
stdin是默认的输入流文件,对应输入缓冲区就是清空输入缓冲区,
避免缓冲区内残存读取函数无法取走的内容!
也就是在添加人员信息
(见下程序段)时,如果加入该函数,则输入的信息如:
姓名,电话等,文件调
用该函数时,就可以把缓冲区的内容全部送入文件.
……cout<<"姓名:
";
cin>>name;
fflush(stdin);
cout<<"电话:
";……
●6.22.函数alter();中,用指针来处理双向链表时.相关程序及分析如下:
record*H=newrecord;
//新建一个结构体指针,作用是为了指向要修改的人员的记录
record*p=H;……
//令p结构体指针指向结构体指针H,为了用p来建立双向链表
…p=H;
//再次使用p指向H的头节点,为了在while(){}循环中输出要修改的整
个人员的信息
while(p){}……//依次输出要修改信息,并进行修改.
……………
p=H;//又令p指针指向H指针的头节点,为了将修改后的信息输出到修改
while(p)//前的位置
{
out<:
left)<
cout<!
!
"<
Ø6.2.心得体会:
●6.21,程序的编写应是:
三分编写,七分调试;
●6.22,程序编写之前需求分析,至关重要,将关系这整个项目的成败.
●6.33,一名优秀程序员的成长,需要付出很多很多,编程是每天必做
之事,就像一位程序大师所说:
“Afterthreedays withoutprogramming,
ifebecomesmeaningless. 三日不编程,食肉无味”
●6.34,熟能生巧,这次在用指针处理双向链表时,以前对这块内容并不十分清楚,,这次感觉很吃力,所以在今后的编程之中,尽可能把基本技能练习熟练.
●6.35,做软件最终是满足用户的需求,所以做软件时应一切应以用记为导向.
七.使用说明:
Ø7.1运行环境:
MicrosoftVisualC++6.0
Ø7.2在此,把软件使用过程写出,并对此程序的一些细节和具体的操作方法加以说明,说明如下:
●7.21将软件进行初始化,即在VC++6.0中运行该程序,进入程序主界面,
界面显示的是“一个通讯录系统”,总的操作流程有七个方面:
1,添加新联系人
2,删除联系人
3,显示所有联系人
4,修改信息
5,查询联系人
6,关闭通讯录
7,最后是提示用户选择要使用的功能
●7.22.输入和存取人员信息,选择菜单界面的第1个选择,按Enter键进入此选择界面,根据提示,输入信息相关信息,出现以下界面:
●7.23显示所有人的信息,按“3”,出现以下界面:
●7.24要修改人员信息就按“4”,根据提示输入相关信息:
如下:
●
7.25要查找相关人员信息就按“5”,根据提示输入信息,将出现以下界面
●7.26,要删除相关人员信息,按“2”,根据提示输入信息,将出现以下界面
●
7.27要退出该程序,按“6”.
八.全部源代码:
//C++课程设计---通讯录
#include
#include
#include
#include
#include
usingnamespacestd;
classbook
{
public:
book();
charinter_face();
voidadd_person();
voiddel_person();
voidshow_all();
voidalter();
voidselect();
voidsave_new();
private:
stringname;
stringaddress;
stringhomepnumber;
stringpost;
stringclass;
stringuniversity;
stringpersonalnumber;
classmajor;
};
structrecord
{
bookobject;
record*prior;
record*next;
};
book:
:
book()
{
name="\0";
address="\0";
number="\0";
post="\0";
qq="\0";
}
charbook:
:
inter_face()
{
system("cls");
cout<cout<<"\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★"<<<"\t\t※※"<<<"\t\t※欢迎使用小小通讯录※"<<<"\t\t※※"<<<"\t\t※1.添加新联系人.4.修改信息.※"<<<"\t\t※※"<<<"\t\t※2.删除联系人.5.查询联系人.※"<<<"\t\t※※"<<<"\t\t※3.显示所有联系人.6.关闭通讯录.※"<<<"\t\t※※"<<<"\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★"<<";
charchoose;
cin>>choose;
fflush(stdin);
returnchoose;
}
voidbook:
:
add_person()
{
cout<cout<<"姓名:
";
cin>>p->object.name;
fflush(stdin);
cout<<"个人联系方式:
";
cin>>p->object.personalnumber;
fflush(stdin);
cout<<"家庭地址:
";
cin>>p->object.adress;
fflush(stdin);
cout<<"邮编:
";
cin>>p->object.post;
fflush(stdin);
cout<<"家庭电话:
";
cin>>p->object.homepnumber;
fflush(stdin);
cout<<”就读大学”;
cin>>p->object.university;
fflush(stdin);
cout<<”班级”
cin>>p->object.class
fflush(stdin);
cout<<”专业”;
cin>>p->object.major
save_new();
cout<!
!
"<system("pause");
}
voidbook:
:
save_new()
{
ofstreamoutData("pbook.txt",ios:
:
app);
if(!
outData)
{
cout<!
!
打开文件失败!
!
!
"<system("pause");
return;
}
outData<:
left)<<object.name<<""<<object.class<<""<<object.personalnumber<<""<<object.post<<""<<object.address<<objiet.homepnumber<<object.university<<object.major<outData.close();
}
voidbook:
:
del_person()
{
ofstreamoutData("temp.txt",ios:
:
out);
ifstreaminData("pbook.txt",ios:
:
in);
if(!
outData||!
inData)
{
cout<!
!
找不到文件!
!
!
"<system("pause");
return;
}
stringsign;
cout<";
cin>>sign;
boolf