数据结构课程设计通讯录.docx

上传人:b****5 文档编号:6513923 上传时间:2023-01-07 格式:DOCX 页数:17 大小:99.14KB
下载 相关 举报
数据结构课程设计通讯录.docx_第1页
第1页 / 共17页
数据结构课程设计通讯录.docx_第2页
第2页 / 共17页
数据结构课程设计通讯录.docx_第3页
第3页 / 共17页
数据结构课程设计通讯录.docx_第4页
第4页 / 共17页
数据结构课程设计通讯录.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

数据结构课程设计通讯录.docx

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

数据结构课程设计通讯录.docx

数据结构课程设计通讯录

淮阴工学院

数据结构课程设计报告

选题名称:

通讯录

系(院):

计算机工程学院

专业:

计算机科学与技术

班级:

计算机1091

姓名:

宋可学号:

1091301117

指导教师:

张亚红周海岩

学年学期:

2010~2011学年第1学期

2010年12月30日

设计任务书

课题

名称

通讯录

设计

目的

利用链表以及其他数据结构存储、编辑、删除、添加、显示联系人等等操,从而实现通讯录功能的模拟!

主要可以加深对数据结构尤其是链表,数组结构的认识!

实验

环境

Windows2000以上操作系统

VisualC++6.0以上编译环境

任务

要求

1.查阅资料,完成通讯录数据结构的设计!

2.撰写PPT文件与课程设计报告;

3.参加答辩。

工作进度计划

序号

起止日期

工作内容

1

2010.12.27

理论辅导,搜集资料

2

2010.12.28~2010.12.29

编写代码,上机调试

3

2010.12.30

撰写课程设计报告及ppt

4

2010.12.31

答辩

指导教师:

张亚红周海岩

2010年01月3日

 

目录

1需求分析3

1.1课题要求及思想3

1.2运行环境及开发工具3

2概要设计3

2.1功能结构3

2.2数据结构的设计4

2.3设计的原理5

3详细设计和实现5

3.1总体框架5

3.2各个模块及功能5

3.3算法实现及流程图6

4调试与操作说明15

总结17

致谢18

参考文献19

1需求分析

1.1课题要求及思想

本次课题是建通讯录,它主要包含九个模块,希望建立一个主函数main(),利用它来调用各个函数,比如创建一个通讯录,删除一个人的信息,添加一个人的信息。

1.2运行环境及开发工具

这次课程设计的运行环境为Windows2000以上操作系统和开发MicrosoftVisualC++6.0,下面主要介绍一下MicrosoftVisualC++6.0。

VisualC++(简称VC)是Microsoft公司推出的目前使用极为广泛的Windows平台的C++可视化开发环境。

VisualC++6.0提供的控制台应用程序对学习和掌握标准C++内容非常有利。

“可视”的资源编辑器与MFC类以及应用程序向导,为快速高效地开发出功能强大的Windows应用程序提供了极大的方便。

利用VisualC++6.0进行Internet和数据库及多媒体等多方面的程序开发也很容易。

本课程设计采用了C++。

C++语言是在C语言的基础上发展起来的,不仅继承了C语言的所有特点,而且引入了面向对象的程序设计方法,改进了程序涉及思路,将编程方式进化到面向对象进行程序设计这一新的思维过程。

C++语言代表着对以往语言之精华的发展和提炼,并能很好的与C语言兼容既支持面向对象的程序设计,也支持结构化的程序设计。

它修补了C语言中的一些漏洞,提供更好的类型检查和编译时的分析,提供了异常处理机制,简化了程序的出错处理,利用throw、try和catch关键字,出错处理程序不必与正常的代码紧密结合,提高了程序的可靠性和可读性。

函数重载允许相同的函数名具有不同参数表,系统根据参数的个数和类型匹配相应的函数。

提供了模板机制。

摸板包括类摸板和函数模板两种,它们将数据类型作为参数。

对于具体数据类型,编译器自动生成模板类或模板函数,它提供了源代码复用的一种手段。

2概要设计

2.1功能结构

本次课题是建通讯录,它主要包含九个模块如下:

第一个模块——主函数main()的功能是:

根据选单的选项调用各函数,并完成相应的功能。

第二个模块——Menu()的功能是:

显示英文提示选单。

第三个模块——Quit()的功能是:

退出选单。

第四个模块——Create()的功能是:

创建新的通讯录。

第五个模块——Add()的功能是:

在通讯录的末尾,写入新的信息,并返回选单。

第六个模块——Find()的功能是:

查询某人的信息,如果找到了,则显示该人的信息,如果未找到,则提示通讯录中没有此人的信息,并返回选单。

第七个模块——Alter()的功能是:

修改某人的信息,如果未找到要修改的人,则提示通讯录中没有此人的信息,并返回选单。

第八个模块——Delete()的功能是:

删除某人的信息,如果未找到要删除的人,则提示通讯录中没有此人的信息,并返回选单。

第九个模块——List()的功能是:

显示通讯录中的所有记录。

2.2数据结构的设计

1、数组存储姓名的首字母和联系人链表的头指针!

数组结点:

structaddlist_arrynod

{

charletter;

MyContactsNode*head;

};

2、联系人链表结点:

structMyContactsNode

{

char*name;

enumsex{M,W}personsex;

char*phonenum_m;

char*phonenum_gd;

char*address;

};

2.3设计的原理

这次课程设计运用了单链表和顺序数组以及它的操作,如单链表的删除,插入,搜索,修改等等,因此设计了一个AddList_arry数组类,自定义了数组结点addlist_arrynod结构,包括两个数据域:

一个用来存储姓名的首字母,另一个用来存储联系人单链表的头指针!

自定义联系人链表的结点MyContactsNode结构!

3详细设计和实现

3.1总体框架

 

图3.1总体框架

3.2各个模块及功能

3.21主要模块

(1)主函数main()的功能是:

根据选单的选项调用各函数,并完成相应的功能。

(2)Menu()的功能是:

显示英文提示选单。

(3)Quit()的功能是:

退出选单。

(4)Create()的功能是:

创建新的通讯录。

(5)Add()的功能是:

在通讯录的末尾,写入新的信息,并返回选单。

(6)SearchAndList的功能是:

查询某人的信息,如果找到了,则显示该人的信息,如果未找到,则提示通讯录中没有此人的信息,并返回选单。

(7)AlterByName()的功能是:

根据用户输入的姓名修改该人的信息,如果未找到要修改的人,则提示通讯录中没有此人的信息,并返回选单。

否则显示输入新的联系人信息!

(8)DeleteByName()的功能是:

根据用户输入的姓名,删除该人的信息,如果未找到要删除的人,则提示通讯录中没有此人的信息,并返回选单。

(9)ListAll()的功能是:

显示通讯录中的所有记录。

其中

(2)Menu(),(3)Quit(),(4)Create(),(5)Add()(6)Find()(7)Alter(),(8)Delete(),(9)List()

(1)main()

3.22辅助模块

(1)boolExamine_name(char*name_in);//检测输入的姓名是否正确!

(2)boolExamine_sex(intsexnum);//检测输入的性别是否正确!

(3)boolExamine_phm(char*phm);//检测输入的移动电话号码是否正确!

(4)boolExamine_phgd(char*phgd);//检测输入的固定的电话号码是否正确!

(5)boolExamine_add(char*add);//检测输入的地址是否正确!

3.3算法实现及流程图

(1)Examine_name()函数

boolAddList_arry:

:

Examine_name(char*name_in)

{

chartemp=*name_in;

intcount=0;

while(temp!

='\0')

{

count++;

name_in++;

temp=*name_in;

}

if(count>10)

returnfalse;

else

returntrue;

}

(2)Examine_phgd()函数

boolAddList_arry:

:

Examine_phgd(char*phgd)

{

chartemp_phgd=*phgd;

intcount=0;

while(temp_phgd!

='\0')

{

count++;

if(temp_phgd<'0'||temp_phgd>'9')

returnfalse;

phgd++;

temp_phgd=*phgd;

}

if(count>12)

returnfalse;

else

returntrue;

}

(3)Search()函数

算法实现:

MyContactsNode*AddList_arry:

:

Search(char*nm_q)

{

MyContactsNode*resultnod_search=FindByName(nm_q)->next;while(resultnod_search!

=NULL)//

{

if(strcmp(resultnod_search->name,nm_q)==0)

returnresultnod_search;

resultnod_search=resultnod_search->next;//向后移动一个指针的位置!

}

returnNULL;//没有找到,返回NULL!

}

(4)AlterByName()函数

算法实现:

boolAddList_arry:

:

AlterByName(char*nm_al)

{

MyContactsNode*resultnod_alter=Search(nm_al);//查找相应的结点,没找到则返回NULL!

if(resultnod_alter==NULL)

returnfalse;//输入的要更改的结点未找到!

cout<<"请输入新的信息!

"<

MyContactsNode*resultnod_new=GetUsercontnod();//获得用户输入的新的结点!

if(GetNameFirstLetter(nm_al)==GetNameFirstLetter(resultnod_new->name))

{

resultnod_alter->ReplaceNode(resultnod_new);//替换结点!

returntrue;//更改成功了!

}

else

{

if(DeleteByName(nm_al))

{

MyContactsNode*resultnodofhead_new=FindByName(resultnod_new->name);

if(resultnodofhead_new->InsertHeadRear(resultnod_new))

returntrue;

}

returnfalse;

}

}

(5)DeleteByName()函数

算法实现:

boolAddList_arry:

:

DeleteByName(char*nm_del)

{

MyContactsNode*resultnod_del=Search(nm_del);

MyContactsNode*resultnodhead_del=FindByName(nm_del);

intend=0;//指示没有被删除的!

while(resultnodhead_del!

=NULL&&resultnod_del!

=NULL)

{

if(resultnodhead_del->next==resultnod_del)

{

MyContactsNode*del=resultnod_del;//保存需要删除的结点!

resultnodhead_del->next=resultnod_del->next;//把需要删除的结点的后继结点重新连接上!

deletedel;//释放需要删除的结点!

end=1;//指示有被删除的了!

}

resultnodhead_del=resultnodhead_del->next;//指针后移!

}

if(end==1)

returntrue;

else

returnfalse;

}

(6)ListAll()函数

算法实现:

voidAddList_arry:

:

ListAll()

{

MyContactsNode*temp;//链表结点指针!

for(inti=0;i<26;i++)

{

temp=AddListArry[i].arry_listhead->next;//获得数组中存放的头指针!

while(temp!

=NULL)

{

temp->ListNode();//打印结点的信息!

temp=temp->next;//temp向后移动!

}

//就是因为这一句,才使得输出为空格的!

//cout<

}

(7)main()主函数

算法实现:

ShowMenue_Main();//显示主窗体!

//实例化一个通讯录数组!

AddList_arrymycontactslist;

//下面用户进行选择,并执行对应的操作!

//用户输入的姓名(全称)!

char*nm_case2in=newchar[10];

memset(nm_case2in,0,sizeof(char)*10);

//用户输入得需要删除的姓名!

char*nm_case6del=newchar[10];

memset(nm_case6del,0,sizeof(char)*10);

//供用户选择是否要显示通讯录中的所有的信息的!

intchoice_case3alter=1;//默认情况下是显示所有的结点信息的!

//根据用户输入的姓名确定更改谁的信息!

char*nm_case3alter=newchar[10];

memset(nm_case3alter,0,sizeof(char)*10);

//程序始终在执行着,直到用户输入7为止!

while

(1)

{

//获取用户的编号的函数!

intmenuechoice=GetMenuSelct();

//根据用户的选择执行不同的操作!

switch(menuechoice)

{

case1:

//调用list方法显示所有的联系人的信息!

mycontactslist.ListAll();//显示所有的联系人的信息!

cout<<"信息显示完毕!

"<

ClearP();

break;

//于2010年12月18号早上1:

30测试完成!

case2:

//调用FindByName方法查找联系人的信息,并打印出来!

//nm_case2in=newchar[10];//申请十个字符空间的数组!

cout<<"请输入要查找人的姓名(全名)!

"<

cin>>nm_case2in;//输入要查找的人姓名!

mycontactslist.SearchAndList(nm_case2in);

ClearP();

break;

case3:

//调用Alter函数更改联系人的信息!

并保存到通讯录结构中去!

cout<<"若您已经知道确切的姓名请选择0,否则选择1,以便显示所有联系人功能选择!

"<

cin>>choice_case3alter;

if(choice_case3alter==1)

mycontactslist.ListAll();//显示所有的联系人信息!

cout<<"请输入您选择更改的姓名:

\t";

cin>>nm_case3alter;

if(mycontactslist.AlterByName(nm_case3alter))

cout<<"恭喜您更改成功!

"<

else

cout<<"对不起,您输入的联系人未找到,更改未成功!

请确认姓名是否正确!

"<

ClearP();

break;

case4:

cout<<"----请输入您想添加的联系人的信息!

"<

//调用Add函数添加联系人的信息到通讯录结构中!

mycontactslist.Add();

ClearP();

break;

case5:

ShowMenue_Main();

break;

case6:

//调用delete方法删除指定的结点!

cout<<"请输入要删除的姓名!

(全称)"<

cin>>nm_case6del;//总是忘记了对字符串进行输入!

if(mycontactslist.DeleteByName(nm_case6del))

cout<<"删除成功!

"<

else

cout<<"很抱歉,未删除成功!

"<

ClearP();

break;

case7:

exit(0);

break;

default:

cout<<"您输入的编号有误,请确保在1~7的范围内!

"<

ClearP();

break;

}

}//while循环循环一次!

}//主函数结束!

4调试与操作说明

运行程序,显示如下主菜单:

图4.1主菜单

选择3,查询信息,显示如下:

图4.2查询信息的界面

选择4,修改信息,显示如下:

图4.3修改信息界面

选择5,删除信息,显示如下:

图4.4删除信息界面

总结

这次的课程设计来的正是时候,给自己敲了个警钟,课本上的知识固然重要但是没有实际的动手编程基础,想要编出好的程序来是不可能的!

同时还让我认识到软件开发并不可怕,编写代码也不是高不可攀的,认认真真地把之前的逻辑设计、数据结构设计以及总体的框架搞清楚,并写成文档的形式才是最难得的,这也是程序设计的关键所在!

虽然简单,但还是发现了几个可以完善的地方:

(1)存储结构里本身设计就有问题,对于是二级汉字的姓名无法正确的存储!

(2)删除某个联系人的信息时,当有很多相同名字的我时候无法一起删除,而是只能删除其中最近添加进去的那一个人,这也是不足的地方;(3)在查询的时候,如果要查询的人的名字在通讯录中同时有几个,由于该程序在查询的时候只是利用姓名是否相同来判断的,所以输出的信息就不会很准确,因此我们可以在姓名相同的情况下,再去判断电话号码是否相同,在电话号码又相同的情况下去判断地址是否相同,这样就可以输出正确的信息了。

这些地方都可以进一步完善。

优点之处在于不用把所有的联系人信息结点都放在一个单链表中,而且查询的效率也是比较的高的,还可以通过姓名的首字母进行检索,这是很有突破和符合实际的!

课程设计是一次锻炼我的实际操作的过程。

我想对于每一次课程设计都要认真对待,这对于我的实际操作能力有很大的帮助。

我相信通过以后认真的学习和坚持不懈的实践,我必将获得很大的收获。

 

致谢

这次课程设计之所以能成功的完成,我要感谢淮阴工学院,计算机工程系提供的实践机会,是你们让你们给我一次表现自己,测试自己编程能力,发现自己不足之处的机会。

还要感谢实验室人员提供了良好的实验环境,不仅是提供了课程设计所需要的机器,而且还有空调,让我们在炎热夏季中感到丝丝凉爽。

在实习中我遇到了许多困难,还好有几位老师及时指点我,告诉我哪里出了错误,该怎么去解决错误,不会因为几个问题浪费很多时间,是你们让我不再迷茫,在此我要感谢我的几位指导老师:

张亚红老师,周海岩老师,周礼清老师,真的很感谢你们。

当然还要感谢我的队友,我们遇到困难总是相互讨论,当我快放弃的时候,谢谢你给我支持。

还要感谢我的同学,不管是认不认识的同学,只要在我需要他们的帮助的时候,他们都会伸出他们的双手,帮助我解决难题。

我要感谢你们,我的同学,你们再一次让我认识到朋友的重要性,和团结就是力量的这句话的重要性。

最后我要感谢参考文献的原作者,是你们的帮助,让我能够顺利的完成这一次的实践,要不是你们的辛勤的劳动的成果及时指引了我,让我找到编写程序的方向,我可能再怎么努力,也不可能顺利完成这次实验。

以上所有的人,正是因为有了你们的帮助,我才能够从这次课程设计中学到新的知识,真正的提高了自身的水平,让我的知识得以充实,最后,再次感谢所有在这次课程设计中给予过我帮助和支持的人,谢谢!

参考文献

1殷人昆.《数据结构》.清华大学出版社,2007.6

2郑阿奇,丁有和,郑进.周怡君.《VisualC++实用教程(第3版)》.电子工业出版社,2008.05

3徐孝凯.《数据结构实验》.中央广播电视大学出版社,2001

4郑莉,傅仕星.《C++面向对象程序设计》.清华大学出版社,2003.9

5蔡子经,施伯乐.《数据结构教程》.复旦大学出版社,1984

6揣锦华.《面向对象程序设计与VC++实践》.西安电子科技大学出版社,2006

 

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

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

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

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