如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。
2设计的相关专业知识、技术说明
2.1If语句
if语句是指c语言中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
if的返回值为真或假,可以用bool型变量进行存储
2.2函数调用
函数调用的一般形式前面已经说过,在程序中是通过对函数的调用来执行函数体的,其过程与其它语言的子程序调用相似。
C语言中,函数调用的一般形式为:
函数名(实际参数表)对无参函数调用时则无实际参数表。
2.3数组指针
数组指针的定义在C语言中,数组名被当做是一个指针来处理,其指向数组首元素。
亦即被当做指针处理的数组名被成为数组指针。
例如,定义了一个长度为10的一维整型数组num[10],则num为该数组的数组指针。
2.4main函数
要完成一件复杂的功能,我们总是习惯把“大功能”分解为多个“小功能”以实现。
在C程序的世界里,“功能”可称呼为“函数”,因此“函数”其实就是一段实现了某种功能的代码,并且可以供其它代码调用。
一个程序,无论复杂或简单,总体上都是一个“函数”;这个函数就称为“main函数”,也就是“主函数”,在主函数中,根据情况,你可能还需要调用子函数。
2.5outtextxy
在指定位置显示一字符串
2.6冒泡排序
冒泡排序,是指计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2),但是有两个优点:
1.“编程复杂度”很低,很容易写出代码;2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。
不过,一路、二路归并排序、不平衡二叉树排序的速度均比冒泡排序快,且具有稳定性,但速度不及堆排序、快速排序。
冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数。
3完成的步骤和实现效果
3.1main函数
main()
{
inta[N],x;
Init(a,&x);
InitializeGraph();
Put(a,x);
find(a,x,N);
Close();
loadlogo();
exit(0);
}
3.2Init(inta[],int*x)初始化函数
voidInit(inta[],int*x)
{
inti;
srand((unsigned)time(NULL));
for(i=0;ia[i]=rand()%100+1;
Sort(a,N);
for(i=0;iprintf("%d",a[i]);
printf("shuruyaochazhaodeshuju:
\n");
scanf("%d",x);
}
3.3Sort(inta[],intn)函数
voidSort(inta[],intn)
{
inttmp,i,j;
for(i=n-1;i>0;i--)
for(j=0;j
if(a[j]>a[j+1])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
3.4Put(inta[],intn)函数
voidPut(intx[],inty)
{
char*driver,*mode;/*Stringsfordriverandmode*/
inti;
char*num;
MainWindow("erfenchazhaochengxu");
settextjustify(LEFT_TEXT,TOP_TEXT);
driver=getdrivername();
mode=getmodename(GraphMode);/*getcurrentsetting*/
setcolor(GREEN);/*设字体绿色*/
settextstyle(0,0,2);/*设置字体的大小*/
for(i=0;i{
sprintf(num,"%d",x[i]);/*将数字转换成字符串输出*/
outtextxy(20+i*50,150,num);/*输出的每个字符x值相隔60*/
}
sprintf(num,"%d",y);
settextstyle(0,0,4);
drawmat(cha64K,64,180,10,GREEN);
drawmat(zhao64K,64,270,10,GREEN);/*设置字符串FIND的X、Y坐标*/
outtextxy(370,30,num);
for(i=0;i<3;i++)
for(i=0;i<2;i++)
for(i=0;i<3;i++)
for(i=0;i<2;i++)
for(i=0;i<6;i++)
drawmat(an16S+i*32,16,245+i*23,420,WHITE);
3.5画箭头函数
voidMid(intn)
{
setcolor(WHITE);
line(25+n*50,120,25+n*50,80);/*在2点间画一条直线(一个点包含X,Y坐标)*/
line(25+n*50,120,20+n*50,110);
line(25+n*50,120,30+n*50,110);
}
3.6擦除函数
voidClr(inty)
{
setfillstyle(SOLID_FILL,0);/*每次演示的时候先将下面显示的文字去除掉*/
bar(0,y+50,640,y-50);/*这里是矩形的方式*/
}
3.7用二分检索法查找过程
voidfind(inta[],inty,intn)
{
intlow,high,mid,i;
charstr1[5],str2[5];
sprintf(str1,"%d",y);/*把格式化的数据y写入str1字符串*/
low=0;
high=n-1;
setcolor(YELLOW);
settextstyle(0,0,4);
drawmat(cha64K,64,180,10,YELLOW);
drawmat(zhao64K,64,270,10,YELLOW);
outtextxy(370,30,str1);
while(low<=high)
{
Clr(300);
Clr(80);/*这里的三个Clr是为了把屏幕上的箭头和文字删了*/
Clr(230);
drawmat(cha64K,64,180,10,YELLOW);
drawmat(zhao64K,64,270,10,YELLOW);
settextstyle(0,0,4);
outtextxy(370,30,str1);
settextstyle(0,0,3);
mid=(high+low)/2;
Up(high);/*让UP箭头指向相应的高位*/
Down(low);/*让DOWN箭头指向相应的低位*/
Mid(mid);/*让MID箭头指向相应的中间位*/
if(a[mid]==y)break;
if(a[mid]{
low=mid+1;
sprintf(str2,"%d",a[mid]);/*把格式化的数据a[mid]写入str2字符串*/
outtextxy(250,250,str2);
outtextxy(300,250,"<");/*这里的3个outtextxy显示比较数据的情况*/
outtextxy(350,250,str1);
}
else
{
high=mid-1;
sprintf(str2,"%d",a[mid]);/*把格式化的数据a[mid]写入str2字符串*/
outtextxy(250,250,str2);
outtextxy(300,250,">");/*这里的3个outtextxy显示比较数据的情况*/
outtextxy(350,250,str1);
}
sleep(3);/*间隔一秒后执行下一次*/
}
setcolor(11);
if(low<=high)/*显示找到*/
{
drawmat(zhao64K,64,200,350,GREEN);/*outtextxy(250,400,"FIND");*/
drawmat(dao64K,64,310,350,GREEN);
}
else/*显示未找到*/
{
drawmat(wei64K,64,180,350,GREEN);
drawmat(zhao64K,64,270,350,GREEN);/*outtextxy(250,400,"NOTFIND");*/
drawmat(dao64K,64,350,350,GREEN);
}
for(i=0;i<6;i++)
drawmat(an16S+i*32,16,250+i*23,420,WHITE);
}
3.8voidClose()
voidClose()
{
getch();
closegraph();
}
4关键代码及注释
char*Fonts[]={
"DefaultFont","TriplexFont","SmallFont",
"SansSerifFont","GothicFont"
};
char*LineStyles[]={
"SolidLn","DottedLn","CenterLn","DashedLn","UserBitLn"
};
char*FillStyles[]={
"EmptyFill","SolidFill","LineFill","LtSlashFill",
"SlashFill","BkSlashFill","LtBkSlashFill","HatchFill",
"XHatchFill","InterleaveFill","WideDotFill","CloseDotFill"
};
char*TextDirect[]={
"HorizDir","VertDir"
};
char*HorizJust[]={
"LeftText","CenterText","RightText"
};
char*VertJust[]={
"BottomText","CenterText","TopText"
};
structPTS{
intx,y;
};/*Structuretoholdvertexpoints*/
intGraphDriver;
intGraphMode;
intMaxX,MaxY;
intErrorCode;
intMaxColors;
doubleAspectRatio;
structpalettetypepalette;
voidSort(inta[],intn);
voidInit(inta[],int*x);
voidMainWindow(char*header);
voidInitializeGraph(void);
voidPut(intx[],inty);/*输出数值*/
voidDrawBorder(void);
voidchangetextstyle(intfont,intdirection,intcharsize);
voidfind(inta[],intx,intn);
voidMid(intn);
voiddrawmat(char*mat,intmatsize,intx,inty,intcolor);
voiddrawmat(char*mat,intmatsize,intx,inty,intcolor)
/*依次:
字模指针、点阵大小、起始坐标(x,y)、颜色*/
{
inti,j,k,n;
n=(matsize-1)/8+1;
for(j=0;jfor(i=0;ifor(k=0;k<8;k++)
if(mat[j*n+i]&(0x80>>k))/*测试为1的位则显示*/
putpixel(x+i*8+k,y+j,color);
}
voidchangetextstyle(intfont,intdirection,intcharsize)
{
intErrorCode;
graphresult();/*clearerrorcode*/
settextstyle(font,direction,charsize);
ErrorCode=graphresult();/*checkresult*/
if(ErrorCode!
=grOk){/*iferroroccured*/
closegraph();
printf("GraphicsSystemError:
%s\n",grapherrormsg(ErrorCode));
exit
(1);
}
}
voidDrawBorder(void)
{
structviewporttypevp;
setcolor(MaxColors-1);/*Setcurrentcolortowhite*/
setlinestyle(SOLID_LINE,0,NORM_WIDTH);
getviewsettings(&vp);
rectangle(0,0,vp.right-vp.left,vp.bottom-vp.top)
}
voidMainWindow(char*header)
{
intheight;
cleardevice();/*Cleargraphicsscreen*/
setcolor(MaxColors-1);/*Setcurrentcolortowhite*/
setviewport(0,0,MaxX,MaxY,1);/*Openporttofullscreen*/
height=textheight("H");/*Getbasictextheight*/
changetextstyle(DEFAULT_FONT,HORIZ_DIR,1);
settextjustify(CENTER_TEXT,TOP_TEXT);
outtextxy(MaxX/2,2,header);
setviewport(0,height+4,MaxX,MaxY-(height+4),1);
DrawBorder();
setviewport(1,height+5,MaxX-1,MaxY-(height+5),1);
}
5设计总结
在这次课程设计中,我深感压力,因为平时在这方面没有过多的关注,平时学的知识也很有限,在设计过程中也明显的准备不足,遇到了很多难题,但是在与其他同学的合作讨论下有颇有收获,从中我们了解的个人的学识终究是限的,但集体的智慧是无限的,当然我们能取得这样的成绩也来于老师的指导有方,我们能够完成一个程序,从起初的总体设计,进行可行性分析,在进行分工编程,最后进行调式,当然当中很多模块都是借鉴的,但毕竟我们还初在出学阶段,要成为高手还有很长的一段路要走,但通过这次课程设计,我们了解到程序也不想想象中的那么复杂,只要花功夫就会有收获,其实很多知识在课堂上老师都已经讲过,但我们就是缺少了那一份灵动,所以除了要有扎实的基本功外,那一点点小聪明还是必要的。
总之我们倾心投入,大家都很努力,为了能够顺利通过,我们查阅了很多资料,这一周过得很慢,但这一周过的很愉快,相信加上我的情有独钟,今后一定颇有成就!
致谢
在此论文撰写过程中,要特别感谢邱老师的指导与督促,同时感谢他的支持与包容。
没有邱老师的帮助也就没有今天的这篇论文。
求学历程是艰苦的,但又是快乐的。
感谢我的班主任李伟老师,谢谢他在这三年中为我们全班所做的一切,他不求回报,无私奉献的精神很让我感动,再次向他表示由衷的感谢。
在这三年的学期中结识的各位生活和学习上的挚友让我得到了人生最大的一笔财富。
在此,也对他们表示衷心感谢。
谢谢我的父母,没有他们辛勤的付出也就没有我的今天,在这一刻,将最崇高的敬意献给你们!
参考文献
【1】数据结构(C语言版).北京:
清华大学出版社,1997
【2】算法与数据结构——C语言描述.北京:
高等教育出版社,2002
【3】算法与数据结构(C语言版).北京:
机械工业出版社,2004
【4】等.数据结构——用C语言描述.北京:
高等教育出版社,1995
【5】数据结构与算法分析.北京:
机械工业出版社,2004
【6】数据结构——C语言描述.西安:
西安电子科技大学出版社,2002
【7】数据结构教程.北京:
清华大学出版社,2005
【8】数据结构.武汉:
武汉理工大学出版社,2004
【9】数据结构实用教程.北京:
清华大学出版社,2004
【10】数据结构.北京:
清华大学出版社,2005
【11】数据结构(C++版).北京:
清华大学出版社,2005
【12】数据结构(C/C++版).北京:
清华大学出版社,2005
【13】数据结构算法实现及解析.西安:
西安电子科技大学出版社,2004
【14】数据结构.2版.北京:
科学出版社,2004
【15】数据结构典型题解和实战模拟.长沙:
国防科技大学出版社,2003
【16】数据结构复习指导与解题.北京:
清华大学出版社,2005
【17】数据结构学练考.北京:
清华大学出版社,2004
【18】数据结构上机实验与习题解析.北京:
中国电力出版社,2004
【19】数据结构习题与解析.北京:
清华大学出版社,2004
【20】数据结构习题与解析.北京:
科学出版社,2004