通讯录管理系统 数据结构课程设计.docx

上传人:b****5 文档编号:5597384 上传时间:2022-12-28 格式:DOCX 页数:31 大小:567.25KB
下载 相关 举报
通讯录管理系统 数据结构课程设计.docx_第1页
第1页 / 共31页
通讯录管理系统 数据结构课程设计.docx_第2页
第2页 / 共31页
通讯录管理系统 数据结构课程设计.docx_第3页
第3页 / 共31页
通讯录管理系统 数据结构课程设计.docx_第4页
第4页 / 共31页
通讯录管理系统 数据结构课程设计.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

通讯录管理系统 数据结构课程设计.docx

《通讯录管理系统 数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统 数据结构课程设计.docx(31页珍藏版)》请在冰豆网上搜索。

通讯录管理系统 数据结构课程设计.docx

通讯录管理系统数据结构课程设计

数据结构C++课程设计

 

一、设计题目

通讯录管理系统

实现一个通讯录管理系统。

通讯录内容包括姓名及电话、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=head->next;

chartemp[20];

while(p)

{

q=p->next;

while(q)

{

if(strcmp(p->n

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1