数据结构课程设计 通讯录管理系统.docx
《数据结构课程设计 通讯录管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计 通讯录管理系统.docx(36页珍藏版)》请在冰豆网上搜索。
数据结构课程设计通讯录管理系统
数据结构C++课程设计
题 目:
通讯录管理系统
学生姓名:
学号:
院 系:
计算机与信息工程学院
专业年级:
信息安全2010级
2012年6月28日
一、设计题目
通讯录管理系统
实现一个通讯录管理系统。
通讯录内容包括姓名及电话、QQ、E_mail四项内容。
系统功能包括实现按姓名升序存放通讯录内容,查询某人信息,并在插入或修改一项新的信息后依然保持有序。
最后将通讯录信息保存到数据文件中。
二、需求分析
1)运行环境(软、硬件环境)
使用语言:
C++
软件环境:
运行软件MicrosoftVisualC++6.0SP6
系统软件Windows7旗舰版
2)输入的形式和输入值的范围
输入姓名和邮箱为字符型,范围为-128~+127
输入电话号码和QQ号为整型,范围为-2147483648~+2147483647
3)输出的形式描述
程序运行后经过屏幕输出
4)功能描述
通讯录内容包括每个人的姓名及电话、QQ、E_mail四项内容;
通讯录中的内容按姓名顺序(升序)存放;
插入一项新的信息或修改一项信息后通讯录任然有序;
查询某人的信息时,如果找到了,则显示该人的信息,如果未找到,则提示
通讯录中没有此人的信息;
修改某人的信息,如果未找到要修改的人,则提示通讯录中没有此人的信
息;
删除某人的信息,如果未找到要删除的人,则提示通讯录中没有此人的信
息;
能显示通讯录中的所有记录;
采用菜单操作。
通讯录的内容保存到数据文件中。
5)测试数据
姓名1:
smj电话1:
123QQ:
123邮箱:
123@
姓名2:
yyf电话2:
456QQ:
456邮箱:
456@
姓名3:
vigoss电话3:
789QQ:
789邮箱:
789@
修改用:
姓名:
cold电话:
1QQ:
1邮箱:
1@
三、概要设计
1)抽象数据类型定义描述
(对各类的成员及成员函数进行抽象描述,参见书或ppt及实验)
1、student类:
成员类型有姓名,电话号码,QQ号及邮箱地址。
2、input函数:
输入:
无
前置条件:
无
功能:
添加联系人信息
输出:
无
3.output函数:
输入:
无
前置条件:
表存在
功能:
用来排序并输出所有联系人的信息
输出:
依次输出联系人信息
后置条件:
表不变
4、友元类AddressBook类:
定义头指针,存放数据key
5、input函数:
输入:
无
前置条件:
无
功能:
录入函数
输出:
无
后置条件:
若添加成功,表中增加一个新元素,并且写入文件
6、find函数:
输入:
无
前置条件:
found函数中有
功能:
子查找函数
输出:
当调用删除、修改操作时,如果找到了,则进入find函数找出该联系人的信息;如果未找到,则提示通讯录中没有此人的信息
7、found函数:
输入:
无
前置条件:
表存在
功能:
查找函数
输出:
当调用查找操作时,如果找到了,则进入find函数找出该联系人的信息;如果未找到,则提示通讯录中没有此人的信息
8、del函数:
输入:
无
前置条件:
表存在
功能:
删除函数
输出:
如果找到了,则删除该联系人信息,如果未找到,则提示通讯录中没有此人的信息
9、show函数:
输入:
无
前置条件:
表存在
功能:
显示函数
输出:
依次输出联系人信息
10、mend函数:
输入:
无
前置条件:
表存在
功能:
修改函数
输出:
如果找到了则显示该联系人信息并修改,如果未找到,则提示通讯录中没有此人的信息
11、save函数
输入:
无
前置条件:
表存在
功能:
保存函数
输出:
将数据保存到数据文件中
12、begin函数:
输入:
无
前置条件:
表存在
功能:
初始化函数
输出:
无
13、clear函数:
输入:
无
前置条件:
表存在
功能:
清空函数
输出:
无
14、mainmenu函数:
输入:
无
前置条件:
表存在
功能:
主选菜单函数
输出:
无
15、main函数:
输入:
无
前置条件:
表存在
功能:
主函数
输出:
无
2)功能模块设计(如主程序模块设计)
1.添加联系人信息模块:
voidAddressBook:
:
input()
2.排序并显示所有联系人信息模块:
voidAddressBook:
:
show()
3.查询联系人信息模块:
voidAddressBook:
:
find()
voidAddressBook:
:
found()
4.查找并修改联系人信息模块:
voidbook:
:
mend()
5.查找并删除联系人信息模块:
voidbook:
:
del()
6.联系人信息写入文件模块:
voidbook:
:
save()
7.主程序模块:
voidmain()
3)模块层次调用关系图
四、详细设计
实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。
类的定义及类中的成员函数:
classstudent
{
protected:
charname[20];
inttel;
intQQ;
charE_mail[20];
public:
student*next;
student(){}
~student(){}
char*getname(){returnname;}
voidinput()
{
cout<<"\t\t\t按提示输入:
"<cout<<"\t\t输入姓名:
";
cin>>name;
cout<<"\t\t输入电话:
";
cin>>tel;
cout<<"\t\t输入QQ:
";
cin>>QQ;
cout<<"\t\t输入E_mail:
";
cin>>E_mail;
}
voidinput(ifstream&is)
{
is>>name>>tel>>QQ>>E_mail;
is.get();
}
voidoutput()
{
cout<<"学生基本信息如下:
"<cout<<"姓名:
"<<<"电话:
"<<<"QQ:
"<<<"e_mail:
"<}
voidoutput(ofstream&os)
{
os<<<<<}
friendclassAddressBook;
};
classAddressBook
{
public:
AddressBook(){head=newstudent;head->next=NULL;key=0;}
~AddressBook(){deletehead;}
voidinput();
voidmend();
voiddel();
intfind(student**p,char*pn="^");
voidfound();
voidshow();
voidcount();
voidsave();
voidbegin();
voidclear();
charmainmenu();
intgetkey(){returnkey;}
voidsetkey(intk){key=k;}
private:
student*head;
intkey;
};
主要模块的伪码算法:
1.添加联系人信息模块:
voidAddressBook:
:
input()
{
student*p,*p2=NULL;
p=head;
intn;
while(p->next)
p=p->next;
while(n)
{
p2=newstudent;
p2->input();
p->next=p2;
p2->next=NULL;
p=p->next;
AddressBook:
:
setkey
(1);
cout<<"\t\t\t按1继续,按0返回:
";
cin>>n;
}
}
2.排序并显示所有联系人信息模块:
voidAddressBook:
:
show()
{
student*p,*q;
p=head->next;
chartemp[20];
while(p)
{
q=p->next;
while(q)
{
if(strcmp(p->name,q->name)==1)
{
strcpy(temp,q->name);
strcpy(q->name,p->name);
strcpy(p->name,temp);
inttemp1;
temp1=q->tel;
q->tel=p->tel;
p->tel=temp1;
inttemp2;
temp2=q->QQ;
q->QQ=p->QQ;
p->QQ=temp2;
chartemp3[20];
strcpy(temp3,q->E_mail);
strcpy(q->E_mail,p->E_mail);
strcpy(p->E_mail,temp3);
q=q->next;
}
elseq=q->next;
}
p=p->next;
}
student*p1;
p1=head->next;
while(p1)
{
p1->output();
p1=p1->next;
}
}
3.查询联系人信息模块:
intAddressBook:
:
find(student**p1,char*pn)
{
student*p;
p=head;
while(p->next)
{
(*p1)=p;
if(!
strcmp((p->next)->getname(),pn))
{
return1;
}
p=p->next;
}
return0;
}
voidAddressBook:
:
found()
{
student*p;
charname[20]="^";
cout<<"\t\t\t输入要查找的姓名:
";
cin>>name;
if(!
find(&p,name))
{
cout<<"\t\t找不到你要查找的内容!
"<return;
}
(p->next)->output();
}
4.查找并修改联系人信息模块:
voidAddressBook:
:
mend()
{
student*p;
charname[20]="^";
cout<<"\t\t\t输入要修改的姓名:
";
cin>>name;
if(!
find(&p,name))
{
cout<<"\t\t找不到你要修改的内容!
"<return;
}
(p->next)->output();
(p->next)->input();
AddressBook:
:
setkey
(1);
}
5.查找并删除联系人信息模块:
voidAddressBook:
:
del()
{
student*p,*p2;
charname;
cout<<"\t\t\t输入要删除的姓名:
";
cin>>name;
if(!
find(&p,&name))
cout<<"\t\t找不到你要删除的内容!
"<(p->next)->output();
p2=p->next;
p->next=p2->next;
deletep2;
AddressBook:
:
setkey
(1);
}
6.联系人信息写入文件模块:
voidAddressBook:
:
save()
{
student*p;
p=head;
ofstreamos("student.txt",ios:
:
out);
if(AddressBook:
:
getkey()==1)
{
while(p->next)
{
(p->next)->output(os);
p=p->next;
}
}
cout<<"\t\t\t文件已保存!
"<AddressBook:
:
setkey(0);
}
7.主程序模块:
voidmain()
{
AddressBookpp;
intk=1;
charn;
pp.begin();
while(k==1)
{
n=pp.mainmenu();
switch(n)
{
case'1':
pp.input();break;
case'2':
pp.show();break;
case'3':
pp.found();break;
case'4':
pp.del();break;
case'5':
pp.mend();break;
case'6':
pp.save();break;
case'0':
if(pp.getkey()==1)
{
cout<<"\t\t\t是否保存?
1:
保存0:
不保存:
";
cin>>k;
if(k==1)
pp.save();
}
pp.clear();
k=0;
break;
}
}
}
五、调试分析
包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经验体会。
在调试过程中发现了很多问题,其中包括在实现升序输出的时候,我想运用冒泡排序的方法。
起初直接将两个类进行交换,但始终实现不了。
经过反复的调试之后,我尝试将类中的“name”、“tel”、“QQ”、“E_mail”分别一次交换,最终实现了升序输出。
我的程序中的输入联系人信息函数时间复杂度为O
(1),平均空间复杂度为0(n/2),输出联系人信息函数时间复杂度由于有冒泡排序法所以为O(n^2),平均空间复杂度为O(n),查询联系人信息函数平均时间复杂度为O(n),查询并修改联系人信息函数平均时间复杂度为O
(1),查询并删除联系人信息函数平均时间复杂度为O
(1)。
调试过程中会有很多的问题,以前遇到问题时我总是显得很茫然不知所措,经过此次课程设计后,我通过逐条错误分析、修改语句,再反复调试,最终达到没有错误顺利运行,从而使我科服了以前的困难,编程和改错能力都有了质的提高。
六用户使用说明
详细列出每一步的操作说明。
1.添加联系人信息:
第一步:
打开程序,进入主界面选择菜单。
第二步:
键盘输入1进入添加联系人程序,按照提示依次输入联系人的姓名、电话、QQ号还有邮箱地址,然后按回车回到主界面选择菜单。
2.查询联系人信息(表中有联系人信息为前提,下同):
第一步:
进入主界面选择菜单。
第二步:
键盘输入3进入查询联系人信息程序,按照提示输入要查询的联系人姓名,按回车,如果找到了则显示该联系人的信息,如果没有找到则显示“查无此人”,然后按回车回到主界面选择菜单。
3.查询并修改联系人信息:
第一步:
进入主界面选择菜单。
第二步:
键盘输入5进入查询并修改联系人信息程序,按照提示输入要查询并修改的联系人姓名,按回车,如果找到了则提示输入修改后的信息,然后按照提示依次输入修改后的姓名、电话、QQ号还有邮箱地址,然后按回车回到主界面选择菜单,如果没找到则提示“找不到你要查找的内容”,然后按回车回到主界面选择菜单。
4.查询并删除联系人信息:
第一步:
进入主界面选择菜单。
第二步:
键盘输入4进入查询并删除联系人信息程序,按照提示输入要查询并修改的联系人姓名,按回车,如果找到了则删除该联系人信息,然后按回车回到主界面选择菜单,如果没找到则提示“找不到你要查找的内容”,然后按回车回到主界面选择菜单。
5.排序并显示所有联系人信息:
第一步:
进入主界面选择菜单。
第二步:
键盘输入2进入排序并显示所有联系人信息程序,然后便会得到按照姓名升序排列以后所有联系人的信息,然后按回车回到主界面选择菜单。
6.保存联系人信息
第一步:
进入主界面选择菜单。
第二步:
键盘输入6进入查询联系人信息程序,按照提示将数据存入“student.txt”文件,输入的内容已保存在此文件内。
7.关闭通讯录:
第一步:
进入主界面选择菜单。
第二步:
键盘输入0则关闭通讯录,再按一下任意一个键则退出程序窗口。
七、测试结果
1.主界面选择菜单:
2.添加新联系人:
3.查询联系人信息:
如果表中有联系人信息:
如果表中有联系人信息但没有匹配的姓名:
4.查询并修改联系人信息:
如果表中有联系人信息且有相匹配的姓名:
如果表中没有联系人信息:
5.查询并删除联系人信息:
如果表中有联系人信息且有相匹配的姓名:
如果表中没有联系人信息:
6.排序并显示所有联系人信息:
7.联系人信息写入文件:
八、附录:
程序设计源代码
#include
#include
#include
#include
#include
#include
usingnamespacestd;
classstudent
{
protected:
charname[20];
inttel;
intQQ;
charE_mail[20];
public:
student*next;
student(){}
~student(){}
char*getname(){returnname;}
voidinput()
{
cout<<"\t\t\t按提示输入:
"<cout<<"\t\t输入姓名:
";
cin>>name;
cout<<"\t\t输入电话:
";
cin>>tel;
cout<<"\t\t输入QQ:
";
cin>>QQ;
cout<<"\t\t输入E_mail:
";
cin>>E_mail;
}
voidinput(ifstream&is)
{
is>>name>>tel>>QQ>>E_mail;
is.get();
}
voidoutput()
{
cout<<"学生基本信息如下:
"<cout<<"姓名:
"<<<"电话:
"<<<"QQ:
"<<<"e_mail:
"<}
voidoutput(ofstream&os)
{
os<<<<<}
friendclassAddressBook;
};
classAddressBook
{
public:
AddressBook(){head=newstudent;head->next=NULL;key=0;}
~AddressBook(){deletehead;}
voidinput();
voidmend();
voiddel();
intfind(student**p,char*pn="^");
voidfound();
voidshow();
voidcount();
voidsave();
voidbegin();
voidclear();
charmainmenu();
intgetkey(){returnkey;}
voidsetkey(intk){key=k;}
private:
student*head;
intkey;
};
//录入函数
voidAddressBook:
:
input()
{
student*p,*p2=NULL;
p=head;
intn;
while(p->next)
p=p->next;
while(n)
{
p2=newstudent;
p2->input();
p->next=p2;
p2->next=NULL;
p=p->next;
AddressBook:
:
setkey
(1);
cout<<"\t\t\t按1继续,按0返回:
";
cin>>n;
}
}
//子查找函数
intAddressBook:
:
find(student**p1,char*pn)
{
student*p;
p=head;
while(p->next)
{
(*p1)=p;
if(!
strcmp(p->next->getname(),pn))
{
return1;
}
p=p->next;
}
return0;
}
//查找函数
voidAddressBook:
:
found()
{
student*p;
charname[20]="^";
cout<<"\t\t\t输入要查找的姓名:
";
cin>>name;
if(!
find(&p,name))
{
cout<<"\t\t找不到你要查找的内容!
"<return;
}
(p->next)->output();
}
//删除函数
voidAddressBook:
:
del()
{
student*p,*p2;
charname[20];
cout<<"\t\t\t输入要删除的姓名:
";
cin>>name;
//cout<if(!
find(&p,name))
{
cout<<"\t\t找不到你要删除的内容!
"<return;
}
(p->next)->output();
p2=p->next;
p->next=p2->next;
deletep2;
AddressBook:
:
setkey
(1);
}
//显示函数
voidAddressBook:
:
show()
{
student*p,*q;
p=