课件54张PPT。 算法的概念算法是指解决给定问题的有穷操作步骤的描述。
算法是计算机科学中的重要概念之一,它指明了问题的求解过程,是对给定问题解题方案的准确而完整地描述。
【例4.1】给定任意两个整数,按从小到大顺序排列。
解决这一问题的算法可描述如下:
⑴输入两个整数A和B;
⑵比较A和B的大小,若A ⑵确定性。算法的计算规则及相应的计算步骤必须是唯一确定的,既不能含糊其词,也不能有二义性。
⑶可行性。算法中的每一个步骤都是可以在有限的时间内完成的基本操作,并能得到确定的结果 。⑷数据输入。每个算法都要求有原始数据输入,即给定计算初值。算法不同,输入的原始数据可能不同,但缺少原始数据的算法则是一个不完善的算法。
⑸信息输出。一个算法至少要有一个有效的信息输出,这就是问题求解的结果。
衡量一个算法好坏的标准是: 算法应当正确,易于阅读和理解,实现算法所占存储空间要少,运算时间短,实现方法简单可行等。
算法的表示方法⒈ 用文字叙述形式表示
可以用中文或英文叙述的形式来描述算法采用文字叙述形式表示算法通俗易懂,但文字冗长,而且容易产生“歧义”(即对同一段文字,不同的人可能会有不同的理解)。因此,除了一些非常简单的问题外,一般不采用文字叙述形式来表示算法。⒉ 用流程图表示
流程图一般可分为传统流程图和结构化流程图(N-S图)。
所谓传统的流程图是指用几何框、箭头、连线以及文字说明相结合的一种图形。用流程图表示算法不仅直观、灵活,而且易于理解。起始或终止框计算处理框(过程)条件判断框(决策)输入输出框(数据)流向或路径连接点开 始输入两个整数A和BA 所谓伪代码表示是指用介于自然语言和计算机语言之间的一种代码来描述算法。 用伪代码表示例4.1 的算法。
INPUT A,B
IF A PRINT A,B
ELSE
PRINT B,A
ENDIF利用计算机处理问题的过程 用计算机所能接受的形式把解题的算法用程序设计语言描述出来的工作叫程序设计,它包括了大量的工作和许多具体的步骤。其中这些步骤包括以下内容:
⑴分析问题。即明确实际问题的要求,给定的数据有哪些,需要输出什么样的数据,需要进行哪种处理。
⑵确定求解方案。⑶算法分析。根据处理方案,具体列出让计算机如何进行操作的步骤(算法),并进行算法的准确性和有效性分析,找出合理的算法。
⑷编写程序。拟定算法的步骤和说明后,使用某种程序设计语言,以书面形式将算法描述出来,所得到的编程结果就是源程序。
⑸上机调试运行程序。将编写好的源程序输入计算机并调试、运行,如果程序是正确的,应能得到预期的结果,如果得 不到正确结果,应该检查前几步是否有误,改正后再上机运行。
⑹编写文档。编写文档是程序设计的必要组成部分。从问题的提出开始一直到程序运行结束,都应该全面、完整地编写文档资料,内容包括技术文档资料和使用文档资料,这是后期使用和维护程序所必需的资料。
⑺维护。程序所处理的各种数据是非常宝贵的信息资源,其宝贵价值就在于信息的真实性、准确性和有效性。要保证信息的真实性和准确性,就需要及时地进行增、删和更新等维护工作。
4.3 结构化程序设计概述4.3.1 结构化程序的三种基本结构
结构化程序规定了三种基本的结构,即顺序结构、分支结构和循环结构。
⒈ 顺序结构
顺序结构是一种最简单、最基本的结构,其特点是各部分按照出现的先后顺序执行。它由A和B两个语句块组成,且仅有一个入口(a)和一个出口(b)。最简单的情况是每一语句块中只含有一条不产生控制转移的执行语句。 每个语句块本身也可以是一个顺序结构,因此一个顺序结构可以由许多顺序执行的语句组成。ABab ⒉ 分支结构
它根据给定的条件在两条可供选择的分支中选择其中的一条执行。当条件成立时,执行语句块A,否则执行语句块B。执行完语句块A或语句块B后,都从b点出口。因此就整个分支结构来讲,它仍然只有一个入口(a) 和一个出口(b)。
条 件ABab成立不成立⒊ 循环结构
循环结构也叫重复结构,即重复执行某些操作。根据其执行情况和循环结束条件的不同可分为当型循环(也称WHILE型结构)和直到型循环(也称UNTIL型结构)。当型循环结构,它是当满足某个指定的条件时,反复执行语句块A,否则不执行。直到型循环结构,它是反复执行语句块A,直到条件满足为止。 它们也只有一个入口(a)和一个出口(b)。
条 件A条 件Aab成立不成立成立b不成立a当 型直到型两种循环结构的区别:
⑴执行情况不一样。当型结构是先判断循环条件,当条件成立时,才执行语句块A, 若循环条件一开始就不成立,则语句块A一次也不执行。而直到型结构是先执行语句块A,后判断循环条件,且语句块A至少要执行一次。
⑵循环结束条件不一样。当型结构是条件不成立时结束循环,而直到型结构是条件成立时结束循环。 由三种基本结构(可以是其中的一种、二种或三种)构成的程序,称为结构化程序。一个结构化程序以及三种基本结构中的每一种都应当具有以下特点:
⑴程序执行的路径只有一个入口和一个出口,在入口和出口之间是一种基本方盒或逻辑结构。
⑵该结构中的任一个部分都存在着从入口到出口的路径,换句话说,结构中每一部分都可以被执行,不存在执行不到的死块(程序段)。
⑶没有死循环(永无休止的循环)。4.3.2 结构化流程图
在结构化程序设计中,经常采用结构化流程图来表示算法。结构化流程图是在去掉传统流程图中的流程线的基础上形成的,由美国计算机科学家I.Nasi和B.Schneiderman 1973 年提出,因此又称为N-S图。看N-S图就好比是看一页书,从上到下看下来就全明白了。 ⒈ 三种基本结构的N-S图符号
⑴顺序结构
顺序结构用矩形框表示,有时为了简便, 也可以将一个顺序结构写在一个矩形框内。AB ⑵分支结构
分支结构用带三角形的框来表示,若三角形中的条件成立,则执行语句块A,否则执行语句块B。条 件成立不成立AB ⑶循环结构
循环结构用一个包含L形的矩形表示,分当型循环结构和直到型循环。循环条件放在L形框(或倒立L形框)中,重复执行部分放在矩形框中。当条件成立时执行AA直到条件成立 所谓结构化程序设计方法是指采用顺序、分支和循环三种基本结构来实现算法。按照结构化程序设计方法设计出的程序结构良好,具有易读、易维护等优点。自顶向下、逐步求精和模块化是结构化程序设计方法中最典型、最具有代表性的方法。
⒈ 自顶向下的设计方法
自顶向下设计方法是一种从顶层开始,向下逐层分解、逐步细化,直到最底一层达到最简单的功能模块为止的方法。这种方法能够使编程者思路清楚、 有条不紊地一步一步深入地工作,用较短的时间设计出结构良好、可读性强、可靠性较高的程序,并容易验证程序的正确性,便于维护。
⒉ 逐步求精设计方法
逐步求精设计方法是将一个抽象的问题分解成若干个相对独立的小问题,并逐级进行由抽象到具体,由粗到细,由表及里不断进行精细化的程序设计方法。每一步求精过程都将问题的算法进一步细化,直到算法精细化到可以用三种基本结构实现为止。
⒊ 模块化设计方法
模块化设计方法是指将一个复杂的问题,分解成许多功能单一、相对独立的模块,各模块之间按照层次结构联系起来构成模块结构图。在模块结构图中,每个模块用一个矩形框表示,框内写上每个模块的名称,模块之间的调用关系用带箭头的方向线表示。模块化设计方法的核心是如何划分模块,产生模块结构图。 上述三种结构化程序设计方法各有其特点。逐步求精设计方法主要指一个程序的设计过程,它符合人们逻辑推理和思维的习惯。模块化设计方法和自顶向下设计方法主要指一个比较大的系统的设计过程,采取的是化整为零,各个击破的方法。将问题分割成若干个子问题,
对子问题再进行分割,这样可将问题分割成一个模块层次结构。
4.4 Foxpro程序的建立、运行和调试
4.4.1 Foxpro程序的一般结构
*PROG4_6.PRG的功能是已知三角形三边,求 三角形面积
SET TALK OFF &&执行结果不在屏幕上显示
A=3
B=4
C=5
P=(A+B+C)/2
S=SQRT(P*(P-A)*(P-B)*(P-C))
?"三角形面积为:",S
SET TALK ON PARAMETERS A,B,C &&形式参数
SET TALK OFF
P=(A+B+C)/2
S=SQRT(P*(P-A)*(P-B)*(P-C))
?"三角形面积为:",S
SET TALK ON
*带参数程序 *PROG4_8.PRG
PARAMETERS A,B,C
SET TALK OFF
IF A+B<=C OR A+C<=B OR B+C<=A
*判断能否构成三角形
DO DISPERR && 调用过程 DISPERR
ELSE
?"三角形面积为:", SOLVEAREA(A,B,C) *调用函数SOLVEAREA计算三角形面积
ENDIF
SET TALK ON
RETURN
PROCEDURE DISPERR && 显示错误信息
WAIT"不能构成三角形!" WINDOW;
NOWAIT
RETURN
FUNCTION SOLVEAREA
* 计算三角形面积自定义函数
PARAMETERS X,Y,Z
P=(X+Y+Z)/2
AREA=SQRT(P*(P-X)*(P-Y)*(P-Z))
RETURN AREA通过以上几个程序例子可以看到:
⒈一个Foxpro程序是由一个主程序或者一个主程序和若干个过程或自定义函数构成
⒉主程序、过程或用户自定义函数通常包括三个基本部分,即参数说明部分、执行部分和结束部分。
⑴参数说明部分
Foxpro规定其程序可以有两种,即不带参数程序和带参数程序,两者的主要区别在于有无参数说明部分。对于不带参数的程序,其第一条可执行的命令应为程序的执行部分。对于带参数程序,其第一条可执行的命令必须是参数说明命令PARAMETERS。参数说明命令的格式如下:
PARAMETERS <形式参数表>
该命令说明程序、过程或用户自定义函数中所使用的全部形式参数,以便接收程序、过程或用户自定义函数传来的数据,它必须是“被调用程序”中的第一条可执行命令。< 形式参数表>中的参数可以是任何内存变量名或数组名,当使用多个形参时,参数之间以逗号“,”分隔。在Foxpro中,一次最多能传送24个参数。
⑵执行部分
一个程序、过程或用户自定义函数的执行部分是由若干条有序的可执行命令组成的,它完成该程序、过程或自定义函数的所有功能。通常把过程的执行部分称为过程体,用户自定义函数的执行部分称为函数体。
⑶结束部分
在Foxpro中,一个程序、过程或用户自定义函数可以有结束部分,也可以没有结束部分。如果有结束部分,一般都是通过执行一条“结束程序执行的命令”来结束该程序、过程或用户自定义函数的执行。Foxpro提供了以下四条结束程序执行的命令:
①返回命令──RETURN
【格式】RETURN [<表达式>|TO MASTER|TO <程序名>]
【功能】该命令终止程序、过程或用户自定义函数的执行。若RETURN后不带任何选项,则返回到调用程序中调用处的下一条命令继续执行,当在命令窗口下执行程序时将返回到命令窗口。如果RETURN后带TO MASTER,则返回到最高层调用程序。如果RETURN后加入TO< 程序名>,则返回到由<程序名>所指定的程序。在用户自定义函数的最后通常用RETURN 命令将一个<表达式>的值返回给调用程序。 ②重试命令──RETRY
【格式】RETRY
【功能】返回调用程序,并再次执行调用程序中上一次被执行的那一行。该命令常用在错误处理程序中。
③结束命令──CANCEL
【格式】CANCEL
【功能】中止程序的执行,直接返回到Foxpro命令窗口。
④退出命令──QUIT
【格式】QUIT【功能】结束程序的执行,关闭所有已打开的文件,退出Foxpro环境,返回到操作系统。
以上四条结束命令可以放在一个程序、过程或用户自定义函数中的任何地方,并且允许出现多次。Foxpro规定,如果在一个程序、过程或用户自定义函数中没有结束部分,则默认为RETURN,在这种情况下,当执行完最后一条命令后,将返回到调用处的下一条命令继续执行。
综上所述,给出Foxpro程序的一般结构如下:
[PARAMETERS <形式参数表>]
<执行部分>
[结束部分]
[PROCEDURE <过程名>
[PARAMETERS <形式参数表>]
<过程体>
[结束部分]
.
]
[FUNCTION <函数名>
[PARAMETERS <形式参数表>]
<函数体>
[RETURN <表达式>]
.
.
.
]
4.4.2 Foxpro程序的建立与修改
⒈ 程序文件的建立
MODIFY COMMAND [<文件>]|?]|
MODIFY FILE [<文件>|?]
modi comm 主要用来编辑程序文件,
modi file 主要用来编辑文本文件。4.4.3 Foxpro程序的运行与调试
⒈ 程序的运行
在Foxpro环境下,运行一个程序有两种方法:一种是在Foxpro系统菜单下执行 Program菜单中的Do选项,另外一种方法是在命令窗口中执行Do命令。Foxpro的Do命令的格式如下:
DO <文件1>[WITH<实际参数表>][IN <文件2>]
该命令用来执行一个Foxpro程序文件。如果没有指定程序文件的扩展名,则按可执行文件(.EXE)→应用程序(.APP)→编译后的文件(.FXP)→源程序(.PRG)顺序来执行。对于带参数程序,必须带WITH<实际参数表>,此时WITH后的实际参数表将被传送给该程序文件
使用。带IN<文件2>选项表示要执行指定程序<文件2>中的一个过程。通常我们把在Foxpro命令窗口中执行DO命令称为“运行程序”,而在一个程序中执行该命令称为“调用程序”。Foxpro中的每个程序都可以被调用,所以在任何程序中都可以通过DO命令来调用其它程序。 ⒉ 程序的调试
初次建立的程序由于种种原因可能会出现各种各样的错误,需要通过试运行来检查和修改程序中的错误,这就是常说的“程序的调试”。调试程序的常用方法是用一些典型数据来试验运行程序,通过分析运行结果来判断程序是否正确。若运行结果不正确,需要找出错误的地方并加以修改。也可以使用Foxpro提供的调试工具来帮助我们跟踪在程序调试中出现的错误。例如,如果使用SET STEP ON命令可以设置单步执行方式,Foxpro 在执行每条命令后暂停,并在 Trace窗口显示该程序,以便查看程序的执行情况。如果使用SET ALTERNATE TO <文件名>命令和SET ALTERNATE ON命令, 可将程序运行过程中输出到屏幕上的数据存入指定的磁盘文件(可以利用CLOSE ALTERNATE命令关闭建立的文件),以便分析结果时使用。
一般来说,程序中的错误可分为语法错误和逻辑错误两种类型。
⑴语法错误
所谓“语法错误”是指程序中某条(些)命令不符合Foxpro的语法规则而引起的错误。例如,命令动词拼写错误,引用的变量不存在,数据类型不匹配等。有时标点符号使用错误也会导致语法错误。一旦出现语法错误,Foxpro将中止程序的运行,并在屏幕上显示出错的命令及错误命令所在的程序名称,可根据出错信息去查改程序中的错误。 除了通过运行程序来检查语法错误外,也可以使用Foxpro提供的编译命令Compile 来编译指定的源程序(.PRG),以便查出其中的全部语法错误,并将错误信息存入同名的扩展名为.ERR的文件中。利用Foxpro的编辑器可以查看这个错误记录文件,并根据提供的信息来修改源程序中的错误。如果源程序中没有语法错误,则产生一个同名的扩展名为.FXP的目标文件(.FXP为Foxpro的伪编译文件)。在Foxpro命令窗口下运行源程序时,实际上执行的都是编译后的.FXP文件。 在Foxpro中编译一个源程序时,既可以选择系统菜单中Program 菜单项中的Compile选项来完成,也可以在命令窗口中直接使用Compile命令来完成。在编译源程序时,可以通过SET LOGERRORS ON|OFF命令来控制是否生成错误记录文件。取ON时, 则生成错误记录文件。取OFF时,则不生成错误记录文件。
⑵逻辑错误
所谓“逻辑错误”是指程序中每条命令的书写都符合Foxpro的语法规则,程序也能够运行,但所得结果却是错误的。逻辑错误比较难查,一般采用分段排除的方法来查找。若查得程序本身无错,就得检查算法是否有误,对问题的理解是否有误等等。程序调试中常见错误分析
⑴Operator/operand type mismatch──数据类型不匹配
⑵Unrecognized command verb.──不认识的命令动词
⑶Variable not found──变量没找到
⑷Unrecognized phrase/keyword in command──命令中出现了不可识别的短语或关键字
⑸Nesting error──嵌套错误
⑹File does not exist──文件不存在
⑺File is in use──文件在使用