数据结构课程设计通讯录Word文件下载.docx
- 文档编号:19527689
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:17
- 大小:99.14KB
数据结构课程设计通讯录Word文件下载.docx
《数据结构课程设计通讯录Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计通讯录Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
工作内容
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()函数
Examine_phgd(char*phgd)
chartemp_phgd=*phgd;
while(temp_phgd!
if(temp_phgd<
'
0'
||temp_phgd>
9'
returnfalse;
phgd++;
temp_phgd=*phgd;
12)
(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->
//向后移动一个指针的位置!
returnNULL;
//没有找到,返回NULL!
(4)AlterByName()函数
算法实现:
AlterByName(char*nm_al)
MyContactsNode*resultnod_alter=Search(nm_al);
//查找相应的结点,没找到则返回NULL!
if(resultnod_alter==NULL)
//输入的要更改的结点未找到!
cout<
<
"
请输入新的信息!
endl;
MyContactsNode*resultnod_new=GetUsercontnod();
//获得用户输入的新的结点!
if(GetNameFirstLetter(nm_al)==GetNameFirstLetter(resultnod_new->
name))
resultnod_alter->
ReplaceNode(resultnod_new);
//替换结点!
//更改成功了!
if(DeleteByName(nm_al))
{
MyContactsNode*resultnodofhead_new=FindByName(resultnod_new->
name);
if(resultnodofhead_new->
InsertHeadRear(resultnod_new))
returntrue;
}
(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->
//把需要删除的结点的后继结点重新连接上!
deletedel;
//释放需要删除的结点!
end=1;
//指示有被删除的了!
resultnodhead_del=resultnodhead_del->
//指针后移!
if(end==1)
(6)ListAll()函数
voidAddList_arry:
ListAll()
MyContactsNode*temp;
//链表结点指针!
for(inti=0;
i<
26;
i++)
temp=AddListArry[i].arry_listhead->
//获得数组中存放的头指针!
while(temp!
temp->
ListNode();
//打印结点的信息!
temp=temp->
//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];
//申请十个字符空间的数组!
请输入要查找人的姓名(全名)!
cin>
>
nm_case2in;
//输入要查找的人姓名!
mycontactslist.SearchAndList(nm_case2in);
case3:
//调用Alter函数更改联系人的信息!
并保存到通讯录结构中去!
若您已经知道确切的姓名请选择0,否则选择1,以便显示所有联系人功能选择!
choice_case3alter;
if(choice_case3alter==1)
mycontactslist.ListAll();
//显示所有的联系人信息!
请输入您选择更改的姓名:
\t"
;
nm_case3alter;
if(mycontactslist.AlterByName(nm_case3alter))
cout<
恭喜您更改成功!
else
对不起,您输入的联系人未找到,更改未成功!
请确认姓名是否正确!
case4:
----请输入您想添加的联系人的信息!
//调用Add函数添加联系人的信息到通讯录结构中!
mycontactslist.Add();
case5:
ShowMenue_Main();
case6:
//调用delete方法删除指定的结点!
请输入要删除的姓名!
(全称)"
nm_case6del;
//总是忘记了对字符串进行输入!
if(mycontactslist.DeleteByName(nm_case6del))
删除成功!
很抱歉,未删除成功!
case7:
exit(0);
default:
您输入的编号有误,请确保在1~7的范围内!
}//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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 通讯录