《数据结构》中典型算法的动态演示毕业设计论文Word格式文档下载.docx
《《数据结构》中典型算法的动态演示毕业设计论文Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《《数据结构》中典型算法的动态演示毕业设计论文Word格式文档下载.docx(45页珍藏版)》请在冰豆网上搜索。
operationalgorithms,thus
itseemsveryabstractandabstruse.Intheteachingprocess,however,ifit
beperformedthroughcomputer-aidedinstruction,itmay
improvetheteachingeffect,thereforecompilingsuchprocedurescannotonlybehelpfultothestudyofconstructionofdata,butalsogreatlystrengthenthestudent'
sstudyinterest,sharpenthestudent'
sprogrammingability.Thisisbecause,ontheonehand,algorithmdemonstrationsystem'
svividnessanddirect-viewing,makethecontentinorderland
visual,reducetheknowledgeitselfdifficultydegree;
Ontheotherhand,interestandtheinteractionasaresultofthedemonstrationsystem,
areadvantageoustostimulatethestudents’strongstudyinterest,causethemtobewillingto
study.
ThissystemtakesQinghuaUniversitypublishinghousepublicationClanguageversion"
Constructionofdata"
asamainsource,reasonablychoosesfourclassicalalgorithmsintheconstructionofdataandcarriesoninthesystemorganicallycombinations,formstheoptimizeddynamicdemonstrationsystem.Itmayadaptthereaders’differentdemandstothealgorithmdata-inandcontrolmodestheprocessexecution,anddemonstratesinthealgorithmimplementationonthecomputerscreenthedatalogicalorganizationeitherthememorystructurechangeconditionorthestackchangeconditionintherecursionalgorithmimplementation.
Visualizationdemonstrationsystemshouldbeavailable.ThesystemusedCprogramminglanguagegraphicssoftwaretechnologytoachievethevisualization.Cprogramminglanguageforgraphicsis
unfamiliar
tous,
orweevenmisleadC
notfor
graphicsprogramming.Throughthedesignofthissystem,weknowCprogramminglanguagecanbegraphic,andcancarryoutvisibledesign.
Keywords:
Datastructures;
Dynamicdemonstration;
Graphprogramming;
Visible
前言
学习编写计算机程序设计仅仅了解计算机语言是不够的,还必须掌握数据组织、存储和运算的一般方法,这些都是数据结构研究的内容,也是我们进行计算机程序设计的重要基础。
由于数据结构的原理和算法比较抽象,因此要理解和掌握其中的原理就比较困难。
本文通过对几个经典算法的研究,并进行动态演示,使得能更好地了解算法的来龙去脉,更好地理解算法,抓住算法的本质,因而更好地学习数据结构这门课程。
本文的目的是将抽象算法转为形象的演示。
本文从软件工程的角度出发,严格按照软件开发的基本步骤,开发了一个数据结构中几个典型算法的可视化演示系统,并给出了C语言实现各功能模块的思想及相关核心代码,充分体现了C语言知识的综合运用,特别是平时大家接触较少的图形编程。
由于编程水平有限以及时间仓促,故本系统难免有各种各样的不足,希望各位老师和朋友提出意见,在此衷心感谢!
1绪论
1.1问题背景
数据结构是一门比较难学的课程,在教学过程中,如果能加以计算机辅助教学,可以提高教学效果,所以编写这样的程序不仅有助于学习数据结构,同时也大大增强了学生的学习兴趣,提高学生的编程能力。
由于数据结构的原理和算法比较抽象,因此要理解和掌握其中的原理就比较困难。
本系统通过对几个经典的算法进行动态演示,让人能更好地了解算法的来龙去脉,更好地理解算法,抓住算法的本质,从而更好地学习数据结构这门课程。
1.2开发环境
开发环境:
TurboC(V2.0)
运行环境:
Windows98/2000/XP/DOS系列平台
1.3开发工具简介
1.3.1C语言图形程序设计
计算机图形程序设计是程序设计中比较困难而且又吸引人的部分。
为了方便用户设计图形程序,不同版本的C语言编译程序提供了许多图形的库函数。
用户在设计图形程序时,只需要调用相应的库函数即可。
在ANSIC中没有对图形库函数的要求,各版本的C语言编译环境图形库函数都不相同,下面以Turboc2.0的图形库来介绍图形程序设计[2]。
Turboc2.0为用户提供了一个功能很强的图形函数库,又称为Borland图形接口(BGI)。
编写图形程序时用到的一些图形库函数均包括在graphics.lib中。
用到这些函数时,必须把图形头文件graphics.h包含进来[6]。
计算机显示器的显示模式按功能可以分为字符模式和图形模式两大类。
因此要进行图形编程,首先要对图形模式进行初始化。
不同的显示器适配器有不同的图形分辨率。
即使是同一显示器适配器,在不同模式下也有不同分辨率。
因此,在屏幕作图之前,必须根据显示器适配器的种类将显示器设置成为某种图形模式。
在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。
设置屏幕为图形模式,可用下列图形初始化函数:
voidfarinitgraph(intfar*gdriver,intfar*gmode,char*path);
其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。
图形驱动程序由TurboC出版商提供,文件扩展名为.BGI。
根据不同的图形适配器有不同的图形驱动程序。
例如对于EGA、VGA图形适配器的图形驱动程序为EGAVGA.BGI。
有时编程者并不知道所用的图形显示器适配器种类,而且我们为了将编写的程序可以用于不同图形驱动器,增强程序的通用性,我们通常不指定图形显示器适配器种类,而使用TurboC提供了一个自动检测显示器硬件的函数,其调用格式为:
voidfardetectgraph(int*gdriver,*gmode);
例1:
自动进行硬件测试后进行图形初始化[2]
#include"
graphics.h"
main()
{
intgdriver,gmode;
detectgraph(&
gdriver,&
gmode);
/*自动测试硬件*/
printf("
driveris%d,modeis%d\n"
gdriver,gmode);
/*输出结果*/
getch();
initgraph(&
gmode,"
);
/*根据测试结果初始化图形*/
circle(320,240,50);
closegraph();
}
上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置。
其中,closegraph()为退出图形状态的函数,其调用格式为:
voidfarclosegraph(void);
调用该函数后可退出图形状态而进入文本方式,并释放用于保存图形驱动程序和字体的系统内存。
同时TurboC提供了一种更简单的初始化图形的方法,即用gdriver=DETECT语句后再跟initgraph()函数就行了。
比如,上例可改为如例2的情形[2]。
例2:
对例1的修改
main()
intgdriver=DETECT,gmode;
对图形模式进行了初始化后,接下来要进行的工作是对于图形模式的屏幕颜色设置以及如何清屏。
对于图形模式的屏幕颜色设置,分为背景色的设置和前景色的设置。
在Turboc中分别使用以下两个函数:
⏹背景色设置函数:
voidfarsetbkcolor(intcolor);
该函数将使背景按照参数color指定的颜色来进行显示。
⏹前景色设置函数:
voidfarsetcolor(intcolor);
该函数将使前景按照参数color指定的颜色来进行显示。
清除图形屏幕内容使用清屏函数,其调用格式如下
voidfarcleardevice(void);
该函数清除整个屏幕的内容,可以在绘图前调用这个函数进行清屏或者在画新图形时调用该函数清除以前画的图形。
有关颜色设置、清屏函数的使用请看例3的示例[2]。
例3:
清屏函数的使用
stdio.h"
intgdriver,gmode,i,j;
gdriver=DETECT;
/*图形初始化*/
setbkcolor(0);
/*设置图形背景*/
cleardevice();
setcolor
(1);
/*设置不同作图色*/
circle(319,239,20);
/*画圆*/
setbkcolor
(1);
/*设置不同背景色*/
}
另外,TURBOC也提供了几个获得现行颜色设置情况的函数。
⏹intfargetbkcolor(void);
返回现行背景颜色值。
⏹intfargetcolor(void);
返回现行作图颜色值。
⏹intfargetmaxcolor(void);
返回最高可用的颜色值。
接下来介绍一些基本的图形函数:
⏹画点函数:
voidfarputpixel(intx,inty,intcolor);
⏹画线函数:
Turboc提供了一系列画线函数,下面介绍其中最常用的一种:
voidfarline(intx0,inty0,intx1,inty1);
画(x0,y0)到(x1,y1)的直线。
⏹图形填充函数:
voidfarsetfillstyle(intpattern,intcolor);
color的值是当前屏幕图形模式时颜色的有效值。
⏹图形模式下的文本输出函数:
voidfarouttextxy(intx,inty,charfar*textstring);
该函数输出字符串指针textstring所指的文本在规定的(x,y)位置。
其中x和y为象元坐标。
1.3.2图形模式下的汉字显示
在编写一些应用软件时,为了使软件更为通俗浅显、易学易用,具备汉字的用户界面是必不可少的条件。
在文本模式下,只要有汉字操作系统的支持,显示汉字是不成问题的。
只要用printf或cprintf就可以了。
在图形模式下显示汉字就稍稍麻烦些。
我们可以定义一个函数来用于汉字的显示。
这个函数不需要汉字系统的支持,但用到其中的字库文件[2]。
下面我看一个例子是如何实现汉字显示的。
例4:
图形模式下16点阵汉字的显示
voidHZ16(intx0,inty0,intw,intcolor,char*s)
/*横坐标,纵坐标,字间隔,汉字颜色,汉字字符串*/
{
FILE*fp;
registercharbuffer[32];
registercharstr[2];
unsignedlongfpos;
/*fpos为最终偏移动量*/
registerinti,j,k;
fp=fopen("
hzk16"
"
r"
/*打开16*16汉字库*/
while(*s)/*一直到字符串结束为止*/
if(*s<
0)/*汉字输出*/
{str[0]=(*s)-0xa0;
str[1]=*(s+1)-0xa0;
fpos=((str[0]-1)*94+(str[1]-1))*32L;
/*计算汉字在hzk16的偏移量*/
fseek(fp,fpos,SEEK_SET);
/*指针移动到当前位置*/
fread(buffer,32,1,fp);
/*读取一个汉字到数组中*/
for(i=0;
i<
16;
i++)/*16行*/
for(j=0;
j<
2;
j++)/*两个字节*/
for(k=0;
k<
8;
k++)/*8位*/
if(((buffer[i*2+j]>
>
(7-k))&
0x1)!
=NULL)/*是一就画点*/
putpixel(x0+8*j+k,y0+i,color);
s+=2;
/*一个汉字占两个字节,现在将指针移动两个字节*/
x0+=w;
/*显示坐标也按照间隔移动*/
else/*显示非汉字字符*/
settextstyle(0,0,1);
setcolor(color);
str[0]=*s;
str[1]=0;
outtextxy(x0,y0+7,str);
/*显示单个字符*/
x0+=w-7;
/*显示单个字符后的x坐标变化*/
s++;
/*指针移动到下一个字节*/
}
fclose(fp);
/*关闭16*16汉字库*/
}
1.3.3Turboc(V2.0)编译错误信息
为了帮助读者调试程序和分析程序,下面简单介绍程序出错的种类[1]。
Turboc(V2.0)的源程序错误分为三种类型:
致命错误、一般错误和警告。
其中,致命错误通常是内部编译出错;
一般错误指程序的语法错误、磁盘或内存存取错误或命令行错误等;
警告则只是指出一些得怀疑的情况,它并不防止编译的进行。
下面按字母顺序A~Z分别列出致命错误及一般错误信息,英汉对照及处理方法:
(1)致命错误英汉对照及处理方法:
A-B致命错误
Badcallofin-linefunction(内部函数非法调用)
分析与处理:
在使用一个宏定义的内部函数时,没能正确调用。
一个内部函数以两个下划线(__)开始和结束。
Irreducableexpressiontree(不可约表达式树)
这种错误指的是文件行中的表达式太复杂,使得代码生成程序无法为它生成代码。
这种表达式必须避免使用。
Registerallocationfailure(存储器分配失败)
这种错误指的是文件行中的表达式太复杂,代码生成程序无发把它生成代码。
此时应简化这种繁杂的表达式或干脆避免使用它。
(2)一般错误信息英汉照及处理方法详见参考文献[1]
1.4其它相关工具软件
1.4.1Dos屏幕下程序截图工具介绍及Dos抓图技巧
现在的抓图软件基本上都只能在Windows下运行,可有时候我们还需要在纯DOS下(注意:
不是Windows中的DOS模式)进行屏幕抓取工作。
可以通过安装虚拟机来解决这个问题,但是很麻烦,怎么办呢?
下面介绍一个工具Graffix,帮你完成纯DOS下的截图任务。
用Graffix完成抓图操作一般情况下都要分成两个主要步骤:
先将屏幕捕捉AT格式然后用附带的转换工具将ATF格式转换为GIF或者PCX图像格式。
(1)ATF文件的获得
①进入纯DOS后,在命令行后输入“DGFX”并回车,将出现用法提示(图1),可以看到抓取热键是“Ctrl+ALT+空格键”。
从内存卸载此程序的命令是“DGFX/U”。
②运行需要抓图的程序,出现待抓画面后,按下热键,屏幕弹出提示(图2),输入文件名后按F1键可以将画面抓取为ATF格式,如果直接按Enter键,则得到的是TXT文本格式。
(2)将ATF转换为GIF/PCX图像格式
ATF格式的图片不能被Windows下应用程序所识别,因此我们需要将前面抓取到的ATF格式转换为GIF或者PCX格式。
①在DOS提示符后输入“A2B”,回车,输入ATF文件名,之后在屏幕上会显示该ATF文件的内容。
②再次按下热键“CTRL+ALT+空格”,会出现“SAVEINWHICHFORMATGIFORPCX(G/P)”的提示(询问你是将文件保存为GIF还是PCX格式),此时若按下字母G,则通过下面的步骤会将ATF转换为GIF格式;
如按字母“P”则可得到PCX格式。
③输入最终要得到的文件的主文件名并回车。
现在进入软件目录看看,是不是得到所需要的GIF或PCX图像文件了?
若要抓取的程序画面本身是图形模式,则将直接得到GIF或PCX图像格式的文件,从而可以省略转换步骤。
1.4.1拓扑图制作工具亿图V1.6.3
亿图是一款类似Visio的流程图、网络图绘制软件,新颖小巧,功能强大,可以很方便的绘制各种专业的业务流程图,程序流程图,数据流程图,网络拓扑图等。
它在设计时采用全拖曳式操作,最大限度的简化用户的工作量,方便易用;
提供各种图形模板库,方便专业人士的使用;
提供强大的图文混排和所见即所得的图形打印。
2需求分析
2.1问题定义
2.1.1问题分析
本系统要完成的工作是通过对数据结构中经典算法的模拟,经用户输入数据和对数据处理后最终以图形的方式实时显示在屏幕上,从而使得抽象的算法形象化、生动化。
用户通过使用这个动态的演示软件就能很好的理解算法的含义。
2.1.2用户目标
本系统可适应读者对算法的输入数据和过程执行的控制方式的不同需求,在计算机的屏幕上显示算法执行过程中数据的逻辑结构或存储结构的变化状况或递归算法执行过程中栈的变化状况。
整个系统使用键盘操作和菜单驱动方式。
每个菜单项对应一个动作或一个子菜单。
系统一直处于选择菜单项或执行动作状态,直到选择了退出动作为止。
用户的目标也就是该演示系统所希望达到的目的。
2.2系统的功能需求
系统的功能需求也即是本系统要实现的具体内容。
算法演示系统要求能够动态演示《数据结构》中的算法的执行过程。
用户可以自由选择演示的算法,且在执行某一个特定算法操作演示前提示用户输入操作元素及操作方法。
由于时间有限而要演示的算法很多,故这里我以几个经典算法为例子,实现它们的动态演示并掌握这种方法,起到抛砖引玉的作用,希望大家能够不断完善这个系统。
本系统要演示的内容包括四个经典算法:
冒泡排序、汉诺塔的递归算法、单链表建立和二叉树的建立与遍历,由主界面菜单显示。
2.2.1正确表达算法
这是最基本的一项要求,算法演示的目的本来就是让大家更好地学习理解算法,演示只是一种手段,目的是降低知识难度,传递知识,因此首先得保证知识的正确性。
2.2.2功能实用化
为了真正起到深入理解算法的效果,系统使用多种演示手段如单步跟踪和连续执行等多种调用方式来演示算法的执行过程。
为了针对用户的各种需要,演示的速度可以由用户自己调节。
2.2.3具体演示功能
A.冒泡排序算法
选择系统自动产生随机数据和手动输入数据两种方式;
选择自动排序和手动单步排序两种方式;
屏幕上显示算法执行过程并输出所有排序序列。
B.汉诺塔递归算法
任意输入演示的个数;
选择电脑自动演示和手