电脑资料第10章_第1页
电脑资料第10章_第2页
电脑资料第10章_第3页
电脑资料第10章_第4页
电脑资料第10章_第5页
已阅读5页,还剩133页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

10.6编程语言10.7选择编程语言10.8小结习题前面的章节介绍了信息、数据的概念。数据是原始事实的数字记录,它本身并没有什么意义,而信息是经过处理后的数据,信息具有实际含义。数据转化为信息的过程就是数据处理,也称其为信息处理。如图10.1所示的是数据处理的基本模型。实际的计算机系统中,数据由键盘、光电阅读器等输入设备进行输入;信息则由显示器、打印机等输出设备进行输出;数据处理则是由计算机程序来进行的,因此,要处理数据,必须编写程序或购买现成的程序。为阐述方便,本章涉及的程序代码均采用VisualBasic编写。图10.1数据处理的基本模型程序是计算机任何动作的驱动力,程序是计算机为完成某一任务所必须执行的一系列指令。没有程序,计算机就像原地待命的士兵,什么也不做。10.1概述

10.1.1计算机程序为了理解程序对于计算机多么重要,举例说明。当孑身一人来到一个陌生的城市,可能首先想到去买一张交通图,以便能按图索骥找到目的地。计算机对于程序的需要正像对于地图的需要,只有这样,才能引导计算机一步步地到达目的地,实现目标。程序中的指令正是人们要求计算机一步步地完成任务的一个个小的命令。从存储的角度来讲,程序是保存在磁盘上的指令序列。比如,用字处理软件编辑处理文档时,首先启动该软件,启动软件就是将该软件包含的主要程序从磁盘调入内存,并执行主要程序中的一部分指令,然后运用另一部分指令来完成文档处理工作。运行一个程序,首先必须将其调入内存,这是由于计算机的CPU无法直接执行磁盘上的程序,如图10.2所示。10.1.2程序是保存在磁盘上的指令序列图10.2将数据调入内存除了少量存在于ROM等存储器中的特殊程序之外,程序大多以文件的形式存在于磁盘等外存储器上,但存在于磁盘上的文件并不都是程序,有的可能是字处理文档文件、图形图像文件、声音和视频多媒体文件等。程序的输出通常也是以文件的形式保存到磁盘上,但它们是数据文件或文档文件,它们是程序的执行结果;程序文件则是指令的集合。程序与其处理结果的关系正像菜谱与做好的菜的关系,做好一道菜之后,还可以按照菜谱再做另一道菜。运行某一程序对一些数据进行处理有了结果之后,还可以再次运行该程序对另一些数据进行处理,得到另一些结果。问题描述指说明一些能用来解决问题的要素。一个表达清晰的问题描述具备以下3个特征:(1)能说明描述问题的任何假设。(2)列出所有的已知条件。(3)具体说明需要解决什么问题。10.2算法

10.2.1问题描述在一个问题的描述中,假设是为了方便设计而假定是正确的陈述。在处理实际问题时,常常需要这样的简化。比如已知一个立方体容器的棱长是5m,求它的容积是多少?如果没有其他已知条件和特别说明,显然,这里应该将实际问题加以简化,假定忽略容器壁的厚度,将求容积问题简化为求体积问题,而且这个假定一般是隐含的。问题描述中的已知条件,就是可以用来解决问题的原始信息,它是解决问题所必需的,也是设计算法的依据,比如,同样是求几何体的容积,容器的形状则是选择体积公式的依据,实际的几何体如果是球体,就应该选用球体公式;而棱长或半径则是求算过程中必须输入的数据。问题描述的第三点是应该说明程序应有的输出是什么。即通过编程解决了什么问题,问题的答案应该就是程序的输出结果。比如,上述问题可以做以下描述,假设:不计容器壁的厚度;已知:容器形状为立方体,棱长5m;求:容器体积;输出:容器的容积数据。算法是解决实际问题的方法,然而实际问题的解决往往会有多种方法,不同的方法也可能得到不同的结果。算法设计就是寻找一种适合的算法,那么什么是适合的算法呢?算法应具有以下特点:(1)有穷性。任何一个算法应该经过有限多个操作步骤得出结果。(2)可行性。有限多个步骤应该在一个合理的范围内。10.2.2算法设计(3)确定性。算法的每一步骤应该有明确的含义。(4)可以定义若干个输入和输出。通俗地讲,设计算法的过程就是解决问题的过程,编写程序的人得先自己知道怎样解决问题,然后才能通过程序来“教”计算机做同样的事情。比如上述问题,必须知道立方体的体积公式,以及在已知棱长的条件下利用该公式求出体积。然后才能把这些写进程序,让计算机求出任一给定棱长的立方体体积。需要提出的是,这里的算法(algorithm)和数学中的计算方法(computationalmethod)是不同的概念。算法可分为两大类:数值运算算法和非数值运算算法。数值运算算法的目的是求数值解,这属于数学中的计算方法讨论的范畴。例如,求方程的根所用的求解公式等,而非数值运算算法相反,通常没有对应的数据模型,而且种类繁多。常见的如各种排序方法、查找方法等。对于同一个问题,也往往有不同的算法。例如,排序就有多种方法,如插入排序法、选择排序法、冒泡排序法、希尔排序法、堆排序法、归并排序法等。查找也有顺序查找、二分法查找、分块查找等。数值运算同样如此,如数值积分运算就有梯形求积法、辛卜生求积法、龙贝格求积法、勒让德-高斯求积法、拉盖尔-高斯求积法、埃尔米特-高斯求积法、切比雪夫求积法等。(1)伪代码法。伪代码法,也称自然语言法,它是用一种比较随便的方法来描述算法,其中可以用英文短句,也可以用编程语句,也可以夹杂一些中文。总之,将算法很随意地表达出来就行。使用伪代码的目的是让设计者把精力集中在算法的表达上,尽可能地把算法正确地表达出来,而不在乎具体的语法细节。当然,这样的代码也只能算是伪代码,因为它是不能被计算机执行的,它需要下一步按照语法细则写成最终的程序,然后才能为计算机所承认。10.2.3算法表达(2)流程图法。流程图描述了计算机程序的输入、处理、输出模型的中间框图,它描述的是计算机如何一步步地去完成指定的任务。流程图虽然不包含所有的程序细节,但它为最终的程序提供了逻辑结构。在绘制好能够正确表达算法的流程图之后,下面编写程序的工作就会很顺畅了。由于绘制流程图比较费时间,有的初学者急功近利,不愿意去绘制流程图,结果在程序的编写中,花费了更多的时间。绘制流程图需要注意两个方面,其一是掌握构成流程图的标准符号,读者可以参考有关的程序设计教程,熟悉各种符号的含义和使用,如图10.3所示列出了几种常用的流程图符号;其二是对要表达的算法的逻辑结构比较清楚。需要说明的是,绘制程序流程图与编程能力是有关的,只有在学习了程序之后,才能更好地学习和使用流程图,而在编写程序之前,可能必须绘制流程图。这个问题有点像“先有蛋还是先有鸡”的问题。而且,许多学科也会碰到类似的问题,它们之间存在着一种相互促进、相互提高的一种互动关系。图10.3常用的流程图符号流程图法与上述的自然语言描述法不仅可以用于算法问题,也可以用于其他方面问题的表达或描述。如图10.4所示的就是一个日常生活中打电话过程的流程图。按照流程图和走向检验一下流程图是否全面考虑了以下几个假设:①假设在你开始打电话时电话坏了。②假设你的朋友在家并接了电话。③假设你朋友的电话占线。④假设你朋友家没有人。⑤假设你的朋友不在家,但是他的家人接了电话。图10.4打电话过程的流程图算法的每一步都必须有明确的含义,绝对不能出现“二义性”,否则计算机将无所适从,很难获得正确结果。计算机无法直接使用人类的语言,这是因为英语等人类语言对于计算机来说,太不明确了。人的大脑具有思维能力,能够直觉地理解句子的含义,而计算机做不到。虽然人工智能方面的专家说,他们的研究工作能使得计算机听懂人类的语言,但至今的研究进展,也仅仅限于孤立的单词,距离理解人类语言实在太远。10.2.4计算机无法处理二义性通过编程,可以让计算机翻译人类的语言,比如让计算机学习下面的句子:Fruitflieslikeanapple.第一句是很普通的一个主谓宾句型,意义是“果蝇喜欢苹果”,当“教会”了计算机“理解”这样的句型,计算机就能翻译出“果蝇喜欢橘子”、“果蝇喜欢香蕉”等。但是对于下面的句子:Timeflieslikeanarrow.计算机根据前面的学习,仍然会把它当作主谓宾句型来对待,结果可能是“时间蝇喜欢箭”,而人们很容易地理解这句话的真正含义:时间飞逝如箭。在数学课上,当写了Num=Num+1这样的式子,那肯定是错误的,任何数不可能等于自身加1。然而,在程序中,数学课中的等号“=”,将被称做赋值号。赋值号“=”的含义是:获取等号右边的所有符号,计算它们的值,并将结果放在等号左边的变量中。10.2.5计数器和累加器一个特别有意义的赋值式子是诸如Num=Num+1这样的式子,事实证明它非常有用。因为它用在循环结构中,能够统计出循环执行的次数。因为每当循环一次,该变量的值就会加1,故把该式子中的变量称为计数器变量。下面的程序清单是一个猜数的游戏程序,其猜数循环结构中使用了计数器变量Tries通过Tries=Tries+1来记录猜了多少次。PrivateSubCommand1_Click()′NumberguessinggameClscompNum=47′Thecomputer′snumberDebug.Print″Iamthinkingofanumber...″Debug.Print″Trytoguessit.″Tries=0DoDebug.Printguess=Val(InputBox(″Whatisyourguess(between1and100)″,″guess″))If(guess<compNum)Then

Debug.Print″Yourguesswastoolow,tryagain.″ElseIf(guess>compNum)Then

Debug.Print″Yourguesswastoohigh,tryagain.″EndIfTries=Tries+1′AddonetothecounterLoopUntil(guess=compNum)Debug.Print″Yougotitinonly″;Tries;″tries!″EndSub累加器类似于计数器,如同样的变量名出现在赋值号的两边。不同的是,累加器通常给变量增加的值不是1,而是一个数,比如要求若干个学生的总分,可以使用Total=Total+Score这样的语句,其中Score逐个输入的某个学生的考分,最后所得的Total记录下来的就是总分。排序算法中一般都用到交换变量的值,也就是对换变量,如图10.5所示,交换的结果是原来变量1中的值现在存储在变量2中,而原来变量2中的值却存储在变量1中。假如使用下列两条语句,将变量Variable1、Variable2分别赋给了具体的值。Variable1=88Variable2=5610.2.6交换变量的值图10.5交换变量的值要对它们进行交换,如果使用下面的语句,那就大错特错了。这是因为第一句将变量Variable2赋给Variable1,用Variable2的值覆盖了原来Variable1的值,这时两个变量的值一样了,第二句已是多余的了。Variable1=Variable2Variable2=Variable1交换变量的值的正确方法是,使用一个中间变量,也称为临时变量,因为一旦交换完成,这个变量也就没有用了。用VisualBasic的语句表示为:Temp=Variable1Variable1=Variable2Variable2=Temp顺序结构,就是计算机按照程序中语句的自然顺序依次执行。第一条语句先执行,接着第二条,……,一直到程序结束。如下面一个VisualBasic程序片段:Debug.Print″Thisisthefirstline.″Debug.Print″Thisisthesecondline.″这两行程序的功能分别是,打印该语句引号中的内容。它的执行情况如图10.6所示。10.3程序结构

10.3.1顺序结构图10.6顺序结构分支结构也称为选择结构,程序执行到选择结构时,必须根据判断的结果做出选择,因此选择结构中的语句只有其中之一被执行,有所选择必定有所放弃。在VisualBasic中,选择结构使用的是If...Then...Else...EndIf语句。举例说明如下:10.3.2分支结构Number=INPUTBOX(″Enteranumberfrom1to10:″)IfNumber>10Then

Debug.Print″Thatnumberisgreaterthan10.″Else

Debug.Print″Thatnumberis10orless.″EndIf分析如图10.7所示的程序流程图,更容易通过上述VisualBasic程序片段来理解分支结构是如何执行的。图10.7分支结构循环结构又称重复控制结构或迭代结构。它可以使计算机反复多次执行同一段程序,直到循环条件不满足时结束。有人认为,计算机最重要的任务就是循环。成千上万次地重复执行某些操作,是计算机最擅长的,而且似乎永远不知疲倦。只有程序中恰当地采用了循环控制结构之后,才可能变得功能强大。10.3.3循环结构在VisualBasic中,循环结构使用的是While...end结构和For...Next结构。同样,举一个简单的BASIC程序片段的例子:ForN=1TO3

Debug.Print″There′snoplacelikehome.″NextNEnd如图10.8所示的程序流程图,描述了上述VisualBasic程序如何执行循环结构的。为了对循环结构有一个更深刻的理解,下面将程序的执行过程详细说明如下:图10.8循环结构如图10.9所示,用一个标有“N框”的矩形框来代表记录循环次数的内存变量,用另一个标有“显示框”的矩形框来代表计算机屏幕,用来显示结果。随着循环一次次地进行,这两个框中的内容也不断改变。①首先,执行语句ForN=1TO3,把N赋值为1。N框中的值为1。②执行语句Debug.Print″There′snoplacelikehome.″。显示框中显示“There′snoplacelikehome.”。图10.9N框和显示框③语句Next使程序的执行回到语句ForN=1TO3。因为这是第二次执行这条语句,所以N的值自动加1,N框中的值由1改为2。④测试N的值是否大于3。这是因为语句ForN=1TO3表示只有当N的值不大于3时,才能继续循环下去。此时,N=2,继续执行。⑤在显示框中再显示“There′snoplacelikehome.”。⑥继续执行,又遇到Next语句,回到For语句。⑦把N框中的值改为3,并判断此时N的值并不大于3,再次进入循环。⑧在显示框中再显示“There′snoplacelikehome.”。⑨继续执行,又遇到Next语句,回到For语句。⑩把N框中的值改为4,并判断此时N的值已大于3,跳出循环,循环结束。⑾执行语句End,程序运行结束。如果程序需要不止一次重复一个循环,比如需要打印乘法口诀表,可以使用嵌套循环。与其他语句一样,循环语句也可以嵌套在另一个循环结构之中。如图10.10(左)所示,显示了一个VisualBasic的二重循环轮廓图,图中的外层循环执行了9次,内层循环在外层循环的每一次完成了一个轮回,即9次,因此内层循环代码总共执行了81次。10.3.4嵌套结构图10.10嵌套循环结构如果要打印乘法口诀表的话,就可以用这个轮廓图所指示的二重循环,它可打印出81个数,如图10.11所示。如果需要的话,可以将多个循环嵌套在一个外层循环之中。在外层循环完成它的第一次循环之前,必须将内部的两个或多个循环都完全执行一个轮回。当外层循环执行第二次的时候,内部每个循环又将做同样的重复,直到外层循环结束。如图10.10(右)所示的循环结构中,每一个内层循环代码块都会执行81次。图10.11打印乘法口诀表在使用嵌套循环时,一个要注意的问题是,Next语句与For语句成对,并且Next总是与离它最近的For匹配。如果程序中内部循环的Next语句在外部循环的Next语句的后面,将会引起语法错误。DimxOut,xInasintegerForxOut=1To9ForxIn=1To9 IfxOut>=xInThen

Debug.Print

xOut*xIn;″″; EndIfNextxIn

Debug.PrintNextxOut所谓子程序,就是将程序分为更小的逻辑组成部分,这样可简化复杂程序的编写,这些组成部分就叫子程序,也有的语言把它称做过程或函数,这里不加以细究,仅认为子程序是程序模块化的一种组织形式。通过它将一项复杂的任务分为若干项子任务,并如此一步步地细分下去,直到面对更小的更具体的任务,而且能够找到解决它的算法。因此,用子程序的思想编程有以下一些优点:10.3.5子程序(1)子程序将程序分为一个个独立的逻辑单位,对每个单位的调试比起一个大的程序要容易得多。(2)一个子程序可以稍做修改或不做修改再被其他程序调用,从而避免了书写重复代码,节省了时间和资源。在VisualBasic中,调用子程序使用GOSUB语句或CALL语句。在被调用的子程序中使用RETURN语句结束子程序,返回调用子程序的语句处继续执行程序。为了帮助读者理解子程序及其调用形式,下列给出一个带有3个子程序的完整的VisualBasic程序,在这个程序中的3个子程序分别完成的任务如下:(1)AskForData子程序要求用户输入10个号码。(2)SortData子程序将号码排序。(3)PrintData子程序打印号码。通过子程序方式来组织的程序,结构非常清晰,即使不能一下子读懂程序,也不会觉得程序的杂乱,并且很快会把注意力集中到较难的语句上。′ProgramwithsubroutinesClsDimValues(10)GoSub

AskForData′Getuser′slistofnumbersGoSub

SortData′SortthenumbersGoSub

printData′printthenumbersEndAskForData:′Gets10valuesfromtheuserDebug.Print″**NumberSortingProgram**″Fori=1To10

Values(i)=Val(InputBox(″Whatisanumberforthelist:″))NextiReturnSortData:′Sortsthe10valuesForpass=1To10Forctr=1To9 If(Values(ctr)>Values(ctr+1))Then t=Values(ctr)

Values(ctr)=Values(ctr+1) Values(ctr+1)=t EndIfNextctrNextpassReturnprintData:Debug.PrintDebug.Print″Afterthesort:″Fori=1To10

Debug.Print

Values(i);″″;NextiReturnEnd如图10.12所示,显示了程序的运行结果。读者可以调试运行本程序,并参照图10.12的结果来理解子程序的调用。图10.12子程序的调用及其结果现在,如果已经对要解决的问题,找到了一个好的算法。比如,要编程计算圆周率,可以利用公式:π/4=1-1/3+1/5-1/7+1/9-1/11+…。接下来就是编写程序了。假设已经初步掌握了如VisualBasic这样的入门级程序设计语言,应该很容易地用程序来求出圆周率。10.4程序的编辑与编译

10.4.1使用编辑器要编写一个程序,首先需要选择一种编辑器。实际上,编辑器可以选用现成的任何一个字处理器。因为在编写程序的过程中,要做的操作就是向计算机中输入程序代码,输入过程中可能要做的复制、移动、删除等操作以及输入完成后的存储操作等都是字处理器的基本功能。只要具备基本的文本编辑功能,就可用来作程序的编辑器。Windows操作系统下的“记事本”就是一个非常适合于编写程序的一个文本编辑器。相反,如果使用像MicrosoftWord那样的功能复杂的字处理器,由于它的格式排版功能,可能会在程序代码中夹杂一些不该有的格式控制符而使程序运行出错。如果要将曾经出现过的编辑器分类的话,那就应该分为两类:行编辑器和全屏编辑器。较早出现的是MS-DOS下的Edline行编辑器,行编辑器不允许使用光标移动键上下左右在屏幕上来回地移动光标,使用起来很不方便,现在基本上不再使用。但在UNIX操作系统之下,可能不得不使用这种编辑方式。一些拨号上网的计算机,因为使用了不允许全屏控制的调制解调器,也必须使用这种编辑方式。另一类是全屏编辑器,现在绝大多数编程语言都带有自己的全屏编辑器。全屏编辑器一般都提供下拉菜单和鼠标点击操作方式,所以只要曾经使用过字处理器,就不会对在编辑器进行程序编辑操作感到困难,当然必要时,可以使用帮助菜单或使用帮助键(如F1)。有两种语言翻译器:解释器和编译器,它们的作用是将编写的源程序代码转换成计算机能够直接执行的机器代码,尽管采用不同的方法,但目的是一样的,如图10.13所示。10.4.2语言编辑器图10.13解释器和编译器将源代码翻译成机器代码1.解释器有些语言使用解释方式的语言翻译器,如BASIC、APL等,称之为解释式程序设计语言,其翻译器称做解释器。解释器的工作方式是对源程序代码每转换一行,就执行一行。有点像英文老师在讲解一篇课文,读一句,翻译一句,明白一句。由于这种方式一次解释一行,执行一行,解释结果并不保留,以后再次执行之前,仍需同样的解释。2.编译器使用编译器,在编译过程中将源程序所有代码都转换为计算机能识别的目标代码。当然,如果程序有错误,必须在编译成功之前改正所有的错误。使用编译器转化源程序代码,就像不愿意学英文的人,要阅读用英文写的文章,那只有请人先将这篇文章翻译成中文,直接阅读它的“中文版”。更多的人愿意使用编译型的编程语言,因为程序一旦编译好,其编译结果就以目标代码文件保存起来,可以反复运行,再次运行时的速度比解释方式下要快得多。使用编译型语言的另一个优点是,生成的可执行文件可以脱离编译器,在没有编译器的情况下照样运行,为程序的发布提供了条件。软件公司出售的软件是经过编译以后的可执行代码,无法知道它的源代码,这一方面增加了程序的安全性,另一方面也避免了软件产权的纠纷。为了使用方便,现在大多数程序设计语言,都将程序编辑器和程序解释器或编译器集成在一起。可以使用相同的桌面环境和同一套菜单命令来进行程序的输入、编辑、编译、运行,这些都在同一个地方进行。这种简单易用性,可以使设计者将更多的精力集中到程序编写上。10.4.3集成开发环境在集成编辑编译环境下,输入了程序之后,可以用菜单命令将程序编译成机器语言,无须离开编辑环境就可以运行程序,并且可以通过简单的方式在编辑程序的窗口与观察程序的输出的窗口之间切换。比如VisualBasic,它的工作环境是集成开发环境,简称IDE,它在一个公共环境里集成了许多的功能,包括设计、编辑、编译和调试。如图10.14所示。图10.14VisualBasic集成开发环境VisualBasic的菜单栏中包含使用VisualBasic所需要的命令。它除了提供标准“文件”、“编辑”、“视图”、“窗口”和“帮助”菜单之外,还提供了编程专用的功能菜单,例如“工程”、“格式”、“调试”、“外接程序”等。VisualBasic的工具栏在编辑环境下提供对于常用命令的快速访问。单击工具栏上的按钮,即可执行相应的操作。可以通过“视图”菜单中的“工具栏”中的命令显示或隐藏某一工具。工具栏能紧贴在菜单栏下方,或以垂直条状紧贴在边框上,如果用鼠标将它从某栏下面移开,则它能“悬”在窗口中。工程窗口的功能实际上类似于一个Windows的资源管理器,主要用来管理用户在制作项目时的项目文件,也称做工程管理器。通过工程管理器可以很方便地找到需要的文件和窗体,还可以添加和删除项目文件。窗体窗口是屏幕中央的主窗口,它可以为用来设计应用程序的界面自定义窗口。用户可以在窗体中添加控件、图形和图片以设计出所希望的应用程序界面。每个窗口必须有一个窗体名字,建立窗体时默认名为Form1、Form2...。窗体名即窗体的“Name”属性,窗体文件名不必相同。工具箱提供了一组工具,用于设计时在窗体中放置控件生成应用程序和用户接口。系统启动后默认的General工具箱就会出现在屏幕左边,上面共有21个常用“部件”。可以将不在工具箱中的其他ActiveX控件放到工具箱中。通过“工程”菜单中的“部件”命令或从“工具箱”快捷菜单中选定“部件”选项卡,就会显示系统安装的所有ActiveX控件清单。要将某控件加入到当前选项卡中,单击要选定控件前面的方框,选定的控件就出现在工具栏中。代码窗口,即代码编辑窗口。在VisualBasic中,所有的代码都是在代码窗口中编写的。代码窗口实际上就是一个文本编辑器,它可以用来编写、显示和编辑窗体、事件和方法程序的代码,应用程序的每个窗体或标准模块都有一个单独的代码编辑器窗口。可打开任意多个代码窗口,从而方便地查看、复制和粘贴来自不同窗体的代码。代码窗口如图10.15所示。图10.15VisualBasic代码窗口属性是指对象的特征,如大小、标题或颜色等数据。在VisualBasic设计模式中,属性窗口列出了当前选定窗体或控件的属性及其值,用户可以对这些属性值进行设置。立即窗口可用来键入或粘贴一行代码,然后执行它,如显示某变量的当前值;也可以通过在程序中,插入“debug.print变量名”语句,检测在执行一个应用过程时某个变量值。监视窗口是为调试应用程序提供的,只在运行工作模式下才有效。自己编写的程序,第一次运行,成功的可能性是极小的,除非程序极其简单,否则总会出现这样那样的错误。程序调试是自己寻找和排错的过程。前人把程序中的错误称做为“虫子”,是因为第一个有记录的计算机运行错误确实是一只虫子。MarkⅡ计算机是一台1945年建造的机电式计算机,有一天,它神秘地停止了工作。通过艰难地搜寻,最后竟然发现在继电器的接触点上夹住了一只飞蛾,于是工作人员将它夹在工作日志中,并记录:“这是第一个实际找到的错误”。因此,把除去计算机运行中的错误称做DEBUG(除去虫子)。10.5程序的调试(1)编译错误。编译错误是由结构不正确的代码造成的。如果键入了一个拼写错误的关键词,遗漏了某个必需的标点符号,或使用For语句时丢失了Next语句。这类错误编译系统会做出提示,指出错误所在的行号,以便在调试时及时发现并改正,如图10.16所示。10.5.1错误的种类图10.16编译错误提示(2)运行错误。当一条语句试图执行一个不可能执行的操作时,会发生运行错误。最常见的运行错误是除数为0错误。如程序中含有A=B/C这样的语句。但如果在运行时,变量C的值可能为0,则该除法是一个无效的运算,而语句本身是正确的,并且变量C的值如果不是0的情况下程序是会得到正确结果的。另外,还有诸如求平方根函数的参数为负数等,这样一类错误,必需在程序运行时才能发现。(3)逻辑错误。当应用程序没有按预定的方式运行,则发生的是逻辑错误。一个应用程序在语法上代码有效,运行时无任何无效的操作,即未发生以上两类错误,但得不到正确的运行结果。比如,在编写求球体积的程序中,使用的数学公式为4/3*3.14159*r*r,显然正确的球体积公式应该是4/3*3.14159*r*r*r。编译系统在编译时是不能查出此类错误的,因此,这类错误具有更大的的隐蔽性,只有通过已知结果的数据进行运行测试并分析后,才能发现和改正。这类错误的排除难度更大,很大程度上需要的是程序调试者的经验和耐心。VisualBasic也提供了程序调试的一些手段,而且这些手段与大多数功能强大的Windows下的编程环境十分相似。这里以VisualBasic为例来介绍程序的常用调试手段。VisualBasic的调试菜单中几个菜单项及其功能如表10.1(见书358页)所示,可以利用这些菜单项来调试程序。10.5.2用VisualBasic练习调试(1)单步执行。选择“调试”菜单中的“逐语句”菜单项或按F8快捷键,开始跟踪。每按一次F8键,VisualBasic执行一条语句,并且使正在执行的语句加亮显示。一直按F8键单步执行每一句,观察加亮语句的变换,必要时输入需要的数据。单步执行方式对检查循环结构中语句的执行非常有帮助,可以直接地看到程序的执行有没有进入循环体,循环了几次,从而判断循环条件设置得是否正确。在单步执行方式下,如果程序中含有debug.print语句,则可以在立即窗口中查看输出,以了解至目前为止程序的输出是否一直无误。当然,在找到并修改了程序中的错误之后,也可以按F5键,以非跟踪方式完成程序中其他语句的执行。不过,如果修改关系到程序结构的语句,像循环结构或者在程序中间定义了一个新的变量,则VisualBasic会要求重新运行程序而不是继续运行程序。(2)跳过过程。“调试”菜单中的“逐过程”菜单项能够一次执行一个函数或过程,而不是一句句地跟踪其每一行。单步执行到调用函数revStr$()的语句Debug.print″yournamebackwardsis:″;revStr$(name$)时,并不进入该函数内部一句句地执行。当知道该函数肯定没有错误时,可使用“逐过程”菜单项,以免浪费时间跟踪到其内部。(3)打印变量。在调试VisualBasic或其他语言的程序时,可能需要查看某些变量的值,以确定程序中的错误所在。VisualBasic及其他语言的调试器也提供了这种功能。在VisualBasic集成开发环境中,可以使用诸如“Form1.printx”的“对象.print”语句在对象上打印变量的值。最常用的是“debug.printx”语句,它在VisualBasic提供的立即窗口输出变量的值。这样,能够在程序运行完查看某些变量的值或程序的执行结果。例如,对于如图10.17所示的求1+2+…+100之和的这样一段程序,如果想知道当For循环结束时,循环控制变量i的值是多少,可以在For循环的Next语句后加上debug.print″I=″;I,这样,在程序运行结束后,可以在立即窗口中看到I的值是101。其他类似的问题都可以通过立即窗口来查看。不过,如果程序中的错误被改正之后,为了程序的简捷,应该将它们删除掉。另外,立即窗口中的操作类似于命令行方式,输入一条语句,按Enter键则会立即执行,这种方式最适合于打印表达式的值,验证表达式是否正确,或者查看函数的值如何。图10.17使用立即窗口(4)设置断点。当程序出现逻辑错误时,由于逻辑错误的隐蔽性,很难从一个较长的程序中找到错误所在。这时在程序的某个语句处设置断点,是一种比较有效的办法。它可以使程序分段执行,便于分段验证程序的正确性。在VisualBasic中,将光标定位在要设置断点的语句行,按F9键或执行“调试”菜单中的“切换断点”菜单项,该语句行出现红色背景,表明这里设置了断点,如图10.18所示。图10.18设置断点的语句行在程序中设置了断点之后,程序运行到这里时,会暂停下来,进入中断模式,此时,可以在立即窗口中查看有关变量的值,从而确定错误所在。断点信号可设在需要的任何语句处,但是断点信号是临时的,它不能随程序代码而保存,下次打开程序文件后,需要的话,可能要重新设置断点。在过去的几十年里出现了上百种编程语言。一些语言的开发为了提高编程效率,降低出错率。另一些则是为专门的编程提供高效的指令集,例如商业程序和科技程序。其他的用于教学。这些语言在描述如何工作和如何给合适任务类型提供信息时各具特色。例如,Pascal语言是一种可编译的过程性高级语言。当需要选择语言来编程时,了解这些语言的特色和优缺点将很有帮助。10.6编程语言用过程性语言编写的程序包含一系列的描述,告诉计算机如何执行这些过程来完成特定的工作。带有过程性特征的语言称为过程性语言。编写求解立方体体积的VisualBasic语言程序就具有过程性特征,那些语句确切地告诉了计算机如何工作:显示信息请求用户输入形状;请求输入大小;然后请求输入价格;然后根据形状选择公式等。10.6.1过程性语言过程性的编程语言适合于那些顺序执行的算法。用过程性语言编写的程序有一个起点和一个终点。程序从起点到终点执行的流程是直线型的,即计算机从起点开始执行写指令序列,直到终点。只需具体说明问题的规则并定义一些条件即可。语言自身内置了方法把这些规则解释为一些解决问题的步骤,这就把编程的重心转移到描述问题和其规则上,而不再是数学公式。因此说明性语言更适于思想概念清晰但数学概念复杂的编程工作。不同于过程性的程序,用说明性语言编写程序只需告诉计算机要做什么,而不需告诉它如何去做。10.6.2说明性语言HTML是一种语言吗?HTML一般称为脚本语言。脚本语言以脚本的形式定义一项任务。脚本需要一个主机应用系统依附来运行,不能单机运行。例如,用HTML标签为显示网页编写一个脚本,这个脚本由网络浏览器解释,这里网络浏览器就是主机应用系统,没有它,HTML脚本就不能运行。10.6.3脚本语言脚本语言包含在许多应用程序中,像字处理软件和电子制表软件。可以用脚本使应用程序中的任务自动化。这些自动化例程即通常所说的宏指令。脚本语言使用起来比其他编程语言要简单,但它提供的控制选项很少。如果想应用软件中的功能自动定制完成的话,HTML对不擅长编程的人是一个很好的选择。低级语言需要为计算机系统低层硬件编写指令,像处理器、寄存器和内存地址等。低级语言对直接在硬件水平上操作机器很有用。通常使用低级语言编写像编译器、操作系统和设备驱动程序之类的系统软件。低级语言中的指令一般和处理器的指令相对应。使用低级语言编程,即使是两数相加这样简单的操作也要数条指令才能实现。10.6.4低级语言面向对象的程序设计语言是建立在用对象编程的方法基础之上的。对象就是程序中使用的实体或“事物”,例如,按钮,就是一个对象,并且已经习惯于用鼠标单击一个按钮。程序员可以使用面向对象的语言来定义按钮对象,在程序运行时把它显示出来。10.6.5面向对象语言对象属于一个具有一定特性的类或组。窗口类是比较常见的类,所有的窗口对象,包括应用程序窗口,都属于窗口类,它们具有相同的属性,如都具有一个标题栏和一个“关闭”按钮。在创建一个窗口对象时,它就获得或者说继承了窗口类的属性和操作,但一个特定的窗口实例可以具有自己特定的属性,如标题、大小、屏幕上的位置均可不同,如图10.19所示。图10.19两类窗口同一对象可用在不同的程序中,这无形中就扩大了程序员的生产率。例如,许多应用软件都给用户文件提供了打开、保存、另存为、打印等操作,如果编写这样的应用程序,定义一个对象来完成这些操作会很方便,只要程序中用到这些操作,随时都可调用这些对象,避免了重复劳动。对象是一种现有的非常明显的良好的编程思想。微软公司的Windows包含一个Comdlg.dll文件,其中就有用于打开、保存、打印文件的菜单对象和对话框对象。程序事件是指程序必须作出响应的动作或表现,比如按键和单击。用事件驱动语言编程可以使用程序随时检测并响应事件。使用图形界面的程序大部分都是事件驱动的,它们在屏幕上显示诸如菜单这样的控件,并在用户作用控件时采取某一动作。事件驱动和程序中,代码段要和图形化的对象相关联,比如命令按钮和图标。用户操作某一对象时产生一个事件。10.6.6事件驱动语言比如单击“画图”按钮,该事件就触发与此对象关联的指令执行。如图10.20所示的是一个事件驱动程序的界面和该事件的代码。代码窗口列出的是对象Command1的单击事件代码,代码的功能是绘制若干个同心圆和两条相互垂直的直径。图10.20一个事件驱动程序的界面和该事件的代码程序中的对象从何而来?实际中,面向对象程序中的对象是由程序设计者生成的。但程序员可以购买一些称为构件或库的对象。构件是事先写好的对象,可以应用到自己的程序中,对于目前流行的编程语言,构件可以买到。使用构件编程称为构件程序设计。10.6.7构件假设你被聘用为政府编写一个研究资源再生的软件。工程师要求该软件能周期性生成一些图形来比较玻璃、纸、铝和其他可再生材料的量。图形构件可以为软件提供这种功能。只需把图形库与程序连接。如果还需要填写政府的表格,可以再买一些表格构件加上“再生”软件来生成所需的表格。可以选择各种各样的构件来增强功能,比如,电子表格、数据库管理、专家系统、报表生成、在线帮助、数据查询、文字编辑、科幻和3D图形等。通常情况下,一项任务可以用多种编程语言来实现。为一项工程选择语言时,应该考虑下面几个问题:(1)这种编程语言是否适合于手中的任务?(2)这种语言在其他的应用程序中是否也经常使用?(3)小组中的人是否都精通这门语言?如果这些问题的回答都是肯定的,那么这门语言对这项工程是一个很好的选择。了解当今一些流行的语言特性对你回答第一个问题会有帮助。10.7选择编程语言BASIC是为初级编程者设计的。自从1964年问世以来,已经出现了几种流行的版本,包括IBM-PC上的GW-BASIC和微软的VisualBasic。由于BASIC容易使用和适合于各种计算机系统,它已成为最流行和最广泛使用的语言之一。BASIC是一种过程性的高级语言,它的大多数版本都是解释执行的语言,但也有一些是编译执行的。10.7.1BASIC语言BASIC早期的版本对于开发复杂的商用程序非常有限,但一些新版本,如微软公司的VisualBasic(VB)就是综合性的且功能强大的编程语言,适合于专业编程项目,尤其适用于带有图形界面的事件驱动程序设计。美国海军上将GraceHopper,第一只计算机臭虫的发现者,和她的工作小组,设计了一种用于商业方面计算的语言——COBOL。COBOL是CommonBusinessOrientedLanguage(通用商务对象语言)的缩写。10.7.2商务语言COBOLCOBOL是发展于20世纪60年代的一种语言,适于大型计算机系统上的事务处理。COBOL是编译执行的过程性高级语言,主要被一些专业程序员用来开发和维护大型商业集团的复杂程序。COBOL程序往往很长,但容易读懂、调试和维护。这种特性对于大型商业组织机构尤其重要,因为许多重要的程序必须由不同的程序员维护和修改。FORTRAN的含义是方程翻译器(formulatranslator)。它主要用于数学计算和科学应用。FORTRAN适用于对高精度数字进行处理,并且提供一个优良的三角函数库,专门用于针对科学开发者的需求。多年以来,程序员们对FORTRAN语言添加了许多内容,使其具有了更强的字符处理能力。FORTRAN的早期版本主要考虑的是解决数学计算,而对结果的表达形式没有太多的关注,较新的版本则在保持其数学运算能力的基础上,大大增强了对字符数据的处理能力。10.7.3FORTRAN语言表10.2(见书364页)中是一个FORTRAN程序的例子清单,目的在于通过具体的程序例子真正地接触一下FORTRAN程序。FORTRAN是一门高级语言,其程序比汇编语言程序要容易阅读,但它并不是一门初学者语言,对于初学者来说,它并不是足够地浅显易懂。FORTRAN语言以其擅长于数据计算的特点一直在科学研究领域中占有立足之地,多年来,它的领地虽已被Pascal、C和C++蚕食了不少,但是其超强的数值计算能力仍是其他语言不可替代的。Pascal开发于1971年,用于帮助学生学习计算机编程。Pascal是编译执行的过程性高级语言。它开了结构化程序设计的先河,但Pascal很少用于专业编程和商用软件的开发。10.7.4Pascal语言C语言是编译执行的过程性高级语言并带有低级语言的接口,这种特性给程序员带来很大的灵活性。利用这种灵活性。有经验的程序员可以使程序速度快、效率高,但也使C程序难于理解、难于调试和维护。C++是支持面向对象的C语言。许多人认为C++的面向对象特性可以提高程序员的效率,但面向对象的程序设计的思维方式与过程性设计迥然不同,因此,刚刚使用C++编程的程序员往往困难重重。10.7.5C语言LISP和Prolog是说明性高级语言,一般用于开发专家系统。它们分别开发于1960年1971年,相对于过程性的语言,它不算很流行,这或许是因为早期的计算机应用程序一般是处理一些需要简单重复运算的任务,而这正是过程性语言所擅长的。那些需要对字符数据进行复杂的逻辑处理的任务则适合用说明性语言来实现。10.7.6LISP和Prolog语言SQL语言是为数据库的定义和操作开发的一种标准语言。SQL是说明性的高级语言,只需程序员和用户对数据库中数据元素之间的关系和欲读取的信息的类型予以描述。虽然数据库也可用COBOL等过程性的语言操作,但SQL语句由于更适用于数据库操作而效率更高。10.7.7SQL语言Java和J++是以C++为基础的但更适于网络应用的面向对象的高级语言。Java和J++尤其适用于生成网页上栩栩如生的图画和称为Applet的Java应用程序,其中包含用户定制的按钮、复选框和文字输入框之类的网页控件。当浏览器和附有Java和J++程序的网页连接时,计算机就会下载这段程序并执行。既然程序是在计算机上而非网络服务器上运行,则在输入和接受响应时就避免了传输时间。10.7.8java和J++Java和J++有一个很大的不同之处。Java是一种独立于平台的语言,这就意味着Java程序不但能在计算机上运行,而且可运行在Macintosh和UNIX机上。J++提供给程序员的工具要求Windows的支持。使用这些工具可以编写更快、更高效的应用程序,但它只能运行在Windows操作系统的机器上。不要把JavaScript和Java混淆起来,JavaScript属于脚本语言,只是Java的一个子集。JavaScript就像HTML标签一样是嵌入网页的。网络浏览器接受到一个网页时便解释JavaScript。JavaScript的主要用途就是交互地生成网页。8086汇编语言是一种低级语言,由一些容易记忆的短语组成,用汇编语言编写的计算机程序也需要将它们转化成目标程序,才能为计算机所运行。8086汇编语言指令集只适用于Intel8086微处理器,用它编写的程序只能运行在装有x86系列微处理器的计算机上,现在8086汇编语言主要用在那些程序尽可能短的或速度要求很高的场合。专业程序员把8086汇编语言嵌入应用程序使其执行速度快,汇编语言也常用来编写系统软件来控制计算机硬件。10.7.98086汇编语言跟人类所使用的语言一样,计算机程序设计语言也处在不断地改变和进化之中,在新的语法和表达式不断充实已有语言的同时,那些旧的和过时的东西也因为不用而逐渐消退。人类使用的语言的变化是一个缓慢而持久的过程,但计算机语言却不然,它的变化则是逐步的,它往往随着该语言的发行厂商的修改或标准化组织对其进行标准化而发生变化。10.8小结20世纪70年代末,Kemeny和Kurtz两人开发出BASIC语言,它很快成为大众的程序设计语言,被装在成千上万的计算机上。随后,一些“更新的和改进的版本”允许程序员使用结构化原则进行BASIC程序的设计,但此时的语法和用户的界面都没有变化。但微软公司于1991年开发出了VisualBasic语言,它大体上还是从老版本的BASIC语言中继承过来的。随后的6年中,微软公司接连发布了4个版本的VisualBasic产品,这使得程序员们不得不花大量的时间和精力去重新学习,这导致了程序员们几乎不能完整地做完一个程序项目。丧失了对语言的熟练掌握,程序员们有时不得不聚在一起讨论一个很基本的对程序的理解问题,这是由于语言功能的增强所造成的后果。VisualBasic的更新反映了技术和程序设计方法的进步,例如,程序从16位向32位的转变、Windows95的引入、网络编程的需要和面向对象技术的引入等都引起了VisualBasic的更新。这些版本的更新所花的代价比起它所能提供的好处来说,究竟值不值得?一些迹象显示,广大和程序员们和信息系统的主管们对市场上计算机语言商家的商业需求和他们所保证的语言新特点越来越感到厌恶和抵制了。看来在计算机市场上,人们需要的是稳定。相关知识点介绍如下:1.软件软件的定义比较公认的一种定义为软件由3部分组成:(1)在运行时能提供所希望的功能和性能的指令集,即程序。(2)使得程序能够正确运行的数据结构。(3)描述程序研制过程、方法及使用的文档。相对硬件而言,软件有自己的特点:(1)它是一种逻辑实体,因而具有抽象性,虽然可以记录在存储介质上,但无法看到软件本身的形态。(2)它是在研制、开发活动中被创造出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论