当前位置:首页 > 经典书库 > 工程师手册

Ⅲ程序设计

书籍:工程师手册

出处:按学科分类—工业技术 企业管理出版社《工程师手册》第922页(9421字)

1.dBASE Ⅲ程序特点

dBASE Ⅲ程序具有结构化程序的基本结构,即顺序执行结构、条件分支结构和循环结构。它没有语句标号,没有无条件转移语句,程序组织模块化。由一个主模块和若干子模块构成。图5.2.3-1是dBASE Ⅲ程序结构图。

图5.2.3-1 dBASE Ⅲ程序结构图

这是一个自顶向下逐步扩大的程序设计方法。由主模块控制下层的处理模块,再由处理模块控制下一层的子模块,逐层控制,将任务逐步细分,从而达到模块化要求。

此外,dBASE Ⅲ提供了功能强大的语句命令,为用户构造了良好的语言系统,并且,dBASE Ⅲ提供了多条具有交互式功能的命令,可使用户随时通过键盘和屏幕参予和控制程序的执行。

2.dBASE Ⅲ程序的建立和运行

(1)dBASE Ⅲ程序的建立

前面介绍过,数据库文件是扩展名为.DBF的文件,命令文件是扩展名为.PRG的文件。为能编辑dBASE Ⅲ程序,可采用以下两种办法。

①用MS-DOS的EDLIN或WPS字处理软件的N方式编写.PRG文件;

②进入dBASE Ⅲ后,在“·”下键入命令;

.MODIFY COMMAND〈文件名〉

文件名部分可指定驱动器号,路径及扩展名,否则采用默认值(当前驱动器下,带.PRG的文件)。

键入该命令后,若为新文件名,则清屏,在全屏幕编辑方式下,可以输入程序了。若该文件已存在磁盘中,则屏幕显示该文件的内容,用户可以编辑、修改该文件。

(2)dBASE Ⅲ程序的执行

dBASE Ⅲ程序的执行,有以下几种方式。

①解释执行方式的dBASE Ⅲ程序

解释执行方式即在执行dBASE Ⅲ程序时,系统对语句一条一条解释判断执行。这种执行方式又分为两种执行方法:

a.在dBASE Ⅲ内部执行命令文件

在“·”提示符下,键入:

DO〈文件名〉

待命令执行完毕,又返回状态“·”提示符下。

在执行DO命令时,系统规定打开的文件含库文件、索引文件、格式文件,程序文件的总数不能超过15个,因而要用CLOSE关闭无用文件。

b.在操作系统下运行程序文件

在操作系统下执行dBASE Ⅲ程序,须在提示符“C>”下,键入:

C>dBASE〈文件名〉

文件名是扩展名为.PRG的程序文件

从命令可看出,该命令首先将dBASE Ⅲ系统调入内存,然后将程序文件调入内存,解释并执行它,执行完后,系统将返回到“·”状态下。

②编译执行方式的dBASE Ⅲ程序

解释执行方式是边翻译边执行,因而速度较低,而用编译执行方式,将已编译和连接好的dBASE Ⅲ可执行文件(.EXE),在操作系统提示符下,直接键入文件名即可。

C>文件名↙

待执行完毕,仍然处于操作系统“C>”提示符状态。

(3)中止程序执行语句及注释语句

dBASE Ⅲ提供了CANCEL命令,用于当有关条件满足后,终止程序,返回到“·”状态,同时关闭所有已打开的文件。其语句格式为:

CANCEL

用户也可以在CANCEL语句后,加上程序注释,以便了解程序设计者意图及特殊用法的标注。其格式如下:

NOTE〈注释字符〉

*〈注释字符〉

其中,注释字符最多可达254个,当一行写不下时,用“;”作分行符,以便继续书写注释。

3.分支程序设计

在本节的开始已经讲过,dBASE Ⅲ程序具有结构化程序的三种基本逻辑结构,即顺序执行结构、条件分支结构和循环结构。顺序执行结构是简单的按顺序逐条执行程序的过程,没有条件判断、逻辑转移,循环处理等问题,因而不能满足用户处理较复杂事务的需求,因而dBASEⅢ除引用了顺序结构外,还采用了分支结构和循环结构。

(1)分支程序框图

由于问题较复杂,因而在解决问题前首先要以流程图的形式,将解析问题详细描述出来。图5.2.3-2表示求两个非负整数公约数的分支判断流程图。其中逻辑判断用菱形框表示。

图5.2.3-2 两非负整数公约数分支判断流程

(2)分支程序语句

①简单判断语句

简单判断语句用下述命令实现:

IF〈条件表达式〉

〈语句行序列〉

ENDIF

它表示在〈条件表达式〉为真时,执行下面的〈语句行序列〉;否则执行ENDIF后的语句。

其中,条件表达式可以是多个表达式的组合,多个表达式由比较运算符联结起来,比较运算符可以是下面的操作符:

<、>、=、〈〉或#(不等于)、<=、>=、.AND.、·OR·和.NOT.

例如可以用如下的语句来咨询40岁以上男职工的健康状况。

IF年龄>40.AND.性别=“MAN”

执行显示健康状况语句

ENDIF

这里“显示语句”为语句行序列,它是对符合条件者所要进行的处理命令的集合。

值得注意的是,IF与ENDIF必须成对使用,否则,系统会标识有错。

②选择判断语句

选择判断语句格式为:

IF〈条件表达式〉

〈语句行序列1〉

ELSE

〈语句行序列2〉

ENDIF

与简单判断语句不同,选择判断语句首先判断条件真与假,若为真,则执行语句行序列1;否则,执行语句行序列2,无论条件真假,都必须接着执行ENDIF后面的语句。

例如:

IF y1>y2

y1=y1-y2

ELSE

y2=y2-y1

ENDIF

③用IF语句嵌套实现多分支

有时,由于情况复杂,一个条件不能满足使用者的需要,这时就要在条件语句中再嵌套进条件语句。dBASE Ⅲ提供了两种用于多分支判断语句,其一是IF…ELSE…ENDIF;其二是DOCASE语句。

IF〈条件表达式1〉

IF〈条件表达式2〉

〈语句行序列1〉

ELSE

〈语句行序列2〉

ENDIF

ELSE

IF〈条件表达式3〉

〈语句行序列3〉

ELSE

〈语句行序列4〉

ENDIF

ENDIF

这种结构要求用户每层的IF…ELSE…ENDIF要一一对应,不能交叉嵌套,以免程序设计混乱。在使用时ENDIF后可加注标记,它不影响程序运行。

④用DOCASE语句实现多分支

这是dBASE Ⅲ提供的另一种有效的多分支判断语句。当分支数目较多时,用IF…ELSE…ENDIF就变得复杂而且易错,不直观,这时用DOCASE既直观明了,又具有较强的功能。其命令格式为:

DOCASE

CASE〈条件1〉

〈语句行序列1〉

CASE〈条件2〉

〈语句行序列2〉

CASE〈条件n〉

〈语句行序列n〉

[OTHERWISE]

[〈语句行序列〉]

ENDCASE

程序依次判断DOCASE和ENDCASE间的每个条件,直到判断条件为真,执行其CASE与下一个CASE间的语句行序列,之后执行ENDCASE后面的语句。若没有一个条件符合又没可选项OTHERWISE的情况下,执行ENDCASE后面的语句;若有可选项OTHERWISE,则执行OTHERWISE后面的语句行序列。

4.循环程序设计

上面我们讲的程序,一次只能处理一遍语句,为了能周期性地重复某一段程序,dBASE Ⅲ又引用了DOWHILE…ENDDO命令进行程序循环的处理,用户可根据自己的意愿去控制程序的循环。

(1)自动循环语句及其执行过程

自动循环语句的格式为:

DOWHILE〈条件〉

〈语句行序列〉

[LOOP]

〈语句行序列〉

[EXIT]

ENDDO

执行DO WHILE语句时,若条件为真,则执行DO WHILE到ENDDO之间的语句(循环体),当执行到ENDDO时,又返回到DO WHILE语句,重新判断条件是否成立,若成立,继续执行循环体,否则,执行ENDDO后面的语句。

其中EXIT是可选用语句,它的功能是强迫退出循环,转到执行ENDDO后面的语句。通常它用于遇到某一特殊场合需退出循环的情况,因此,EXIT一定处于IF…ENDIF或DO CASE…ENDCASE判断语句内部。

此外,LOOP也是可选用语句,它的功能是迫使程序不执行LOOP后面的语句而回到循环开始的DO WHILE位置。事实上,它是另一种循环终止语句,它用于阻止某些剩余循环处理的情况,因此,LOOP循环也必定包含在IF…ENDIF或DO CASE…ENDCASE语句内部。

(2)多重循环

所谓多重循环是指在一个循环中嵌套另一个循环,其一般结构如图5.2.3-3所示;

图5.2.3-3 多重循环的一般结构

多重循环的嵌套层数没有限制,但不允许出现交叉循环体,如图5.2.3-4(1)为合法的,5.2.3-4(2)为非法的。

图5.2.3-4 嵌套结构

5.过程及调用

在程序的设计中,常常会遇到反复出现的某些数据运算、数据处理,这些运算或处理的方法、算法大体一样,为了简化程序的设计,常常将一些经常使用的程序设计成独立的程序段作为子程序,存入内存,使用时调用即可。

(1)过程及其调用

如上所述,我们可以编制相对独立用于专门处理某种运算的程序,这个公用程序即为过程。过程的编制、建立、存储以及扩展名(.PRG)均与主程序一样,只是过程的最后一条语句必须是RETURN。

过程的调用随基类型不同分两种。外部过程调用及过程文件中的过程调用。

①外部过程调用

外部过程是用DO命令调用的,以磁盘文件形式单独存储的过程。其调用方法为:

DO〈程序文件名〉[WITH〈参数表〉]

该命令由主程序调用。执行时,将〈程序文件名〉(即过程名)指定的程序调到内存并执行过程中的语句,直至遇到RETURN,返回主程序DO的下一条语句继续执行。

命令中的〈参数表〉要与过程中PARAMETERS定义的参数匹配。

过程中的RETURN,可以采用下面格式:

RETURN[TO MASTER]

当无[TO MASTER]项时,表示过程返回调用它的原位置,有[TO MASTER]项时,表示在过程调用嵌套中,从较深嵌套过程中直接返回到主程序,用法为在深层过程的末尾语句上使用RETURN TO MASTER。

②过程文件中过程的调用

过程文件中的过程是以扩展名为.PRG的文件格式存在磁盘上的,由一个或多个过程组成的过程文件。这些过程的格式为:

PROCEDURE〈过程名〉

〈语句行序列〉

RETUEN

一个过程文件最多可容纳32个过程。在调用时先打开过程文件。其格式为

SETPROCEDURE TO〈过程文件名〉

调用时,仍用DO语句调用,但此时调用的为过程文件中的过程名,而非磁盘文件名。

由于任一时刻只能打开一个过程文件,打开一个新过程文件后,旧的过程文件被系统自动关闭。用户也可以用CLOSE PROCEDURE命令关闭过程文件。

图5.2.3-5(1)(2)分别描述了外部过程调用和过程文件中过程调用的方法。

图5.2.3-5 两种过程调用示意图

(2)过程调用中的参数传递

在过程调用中,我们已涉及到参数表的问题,这是主程序和过程之间进行数据交换的关键。为此dBASE Ⅲ提供了两种办法来解决这一问题。

①利用变量传递参数

本书已对全局变量及局部变量的概念作过介绍,下面我们再作进一步讨论。

全局变量是将某个变量用PUBLIC命令说明,该变量可以在任何嵌套级的程序中使用,而且这种存储变量不会被清除。除非使用RELEASE语句(已介绍过其用法)。

其它未被说明为全局变量的变量均为局部变量,它只在说明它的模块中使用,一旦程序模块返回,该变量将被自动清除。在dBASEⅢ中只能将上层模块数据传给下层模块,反之则不行。如果某个模块的变量与调用它的上层模块的全局变量重名,这时要用PRIVATE语句定义其为局部变量,以避免同上层模块的全局变量混淆,并且在结束调用该模块时,保持调用前上层模块的全局变量值。

②用PARAMETERS语句传递参数

模块间另一种传递变量的方法是使用PARAMETERS命令。该命令的使用格式是:

DO〈过程文件名〉[WITII〈参数清单〉]

PARAMETERS〈参数清单〉

这两条语句必须同时使用,前者放在主程序中使用,后者放在过程中使用。

例如在主程序中有:

SETPROCEDURETO SUBPROC

INPUT“输入考试分数:”TO T1

INPUT“输入实验分数:”TO T2

TOTAL=0

DO CHENGJI WITH T1,T2,TOTAL

?“总分为:”,TOTAL

CLOSE PROCEDURE

过程中文件有

PROCEDURE CHENGJI

PARAMETERS A,B,C

C=0.8*A+0.2*B

RETURN

这时参数T1,T2,TOTAL的值通过DO…WHTH语句传递给A,B,C,通过调用过程进行运算,将C的值又返回给主程序中的TOTAL。

整个过程可以这样描述:当DO中被传递的是一个常数,如上例的T1、T2,则被PARAMETERS的相应位置的变量接受;若DO传递的参数为表达式,则先求表达式的值,然后赋给PARAMETERS中的相应变量,若DO传递的是一个存储变量,如TOTAL,则系统先将DO中的值赋给PARAMETERS中的变量,然后将DO语句变量隐匿起来。在执行过程时,PARAMETERS中变量的变化会使相应的隐匿的存储变量的变化。过程结束后,系统恢复隐匿的存储变量将它们返回主程序,同时清除PARAMETERS中的所有存储变量。

上一篇:多媒体的应用 下一篇:工程师手册目录
分享到: