1、第4章 程序设计初步 4.1 程序文件 VFP VFP程序设计包括结构化程序设计和面向对象程序设计。程序设计包括结构化程序设计和面向对象程序设计。 结构化程序设计是传统的程序设计方法,若仍用这种方法结构化程序设计是传统的程序设计方法,若仍用这种方法 来设计来设计VPPVPP程序的用户界面,不仅难度很大,而且十分麻烦。程序的用户界面,不仅难度很大,而且十分麻烦。 面向对象程序则面向对象,用户界面可利用面向对象程序则面向对象,用户界面可利用VFPVFP提供的辅助提供的辅助 工具来设计,应用程序也可自动生成,但是仍需用户编写一些工具来设计,应用程序也可自动生成,但是仍需用户编写一些 过程代码。过程代
2、码。 应注意的是,结构化程序设计仍是面向对象程序设计的基应注意的是,结构化程序设计仍是面向对象程序设计的基 础。础。 一、程序文件的建立和执行一、程序文件的建立和执行 1 1、建立程序文件、建立程序文件 VFPVFP将命令文件称为程序文件或程序。本节主要介绍程将命令文件称为程序文件或程序。本节主要介绍程 序的建立、执行以及专用子程序文件中的若干命令。序的建立、执行以及专用子程序文件中的若干命令。 建立或修改程序文件可以使用的命令格式:建立或修改程序文件可以使用的命令格式: MODIFY COMMAND MODIFY COMMAND () 功能:打开文本编辑窗口,用来建立或修改程序文件。功能:打
3、开文本编辑窗口,用来建立或修改程序文件。 说明说明: : (1 1)程序文件由)程序文件由VPPVPP命令组成。命令组成。 由用户指由用户指 定,定,缺省的扩展名为缺省的扩展名为.PRG.PRG。文件名前也可指明路径,。文件名前也可指明路径, 例如例如MODIFY COMMAND E4-01MODIFY COMMAND E4-01。 (2 2)关闭编辑窗口的主要方法有:按)关闭编辑窗口的主要方法有:按Ctrl+wCtrl+w键,键, 按按EscEsc键,在编辑窗口双击控制菜单按钮或单击关闭键,在编辑窗口双击控制菜单按钮或单击关闭 按钮,按按钮,按Ctrl+wCtrl+w可将文件立即存盘并且退出
4、编辑。可将文件立即存盘并且退出编辑。 (3 3)文本编辑窗口也可以编辑由)文本编辑窗口也可以编辑由ASCIIASCII字符组成字符组成 的的.PRG.PRG文件。文件。.PRG.PRG文件中是程序的内容,可以由系统文件中是程序的内容,可以由系统 编译后运行。编译后运行。 2 2、程序的运行、程序的运行 命令格式:命令格式: DO DO () 功能:执行由功能:执行由 文件名)表示的程序,如文件名)表示的程序,如DO E4-01DO E4-01。 所谓执行程序,就是依次执行程序中的命令。所谓执行程序,就是依次执行程序中的命令。 DODO命令默认运行命令默认运行.PRG.PRG程序,如果要运行的是
5、程序,如果要运行的是.PRG.PRG程序,程序, DoDo命令中的命令中的 只需取文件主名。要运行其它程序,只需取文件主名。要运行其它程序, 中须包括扩展名。中须包括扩展名。 3 3、程序书写规则、程序书写规则 (1 1)命令分行)命令分行 程序中每条命令都以回车结尾,若需分行书写,则程序中每条命令都以回车结尾,若需分行书写,则 在一行终了时键入续行符在一行终了时键入续行符“;”,然后按回车键。,然后按回车键。 (2 2)命令注释)命令注释 程序中可插入注释,以提高程序的可读性。程序中可插入注释,以提高程序的可读性。 注释行以符号注释行以符号“* *”开头,它是一条非执行命令,开头,它是一条非
6、执行命令, 仅在程序中显示。命令后也可以添加注释,这种注释以仅在程序中显示。命令后也可以添加注释,这种注释以 符号符号“& &”开头。开头。 4 4、求解的基本逻辑与程序通用性、求解的基本逻辑与程序通用性 (1 1)求解的基本逻辑)求解的基本逻辑 VFPVFP程序多数用于数据处理,解决问题的基本逻辑程序多数用于数据处理,解决问题的基本逻辑 是:是: 输入数据处理数据一输出数据。输入数据处理数据一输出数据。 (2 2)程序的通用性)程序的通用性 程序的通用性指程序对多种场合的适应性,通用性程序的通用性指程序对多种场合的适应性,通用性 好的程序的应用范围较广。好的程序的应用范围较广。 二、程序文件
7、中的专用命令二、程序文件中的专用命令 1 1、程序结尾的专用命令、程序结尾的专用命令 (1 1)RETURNRETURN命令:命令: 它能使程序执行结束,并返回到调用它的上级程序继续执行,若它能使程序执行结束,并返回到调用它的上级程序继续执行,若 无上级程序则返回到命令窗口。无上级程序则返回到命令窗口。RETURNRETURN命令一般允许缺省。命令一般允许缺省。 (2 2)CANCELCANCEL命令:命令: 它能使程序运行终止,清除程序的私有变量,并返回到命令窗口。它能使程序运行终止,清除程序的私有变量,并返回到命令窗口。 (3 3)QUITQUIT命令:命令: 若要退出若要退出VFPVFP
8、系统,可使用系统,可使用QUITQUIT命令,该命令与文件菜单的退出命命令,该命令与文件菜单的退出命 令功能相同。使用令功能相同。使用QUITQUIT命令正常退出,就不会出现数据丢失或打开的命令正常退出,就不会出现数据丢失或打开的 文件被破坏等情况文件被破坏等情况. .还会自动删去磁盘中的临时文件;程序终止运行后还会自动删去磁盘中的临时文件;程序终止运行后 将返回到将返回到WINDOWSWINDOWS。 2 2、输入输出专用命令、输入输出专用命令 传统的专用数据输入命令有传统的专用数据输入命令有INPUTINPUT,ACCEPTACCEPT等多种,数据输出命等多种,数据输出命 令有令有TEXT
9、TEXTENDTEXTENDTEXT命令等,现均已很少使用。这里仅介绍定位输入命令等,现均已很少使用。这里仅介绍定位输入 格出命令。格出命令。 命令基本格式:命令基本格式: SAY SAY GET GET DEFAULT DEFAULT 2 功能:在屏幕的指定行列输出功能:在屏幕的指定行列输出SAYSAY子句的表达式值,并可修改子句的表达式值,并可修改GETGET 子句的变量值。子句的变量值。 说明:说明: 在在DOSDOS系统中,屏幕分成系统中,屏幕分成8080列,列,2525行,编号分别为行,编号分别为0 07979和和0 02424。 使用以上命令可以定位输出相关内容或者交互给变量赋值。
10、使用以上命令可以定位输出相关内容或者交互给变量赋值。 (1 1) 表示数据在窗口中显示的位置,行自顶表示数据在窗口中显示的位置,行自顶 向下编号,列自左向右编号,编号均从向下编号,列自左向右编号,编号均从0 0开始。行与列都开始。行与列都 是数值表达式,还可使用十进制小数精确定位。是数值表达式,还可使用十进制小数精确定位。 (2 2)SAYSAY子句用来输出数据,子句用来输出数据,GETGET子句用来输入及编辑子句用来输入及编辑 数据。若缺省数据。若缺省SAYSAY子句,子句,GETGET变量值从指定位置开始显示:变量值从指定位置开始显示: 含有含有SAYSAY子句时先显示其表达式值,然后空开
11、一格显示子句时先显示其表达式值,然后空开一格显示 GETGET变量的值。变量的值。SAYSAY和和GETGET子句数据显示时的背景色不一样,子句数据显示时的背景色不一样, 前者以标准型显示,后者以增强型显示。前者以标准型显示,后者以增强型显示。 (3 3)GETGET子句中的变量子句中的变量必须具有初值,或用必须具有初值,或用 DEFAULTDEFAULT子句的子句的 指定初值指定初值。初值一旦指定,该。初值一旦指定,该 变量的类型在编辑期间就不能改变,字符型变量的宽度变量的类型在编辑期间就不能改变,字符型变量的宽度 与数值型变量的小数位数也无法再变。与数值型变量的小数位数也无法再变。 (4
12、4)GETGET子句的变量必须用子句的变量必须用READREAD命令来激活命令来激活,也就,也就 是说,在若干带有是说,在若干带有GETGET子句的定位输入输出命令后,必子句的定位输入输出命令后,必 须遇到须遇到READREAD命令才能编辑命令才能编辑GETGET变量。当光标移出这些变量。当光标移出这些GETGET 变量组成的区域时变量组成的区域时READREAD命令执行结束。命令执行结束。 示例:示例: 在命令窗口直接输入以下命令:在命令窗口直接输入以下命令: a=1a=1 2,30 say 2,30 say 请输入数值请输入数值 get a get a read read ?a ?a 3
13、3、WAITWAIT命令命令 WAIT WAIT TO TO WINDOW WINDOW AT AT 行行, ,列列 NOWAIT CLEAR | NOCLEAR TIMEOUT NOWAIT CLEAR | NOCLEAR TIMEOUT 功能:暂停程序的运行,直到用户输入一个字符。也可功能:暂停程序的运行,直到用户输入一个字符。也可 只用于输出一条提示信息。只用于输出一条提示信息。 说明;说明; (1 1)该命令使)该命令使VFPVFP程序暂停运行,等用户按任一键(或程序暂停运行,等用户按任一键(或 回车)后,程序继续运行。回车)后,程序继续运行。 (2 2) 用来保存键入的字符,如果不选
14、用来保存键入的字符,如果不选TOTO子子 句,则输入的数据不予保存。句,则输入的数据不予保存。 (3 3)如果缺省)如果缺省 ,则执行命令后屏幕显,则执行命令后屏幕显 示示“按任意键继续按任意键继续”,提示按任一键将继续运行。,提示按任一键将继续运行。 (4 4)WINDOWWINDOW子句可使主屏幕上出现一个子句可使主屏幕上出现一个WAITWAIT提示提示 窗口。位置由窗口。位置由ATAT选项的选项的 、 来指定。若缺省来指定。若缺省ATAT选选 项,项, 将显示在主屏幕右上角。将显示在主屏幕右上角。 示例:示例:wait wait 请输入检查内容请输入检查内容 window to a wi
15、ndow to a wait wait 请输入检查内容请输入检查内容 window at 20,30 to a window at 20,30 to a (5 5)若使用)若使用NOWAITNOWAIT选项,系统将不等用户按键,选项,系统将不等用户按键, 立即往下执行。立即往下执行。 (6 6)CLEARCLEAR选项用来关闭提示窗口。选项用来关闭提示窗口。NOCLEARNOCLEAR表示表示 不关闭提示窗口将在执行到下一个不关闭提示窗口将在执行到下一个WAITWINDOWWAITWINDOW命令时命令时 自动关闭。自动关闭。 (7 7)TIMEOUTTIMEOUT子句用来设定等待时间(秒数)
16、,一子句用来设定等待时间(秒数),一 旦超时自动往下执行命令。旦超时自动往下执行命令。 示例:示例:wait wait 请输入检查内容请输入检查内容 window at 20,30 window at 20,30 timeout 5timeout 5 4.2 程序控制结构 一、顺序结构一、顺序结构 顺序结构的程序运行时按照语句排列的先后顺序,一条顺序结构的程序运行时按照语句排列的先后顺序,一条 一条的依次执行。它是程序中基本的结构。一条的依次执行。它是程序中基本的结构。 二、分支结构二、分支结构 1 1、简单的条件语句、简单的条件语句 语句格式:语句格式:IF IF ENDIF ENDIF 功
17、能:首先计算功能:首先计算 的值,若其值为真,对的值,若其值为真,对IFIF 与与ENDIFENDIF之间的语句顺序执行,然后执行之间的语句顺序执行,然后执行ENDIFENDIF后面的语句;后面的语句; 若其值为假,直接执行若其值为假,直接执行ENDIFENDIF后面的语句。后面的语句。 示例:示例:e4-03.PRGe4-03.PRG 2 2、带、带ELSEELSE的条件语句的条件语句 语句格式:语句格式: IF IF 1 ELSE ELSE 2 ENDIF ENDIF 功能:根据功能:根据 的逻辑值,选择执行两个语句的逻辑值,选择执行两个语句 序列中的一个。序列中的一个。 若若 值为真,先
18、执行值为真,先执行 1,然后再,然后再 执行执行ENDIFENDIF后面的语句;后面的语句; 若其值为假,先执行若其值为假,先执行 2,然后再执行,然后再执行ENDIFENDIF后后 面的语句。面的语句。 示例:示例:e4-04.prge4-04.prg 补充命令:宏代换命令补充命令:宏代换命令 格格 式:式:&. 注意,如果内存变量后有非空的字符型表达式,需要在字符注意,如果内存变量后有非空的字符型表达式,需要在字符 表达式前加表达式前加“. .”将两个连接起来。将两个连接起来。 如:如:bmbm=123=123 ?& ?&bmbm 显示显示123123 ?&bm.456 ?&bm.456
19、显示显示123456123456,将,将bmbm中的值和后边表达式的中的值和后边表达式的 值作为一个整体看待值作为一个整体看待 ?&bm.456 ?&bm.456 显示显示123.456123.456,如果中间有点时如何处理,如果中间有点时如何处理 示例:示例:e4-05.prge4-05.prg 3 3、多分支语句、多分支语句 语句格式:语句格式: CASE CASE 1 l CASE CASE(逻覆表达式(逻覆表达式22 2 CASE CASE(逻辑表达式(逻辑表达式n n) n OTHERWISE OTHERWISE n+1 ENDCASE ENDCASE 执行多分支语句时,系统将依次判
20、断逻辑表达式值是否为真,若执行多分支语句时,系统将依次判断逻辑表达式值是否为真,若 某个逻辑表达式值为真,则执行该某个逻辑表达式值为真,则执行该CASECASE段的语句序列,然后执行段的语句序列,然后执行 ENDCASEENDCASE后面的语句后面的语句. . 在各逻辑表达式值均为假的情况下。若有在各逻辑表达式值均为假的情况下。若有OTHERWISEOTHERWISE子句,就执行子句,就执行 n+1,然后结束多分支语句,否则直接结束多分支语句。,然后结束多分支语句,否则直接结束多分支语句。 示例:示例:e4-06.prge4-06.prg e4-06-1.prg e4-06-1.prg 注意:
21、以上程序中使用了函数注意:以上程序中使用了函数INLIST()INLIST(),该函数格式如下:,该函数格式如下: INLIST(INLIST(eExpression1eExpression1, , eExpression2eExpression2 , ,eExpression3eExpression3 .) .) 其作用在于判断一个表达式是否与一组表达式中的某个匹配,其作用在于判断一个表达式是否与一组表达式中的某个匹配, 其中其中eExpression1eExpression1是要搜索的。是要搜索的。 在构成分支结构时需注意:在构成分支结构时需注意: (1 1)条件语句中的)条件语句中的IF
22、IF和和ENDIFENDIF必须配对出现;同样,多分支必须配对出现;同样,多分支 语句中的语句中的DO CASEDO CASE和和END CASEEND CASE也须配对出现。也须配对出现。 (2 2)为使程序清晰易读,对分支、循环等结构应使用缩格书)为使程序清晰易读,对分支、循环等结构应使用缩格书 写方式,见教材中写方式,见教材中P130-132P130-132的例的例4 44 4和例和例4 46 6两例。两例。 (3 3)表达分支、循环的每种语句都不允许在一个命令行中输)表达分支、循环的每种语句都不允许在一个命令行中输 入完,必须按语句格式一行一个回车分行键入,即这些语句不能入完,必须按语
23、句格式一行一个回车分行键入,即这些语句不能 用于命令窗口中。用于命令窗口中。 三、循环结构三、循环结构 VFPVFP具有一般程序设计语言都有的具有一般程序设计语言都有的WHILEWHILE条件循环语句和条件循环语句和FORFOR步步 长循环语句,此外还有专用于对表进行处理的长循环语句,此外还有专用于对表进行处理的SCANSCAN扫描循环语句。扫描循环语句。 循环执行的次数一般由循环条件决定,但在循环体中可插入循环执行的次数一般由循环条件决定,但在循环体中可插入 跳出语句跳出语句EXITEXIT来结束循环,也可以用来结束循环,也可以用LOOPLOOP语句来继续循环。语句来继续循环。 1 1、条件
24、循环、条件循环 语句格式:语句格式: DO WHILE DO WHILE ENDDO ENDDO 语句格式中的语句格式中的 称为循环条件,称为循环条件, 称为称为 循环体。循环体。 语句执行时,若语句执行时,若DO WHILEDO WHILE子句的循环条件为假循环就结束,子句的循环条件为假循环就结束, 然后执行然后执行ENDDOENDDO子句后面的语句;为其则执行循环体,一旦遇到子句后面的语句;为其则执行循环体,一旦遇到 ENDDOENDDO就自动返回到就自动返回到DO WHILEDO WHILE重新判断循环条件是否成立,以决定重新判断循环条件是否成立,以决定 是否继续循环。是否继续循环。 示
25、例:示例:e4-07.prg, e4-08.prge4-07.prg, e4-08.prg 2 2、步长循环、步长循环 语句格式:语句格式: FOR FOR = = TO TO STEP 2 STEP 3 EXIT EXIT LOOP LOOP ENDFOR | NEXT ENDFOR | NEXT 语句格式中的语句格式中的 称为循环变量,称为循环变量, 1、 2、 3分别称为初值、终值、步长。分别称为初值、终值、步长。 语句执行时,通过比较循环变量值与终值来决定是否执行语句执行时,通过比较循环变量值与终值来决定是否执行 。步长为正数时,若循环变量值不大于终值就执行循环体。步长为正数时,若循环
26、变量值不大于终值就执行循环体。 步长为负数时,若循环变量值不小于终值就执行循环体。执行一步长为负数时,若循环变量值不小于终值就执行循环体。执行一 旦遇到旦遇到ENDFORENDFOR或或NEXTNEXT,循环变量值即加上步长,循环变量值即加上步长. .然后返回到然后返回到FORFOR重重 新与终值比较。新与终值比较。 示例:示例:e4-09.prge4-09.prg 3 3、扫描循环、扫描循环 语句格式:语句格式: SCANSCAN(范围(范围 FOR FOR WHILE WHILE2 ENDSCAN ENDSCAN SCAN SCAN循环针对当前表进行循环,循环针对当前表进行循环, 子句表示
27、记录范围,子句表示记录范围, 缺省值为缺省值为ALLALL,语句执行时在,语句执行时在 中依次寻找满足中依次寻找满足FORFOR条件或条件或 WHILEWHILE条件的记录,并对找到的记录执行条件的记录,并对找到的记录执行 。 示例:示例:e4-10.prge4-10.prg 4 4、循环辅助语句、循环辅助语句 在各种循环语句的循环体中可以插入在各种循环语句的循环体中可以插入LOOPLOOP和和EXITEXIT语句,前者语句,前者 能使执行转向循环语句头部继续循环,后者则用来立即退出循环,能使执行转向循环语句头部继续循环,后者则用来立即退出循环, 转去执行转去执行ENDDOENDDO,ENDF
28、ORENDFOR或或ENDSCANENDSCAN后面的语句。后面的语句。 示例:示例:e4-11.prge4-11.prg 注意:在注意:在FORFOR循环语句中执行循环语句中执行LOOPLOOP语句,将会先修改循环变量语句,将会先修改循环变量 的值,然后转向循环语句头部。在的值,然后转向循环语句头部。在SCANSCAN循环语句中执行循环语句中执行LOOPLOOP语句,语句, 将会先移动记录指针,然后转去判断循环条件。将会先移动记录指针,然后转去判断循环条件。 示例:示例:e4-11-1.prge4-11-1.prg 5 5、多重循环、多重循环 若一个循环语句的循环体内又包含其它循环,就构成了
29、多重若一个循环语句的循环体内又包含其它循环,就构成了多重 循环,也称为循环嵌套。较为复杂的问题往往要用多重循环来处循环,也称为循环嵌套。较为复杂的问题往往要用多重循环来处 理。理。 设计多重循环程序要分清外循环和内循环,外循环体中必然设计多重循环程序要分清外循环和内循环,外循环体中必然 包含内循环语句,执行外循环体就是将其内循环语句及其它语句包含内循环语句,执行外循环体就是将其内循环语句及其它语句 执行一遍。执行一遍。 4.3 多模块结构 应用程序一般都是多模块程序,可包含多个程序模块。模块是可应用程序一般都是多模块程序,可包含多个程序模块。模块是可 以命名的程序段,可指主程序、子程序和自定义
30、函数。以命名的程序段,可指主程序、子程序和自定义函数。 一、子程序一、子程序 1 1、调用与返回、调用与返回 对于两个具有调用关系的程序文件,常称调用程序为主程序,被对于两个具有调用关系的程序文件,常称调用程序为主程序,被 调用程序为子程序。调用程序为子程序。 执行执行DODO命令能运行命令能运行VFPVFP程序,其实程序,其实DODO命令也可用来执行子程序模命令也可用来执行子程序模 块。主程序执行时遇到块。主程序执行时遇到DODO命令,执行就转向子程序,称为调用子程序。命令,执行就转向子程序,称为调用子程序。 子程序执行到子程序执行到RETURNRETURN语句(或缺省该语句),就会返回到主
31、程序中转语句(或缺省该语句),就会返回到主程序中转 出处的下一语句继续执行程序,称为从子程序返回,或简称返主。出处的下一语句继续执行程序,称为从子程序返回,或简称返主。 2 2、带参数子程序的调用与返回、带参数子程序的调用与返回 DoDo命令允许带一个命令允许带一个WITHWITH子句,用来进行参数传递。子句,用来进行参数传递。 命令格式:命令格式: Do Do WITH WITH 1N 1N 2 说明:说明: (1 1) 中的参数可以是表达式,但若为中的参数可以是表达式,但若为内存变量必须具有内存变量必须具有 初值初值。 (2 2)当)当 1是是ININ子句子句 2中的一个过程时,中的一个过
32、程时,DoDo命令调命令调 用该过程,请参阅例用该过程,请参阅例e4-16.prge4-16.prg。 调用子程序时参数表中的参数要传送给子程序,子程序中也必须调用子程序时参数表中的参数要传送给子程序,子程序中也必须 设置相应的参数接收语句。设置相应的参数接收语句。VFPVFP的的PARAMETERSPARAMETERS命令就具有接收参数和回命令就具有接收参数和回 送参数值的作用。送参数值的作用。 命令格式:命令格式: PARAMETIRS PARAMETIRS 功能:指定内存变量以接收功能:指定内存变量以接收DODO命令发送的参数值,返主时把命令发送的参数值,返主时把 内存变量值回送给调用程
33、序中相应的内存变量。内存变量值回送给调用程序中相应的内存变量。 说明:说明: (1 1)PARAMETERSPARAMETERS必须是被调用程序的第一个语句。必须是被调用程序的第一个语句。 (2 2)命令中的参数被)命令中的参数被VFPVFP默认为私有变量,返主时回送参数默认为私有变量,返主时回送参数 值后即被清除。值后即被清除。 (3 3)命令中的参数依次与调用命令)命令中的参数依次与调用命令WITHWITH子句中的参数相对应,子句中的参数相对应, 故两者参数个数必须相同。故两者参数个数必须相同。 示例:示例:e4-13.PRGe4-13.PRG(其调用子程序为(其调用子程序为js.PRGj
34、s.PRG) 3 3、子程序嵌套、子程序嵌套 主程序与子程序的概念是相对的,子程序还可调用它自主程序与子程序的概念是相对的,子程序还可调用它自 己的子程序,即子程序可以嵌套调用。己的子程序,即子程序可以嵌套调用。VFPVFP的返回命令包含的返回命令包含 了因嵌套而引出的多种返回方式。了因嵌套而引出的多种返回方式。 命令格式:命令格式: RETURN TO MASTSR | ToRETURN TO MASTSR | To 命令格式中的命令格式中的TO MASTERTO MASTER选项,使返主时直接近回到选项,使返主时直接近回到 最外层主程序,最外层主程序,TOTO 强制返回到指定的程序文件。强
35、制返回到指定的程序文件。 任何时候要退出任何时候要退出VFPVFP,只要执行命令,只要执行命令QUITQUIT。 二、自定义函数二、自定义函数 VFPVFP除了提供众多系统函数外,还可以由用户来定义函数。除了提供众多系统函数外,还可以由用户来定义函数。 1 1、自定义函数的建立、自定义函数的建立 自定义函数的格式如下:自定义函数的格式如下: FUNCTION FUNCTION PARAMATE PARAMATE RETURN RETURN 说明:说明: (1 1)若使用)若使用FUNCTIONFUNCTION语句来指出函数名,表示该函数语句来指出函数名,表示该函数 包含在调用程序中。若缺省该语
36、句,表示此函数是一个独立包含在调用程序中。若缺省该语句,表示此函数是一个独立 文件,函数名将在建立文件时确定,其扩展名默认为文件,函数名将在建立文件时确定,其扩展名默认为.PRG.PRG, 并可使用命令并可使用命令MODIFY COMMANDMODIFY COMMAND(函数名)来建立或编辑该自(函数名)来建立或编辑该自 定义函数。还需注意,自定义函数的函数名不能和定义函数。还需注意,自定义函数的函数名不能和VFPVFP系统系统 函数同名,也不能和内存变量同名。函数同名,也不能和内存变量同名。 (2 2) 组成为函数体,用于进行各种处理;组成为函数体,用于进行各种处理; 简单的函数其函数体也可
37、为空。简单的函数其函数体也可为空。 (3 3)RETURNRETURN语句用于返回函数值,其中的(表达式)值就语句用于返回函数值,其中的(表达式)值就 是函数值。若缺省该语句,则返回的函数值为是函数值。若缺省该语句,则返回的函数值为.T.T.。 (4 4)自定义函数与系统函数调用方法相同)自定义函数与系统函数调用方法相同. .其形式为:其形式为: 函数名函数名 (参数表)(参数表) 示例:示例:e4-14.PRGe4-14.PRG; e4-14-1.PRGe4-14-1.PRG; ROOT.PRGROOT.PRG( ROOT.PRG ROOT.PRG 可以在命令窗口中直接调用)可以在命令窗口中
38、直接调用) 2 2、数组参数的传递、数组参数的传递 在调用自定义函数或过程时,也可将数组作为参数来传在调用自定义函数或过程时,也可将数组作为参数来传 递数据。此时发送参数与接收参数都使用数组名,发送参数递数据。此时发送参数与接收参数都使用数组名,发送参数 数组名前要加来标记,而作为接收参数的数组不需事先定数组名前要加来标记,而作为接收参数的数组不需事先定 义。义。 示例:示例:e4-14-2.PRGe4-14-2.PRG 三、过程三、过程 如果将多模块程序中的每个模块(主程序如果将多模块程序中的每个模块(主程序b b子程序或自子程序或自 定义函数)分别保存为一个定义函数)分别保存为一个.PRG
39、.PRG文件,则每执行一个模块就文件,则每执行一个模块就 要打开一次文件,势必增加总的运行时间。为此要打开一次文件,势必增加总的运行时间。为此VFPVFP允许在允许在 一个一个.PRG.PRG文件中设置多个程序模块,并将主程序以外的每个文件中设置多个程序模块,并将主程序以外的每个 模块定义为一个过程。这种文件可称为模块定义为一个过程。这种文件可称为“过程文件过程文件”,仍使,仍使 用用.PRG.PRG为扩展名。为扩展名。 过程定义格式:过程定义格式: PROCUDURE PROCUDURE PARAMATE PARAMATE RETURN RETURN 从格式可知,过程是以从格式可知,过程是以
40、PROCEDUREPROCEDURE开头,并标出开头,并标出 的程序或程序段,的程序或程序段, 是过程体。与程序是过程体。与程序 调用一样,过程也用调用一样,过程也用DODO命令调用。命令调用。 示例:示例:e4-15.PRGe4-15.PRG;e4-16.PRGe4-16.PRG(过程在程序(过程在程序 js1.PRGjs1.PRG中)中) 四、变量的作用域四、变量的作用域 1 1、公共变量、公共变量 在任何模块中都可使用的变量称为公共变量在任何模块中都可使用的变量称为公共变量。 命令格式,命令格式, PUBLIC PUBLIC 说明:说明: (1 1)若下层模块中建立的内存变量要供上层模块
41、使用,或某)若下层模块中建立的内存变量要供上层模块使用,或某 模块中建立的内存变量要供并列模块使用,必须将这种变量说明模块中建立的内存变量要供并列模块使用,必须将这种变量说明 成公共变量。成公共变量。 (2 2)VFPVFP默认命令窗口中定义的变量都是公共变量,但这样默认命令窗口中定义的变量都是公共变量,但这样 定义的变量不能在程序方式下利用。定义的变量不能在程序方式下利用。 (3 3)程序终止执行时公共变量不会自动清除,而只能用命令)程序终止执行时公共变量不会自动清除,而只能用命令 来来RELEASERELEASE命令或命令或CLEAR ALLCLEAR ALL命令都可用来清除公共变量。命令
42、都可用来清除公共变量。 2 2、私有变量、私有变量 VFPVFP默认程序中定义的变量是私有变量,默认程序中定义的变量是私有变量,私有变量仅在定义它私有变量仅在定义它 的模块及其下层模块中有效,而在定义它的摸块运行结束时自动的模块及其下层模块中有效,而在定义它的摸块运行结束时自动 清除清除。 私有变量允许与上层模块的变量同名,但此时为分清两者是私有变量允许与上层模块的变量同名,但此时为分清两者是 不同的变量,需要采用暂时屏蔽上级模块变量的办法。下述命令不同的变量,需要采用暂时屏蔽上级模块变量的办法。下述命令 声明的私有变量就能起这样的作用:声明的私有变量就能起这样的作用: 命令格式:命令格式:
43、PRIVATE PRIVATE ALLLIKE|EXCEPT ALLLIKE|EXCEPT 功能:声明私有变量并隐藏上级模块的同名变量,直到声明功能:声明私有变量并隐藏上级模块的同名变量,直到声明 它的程序函数执行结束后,才恢复使用先前隐藏的变量。它的程序函数执行结束后,才恢复使用先前隐藏的变量。 说明:说明: (1) (1)“声明声明”与与“建立建立”不一样,前者仅指变量的类型,不一样,前者仅指变量的类型, 后者包括类型与值。后者包括类型与值。PUBLICPUBLIC命令除声明变量的类型外还赋了初值,命令除声明变量的类型外还赋了初值, 故称为建立;而故称为建立;而PRIVATEPRIVATE
44、并不自动对变量赋值,仅是声明而已。并不自动对变量赋值,仅是声明而已。 (2)2)若应用程序由多个人员同时开发,很可能因变量名相若应用程序由多个人员同时开发,很可能因变量名相 同造成失误,如果各人将自己所用的变量用同造成失误,如果各人将自己所用的变量用PRIVATEPRIVATE命令来声明,命令来声明, 就能避免发生混淆。就能避免发生混淆。 (3)3)在程序模块调用时,参数接受命令在程序模块调用时,参数接受命令PARAMETERSPARAMETERS声明的声明的 参变量也是私有变量,与参变量也是私有变量,与PRIVATEPRIVATE命令作用相同。命令作用相同。 3 3、本地变量、本地变量 本地
45、变量只能在建立它的模块中使用,而且本地变量只能在建立它的模块中使用,而且不能在高层或底不能在高层或底 层模块使用层模块使用,该模块运行结束时本地变量就自动释放。,该模块运行结束时本地变量就自动释放。 命令格式:命令格式: LOCAL LOCAL 功能:将(内存变量表)指定的变量设置为本地变量并将这功能:将(内存变量表)指定的变量设置为本地变量并将这 些变量的初值均赋以些变量的初值均赋以.F.F.。 注意:注意:LOCALLOCAL与与LOCATELOCATE前前4 4个字母相同,故不可缩写。个字母相同,故不可缩写。 示例:示例:e4-17.PRGe4-17.PRG, e4-17-1.PRGe4
46、-17-1.PRG,(注意:运行程序前,应,(注意:运行程序前,应 先使用先使用RELEASE ALLRELEASE ALL将全局变量清除)将全局变量清除) 五、程序的调试五、程序的调试 1 1、调试的概念、调试的概念 编好的程序难免有错,必须反复地检查改正,直至达到预定编好的程序难免有错,必须反复地检查改正,直至达到预定 设计要求方能投入使用。设计要求方能投入使用。 程序调试的目的就是检查并纠正程序中的错误,以保证程序程序调试的目的就是检查并纠正程序中的错误,以保证程序 的可取运行。调试通常分三步进行:的可取运行。调试通常分三步进行: 检查程序是否存在错误,确定出错的位置,纠正错误。检查程序
47、是否存在错误,确定出错的位置,纠正错误。 调试需要经验,关键在查错,有时查出错误,但难以确定错调试需要经验,关键在查错,有时查出错误,但难以确定错 误的位置,这就无法纠正错误,纠正错误要掌握程序设计技术与误的位置,这就无法纠正错误,纠正错误要掌握程序设计技术与 技巧。技巧。 (1 1)程序中常见错误)程序中常见错误 语法错误语法错误 系统执行命令时都要进行语法检查,不符合语法规定就会提系统执行命令时都要进行语法检查,不符合语法规定就会提 示出错信息,例如命令字拼写错、命令格式写错、使用了未定义示出错信息,例如命令字拼写错、命令格式写错、使用了未定义 的变量、数据类型不匹配、操作的文件不存在等。
48、的变量、数据类型不匹配、操作的文件不存在等。 超出系统允许范围的错误超出系统允许范围的错误 例如文件太大(不能大于例如文件太大(不能大于2GB2GB)、嵌套层数超过允许范围()、嵌套层数超过允许范围(DODO 命令允许命令允许128128层嵌套循环)等。层嵌套循环)等。 逻辑错误逻辑错误 逻辑错误指程序设计的差错,例如计算或处理逻辑有错。逻辑错误指程序设计的差错,例如计算或处理逻辑有错。 (2 2)查错技术)查错技术 查错技术可分两类,一类是静态检查,例如阅读程序,查错技术可分两类,一类是静态检查,例如阅读程序, 从而找出程序中的错误;另一类是动态检查,即通过执行从而找出程序中的错误;另一类是
49、动态检查,即通过执行 程序来考察执行结果是否与设计要求相符。动态检查又有程序来考察执行结果是否与设计要求相符。动态检查又有 以下方法。以下方法。 设置断点:若程序执行到某语句处能自动暂停运行,设置断点:若程序执行到某语句处能自动暂停运行, 该处称为断点。在调试程序时用户常用插入暂停语句该处称为断点。在调试程序时用户常用插入暂停语句 (WAITWAIT)的办法来设置断点。)的办法来设置断点。 单步执行:一次执行一个命令。单步执行:一次执行一个命令。 跟踪:在程序执行过程中跟踪某些信息的变化跟踪:在程序执行过程中跟踪某些信息的变化. . 有的系统还能显示执行过的语句的行号。有的系统还能显示执行过的
50、语句的行号。 设置错误陷阱:在程序中设置错误陷阱可以捕捉设置错误陷阱:在程序中设置错误陷阱可以捕捉 可能发生的错误,这时若发生错误就会中断程序运行并可能发生的错误,这时若发生错误就会中断程序运行并 转去执行预先编制的处理程序,处理完后再返回中断处转去执行预先编制的处理程序,处理完后再返回中断处 继续执行原程序。例如继续执行原程序。例如ON ERRORON ERROR命令用于设置错误陷阱,命令用于设置错误陷阱, 函数函数ERRORERROR()和()和MESSAGEMESSAGE()可用于出错处理。()可用于出错处理。 2 2、调试器、调试器 VFPVFP提供了一个称为提供了一个称为“调试器调试