人人范文网 范文大全

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

发布时间:2020-03-02 00:29:56 来源:范文大全 收藏本文 下载本文 手机版

信息科学与技术学院 程序设计基础课程设计报告

题目名称: 通信管理系统 学生姓名: 学 号: 专业班级: 指导教师:

2016年 12月 31日

目录

1.课程设计题目与要求 ........................1

1.1设计题目 ..........................................1 1.2设计要求 ..........................................1

2.总体设计 ..................................2

2.1 总体功能框架 ......................................2 2.2 数据结构概要设计 ..................................2

3.详细设计 ..................................3

3.1 数据结构详细设计 ..................................3 3.2 系统功能详细设计 .................................10

4.运行结果 .................................16 5.课程设计总结 .............................20

5.1 编程中的问题及解决方法 ...........................20 5.2 小结 .............................................20 5.3 心得体会 .........................................20 5.4 程序设计方法 .....................................20

参考文献 ...................................21

1.课程设计题目与要求

1.1设计题目 通信管理系统 1.2设计要求

用C/C++设计出模拟手机通信录管理系统,实现对手机中的通信录进行管理。

(一)功能要求

(1)查看功能:选择此功能时,列出下列三类选择。

A 办公类 B 个人类 C 商务类 ,当选中某类时,显示出此类所有数据中的姓名和电话号码)

(2)增加功能:能录入新数据(一个结点包括:姓名、电话号码、分类(可选项有:A 办公类 B 个人类 C 商务类)、电子邮件)。例如

杨春 13589664454 商务类 Chuny@126.C++om 当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。

(3)拔号功能:能显示通信录中所有人姓名,当选中某个姓名时,屏幕上模拟打字机的效果依次显示此人电话号码中的各个数字,并伴随相应的拔号声音。

(4)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改 (5)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。

(二)其它要求:

(1) 只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读 (2) 至少采用文本菜单界面(如果能采用图形菜单界面更好) (3) 建议使用结构和链表等数据结构

(4) 学生可自动增加新功能模块(视情况可另外加分)

1 2.总体设计

2.1 总体功能框架

新增联系人查看通信录拨号

功能模块

修改信息删除联系人导入通信录导出通信录

退出系统

图 2-1 总体功能框架图

2.2 数据结构概要设计

本通信管理系统采用的数据结构为线性表中的链表。链表的结构体成员分为数据域和指针域。数据域为联系人(contacts)结构体,成员有联系人姓名(name)、联系人电话号码(teleNum)、联系人类别(claes)、电子邮件(email)四个。

图 2-2 数据结构组成

2 3.详细设计

3.1 数据结构详细设计

结构体名称:contact,LNode,*LinkList typedef struct {

string name; //姓名

string teleNum; //电话号码

int claes; //分类

string email; //电子邮件

}contacts;

typedef struct LNode { contacts data; //数据域

struct LNode* next; //指针域 }LNode,*LinkList;

具体操作:

InitList(&L) 操作结果:初始化链表 具体代码:

int InitList(LinkList &L) { L = new LNode; L->next = NULL; return 0; }

CreateList_H(&L,n) 操作结果:前插法创建一个链表

具体代码:

void CreateList_H(LinkList &L,int n) { LinkList p; for(int i = 0;i

3

cin >> p->data.name; cout > p->data.teleNum; cout > p->data.claes; cout > p->data.email; p->next = L->next; L->next=p; } }

CheckAll(L,c)

操作结果:显示类别为c的联系人姓名和电话号码

具体代码:

void CheckAll(LinkList L,int c)//c是联系人类别 {

LinkList p;

p = L->next;

cout

while(p) //当链表没到尾部时

{

if(p->data.claes==c) //若符合类别则输出联系人姓名和电话号码

{

cout data.name data.teleNum

}

p=p->next;

} } CheckAll(L)

操作结果:显示已有联系人的姓名 具体代码:

void CheckAll(LinkList L) { LinkList p; p=L->next; while(p)

4

{ cout data.name next; } } Search(L, name)

操作结果:找到名为name的联系人位置

具体代码:

LinkList Search(LinkList L,string name) { LinkList p; p=L->next; while(p&&p->data.name!=name) //当链表没到尾部且没找到联系人时 { p=p->next; } return p; }

IfExist(L, c) 操作结果:判断是否存在联系人contacts 具体代码:

char IfExist(LinkList L,contacts c) { LinkList p; p=L->next; while(p&&p->data.name!=c.name) //根据姓名查找是否存在该联系人

{ p=p->next; } if(!p) //若到达链表尾部,则不存在 return \'n\'; if(p->data.teleNum==c.teleNum) //若找到联系人姓名 if(p->data.claes==c.claes) //依次判断电话号码、类别、电子邮件是否相同

if(p->data.email==c.email) return \'y\'; return \'n\'; }

5 Length(L)

操作结果:获取链表的长度 具体代码:

int Length(LinkList L) { int i=0; LinkList p=L->next; while(p) { ++i; p=p->next; } return i; } Add(&L, c)

6 操作结果:把contacts添加到链表中 具体代码:

int Add(LinkList &L,contacts c) { LinkList p,s; if(Length(L)>=MAXSIZE) //判断链表长度是否达到最大值

{ cout data=c; s->next=p->next; p->next=s; return 0; } Dail(L,name)

操作结果:拨打姓名为name的联系人的电话 具体代码:

void Dail(LinkList L,string name) { LinkList p,s; p=L->next; s=Search(L,name); //根据姓名查找联系人所在

//模拟打字机效果,输出联系人电话号码 string tele=s->data.teleNum; for(int i=0;i

cout

PlaySound(\"E:\\670.wav\",NULL,SND_FILENAME|SND_ASYNC); }

ChangeInfo(&L,name) 操作结果:修改姓名为name的联系人的信息

具体代码:

void ChangeInfo(LinkList &L,string name) { LinkList p; p=Search(L,name); //找到联系人的位置所在 cout

//根据选择修改联系人信息 int elec; cin >> elec; switch(elec) {

7 case 1: { cout > newName; p->data.name=newName; break; } case 2: {

cout > newTele; p->data.teleNum=newTele; break; } case 3: {

cout > newCales; p->data.claes=newCales; break; } case 4: {

cout > newEmail; p->data.email=newEmail; break; } } }

Delete(&L,name) 操作结果:删除姓名为name的联系人 具体代码:

void Delete(LinkList &L,string name) { LinkList p=L,s;

8 //找到需删除联系人的前一个位置

while(p->next&&p->next->data.name!=name) { p=p->next; } s=p->next; p->next=s->next; delete s; //删除联系人 } Read(L) 操作结果:从文件中读入信息到链表

具体代码:

void Read(LinkList L) { LinkList p;

//打开文件导入通信录

ifstream fin; fin.open(\"通信录.txt\",ios::in); string s1,s2,s3,s4; fin >> s1 >> s2 >> s3 >> s4;

while(!fin.eof()) //当没有到文件尾时

{

string s5;

contacts c;

fin >> c.name >> c.teleNum >> s5 >> c.email;

if(s5.compare(\"办公类\")==0)

c.claes=1;

if(s5.compare(\"个人类\")==0)

c.claes=2;

if(s5.compare(\"商务类\")==0)

c.claes=3;

Add(L,c); //将联系人c增加到链表中

} fin.close(); }

操作结果:将所有联系人导出到文件里保存 具体代码:

void Write(LinkList L)

9 Write(L) {

endl;

} LinkList p=L->next; int l=Length(L); //打开文件写入通信录

ofstream fout(\"通信录.txt\",ios::out|ios::trunc); fout data.name data.teleNum data.claes) {

case 1:

{

fout

break;

}

case 2:

{

fout

break;

}

case 3:

{

fout

break;

} } fout data.email; if(i

fout next; } fout.close(); 3.2 系统功能详细设计

3.2.1 文件数据读出

10 (1)函数原型: void CreateList_H(LinkList &L,int n) (2)函数功能: 创建链表,给链表增加n个联系人

(3)函数形参: CreateList_H(&L,n),其中L是链表指针,n是增加的联系人的数目

(4)函数算法流程:如图3-1所示

3-1算法流程图1 3.2.2 文件数据读出

(1)函数原型: int Add(LinkList &L,contacts c) (2)函数功能: 单个增加联系人

(3)函数形参: Add(&L, c),其中L是链表指针,c是具体的联系人 (4)函数算法流程:如图3-2所示

11

3-2算法流程图2 3.2.3 文件数据读出

(1)函数原型:void Dail(LinkList L,string name) (2)函数功能: 拨打姓名为name的联系人的电话,在拨打时依次显示此人电话号码中的各个数字,并伴随相应的拔号声音

(3)函数形参: Dail(L, name),其中L为链表指针,name为拨号的联系人的姓名

(4)函数算法流程:如图3-3所示

3-3 算法流程图3 3.2.4 文件数据读出

(1)函数原型: void ChangeInfo(LinkList &L,string name)

12 (2)函数功能: 修改姓名为name的联系人的信息

(3)函数形参: ChangeInfo(&L,name),其中L为链表指针,name为将要修改信息的联系人的姓名

(4)函数算法流程:如图3-4所示

3-4 算法流程图4 3.2.5 文件数据读出

(1)函数原型: void Delete(LinkList &L,string name) (2)函数功能: 从链表中删除姓名为name的联系人

(3)函数形参: Delete(&L,name),其中L为链表指针,name为将要删除的联系人的姓名

(4)函数算3-5所示

13

法流程:如图

3-5 算法流程图5 3.2.6 文件数据读出

(1)函数原型: void Read(LinkList L) (2)函数功能: 将文件中的联系人信息导入通信管理系统中 (3)函数形参:Read(L),其中L为链表指针 (4)函数算法流程:如图3-6所示

3-6 算法流程图6 3.2.7 文件数据读出

(1)函数原型: void Write(LinkList L)

14 (2)函数功能: 将通信管理系统中所有联系人的各项信息有序的导出,保存在文件里

(3)函数形参: Write(L),其中L为链表指针 (4)函数算法流程:如图3-7所示

3-7 算法流程图7

15 4.运行结果

(1)打开系统,显示主菜单界面,如图4-1所示:

图4-1 主菜单界面

(2)输入数字1,进行新增联系人的操作。接着输入1选择批量增加,输入数字2选择单个增加。批量增加如图4-2所示,单个增加如图4-3所示:

图4-2 批量增加联系人

16

图4-3 单个增加联系人

(3)输入数字2,进行查看通信录的操作,然后选择联系人的类别,查看此类中的所有联系人姓名及电话号码,如图4-4所示:

图4-4 按类别查看联系人

(4)输入数字3,进行拨号操作,如图4-5所示:

图4-5 拨号

(5)输入数字4,进行修改信息操作,然后输入将要修改信息的联系人姓名,再选择学要修改的信息项,如图4-6所示:

17

图4-6 修改联系人信息

(6)输入数字5,然后输入将要删除的联系人姓名,进行删除联系人的操作,如图4-7所示:

图4-7 删除联系人

(7)输入数字6,进行导入通信录操作,将文件“通讯录.txt”中的联系人信息导入通讯管理系统,如图4-8所示:

18

图4-8 导入通信录

(8)输入数字7,进行导出通信录操作,如图4-9所示;导出的通信录如图4-10所示:

图4-9 导出通信录

图4-10 已导出通信录列表

(9)输入数字0,退出通信管理系统,如图4-11所示:

图4-11 退出通信管理系统

19 5.课程设计总结

5.1 编程中的问题及解决方法

在本次程序设计过程中,遇到的主要问题是模拟打字机效果输出联系人电话号码以及从导入通信录。

前者是由于对字符串的理解不到位,后来查阅了相关资料后意识到可以将字符串看作字符数组,从而获取单个的字符,然后在每个字符的输出后利用系统的休眠函数Sleep设置停顿,从而达到想要的效果。

后者是因为在导出通信录的时候多输出了一个回车换行符,导致在进行文件读入时多读入一个回车换行符,以至于总是多一个联系人。然后便在导出文件时,不再在末尾输出回车换行符,从而解决了该问题。 5.2 小结

总的来说这次课程设计完成总体较好。首先在已经学习了的数据结构基础上,我很快的想出了具体的设计思路,接着利用课余时间写出了大体的框架。再写出大题框架后随即进行了细节的完善,最后大概用了两天时间进行各项功能的调试。在代码的编写过程中并未产生太大瓶颈,遇到问题在查阅相关资料以及仔细调试后也得到了很好地解决,这是一次能好的体验,也是对自己能力的一次考验。 5.3 心得体会

经过这次课程设计,我对数据结构这门课程有了更深刻的了解,不再仅仅是书本上抽象的代码,还对如和将数据结构应用到具体的实例中有了更好的认识。编程不仅需要对理论知识的理解,更重要的是它实际的应用,只有具体地进行过程序的设计,才能有更深刻的记忆和领会。同时通过查阅资料和读别人的代码,我也学会到一些新的内容和一些巧妙的思想。 5.4 程序设计方法

本程序设计主要采用的方法是利用结构体进行编程,而采用的数据结构是线性表中的链表结构。

20 参考文献

[1] 严蔚敏,吴伟民.数据结构(c语言版)[M].2.北京:清华大学出版社,2016 [2] 陈维新,林小茶.c++面向对象课程设计教程[M].清华大学出版社

21

数据结构课程设计职工管理系统

数据结构课程设计——成绩管理系统

图书管理系统 数据结构 课程设计

数据结构课程设计—西文图书管理系统

通讯录管理系统

通讯录管理系统

通讯录管理系统

数据结构课程设计报告

数据结构课程设计报告

数据结构课程设计报告

通讯录管理系统数据结构课程设计报告
《通讯录管理系统数据结构课程设计报告.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档