数据结构课程设计 通讯录管理系统.docx
- 文档编号:24751301
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:36
- 大小:571.48KB
数据结构课程设计 通讯录管理系统.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=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计 通讯录管理系统 数据结构 课程设计 通讯录 管理 系统