数据结构课程设计通讯录.docx
《数据结构课程设计通讯录.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计通讯录.docx(17页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计通讯录.docx](https://file1.bdocx.com/fileroot1/2023-1/7/9cc81ca7-07a8-47e6-bd31-55acfdd888bb/9cc81ca7-07a8-47e6-bd31-55acfdd888bb1.gif)
数据结构课程设计通讯录
淮阴工学院
数据结构课程设计报告
选题名称:
通讯录
系(院):
计算机工程学院
专业:
计算机科学与技术
班级:
计算机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