第一章 数据库应用基础第 8 章程序设计基础程序是能够完成特定任务的命令序列的组合 。 Visual FoxPro 提供了结构化程序设计方法,能帮助用户创建出功能强大,灵活多变的应用系统 。
第一章 数据库应用基础
8.1 Visual FoxPro的工作方式
8.2 程序文件的建立与编辑
8.2.1 程序文件的建立与修改
8.2.2 程序文件的保存
8.2.3 程序文件的执行
8.3 程序的基本结构
8.3.1 结构化程序
8.3.2 顺序结构
8.3.3 分支结构
8.3.4 循环结构教学内容第一章 数据库应用基础
8.4 过程及其调用
8.4.1 定义过程或过程文件
8.4.2 调用过程或过程文件
8.4.3 变量的作用域
8,5 程序的测试与调试
8.5.1 建立测试环境
8.5.2 调试器窗口
8.5.3 断点教学内容第一章 数据库应用基础
Visual FoxPro有两种工作方式,人机交互方式和程序方式 。
1,交互方式有两种:
( 1) 命令方式
Visual Foxpro的命令方式是利用命令窗口来实现的 。 用户在命令窗口中输入命令,可实现对数据库的各种操作 。
( 2) 菜单方式这种方式直观,方便 。
2,程序方式
程序是能够完成指定任务的命令序列的组合,可以通过菜单方式或命令方式建立,编辑修改或运行 。 这组命令以扩展名为,PRG
的文件形式保存就叫做程序文件或称为命令文件 。
与交互式方式相比,采用程序方式有许多好处:
8.1 Visual FoxPro的工作方式第一章 数据库应用基础程序设计的基本步骤包括
( 1) 对问题进行说明,描述程序的目标 。
( 2) 分解问题成各独立步骤 。
( 3) 编制各模块 。
( 4) 测试并完善各模块 。
( 5) 组装全部模块 。
( 6) 整体测试 。
8.2 程序文件的建立与编辑第一章 数据库应用基础
8.2.1 程序文件的建立与修改
1,命令方式
命令格式,MODIFY COMMAND [<文件名 >]
命令功能:建立或编辑修改指定的命令文件,并打开 Visual
FoxPro 6.0文本编辑器,进入命令文件编辑窗口 。
若文件名是一个已有的文件,则此命令表示打开此文件进行修改;若没有这个文件名,则表示新建一个程序文件,并以此作为程序文件名。
2.以菜单方式
3.在项目管理器中,选定,代码,选项卡中的,程序,项。
4.利用建立、编辑文本文件的工具软件。
5.利用设计工具编写代码:
第一章 数据库应用基础
8.2.2 程序文件的保存
1,从,文件,菜单中选择,保存,命令或按 Ctrl+W键保存文件 。
若要放弃本次修改,可选择选择,文件,菜单中的,还原,命令或按 Esc键 。
2,若要关闭一个没有保存的命令文件,则会弹出相应对话框,
提示用户是保存还是放弃已作的修改 。
3,若保存了一个由项目管理器创建的程序,则该程序被加入项目中 。
4,若保存一个尚未命名的新程序,则会打开,另存为,对话框,
然后在,另存为,对话框中指定程序文件的存放位置和文件名
( *.prg),并单击,保存,命令按钮 。 程序保存后,可以运行或修改它 。
第一章 数据库应用基础
8.2.3 程序文件的执行
1,命令方式命令格式,DO <命令文件名 >
命令功能:将指定的命令文件调入内存并从第一条命令语句开始执行 。
2,菜单方式
( 1) 单击,程序,菜单的,运行,命令,打开,运行,对话框;
( 2) 从文件列表框中选择要执行的命令文件,并单击,运行,命令按钮 。
3,若程序包含在一个项目中,则在项目管理器中选定它并选择,运行,命令 。
第一章 数据库应用基础
当程序文件被执行时,文件中包含的命令将被依次执行,直到所有的命令被执行完毕,或者执行到以下命令:
( 1) CANCAL:终止程序运行,清除所有的私有变量,返回命令窗口;
( 2) DO <程序 >:转去执行另一个程序;
( 3) RETURN:结束当前程序的执行,返回到调用它的上级程序,
若无上级程序则返回到命令窗口;
( 4) QUIT:退出 Visual FoxPro系统,返回到操作系统 。
第一章 数据库应用基础
8.3 程序中常用的命令
8.3.1结构化程序
结构化程序由顺序结构,分支结构和循环结构三种基本结构组成 。
⑴ 顺序结构:程序执行顺序是根据程序中语句的书写顺序 。
⑵ 分支结构:程序执行顺序是根据条件的成立与否,选择执行不同的程序语句 。
⑶ 循环结构:程序执行顺序是在条件成立时反复执行某段程序语句 。
由三种基本结构构成的程序,可以处理任何复杂的问题 。
第一章 数据库应用基础
Visual FoxPro程序的组成部分从功能上看,Visual FoxPro程序可以分为三个部分:
( 1) 程序的注释部分,一般用于说明程序的功能,文件名等需要说明的有关信息 。
( 2) 程序运行环境的设置及初始化部分 。
( 3) 数据处理部分 。 通常任何一个有意义的程序,总是要有一些原始数据,否则,这个程序就没有处理对象 。 同样,程序运行的结果也有必要显示或打印出来,否则,用户将不知道程序干了一些什么 。 因此,这部分程序常包括下列三个部分,依次为:提供原始数据部分,数据处理部分,输出结果部分 。 这部分是程序核心部分 。
( 4) 控制返回部分 。 它控制程序返回到调用该程序的调用处 。
第一章 数据库应用基础
8.3.2 顺序结构第一章 数据库应用基础例 8.1 试编程完成下列功能。从键盘上随机输入一个正数,以此数为半径,求圆周长和圆面积,并输出结果。
程序如下:
*求圆周长和圆面积程序 VFP8-1.PRG &&注释语句
CLEAR &&清屏语句
SET TALK OFF &&系统参数设置语句
INPUT "半径 =" TO R &&输入圆半径值
L=2*PI()*R &&计算圆周长
S=PI()*R*R &&计算圆面积 " 圆周长 =",L
&&显示圆周长值
"圆面积 =",S &&显示圆面积值
SET TALK ON &&恢复参数设置语句
RETURN &&返回语句第一章 数据库应用基础
8.3.3 分支结构
1,IF… ELSE… ENDIF语句
语句格式:
IF <条件 >
<语句序列 1>
[ELSE
<语句序列 2>]
ENDIF
语句功能:判断给定的条件是否成立 。 成立,则执行语句序列 1;否则执行语句序列 2。
第一章 数据库应用基础
功能说明:
( 1) ELSE是一个可选项 。 当 ELSE子句缺省时,如果条件不成立,
将不执行任何语句 。 直接转向 ENDIF后的下一条语句 。
( 2) IF和 ENDIF必须成对出现,IF是本结构的入口,ENDIF是本结构的出口 。
( 3) 条件语句可以嵌套,但不能出现交叉 。 在嵌套时,为了使程序清晰,易于阅读,可按缩进格式书写 。
第一章 数据库应用基础例 8.2 改写例 8.1的程序,当输入半径大于零时,计算圆周长和圆面积,否则显示,半径值不能小于等于零,的提示信息 。
*求圆周长和圆面积程序 VFP8-1.PRG
CLEAR
SET TALK OFF
INPUT "半径 =" TO R
IF R>0
L=2*PI()*R
S=PI()*R*R
" 圆周长 =",L
"圆面积 =",S
ELSE
” 半径值不能小于等于零,
ENDIF
SET TALK
第一章 数据库应用基础
2,DO CASE… ENDCASE语句
DO CASE
CASE <条件 1>
<语句序列 1>
CASE <条件 2>
<语句序列 2>
……
CASE <条件 n>
<语句序列 n>
[OTHERWISE
<语句序列 >]
ENDCASE
第一章 数据库应用基础
语句功能:语句执行时,依次判断 CASE后面的条件是否成立 。
当发现某个 CASE后面的条件成立时,就执行该 CASE和下一个 CASE
之间的命令序列,然后执行 ENDCASE后面的命令 。 如果所有的条件都不成立,则执行 OTHERWISE 与 ENDCASE之间的命令序列,然后转向 ENDCASE后面的语句 。
功能说明:
( 1) 不管有几个 CASE条件成立,只有最先成立的那个 CASE条件的对应命令序列被执行 。 DO CASE与第一个 CASE之间不能有任何语句 。
( 2) 如果所有 CASE条件都不成立,且没有 OTHERWISE子句,则直接跳出本结构 。
( 3) DO CASE和 ENDCASE必须成对出现,DO CASE是本结构的入口,
ENDCASE是本结构的出口 。
( 4) DO CASE… ENDCASE语句可以嵌套使用 。
第一章 数据库应用基础
8.3.4 循环结构
1,基于条件的循环,DO WHILE – ENDDO语句
( 1) 语句格式:
DO WHILE < 条件 >
< 语句序列 1 >
[ LOOP ]
< 语句序列 2 >
[ EXIT ]
< 语句序列 3 >
ENDDO
第一章 数据库应用基础
( 2)执行过程:
( 3)功能说明:
① 如果第一次判断条件时,条件即为假,则循环体一次都不执行。
② 如果循环体包含 LOOP命令,那么当遇到 LOOP时,就结束循环体的本次执行,不再执行其后面的语句,而是转回 DO WHILE处重新判断条件。
③ 如果循环体包含 EXIT命令,那么当遇到 EXIT时,就结束该语句的执行,转去执行 ENDDO后面的语句。
④ 通常 LOOP或 EXIT出现在循环体内嵌套的选择语句中,根据条件来决定是 LOOP回去,还是 EXIT出去。
第一章 数据库应用基础例 8.4 计算连续自然数之和,并且显示和刚大于 1000的最后一个自然数 。
STORE 0 TO AA,BB
DO WHILE AA<=1000
BB=BB+1
AA=AA+BB
ENDDO
BB
第一章 数据库应用基础
2,基于,计数,的循环,FOR – ENDFOR语句
( 1) 语句格式:
FOR < 循环变量 > = < 初值 > TO < 终值 > [STEP < 步长 >]
< 循环体 >
ENDFOR|NEXT
( 2) 执行过程:
第一章 数据库应用基础
( 3) 功能说明:
① <循环变量名 >既是一个内存变量,也可以是某数组的一个下标变量 。 若不存在,则自动建立 。
② <数字表达式 1>为循环变量置初值,<数字表达式 2>给出循环变量的终值,<数字表达式 3>给出循环变量值每次变化的值 ( 缺省 STEP子句时,默认为 1) 。
③ ENDFOR和 NEXT是等价的,都是 FOR循环结束语句,
选用哪一个都可以。
第一章 数据库应用基础
( 1) 语句格式:
Scan [<范围 >] [For <条件表达式 1>]
[While <条件表达式 2>]
<语句序列 >
EndScan
( 2) 执行过程:执行该语句时,记录指针自动,依次地在当前表的指定范围内满足条件的记录上移动,对每一条记录执行循环体内的命令,搜索完范围内最后一条记录后,SCAN语句执行完毕 。 范围的默认值是 ALL 。
( 3) 语句功能:
① SCAN为循环起始语句,ENDCAN为循环结束语句 。
② 本语句对范围内满足条件的记录执行 <循环体 >。 默认范围值为 ALL。
第一章 数据库应用基础使用循环语句应注意的几点,
( 1) Do While和 EndDo,For和 EndFor,Scan和 EndScan必须配对使用 。
( 2) 语句序列或循环体可以是任何 FoxPro命令或语句,也可以是循环语句,即可以为多重循环 。 在嵌套使用时,注意不要互相交叉
( 3) 循环变量应是数值型的内存变量或数组元素 。
( 4) Exit和 Loop命令嵌入在循环体内,不能单独使用第一章 数据库应用基础
8.4 过程及其调用
8.4.1 定义过程或过程文件过程是以特定的命令开始又以特定的命令结束的模块,被放置在程序文件或过程文件中 。
1.定义过程第一章 数据库应用基础
命令格式:
PROCDURE <过程名 >
<命令序列 >
[RETURN[<表达式 >]]
[ENDPROC]
过程定义说明:
( 1) PROCDURE命令表示一个过程的开始,并命名过程名;
( 2) 过程名必须以字母或下划线开头,字母,数字和下划线的组合;
( 3) RETURN命令是过程返回命令,当过程执行到 RETURN
命令时,控制将转回到调用程序 ( 或命令窗口 ),并返回表达式的值,若省略表达式,则返回逻辑值,T.;
第一章 数据库应用基础
( 4) 缺省 RETURN命令,则在过程结束处自动执行一条隐含的
RETURN命令;
( 5) ENDPROC命令表示一个过程的结束,缺省时,过程结束于下一条 PROCDURE命令处或文件结束处 。
( 6) 用户也可以自定义函数,格式如下:
FUNCTION <函数名 >
<命令序列 >
[RETURN[<表达式 >]]
[ENDFUNC]
第一章 数据库应用基础
2,定义过程文件命令格式:
PROCEDURE <过程名 1>
<命令序列 1>
[RETURN[<表达式 >]]
[ENDPROC]
……
PROCEDURE <过程名 n>
<命令序列 >
[RETURN[<表达式 >]]
[ENDPROC]
第一章 数据库应用基础
3,子程序或过程的返回语句
命令格式,RETURN [<表达式 >/TO MASTER/TO <过程名 >]
命令功能:将程序控制权返回给调用程序,并返回表达式值 。
命令说明:
( 1) <表达式 >短语:指定返回给调用程序的表达式值 。 如果省略 RETURN命令或省略返回表达式,则自动将,,T.”返回给调用程序 。
( 2) TO MASTER短语:将控制权返回给最外层的调用程序 。
( 3) TO <过程名 >短语:将控制权返回给指定的过程。
第一章 数据库应用基础
1,调用过程命令格式,DO <过程名 > [IN <程序文件名 >][WITH <参数表 >]
命令功能:执行过程名所指定的子程序 。 WITH用于主程序和子程序间参数的传递 。
命令说明:
( 1) <过程名 >>短语,指定要执行的过程名称。
( 2) IN <程序文件名 >,
( 3) [WITH <参数表 >]:指定要传递给程序或过程的参数。
8.4.2 调用过程或过程文件第一章 数据库应用基础
2.调用过程文件
命令格式,SET PROCEDURE TO [<过程文件 1>[,<过程文件
2>,...]][ADDITIVE]
命令功能:打开指定的过程文件 。
命令说明:
( 1) ADDITIVE表示并不关闭已打开的过程文件。
( 2)调用其他命令文件中的过程要先打开此命令文件,才能调用。
( 3) 调用过程文件中的过程 。 也要先打开过程文件,再用 Do <
过程名 > 或 <过程名 >()调用 。
(4) 在主程序中应先打开过程文件,将过程文件中的所有过程都调入内存(打开一个过程文件只算打开了一个文件)。
第一章 数据库应用基础
3,关闭过程文件语句当过程文件不再用时应将其关闭,以节省内存空间 。
命令格式 1,SET PROCEDURE TO
命令功能:关闭所有已打开的过程文件 。
命令格式 2,RELEASE PROCEDURE <过程文件 1>[,<过程文件
2>,...]
命令功能:关闭所指定的过程文件。
第一章 数据库应用基础
4,参数传递
( 1) 调用程序向被调用过程传递参数的命令:
命令格式 1,DO <过程名 > WITH <实参 1>[,<实参 2>,… ]
命令格式 2,<过程名 > WITH <实参 1>[,<实参 2>,… ]
说明,
① DO WITH语句中的参数也叫实在参数 。
② 实在参数可以是任何类型的常量,变量和表达式,有多个参数时,各参数之间用逗号分隔 。
③若参数表中的内存变量与库文件的字段名相同时,则内存变量前应冠以 m->,以区别同名字段变量,否则字段变量优先于内存变量。
第一章 数据库应用基础
④ 参数表中的内存变量必须先定义或赋值才能使用 。
⑤ 采用命令格式 1,如果实参是常量,称为按值传递,即把实参的值传给形参;如果实参是变量,称为按引用传递,即把实参的地址传给形参;
⑥采用命令格式 2,默认情况下都以按值方式传递参数,如果实参是变量,可以通过命令 SET UDFPARMS重新设置参数传递的方式。
第一章 数据库应用基础
( 2) 在过程中接收参数的命令:
命令格式 1,PARAMETERS <形参变量 1>[,<形参变量 2>,… ]
命令格式 2,LPARAMETERS <形参变量 1>[,<形参变量 2>,… ]
说明,
① PARAMETERS语句中的参数也叫形式参数,形式参数只能是变量 。
② PARAMETERS 语 句只 能在 过 程中 使 用,且必 须 作为 过 程 中
PROCEDURE语句后的第一条可执行语句 。
③ 形参的数目不能少于实参的数目,多余的形参变量初值为逻辑假,F.,形式参数与实在参数要类型对应一致
④ PARAMETERS中形式参数默认为私有变量,LPARAMETERS
中形式参数默认为局部变量,过程结束后,即被清除。若与其对应的实在参数为变量,则其值可以传回主程序。
第一章 数据库应用基础变量的作用域指的是变量在什么范围内是有效或能够被访问的,VFP中,以变量的作用域来分,内存变量分三类,公用变量,
私有变量及局部变量 。
1,公用变量公用变量也称为全局变量,是在主程序和子程序中都有效的变量 。 建立公用变量命令如下 。
命令格式,PUBLIC <内存变量名 1>[,<内存变量名 2>,<内存变量名 3>...]
命令功能:定义公用变量 。
8.4.3 变量的作用域第一章 数据库应用基础
( 3) 在执行 CLEAR MEMORY,RELEASE,QUIT等命令后,公共变量才被释放;
2,私有变量私有变量是在程序中直接使用而由系统自动隐含建立的变量 。 私有变量可以在使用中建立,如,STORE 23 TO XY1
说明:私有变量只能在建立它的模块或下层模块中使用;
私有变量在建立它的模块程序运行结束时被释放 。
第一章 数据库应用基础
3,局部变量局部变量是只能在建立它的模块中使用的变量 。 建立局部变量命令如下:
命令格式,LOCAL <内存变量名 1>[,<内存变量名 2>,<内存变量名 3>...]
说明:局部变量要先建立后使用,初值是逻辑假,F.。 局部变量不能在上层或下层模块中使用,只能在建立它的模块中使用;
局部变量在建立它的模块程序运行结束时被释放 。
第一章 数据库应用基础
8,5 程序的测试与调试
8.5.1 建立测试环境为了保证可移植性并建立适当的测试和调试环境,您必须考虑以下几个方面的问题:
l 硬件和软件
l 系统路径和文件属性
l 目录结构和文件位置第一章 数据库应用基础
8.5.2 调试器窗口
1,打开调试器窗口方法一:选择,工具 /调试器,菜单项中,就打开了,调试器,窗口,如图 8.7。
方法二:使用下面的命令打开调试器:
DEBUG
SET STEP ON
SET ECHO ON
2,调试器窗口元素:
第一章 数据库应用基础
8.5.3 断点断点允许将执行程序停止,设置断点可缩小逐步调试代码的范围 。
1,设置断点若要为某个特定的代码行设置断点,可以双击该行旁边的阴影页边,或者把光标放在行中并按下空格键或回车键。该代码行左边的灰色区域中会显示一个实心点,这表明该行已经设置了一个断点。除此之外,利用 VFP的,断点,对话框(单击工具栏上的,断点对话框,按钮即可打开),还可以设置各种类型的断点。
2,断点类型断点的类型有四种,
第一章 数据库应用基础断点类型表设置 说明在定位处中断 在定位处停止执行 。
如果表达式值为真则在定位处中断表达式为,真,(.T.) 时,在定位处停止执行 。
当表达式值为真时中断 表达式为,真,(.T.) 时,停止执行 。
当表达式值改变时中断 表达式的值改变时,停止执行 。