电话号码查询系统课设报告Word格式.docx
《电话号码查询系统课设报告Word格式.docx》由会员分享,可在线阅读,更多相关《电话号码查询系统课设报告Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
课程设计完成情况
课程设计动手能力
文字表达
学习态度
规范要求
课程设计论文的质量
指导教师对课程设计的评定意见
综合成绩指导教师签字年月日
学生姓名:
黄浩辉指导老师:
摘要人们在日常生活中经常要查找某个人或某个单位的电话号码,本课程设计将实现一个简单的个人电话号码查询系统,用哈希表方法实现查找,并根据用户输入的信息(例如姓名等)进行快速查询在程序中采用线性探测再散列法解决冲突
关键字程序设计;
哈希表;
线性探测再散列法
1引言…………………………………………………………...........................6
1.1课程设计的背景…………………………………………………………6
1.2课程设计的目的…………………………………………………………6
1.3课程设计的内容…………………………………………………………6
2设计内容…………………………………………………………...................7
2.1问题描述…………………………………………………………………7
2.2思路分析…………………………………………………………………7
2.3算法执行流程……………………………………………………………7
3程序设计…………………………………………………………...................8
3.1程序的结点设计…………………………………………………………8
3.2程序的数据设计..…………………………………………………..........8
3.3程序主要函数说明………………………………………………………9
4程序运行结果…………………………………………………………..........17
5设计体会与总结...............................................................................................21
5.1设计体会…………………………………………………………...........21
5.2总结…………………………………………………………...................21
参考文献………………………………………………………………………...22
附录:
源程序清单…………………………………………………………......23
1引言
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
本课程设计是设计一个电话号码查询系统,并要求采用哈希表方法实现查找,实现分别按电话号码排序和用户排序的功能。
1.1课程设计背景
为更好学习数据结构(C语言版)[1]这一门理论和实践性均较强的基础课程,熟练掌握理论知识的同时更需要加强上机实践。
本课程设计就是要达到理论与实际应用相结合,培养学生的动手能力,在实践理解各种算法,在创作中提升,使同学们能够根据数据对象的特性,学会数据组织的方法。
1.2课程设计的目的
(1)通过实际项目的分析、设计、编码、测试等工作,体会数据结构在软件工程中的重要作用,并初步学会用C语言(或VC++、VB、JAVA等程序设计语言)开发和维护软件的基本方法。
掌握算法的编写方法。
(2)按要求撰写课程设计报告书,并能正确编写分析、设计、编码、测试等技术文档。
掌握类C语言的算法转换成C程序并上机调试的基本方法。
1.3课程设计的内容
该课程设计的内容是设计一个电话号码查询系统。
用户根据提示可以建立并在外存上,用文件保存电话号码信息;
在内存中,设计数据结构存储电话号码信息;
还提供查询功能,如根据姓名或编号实现快速查询;
同时也提供其他维护功能,例如插人、删除、修改等。
2设计内容
2.1问题描述
设计一个电话号码查询系统,要求采用哈希表方法实现查找,实现分别按电话号码排序和用户排序的功能。
2.2思路分析
(1)在外存上,用文件保存电话号码信息;
(2)在内存中,设计数据结构存储电话号码信息;
(3)提供查询功能:
根据姓名或编号实现快速查询;
(4)提供其他维护功能,例如插人、删除、修改等。
2.3算法执行流程
该部分给出了算法执行的流程,如图2-1所示。
图2-1算法流程图
3程序设计
3.1程序的结点设计
现假设链表结点仅含有一个数据域和一个指针域。
数据域是为了描述通讯者的相关信息,定义通讯者的结点类型:
typedefstruct{
charnum[10];
//编号
charname[15];
//姓名
charphone[11];
//电话号码
}dataType;
因此,,线性表的链式存储结构定义如下:
typedefstructnode{//结点类型定义
dataTypedata;
//结点的数据域
structnode*next;
//结点指针域
}listnode,*linklist;
linklisthead;
//定义指向单链表的头指针
listnode*p;
//定义一个指向结点的指针变量
3.2程序的数据设计
该系统用下面六个功能模块编写,每个模块执行不同的功能,体现了模块化设计的思想。
下面六个模块都是利用C语言文件,向文件中追加数据、修改数据、查询数据和删除数据。
建立:
可以建立通讯录记录,利用C语言文件,向文件中按顺序输入编号、姓名、电话号码,这里实际上是要求建立一个带头结点的单链表。
添加:
可以添加通信录记录,向链表中继续增加结点,但只是输入到内存中,如果要输入到文件中还得调用保存函数。
输出:
也是用通过循环依次输出文件中的数据,即输出所有通讯录里的记录。
删除:
输入你要删除的人的姓名或编号后,系统会自动删除他的记录,在删除通过switch语句满足提示你确认删除的功能,只有等你确认删除后才会删除。
查询:
为了满足用户的实际需求,设计了两种查询方式,可以用姓名、编号两种方式查找通讯录记录。
这里用到strcmp()函数,通过比较字符串是否相同来判别是否找到相关信息,找到后,就把文件中的数据赋给对应的变量,再把变量所带的值输出到屏幕上。
修改:
当你选择修改功能后,系统会在修改函数中调用查询函数来找到需要修改的记录,然后返回该记录的结点。
再通过printf语句来显示他的记录,再通过修改查询函数返回的结点来修改所需要修改的记录。
保存:
用到fclose()函数,每次操作成功后会自动保存到指定的文件中。
3.3程序主要函数说明
主函数和菜单选择函数部分
这是主函数和菜单选择函数程序部分,这部分是通过一个无限循环来执行上述所有的功能模块,(用for和switch语句解决),如果用户要退出的话,只需选择“0”就可以成功退出并且自动将数据保存到指定的文件中。
输入变量为n,它作为menu_selet函数的返回值提供给switch语句。
使用for循环实现重复选择,并在主函数中实现。
实际使用时,只有选择0—7才会有用,对于不符合要求的输入,提示输入错并要求重新输入。
intmain(){
for(;
;
){
switch(menu_select()){
case1:
printf("
\t\t\t建立\n\n"
);
head=createlist();
break;
case2:
\t\t\t添加\n\n"
编号姓名电话号码地址\n"
p=(linklist)malloc(sizeof(listnode));
scanf("
%s%s%s%s"
p->
data.num,p->
data.name,p->
data.phone,p->
data.address);
insertnode(head,p);
case3:
\t\t\t查询\n\n"
p=listfind(head);
if(p!
=NULL){
printf("
%s%s%s%s\n"
p->
data.name,p->
data.phone,p->
data.address);
}
else
没有查询到!
\n"
case4:
modify(head);
修改成功!
请保存!
case5:
\t\t\t删除\n\n"
delnode(head);
case6:
\t\t\t输出\n\n"
printlist(head);
case7:
save(head);
保存成功!
system("
pause"
case0:
\t\t\t谢谢你的使用~~~\n\n"
return0;
}
}
return0;
}
intmenu_select(){
intn;
printf("
\t\t\t个人电话号码查询系统\n"
printf("
\t\t\t<
----请选择---->
----1建立---->
----2添加---->
----3查询---->
----4修改---->
----5删除---->
----6输出---->
----7保存---->
----0退出---->
for(;
){
scanf("
%d"
&
n);
if(n<
0||n>
7)
printf("
输入错误,请重选:
"
elsebreak;
returnn;
建立函数
在这个函数里,首先看文件是否存在,如果存在,就把信息从外存调到内存中来,如果不存在,就会提示不存在记录文件,请自己输入。
要建立链表,首先要生成结点,在这里用的是尾插法建立链表,这里没有用排序功能,自己输入信息时得按编码从小到大输入。
linklistcreatelist(){//建立
if((fp=fopen(dir_name,"
r"
))!
=NULL){//打开文件
linklisthead=(linklist)malloc(sizeof(listnode));
//动态建立空间。
listnode*p,*rear;
rear=head;
chara[30],b[30],c[30],d[20];
fscanf(fp,"
%s%s%s%s\n"
a,b,c,d);
//读取"
编号姓名电话号码"
这几个汉字
while(!
feof(fp)){//检测文件是否结束不是则继续循环,是则退出
fscanf(fp,"
p->
data.num,p->
data.name,p->
data.phone,p->
data.address);
//读入信息进文档
rear->
next=p;
rear=p;
rear->
next=NULL;
fclose(fp);
printf("
成功读取文件记录!
returnhead;
else{
不存在记录文件,请自己输入:
);
//linklisthead=newlistnode;
linklisthead=(linklist)malloc(sizeof(listnode));
listnode*p,*rear;
intflag=0;
//定义一个变量来判断j是否循环
rear=head;
while(flag==0){
p=(linklist)malloc(sizeof(listnode));
data.address);
next=p;
//插入信息
rear=p;
按1结束建表,按0继续建表。
结束建表吗?
(1/0):
flag);
添加函数
把要添加的信息输入到一个结点当中,然后通过排序插入,找到不比插入的数据小的结点,然后插在此结点的前面。
voidinsertnode(linklisthead,listnode*p){//添加函数
listnode*p1,*p2;
p1=head;
p2=p1->
next;
while(p2!
=NULL&
&
strcmp(p2->
data.num)<
0){//排序插入,找到不比插入的数据小的节点。
p1=p2;
p2=p2->
p1->
p->
next=p2;
删除函数和查找函数
用户单选择查找功能,系统会提示你是用编码查找还是用姓名查找。
然后通过循环从链表中寻找此人,过程是这样的,每次从链表中读取数据后,便把数据赋给相应的变量,再用该数据与用户输入字符串比较,如果相同,那就说明已找到该人的数据;
如果不同,那就执行下一个循环,直到找出为止。
系统会显示出该人的所有记录。
如果找不到的话,系统会输出:
“没有查询到!
”并且返回主菜单。
如果选择删除功能,会先调用查找函数找到要查询的结点,然后再删除该结点。
如果没有查到系统会提示没有要删除的人!
listnode*listfind(linklisthead){//查找函数
listnode*p;
charnum[5];
charname[9];
printf("
1.按编号查询\n"
2.按姓名查询\n"
请选择:
p=head->
scanf("
n);
if(n==1){
请输入要查找者的编号:
%s"
num);
while(p&
strcmp(p->
data.num,num)<
0)p=p->
if(p==NULL||strcmp(p->
data.num,num)>
0)p=NULL;
elseif(n==2){
printf("
请输入要查找者的姓名:
name);
strcmp(p->
data.name,name)!
=0)p=p->
returnp;
voiddelnode(linklisthead){//删除
charjx;
listnode*p,*q;
p=listfind(head);
if(p==NULL){
没有查到要删除的人!
return;
真的要删除该人的记录吗?
(y/n):
jx);
if(jx=='
y'
||jx=='
Y'
q=head;
while(q!
q->
next!
=p)q=q->
q->
next=p->
free(p);
已删除!
修改函数
这个和删除模块有点相似,用户使用这个功能的时候,会先调用查询函数,系统会通过循环从链表中寻找此人,该过程和删除模块是一样的,找到后,系统会显示该人的所有记录,这时用户要按秩序输入数据。
用户输入完成后,系统会显示“已修改!
”并且返回主菜。
voidmodify(linklisthead){//修改
p=listfind(head);
\n该人的记录为:
请修改:
4程序的运行结果
通过对源程序进行简单的修改以及调试后,该程序在VC6.0中调试通过,没有错误和警告,运行结果经过检验为正确,以下几图即为该程序运行结果截图:
图4.1程序主界面
图4.2建立信息
图4.3添加信息
图4.4查询信息
图4.5修改信息
图4.6删除信息
图4.7输出所有信息
图4.8保存所有信息
图4.9退出
5设计体会与总结
5.1设计体会
该课题是设计一个电话号码查询系统,该电话号码查询系统能够很好的管理好我们的通讯录记录,也拥有比较完善的功能,但是该系统依旧有漏洞,此程序必须按照系统提示的操作来执行,不然的话就会使程序进入死循环!
并且后面的删除模块所用的方法是用删除结点来删除记录,虽然可以删除,但达不到理想的效果。
在整个系统程序设计的过程中,我可以感受到自己对数据结构有了一定的掌握!
但也有着许多不足之处。
特别是在程序的逻辑部分还存在着严重的不足。
我逐步的了解了程序模块化设计的思想含义。
在整个程序设计的过程中语法的错误还是比较容易检查的,但是对于那些逻辑思维的问题方面的缺陷不易查出,因此常常出现系统提示没有错误但是仍然不能够正常运行,不能够达到理想的状况,即函数在逻辑方面存在错误!
此外编程是一项高精度的工作,所以我们要有规范化,标准化的代码编写习惯,通过这次编程我们深深的感受到对代码的变量命名,代码内注释格式,甚至函数都有明确规定,良好的编写习惯,不但有助于代码的纠错,也有助于不同人员之间的协作。
我们还要有模块化思维能力,模块化思维就是编程任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大的避免重复性的工作。
5.2总结
这次课程设计对我来说是印象十分深刻的,在这次课程设计中,我遇到了不少困难,但是在我的坚持和虚心请教中得到了顺利解决。
在这次课程设计中,我发现理论必须和实践相结合,才能真正学会课程设计。
在这次设计中我参考了不少书籍,从中学到了课程中无法学到的许多东西,对此我感到很兴奋。
原来不断的学习,不断的探索是苦中带着甜,虽然经历不少弯曲,经历了不少挫折,但当程序调试成功后,当运行能达到要求后,我感到十二分的成就感。
在这个设计过程中,不懂的可以虚心学习与同学交流。
态度是成功的试金石。
编程是一件枯燥乏味工作,但是只要认真专研,我们会从中学到很多在课本上学不到或者无法在课堂上掌握的知识,同时也能从中感受到编程的乐趣。
参考文献
[1]陈倩诒,邓红卫.数据结构(C语言版)[M].武汉:
华中科技大学出版社,2013
[2]谭浩强.C语言程序设计(第3版)[M].北京:
清华大学出版社,2005
[3]严蔚敏,吴伟明.数据结构(C语言版)[M].北京:
清华大学出版社,2003
[4]赵文静.数据结构与算法[M].北京:
科学出版社,2005.8:
41-65
源程序清单
#include<
stdio.h>
string.h>
stdlib.h>
ty