课程设计数据结构之 折半查找职工信息管理Word文件下载.docx
《课程设计数据结构之 折半查找职工信息管理Word文件下载.docx》由会员分享,可在线阅读,更多相关《课程设计数据结构之 折半查找职工信息管理Word文件下载.docx(12页珍藏版)》请在冰点文库上搜索。
3概要设计,
3.1设计思路
(1)首先建立主函数main,在main中有三个子函数,输入、排序、查找。
Main函数中用flag作为循环开关变量。
先赋值flag=1,输入要查找的职工号,显示查找结果,当不再继续查找时,flag=0.循环结束。
否则flag=1.
(2)接下来分析第一个子函数---输入函数input-e。
用一个一维数组存储职工号,为整型。
职工的姓名用一个二维数组存储,为字符串。
定义一个变量i用i的循环递增输入职工号和职工姓名。
(3)接着用选择法进行排序,建立子函数sort。
每趟排序从待排记录中找到最大的记录,并与第一个记录进行交换。
这样就完成了从大到小排序,是整个记录成递减序列。
(4)建立一个查找函数search。
功能为对指定的职工号查找出职工的姓名。
用loca作为开关变量,赋值loca=0。
用一个if语句判断待查的职工号与输入的职工姓名是否相符。
若待查找的变量n不在查找范围,则loca=-1.结束。
折半查找算法思想是考察表中中间记录,其关键字与给定的信息相符,则查找成功。
若大于给定值,则在前半部分再实施折半查找;
若小于给定值,则下一步在后半部分查找。
一直到查找成功,或确定关键字与所给信息不存在。
3.2模块划分
本程序包括四个模块:
(1)主程序模块,
voidmain()
{
初始化;
输入职工号和职工姓名;
按职工号从大到小排序;
输入职工号查找职工姓名;
}
(2)输入模块——实现职工号与职工姓名的输入
(3)排序模块——实现将职工号从大到小排序
(4)查找模块——实现输入一个职工号查找该职工的姓名
3.3N-S图
调用input_e函数输入职工的数量
调sort函数进行排序
循环开关变量flag=1
输入要查找的职工号
调search函数进行查找并显示结果
T
不查找了?
F
Flag=0
图3.3实验系统N-S图
4详细设计
4.1数据类型的定义
(1)数组类型
#defineN10
charname[N][8]
(2)整数类型
inti,j,min,temp1,top,bott,loca;
4.2程序分析
此程序分为四个部分:
(1)主函数部分;
(2)输入部分;
(3)选择排序部分;
(4)查找部分。
(1)主函数
{intnum[N],number,flag,c,;
charname[N][8];
/*定义num[]来存储职工号,name[N][8]来存储职工的姓名*/
input_e(num,name);
/*输入职工信息*/
sort(num,name);
/*由大到小排序*/
for(flag=1;
flag;
)
{printf("
\nqingshuruyaochazhaodezhigongming:
"
);
scanf(“%d”,&
number);
/*从键盘输入要查找的职工号*/
search(number,num,name);
/*通过职工号查找职工姓名*/
printf("
shifoujixuchazhao?
y/n!
getchar();
c=getchar();
if(c=='
N'
||c=='
n'
)/*判断是否继续查找*/
flag=0;
}
(2)输入职工号与职工姓名部分(input_e)
voidinput_e(num,name)
intnum[];
charname[N][8];
{inti;
for(i=0;
i<
N;
i++)
{printf("
\nshuruzhigonghao:
"
scanf("
%d"
&
num[i]);
/*输入职工号*/
\nshuruzhigongming:
gets(name[i]);
/*输入职工的姓名*/
(3)选择法排序部分(sort)
voidsort(num,name)
inti,j,max,temp1;
chartemp2[8];
for(i=0;
N-1;
{
max=i;
for(j=i;
j<
j++)
if(num[max]>
num[j])/*选择*/
max=j;
temp1=num[i];
/*排序*/
strcpy(temp2,name[i]);
/*交换*/、
num[i]=num[max];
strcpy(name[i],name[max]);
num[max]=temp1;
strcpy(name[min],temp2);
printf("
\npaixujieguoruxia:
\n"
for(i=N-1;
;
i>
0;
i--)/*由大到小依次输出职工信息*/
\n%5d%10s"
num[i],name[i]);
(4)查找部分(search)
voidsearch(n,num,name)
intn,num[];
{inttop,bott,min,loca;
loca=0;
top=0;
bott=N-1;
if((n<
num[0])||(n>
num[N-1]))/*所要查找的记录不在输入的职工信息范围*/
loca=-1;
/*loca重新赋值*/
while((loca==0)&
&
(top<
=bott))/*条件为真就循环*/
{min=(bott+top)/2;
/*折半查找,取中间值*/
if(n==num[min])/*比较*/
{loca=min;
/*查找成功*/
%dhaozhigongdexingmingshi%s\n"
name[loca]);
/*根据职工号输出职工姓名*/
elseif(n<
num[min])/*向小于min的记录中查找*/
bott=min-1;
else
top=min+1;
if(loca==0||loca==-1)/*所要查找的记录不在输入的职工信息范围*/
%dbuzaibiaozhong.\n"
n);
4.3程序清单
#include"
stdio.h"
{inti;
printf("
getchar();
gets(name[i]);
{max=i;
num[j])
strcpy(name[max],temp2);
i--)
if((n<
num[N-1]))
=bott))
{min=(bott+top)/2;
if(n==num[min])
{loca=min;
%dhaozhigongdexingmingshi:
%s\n"
n,name[loca]);
num[min])
if(loca==0||loca==-1)
%dbuzaibiaozhong.\n"
main()
{
intnum[N],number,flag,c,n;
input_e(num,name);
sort(num,name);
\nqingshuruyaochaozhaodezhigonghao:
search(number,num,name);
flag=0;
5测试分析
测试数据及结果如下:
按照题目所给的职工信息在键盘上进行输入,并得到测试数据。
按从大到小的排序结果:
从结果显示来看,确实是按从大到小排序的。
查找结果也与编程的理论值一样,所以,此程序正确。
6课程设计总结
这次,我选择的题目是折半查找。
通过这个课程设计让我对数据结构的算法有了更深的认识和理解,当然也学到了怎样将已学过的知识融会贯通以便更加灵活地运用这些知识来编写程序。
折半查找这个题目看起来虽然不是很难,在课本里我也有学过。
但在实际自己编写时还是会遇到一些问题。
在遇到问题时,我很高兴能与我的伙伴们一起分析、一起思考,然后一起想办法解决。
所谓三个臭皮匠赛过一个诸葛亮。
当然在这过程中,我们的思路意见可能不同。
但通过交流我们还是达到了一致。
每个人也会有缺点,比如我就有些粗心。
在word排版上总是会有一些失误。
我很感谢我的伙伴们能指出我的缺点,并帮助我。
因此每完成一件事时,都不可必免的会遇到问题。
在这次课程设计,让我懂得了在面对问题出现时,我们应该怎样做怎样解决,才是重要的。
之前冷静地分析问题也是相当重要的。
当然,在课程设计这段时期我们小组成员一起互相帮助一起学习,慢慢地磨合相处。
这些对我以后的学习以及工作、为人处事等都有所帮助。
从中也深刻地体会到了团队合作的重要性。
同时也非常感谢我的辅导老师傅篱老师,感谢老师尽职尽职帮助我们指点我们。
总之,通过这次课程设计,我获益良多。
参考文献
[1]黄同成,黄俊民,董建寅.数据结构[M].北京:
中国电力出版社,2008
[2]董建寅,黄俊民,黄同成.数据结构实验指导与题解[M].北京:
[3]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2002
[4]刘振鹏,张晓莉,郝杰.数据结构[M].北京:
中国铁道出版社,2003