VF程序文件的建立与设计
程序文件的建立与设计:
Visual FoxPro程序文件,是一个以(.PRG)为扩展名的文本文件。任何可以建立、编辑文本文件的工具,都可以创建和编辑Visual FoxPro程序文件。这些文本编辑工具,可以是Visual FoxPro系统提供的内部编辑器,也可以是其它常用文本编辑软件。在文本编辑环境下,不仅可以对程序文件进行输入和修改,还可以实现字符串查找、替换、删除和编辑功能。
建立、编辑程序文件有两种方式:
1.命令方式: MODIFY COMMAND 〈程序文件名〉
2.菜单方式 : 打开“文件”菜单,选择“新建”;在“新建”窗口,选择“程序”,再选择“新建文件”;在“程序文件”编辑窗口,输入程序文件并保存,此时建立程序文件的操作结束。
程序文件的调用:即运行程序文件,是程序文件建立的最终目的。在Visual FoxPro系统中,调用程序文件有很多方法,在这里仅介绍其中两种方法。
1.命令方式:在Command 窗口中,输入如下命令,则程序文件被调用。
命令格式: DO 〈程序文件名〉
2.菜单方式
以菜单方式调用程序文件,操作方法如下:
(1)在Visual FoxPro系统主菜单下,打开“程序”菜单,选择“运行”。
(2)在“运行”窗口,输入被调用的程序文件名即可。
程序的基本结构:
Visual FoxPro系统提供的命令丰富,且功能强大,把这些命令和程序设计语句有效地组织在一起,就形成了实现某一特定功能的程序。
Visual FoxPro系统的程序有两个特点:一是程序控制流模式,由顺序、分支、循环三种基本结构构成。二是面向对象可视化的结构程序模块,在每个模块的内部也是由程序控制流组成。
常见的控制结构如下:
1.顺序结构(第35套)
顺序结构是在程序执行时,根据程序中语句的书写顺序依次执行的命令序列。Visual FoxPro系统中的大多数命令都可以作为顺序结构中的语句。
2.分支结构:分支结构是在程序执行时,根据不同的条件,选择执行不同的程序语句,用来解决有选择、有转移的诸多问题。
3.循环结构
循环结构则能够使某些语句或程序段重复执行若干次。如果某些语句或程序段需要在一个固定的位置上重复操作,使用循环是最好的选择。
4.过程结构
在许多应用程序中,有一些程序段需要反复执行多次,这些程序段不在一个固定的位置上,而是分散在程序的许多位置上重复执行,可将其与嵌入它的程序分开,形成独立的程序序列,待使用时再调入程序中,以实现不同位置上的重复操作。这样做增强了程序的可读性和模块化。我们称这种具有独立功能而且可以被其它程序调用的程序序列为过程。
分支结构-单向分支
分支结构形式有如下三种:
1.单向分支:即根据用户设置的条件表达式的值,决定某一操作是否执行。
(1)语句格式:
IF〈条件表达式〉
〈命令行序列〉
ENDIF
(2)语句功能:
该语句首先计算〈条件表达式〉的值,当〈条件表达式〉的值为真时,执行〈命令行序列〉;否则,执行ENDIF后面的第一条命令。
2.双向分支:即根据用户设置的条件表达式的值,选择两个操作中的一个来执行。
(1)语句格式:
IF〈条件表达式〉
〈命令行序列1〉
ELSE
〈命令行序列2〉
ENDIF
(2)语句功能:
该语句首先计算〈条件表达式〉的值,当〈条件表达式〉的值为真时,执行〈命令行序列1〉中的命令;否则,执行〈命令行序列2〉中的命令;执行完〈命令行序列1〉或〈命令行序列2〉后都将执行ENDIF后面的第一条命令。
3.多向分支:,即根据多个条件表达式的值,选择执行多个操作中的一个对应执行 。
(1)语句格式:
DO CASE
CASE〈条件表达式1〉
〈命令行序列1〉
[CASE〈条件表达式2〉
〈命令行序列2〉
… …
CASE〈条件表达式N〉
〈命令行序列N〉]
[OTHERWISE
〈命令行序列N+1〉]
ENDCASE
(2)语句功能:该语句根据给出的N个〈条件表达式〉的值,选择N+1个〈命令行序列〉中的一个执行。当所有CASE中〈条件表达式〉的值都是假时,如果有OTHERWISE项,则执行〈命令行序列N+1〉,再执行ENDCASE后面的第一条命令;否则,直接执行ENDCASE后面的第一条命令。
使用分支语句应注意的几点:
(1)IF… … ENDIF和DO CASE… … ENDCASE 必须配对使用,DO CASE与第一个CASE〈条件表达式〉之间不应有任何命令。
(2)〈条件表达式〉可以是各种表达式或函数的组合,其值必须是逻辑值。
(3)〈命令行序列〉可以由一个或多个命令组成,可以是条件控制语句组成的嵌套结构。
(4)DO CASE… … ENDCASE 命令,每次最多只能执行一个〈命令行序列〉。在多个CASE项的〈条件表达式〉值为真时,只执行第一个〈条件表达式〉值为真的〈命令行序列〉,然后执行ENDCASE的后面的第一条命令。
循环结构- “当”型循环 常用的循环语句有以下三种形式:
1.“当”型循环控制语句,即根据条件表达式的值,决定循环体内语句的执行次数。
(1)语句格式:
DO WHILE 〈条件表达式〉
〈命令行序列〉
[LOOP/EXIT]
ENDDO
(2)语句功能:该语句通过〈条件表达式〉的值来控制循环。执行语句时,反复判断〈条件表达式〉的值,当〈条件表达式〉的值为“真”时,执行〈命令行序列〉;否则,结束循环,并执行ENDDO 后面的第一条命令。
循环结构- “计数”型循环
2.“计数”型循环控制语句,即根据用户设置的循环变量的初值、终值和步长,决定循环体内语句的执行次数据。
(1)语句格式:
FOR〈循环变量〉=〈循环变量初值〉TO〈循环 变量 终值〉[STEP〈循环变量步长〉]
〈命令行序列〉
[LOOP/EXIT]
ENDFOR|NEXT
(2)语句功能:该语句用〈循环变量〉来控制〈命令行序列〉的执行次数。执行语句时,首先将〈循环变量初值〉赋给〈循环变量〉,然后判断〈循环变量〉是否大于或小于〈循环变量终值〉,若结果为“真”,则结束循环,执行ENDFOR 后面的第一条命令;否则,执行〈命令行序列〉,〈循环变量〉自动按〈循环变量步长〉增加或减少,再重新判断〈循环变量〉当前的值是否大于或小于〈循环变量终值〉,直到其结果为真。
循环结构- “指针”型循环
3.“指针”型循环控制语句,即根据用户设置的表中的当前记录指针,决定循环体内语句的执行次数据。
(1)语句格式:
SCAN[〈范围〉][FOR〈条件表达式〉
〈命令行序列〉
[LOOP/EXIT]
ENDSCAN
(2)语句功能: 该语句在指定的范围内,用数据记录指针来控制循环次数。执行语句时,首先判断函数EOF()的值,若其值为“真”,则结束循环,否则,结合〈条件表达式1〉或〈条件表达式2〉,执行〈命令行序列〉,记录指针移到指定的范围和条件内的下一条记录,重新判断函数EOF()的值,直到函数EOF()的值为真时结束循环。
使用循环语句时应注意的几点
(1)DO WHILE和ENDDO、FOR和ENDFOR、SCAN和ENDSCAN必须配对使用。
(2)〈命令行序列〉可是任何FoxPro命令或语句,也可以是循环语句,即可以为多重循环。
(3)〈循环变量〉应是数值型的内存变量或数组元素。
(4)EXIT和LOOP命令嵌入在循环体内,可以改变循环次数,但是不能单独使用。EXIT的功能是跳出循环,转去执行ENDDO、ENDFOR、ENDSCAN后面的第一条命令;LOOP的功能是转回到循环的开始处,重新对“条件”进行判断,相当于执行了一次ENDDO、ENDFOR、ENDSCAN命令,它可以改变〈命令行序列〉中部分命令的执行次数。EXIT、LOOP可以出现在〈命令行序列〉的任意位置。
过程
在Visual FoxPro系统中,程序是独立存放在磁盘上的程序文件,使用时用户通过文件名调用并执行。为了实现用户的某种目的,很可能需要由多个程序完成。
1.调用过程语句,即执行已有的过程。
(1)语句格式: DO 〈过程名〉
(2)语句功能:执行以〈过程名〉为名的过程。
2.过程返回语句,即返回过程的调用处。
(1)语句格式:RETURN[TO MASTER|TO〈过程名〉]
(2)语句功能:将控制返回到调用程序中调用命令的下一语句。
简单的输入输出命令
1.ACCEPT命令
【格式】:ACCEPT [<提示信息>] TO <内存变量>
【功能】在程序执行过程中,将用户交互式输入的内容作为字符串赋值给指定内存变量。
该命令只接受字符型数据,输入的字符串不需要加定界符
2.INPUT命令
【格式】: INPUT [<提示信息>] TO <内存变量>
【功能】在程序执行过程中,将用户交互式输入的内容赋值给指定内存变量
可以输入字符型、数值型、逻辑型、日期型和日期时间型等类型数据,而且可以是常量、变量、函数或表达式等形式,按回车键结束输入,系统将输入的数据赋值给<内存变量>。
3.WAIT命令
【格式】: WAIT [<提示信息>][TO<内存变量>]
【功能】显示提示信息,暂停程序执行,直到用户按任意键或单击鼠标时继续执行程序。
若选择可选项[TO <内存变量>],将输入的单个字符作为字符型数据赋给指定的<内存变量>;若用户是按Enter键或单击鼠标,<内存变量>的值为空串。若省略所有可选项,屏幕显示“键入任意键继续……”默认提示信息
三条输入命令的异同:ACCEPT命令只能接受字符型数据,不需定界符,输入完毕按回车键结束;WAIT命令只能输入单个字符,且不需定界符,输入完毕不需按回车键; INPUT命令可接受数值型、字符型、逻辑型、日期型和日期时间型数据,数据形式可以是常量、变量、函数和表达式,如果是字符串,需用定界符,输入完毕按回车键结束。
4.定位输入命令
【命令】:@<行,列>SAY<提示信息>| GET <变量>READ
【功能】在屏幕指定的行列位置输入数据。
【说明】命令中的各选项说明如下:
<行,列>是指屏幕窗口的位置。
SAY<提示信息>给出提示信息。
GET <变量>取得变量的值。
GET子句必须使用命令READ激活。
GET <变量>必须先定义再使用。比如先申请为多个宽度的空格
内存变量的作用域-全局变量
1.全局变量,指在所有程序模块中都有效的内存变量
在程序或过程中定义全局变量的语句为:
【格式】PUBLIC <内存变量表>
例:Public X,Y && X、Y被显示定义为全局变量
Z=0 &&Z变量被隐式定义
?Y,Z && Y=.F. Z=0,变量的初始值为.F.
【说明】(1)当定义多个变量时,各变量名之间用逗号隔开;
(2)用PUBLIC语句定义过的内存变量,在程序执行期可以在任何层次的程序模块中使用;
(3)变量定义语句要放在使用此变量的语句之前,否则会出错;
2.局部变量,指在建立它的程序以及被此程序调用的子程序中有效的内存变量 。在程序中没有被显示定义为全局变量的内存变量都被看作局部变量。局部变量可以用PRIVATE说明.
命令格式为:
【格式】PRIVATE <内存变量表>
【说明】(1)用PRIVATE语句说明的内存变量,只能在本程序及其下属过程中使用,退出程序时,变量自动释放;
(2)用PRIVATE语句在过程中说明的局部变量,可以与上层调用程序出现的内存变量同名,但它们是不同的变量,在执行被调用过程期间,上层过程中的同名变量将被隐藏。即:在下级程序中再使用PRIVATE显示定义,就为同名变量, 该变量的值不能返回到主程序。
重要提示:凡是过程中未经说明的内存变量,系统一律认为是局部变量,这种方式叫做隐式定义方式。也可以使用专门命令来定义局部变量,即显式定义方式。在同一过程中,用隐式或显式定义的局部变量的作用域完全相同。在主程序或上级过程中未经Private语句定义的局部变量,在下级过程中也未经显式定义,它的新值可以返回主程序或上级过程;若在下级过程中进行了显式定义,即定义为同名变量,则其新值不能返回主程序。
过程的带参数调用
1.带参数调用:调用过程语句,即执行已有的过程,并为调用过程提供过程参数。
【格式】: DO 〈子程序名〉 WITH <参数表>
语句功能:执行以〈过程名〉为名的过程。该处的参数表又称为实参表。其中的参数为常量、已赋值的变量或数值表达式。
2.接收参数
3.【格式】PARAMETERS <参数表>
语句功能:该命令必须位于被调用过程的第一条可执行语句处。此处的参数表称为形参表,其中的参数一般为内类变量。形参与实参的个数应相等、数据类型和个数要对应相同。
重要提示
1.值传递方式分为:变量传递与参数传递。
2.在参数传递过程中,如果实参是常量或是表达式,称为按值传递,即把实参的值传给形参,形参不能返回到实参;如果实参是变量,称为按引用传递,即把实参的地址传给形参,形参可以将值返回给实参;
3.在参数传递过程中,如果实参不是变量,它将作为变量传递到它的下级过程中。
4. 若形参被显示定义为局部变量,仍然可以返回到上级程序。带参数的过程传递是利用参数将值传递到主程序,不是通过变量来传递值。
读程序第7题(答案见课件)
X1=1
X2=2
DO P1 WITH X1,X2
?X1,X2
X1=1
X2=2
DO P1 WITH X1,X1+X2
?X1,X2
RETURN
自定义函数
自定义函数和过程一样,可以以独立的程序文件形式单独存储在磁盘上,也可以放在过程文件或直接放在程序文件中
自定义函数具有如下语法结构:
FUNCTION <函数名>
PARAMETER <参数表>
<函数体命令序列>
RETURN <表达式>
自定义函数的调用语法与系统函数的调用相同。
例题:计算圆面积(example.prg)
INPUT ”请输入圆的半径:” TO R
? ”圆的面积为:”,AREA(R)
SET TALK ON
FUNCTION AREA && 计算面积的函数
PARAMETER X && 形参说明
RETURN (3.1416*X**2)
内部过程:把多个过程组织在一个文件中(这个文件称之为过程文件),或者把过程放在调用它的程序文件的末尾。
Visual FoxPro为了识别过程文件或者程序文件中的不同过程,规定过程文件或者程序文件中的过程必需用PROCEDURE语句说明。其格式为:
PROCEDURE <过程名>
<命令序列>
[RETURN [<表达式>]]
过程文件的建立:过程文件的建立方法与程序文件相同。可用MODIFY COMMAND <过程文件名>命令来建立。
过程文件的结构一般为:
PROCEDURE <过程名1>
<命令序列1>
RETURN
PROCEDURE <过程名2>
<命令序列2>
RETURN
过程文件的调用:调用某过程文件中的过程时,必须先打开该过程文件打开过程文件命令为:
【格式】:\SET PROCEDURE TO <过程文件名>
任何时候系统只能打开一过程文件,当打开一新过程文件时,原已打开的过程文件自动关闭。
过程文件的关闭:【格式一】SET PROCEDURE TO【格式二】CLOSE PROCEDURE
外部过程:也叫子程序,和主程序一样是以程序文件(.PRG)的形式单独存储在磁盘上
【例】分别建立如下程序文件,
* MAIN.PRG
SET TALK OFF
? ”正在执行主程序”
DO SUB1
SET TALK ON
*SUB1.PRG
? ”正在执行SUB1”
RETURN