第六章程序设计基础程序文件常用命令子程序、过程及函数VisualFoxPro的工作方式VF系统有三种工作方式:单命令方式、菜单方式及程序文件方式。单命令方式:输入一条命令,完成一个操作。VF单命令方式利用Command窗口实现,用户通过Command窗口输入命令,并执行操作。窗口中可输入单个操作命令和系统命令,完成对数据库的操作管理和系统环境的设置;也可建立命令文件及运行Command窗口不仅是VF命令的执行窗口,也是VF命令文件的编辑窗口。VisualFoxPro的工作方式菜单方式:通过打开不同的菜单选择并完成不同的操作VF中也可通过系统提供的菜单项,对数据库资源进行操作管理和对系统环境进行设置;并通过菜单建立命令文件及运行命令文件。程序文件方式:通过程序文件中的命令完成不同的操作。程序文件也叫做命令文件。运用程序文件方式进行数据库管理,是通过程序文件编辑工具,将对数据库资源进行操作管理的命令和对系统环境进行设置的命令,集中在一个以(.PRG)为扩展名的命令文件中,然后再通过菜单方式或命令方式运行该命令文件。程序文件的建立与编辑任何可建立、编辑文本文件的工具,都可创建和编辑VF程序文件。这些编辑工具,可以是VF系统提供的内部编辑器,也可以是其它常用文本编辑软件。建立、编辑程序文件有两种方式:命令方式MODIFYCOMMAND〈程序文件名〉菜单方式“文件”菜单→选择“新建”→选择“程序”→选择“新建文件”→在“程序文件”编辑窗口,输入程序文件,并保存。程序文件的调用调用程序文件,即运行,是程序文件建立的最终目的。这里仅介绍两种调用方法。命令方式:在Command窗口中输入命令,则程序文件被调用。DO〈程序文件名〉菜单方式:“程序”菜单中选择“运行”,在“运行”窗口,输入被调用的程序文件名即可。程序的基本结构VF系统的程序有两个特点:一是程序控制流模式,由顺序、分支、循环三种基本结构构成。二是面向对象可视化的结构程序模块,在每个模块的内部也是由程序控制流组成。顺序结构:程序执行时,根据程序中语句的书写顺序依次执行的命令序列。分支结构:程序执行时,根据不同的条件,选择执行不同的程序语句,用来解决有选择、有转移的诸多问题。循环结构:能使某些语句或程序段重复执行若干次。如果某些语句或程序段需要在一个固定的位置上重复操作,使用循环是最好的选择。程序的基本结构过程结构应用程序中,有些程序段需要反复执行,这些程序段不在一个固定位置上,而是分散在程序的许多位置上重复执行,可将其与嵌入它的程序分开,形成独立的程序序列,待使用时再调入程序中,以实现不同位置上的重复操作。这样增强了程序的可读性和模块化。这种具有独立功能而且可被其它程序调用的程序序列为过程。顺序结构基本输出语句?|??表达式表基本输入语句单字符输入:WAIT多字符输入:ACCEPT各类型数据输入:INPUT格式输入输出语句@行,列…SAY表达式…GET变量READ分支结构分支结构三种形式:单向分支、双向分支、多向分支单向分支:根据用户设置的条件表达式的值,决定某一操作是否执行。语句格式:IF〈条件表达式〈命令行序列〉ENDIF语句功能:首先计算〈条件表达式〉的值,当值为真时执行〈命令行序列〉;否则执行ENDIF后面的第一条命令。分支结构双向分支:根据用户设置的条件表达式的值,选择两个操作中的一个来执行。语句格式:IF〈条件表达式〉〈命令行序列1〉ELSE〈命令行序列2〉ENDIF语句功能:首先计算〈条件表达式〉的值,当值为真时,执行〈命令行序列1〉中的命令;否则执行〈命令行序列2〉中的命令;执行完〈命令行序列1〉或〈命令行序列2〉后都将执行ENDIF后面的第一条命令。分支结构多向分支:根据多个条件表达式的值,选择执行多个操作中的一个对应执行。语句格式:DOCASECASE〈条件表达式1〉〈命令行序列1〉[CASE〈条件表达式2〉〈命令行序列2〉……CASE〈条件表达式N〉〈命令行序列N〉][OTHERWISE〈命令行序列N+1〉]ENDCASE分支结构DOCASE功能:根据给出的N个〈条件表达式〉的值,选择N+1个〈命令行序列〉中的一个执行。当所有CASE中〈条件〉的值都是假时,如有OTHERWISE,则执行〈命令行序列N+1〉,再执行ENDCASE后面的第一条命令;否则直接执行ENDCASE后面的第一条命令。使用分支语句应注意IF…ENDIF和DOCASE…ENDCASE必须配对,DOCASE与第一个CASE〈条件表达式〉之间不应有任何命令。〈条件表达式〉可以是各种表达式或函数的组合,其值必须是逻辑值。〈命令行序列〉可由一个或多个命令组成,可以是条件控制语句组成的嵌套结构。DOCASE…ENDCASE,每次最多只能执行一个〈命令行序列〉。多个CASE项的〈条件〉值为真时,只执行第一个〈条件〉值为真的〈命令行序列〉循环结构常用的循环语句有三种形式:“当”型循环控制语句、“计数”型循环控制语句、“指针”“当”型循环控制语句:即根据条件表达式的值,决定循环体内语句的执行次数。语句格式:DOWHILE〈条件表达式〉〈命令行序列〉ENDDO语句功能:通过〈条件表达式〉的值来控制循环。执行时反复判断〈条件〉的值,当〈条件〉的值为“真”时,执行〈命令行序列〉;否则结束循环,执行ENDDO后面的第一条命令。循环结构“计数”型循环控制语句:根据用户设置的循环变量的初值、终值和步长,决定循环体内语句的执行次数据。语句格式:FOR〈循环变量〉=〈循环变量初值〉TO〈循环变量终值〉[STEP〈循环变量步长〉]〈命令行序列〉ENDFOR|NEXT语句功能:用〈循环变量〉来控制〈命令行序列〉的执行次数。执行时先将〈循环变量初值〉赋给〈循环变量〉,再判断〈循环变量〉是否大于或小于〈循环变量终值〉,若结果为“真”,则结束循环,执行ENDFOR后面的第一条命令;否则执行〈命令行序列〉。〈循环变量〉自动按〈步长〉增加或减少,再重新判断〈循环变量〉当前值是否大于或小于〈终值〉,直到其结果为真。循环结构“指针”型循环控制语句:根据用户设置的表中的当前记录指针,决定循环体内语句的执行次数据。语句格式:SCAN[〈范围〉][FOR〈条件表达式1〉[WHILE〈条件表达式2〉]]〈命令行序列〉ENDSCAN语句功能:在指定范围内,用数据记录指针来控制循环次数。执行时先判断函数EOF()的值,若值为“真”则结束循环,否则结合〈条件表达式1〉或〈条件表达式2〉,执行〈命令行序列〉,记录指针移到指定范围和条件内的下一记录,重新判断函数EOF()的值,直到函数EOF()的值为真时结束循环。使用循环语句时应注意DOWHILE和ENDDO、FOR和ENDFOR、SCAN和ENDSCAN〈命令行序列〉可以是任何FoxPro命令或语句,也可以是循环语句,即可以为多重循环。〈循环变量〉应是数值型内存变量或数组元素EXIT和LOOP嵌入在循环体内,可改变循环次数,但不能单独使用。EXIT的功能是跳出循环,转去执行ENDDO、ENDFOR、ENDSCAN后面的第一条命令;LOOP的功能是转回到循环的开始处,重新对“条件”判断,相当于执行一次ENDDO、ENDFOR、ENDSCAN,它可改变〈命令行序列〉过程VF系统中程序是独立存放在磁盘上的程序文件,使用时用户通过文件名调用并执行。为实现用户的某种目的,可能需要由多个程序完成。调用过程语句,即执行已有的过程。语句格式:DO〈过程名〉语句功能:执行以〈过程名〉为名的过程过程返回语句,即返回过程的调用处。语句格式:RETURN[TOMASTER|TO〈过程名〉]语句功能:将控制返回到调用程序中调用命令的下一语句。用户自定义函数自定义函数与子程序的主要区别是函数必须返回一个函数值,而子程序无此要求。因此自定义函数可以象程序文件一样建立,在其最后一条返回语句中必须指出函数的返回值,且程序文件名应改为函数名,便于主程序调用格式:FUNCTION函数名[PARAMETERS参数表]语句组[RETURN表达式]ENDFUNC用户自定义函数自定义函数的调用方法与系统函数的调用相同,形式为:〈函数名〉(参数表)由于自定义函数返回一个表达式的值,所以调用符号只能以表达式的一项出现。系统允许自定义函数的最后一条命令不是RETURN〈表达式〉,或虽使用RETURN,但并不说明返回值,这时系统在遇到下一个FUNCTION或该程序文件的结束语句时,函数自动执行隐含返回。过程与自定义函数的区别在于过程用于执行某个动作,而自定义函数用于返回一个值;调用方式也不同,过程的调用是一个独立命令,执行结果以另一个命令来输出;而函数的调用符号表示一个表达式的值,它除了可单独输出外,还可直接写在表达式中作为其中一项输出。变量的作用域全程量:在有嵌套结构的任何程序中都可使用的变量称为全程量。有两种定义方法:在命令窗口中定义的变量不属于某个应用程序,故它们都是全程量。PUBLIC〈内存变量表〉,把指定的内存变量设置为全程量,并赋初值.F.局部量:在一个程序内部定义且未被指明为全程量的即为局部量。局部量只能在定义它的局部范围中有效,该程序执行结束后,有关变量即被自动清除。PRIVATE[〈内存变量表〉][ALL[LIKE|EXCEPT〈通配符〉]]变量的作用域上级程序定义的局部量要在上级程序执行结束后才失效,因此这些局部量可以在其下级程序中使用;而下级程序中的局部量在其执行后即被清除(失效),故在其上级程序中不能引用局部量可以与全程量或上级的局部量同名,但需用PRIVATE命令屏蔽某个功能模块中定义的局部量不能在与它无调用关系的其他模块中使用。