第 9 章 结构化程序设计
DESCRIPTION
第 9 章 结构化程序设计. 9.1 程序设计基础. 9.1.1 程序设计的概念. V FP 提供一种程序执行方式,这种方式就是预先把需要执行的多条命令按一定的结构组成一个有机序列以文件的形式存储在磁盘上,这个文件就称为 程序文件 ,这个序列的设计、编码和调试的过程就是 程序设计 。. 9.1.2 程序的控制结构 任何复杂的程序都由 3 种基本控制结构组成。它们是顺序结构、选择结构和循环结构。. 图 9.1 程序的控制结构. 9.1.3 结构化程序设计方法 结构化程序设计采用自顶向下、逐步求精和模块化的分析方法。 - PowerPoint PPT PresentationTRANSCRIPT
第第 99 章 章 结构化程序设计结构化程序设计
VFP 提供一种程序执行方式,这种方式就是预先把
需要执行的多条命令按一定的结构组成一个有机序列以
文件的形式存储在磁盘上,这个文件就称为程序文件,
这个序列的设计、编码和调试的过程就是程序设计。
9.1 程序设计基础
9.1.1 程序设计的概念
9.1.2 程序的控制结构 任何复杂的程序都由 3种基本控制结构组成。它们是顺序结构、选择结构和循环结构。
图 9.1 程序的控制结构
9.1.3 结构化程序设计方法 结构化程序设计采用自顶向下、逐步求精和模块化的分析方法。 自顶向下是指对设计的系统要有一个全面的理解,从问题的全局入手,把一个复杂问题分解成若干个相互独立的子问题 。逐步求精是指程序设计的过程是一个渐进的过程,先把一个子问题用一个程序模块来描述,再把每个模块的功能逐步分解细化为一系列的具体步骤 。模块化是结构化程序的重要原则。所谓模块化就是把大程序按照功能分为较小的程序。
9.1.4 程序文件的建立与执行
1 .命令方式建立或修改程序文件
命令格式: MODIFY COMMAND [ <程序文件名 > | ? ]
MODIFY.FILE. [〈文件名〉| ? ]
功能:启动 VFP 提供的文本编辑器来建立或编辑程序文件。
2.菜单方式建立编辑程序文件
命令格式: DO <程序文件名>
功 能 : 将程序文件从磁盘调入内存 , 编译成 .FXP 目
标文件后并执行。
3. 程序文件的执行
菜单方式:① .CANCEL :终止程序运行,清除所有的私有变量,返回命令窗口。②.RETURN :结束程序执行,返回调用它的上级程序,若无上级程序则返回命令窗口。③.QUIT :结束程序执行并退出 Visual.FoxPro 系统,返回操作系统。
9.2 顺序结构程序
顺序结构是最简单、最基本的一种程序结构。在顺序结构程序中,各命令按照各自出现的先后顺序,依次执行。
9.2.1 程序文件中的辅助命令
一.输入类语句
格 式 1: STORE <表达式> TO <内存变量名表>
格 式 2: <内存变量> = <表达式>
功 能:给内存变量赋值。
㈠ . 赋值语句
㈡ . 交互式语句 /键盘输入命令
1. 字符串数据输入命令
格式: ACCEPT [ <提示信息 >] TO < 内存变量>功能:在屏幕上显示提示信息,等待用户从键盘输入,再把输入内容赋值给指定的内存变量。
注: ACCEPT 命令只能接受字符型常量,输入时不需加定界符。
键盘输入命令主要用于程序执行过程中原始数据的输入。
例 9-1 :要求用户从键盘上输入用户名,然后把输入的用户名显示出来。
ACCEPT “ 请输入用户名:” TO NAME
? NAME
格式: INPUT [ <提示信息 >] TO < 内存变量 >
2. 数据输入命令
功能:在屏幕上显示提示信息,等待用户从键盘输入,再把输入内容赋值给指定的内存变量。
注: INPUT 命令能接受任何类型的表达式:
① 输入 C 型数据时,要使用 ‘ ’ 或 “ ” 作为定界符;
② 输入 L 型数据时, .T. 和 .F. ,两边的 . 不能省;
③ 输入 D 型数据时,要用 { } 或 CTOD( ) 将字符串转成日期型变量。
例 9-2 :求任意两数之和。
INPUT “请输入一个数 x:” TO X
? X+Y
INPUT “请输入另一个数 y:” TO Y
J=2800
INPUT “ 输入 J+200 :” TO A
ACCEPT “ 输入 J+200 :” TO B
?“ A=” , A
? “B=” , B
注:执行时,先后两次输入同样的内容: J+200
例 9-3 : 给出下列 A、 B的结果
格式: WAIT [ <提示信息 >] TO < 内存变量 >
[TIMEOUT < 数值表达式 >]
3. 只能输入一个字符的命令
功能:当程序执行某一处需要暂停时使用此命令。
注: WAIT 命令响应速度快,它只接受一个字符,不需用户键入回车键。
**** 数据表操作命令菜单 ****
1. 打开工作数据表2. 增加数据表记录3. 删除数据表记录4. 修改数据表记录5. 打印数据表记录6. 关闭工作数据表
? “您选择的是第” + CHOICE + “ 个选项”
WAIT “ 请选择相应代码:” TO CHOICE
例 9-4 :
格式: @ < 行,列 > SAY < 提示信息 > GET < 变量 >
[RANGE < 数值表达式 1>, < 数值表达式 2>] READ
4. 格式输入语句
功能:在屏幕指定的坐标位置上显示提示或输入数据。
② READ 一般与 GET 联合起来用:
•当有 READ 时, GET < 变量 > 的内容可以从键盘上修改;
•没有 READ 时, GET 后的变量只能显示内容,不能修改;
•一个 READ可以修改它前面的多个 GET项的内容,但它可以由 CLEARGETS 命令隔断。
注:① < 变量 > :该变量应在其前面定义过( 赋初值 ) 。
@ 8, 18 SAY “**** 数据表操作命令菜单 ****”
@ 9, 18 SAY “ 1. 打开工作数据表 ”
@ 10, 18 SAY “ 2. 增加数据表记录 ”
@ 11, 18 SAY “ 3. 删除数据表记录 ”
@ 12, 18 SAY “ 4. 修改数据表记录 ”
@ 13, 18 SAY “ 5. 打印数据表记录 ”
@ 14, 18 SAY “ 6. 关闭工作数据表 ”
@ 18, 28 SAY “您选择的是 :” + LTRIM(STR(CHOICE))
@ 16, 28 SAY “ 请选择相应代码:” GET CHOICE
READ
例 9-5 :
二.输出类语句
1. 非格式输出语句
格式 1: ? <内存变量名表>
格式 2 : ?? <内存变量名表>
注:语句 1 是在光标所在行的下一行开始显示,
语句 2 则是在当前光标位置开始显示。
功 能:显示内存变量、常量或表达式的值。
格式: @ < 行,列 > SAY < 表达式 >
[FUNCTION < 功能符 >][PICTURE < 格式符 >]
2. 格式输出语句
功能:按指定的坐标位置在屏幕上输出表达式的值。
注: 若选用 PICTURE 、 FUNCTION子句,则按一定的格式输出 ,分别见教材 P131 的表 6.1 、 6.2 。
格式: TEXT
< 输出显示内容 >
ENDTEXT
3. 文本输出语句
功能:在屏幕上原样显示 TEXT 和 ENDTEXT 之间的内容。
注: TEXT 、 ENDTEXT 是一条子句,不能省略其中任一条子句。
**** 数据表操作命令菜单 ****
1. 打开工作数据表2. 增加数据表记录3. 删除数据表记录4. 修改数据表记录5. 打印数据表记录6. 关闭工作数据表
? “您选择的是第” + CHOICE + “ 个选项”
WAIT “ 请选择相应代码:” TO CHOICE
例 6-6TEXT
ENDTEXT
三 . 设置会话状态语句
语句格式 2: SET TALK OFF
功能 语句 1:设置会话状态开通。
语句 2:设置会话状态关闭。
语句格式 1: SET TALK ON
四 . 清屏与注释语句
语句格式: CLEAR
1. 清屏语句
功 能 :清除屏幕上所有显示内容,光标回到屏幕左上角。
2. 注释语句
语句格式 2: * < 注释内容 >
注:语句 1、 2、 3 在程序中,系统不执行。
语句格式 1: NOTE < 注释内容 >
功 能 : 在程序中加入说明性语句。
语句格式 3: && < 注释内容 >
五 . RETURN 命令
注:一般 RETURN 出现于程序末尾。
格式: RETURN [< 表达式 >/TO MASTER/TO < 程序名 >]
功能 : 结束一个程序的执行。
六 . 终止程序执行语句
语句格式 2: QUIT
注 :
语句 1:在终止程序执行后,返回到 VFP 命令状态;
语句 2:返回到操作系统状态。
语句格式 1: CANCEL
功能:终止程序执行,关闭所有打开的命令文件。
顺序结构程序:按语句的先后顺序组织的程序,即把处理过程的各个步骤按执行的先后顺序列出。
其流程图如右图所示。
顺序结构程序设计
A
B
C
N
图中箭头表示程序执行的方向,方框代表不同的可执行语句。
例 9-7 变量的初始化和变量的赋值。
SET TALK OFF
STORE 0 TO X , Y , Z
A=3
B=A+1
C=A*B
? X, Y, Z
? A, B, C
SET TALK ON
例 9-8 执行以下命令序列,问答问题:
最后显示的值是:
A. 所有职工的平均工资;
B. 所有工资在 1000元以上的职工的平均工资;
C. 所有工资在 1000元以上的职工人数;
D. 所有职工人数 。
USE zgb
SUM 基本工资 FOR 基本工资 >1000 TO SGZ
COPY FOR 基本工资 >1000 TO GZK2
USE GZK2
num=reccount( )
ave=sgz/num
? ave
在计算机应用的许多场合,要求程序根据不同的
条件采用不同的处理方法。如果条件满足,则执行某
一些语句;如果条件不满足,则执行另一些语句。这
些需要根据判断条件来控制程序走向的程序设计称为
选择结构程序设计,又称分支结构程序设计。
Visual FoxPro 提供双分支选择语句、多分支选
择语句两种选择结构。
9.3 9.3 选择结构程序设计选择结构程序设计
ENDIF 后的语句
语句序列 1
ENDIF 后的语句
语句格式:
IF <条件>
<语句序列 1>
ENDIF
条件9.3.1 双分支选择语句 ( 选择判断语句 )
条件
.T.
.F.语句序列 1
.Y. .N.
语句序列 2
[ELSE
<语句序列 2> ]
注:
(1) IF 和 ENDIF 必须配对使用,而 ELSE 可选。
(2) IF 、 ELSE 、 ENDIF 必须各占一行。
(3) < 条件 > 可以为关系表达式、逻辑表达式。
(4) 在<语句序列 1>和<语句序列 2>中可以嵌套 IF语句。
执行过程:如果 <条件 >成立,就执行语句序列 1;如果 <条件 >不成立,执行语句序列 2。
例 请改用分支结构语句编程计算电费 : 不超过 50度 , 每度 0.52元 ; 超过 50 度时 , 超出部分每度 0.75 元。SET TALK OFF
INPUT “请输入所用电量 :" TO DL
DF=IIF( DL<=50 , 0.52*DL , 0.52*50+0.75*(DL-50) )
? “应缴电费为 :” + LTRIM(STR(DF,10,2)) + " 元 "
SET TALK ON
RETURN
SET TALK OFF
INPUT " 请输入行李重量 :" TO W
IF 1
YF=0.22*W
ELSE
YF= 0.22*40 + 1
ENDIF
? " 应交托运费为 :"+LTRIM(STR(YF,10,2))+"元 "
SET TALK ON
RETURN
例 火车托运行李 : 每人不超过 40公斤 ,每公斤 0.22元;超过 40公斤时 , 超出部分每公斤 0.40元。填空完成以下程序。
W < 40
(W-40) * 0.4
SET TALK OFFSet defa to f:\jfvfp\prgUSE zgbACCEPT “请输入要查找人的姓名 : ” TO NLOCATE ALL FOR XM=NIF FOUND( ) DISP ELSE ? [查无此人 ]ENDIFUSESET TALK ONRETURN
例 编程:在 ZGB.DBF 中查找某人。
9.3.2 多分支选择语句 ( 选择语句 | 情况语句 )
说明:
①DO CASE 和第一个 CASE子句之间不能插入任何语句。
②DO CASE 和 ENDCASE必须配对使用,且 DO CASE ,CASE , OTHERWISE 和 ENDCASE各子句必须各占一行。
③在<语句序列>中可嵌套情况语句。
语句格式 : DO CASE
CASE <条件表达式 1 >
<语句序列 1 >
CASE <条件表达式 2 >
<语句序列 2 >
┇
CASE <条件表达式 n >
<语句序列 n >
[ OTHERWISE
<语句序列 n+1 > ]
ENDCASE
功能:系统依次测试语句中各个条件表达式的值 : 若为真,即执行相应<条件表达式>后的<语句序列> , 然后脱离情况语句 , 执行 ENDCASE 的下一语句。若所有的条件表达式的值均为假,则执行 OTHERWISE 后面的语句序列 , 然后脱离情况语句 ,执行 ENDCASE 下一语句 。
开始判断
语句序列 1 序列 2 序列 n 序列 n+1
ENDCASE 后面的语句
条件 1 条件 2 条件 n 其它
……
例 已知 cjb.dbf中包含 xingming, avcj等字段。试用 avcj来判断该生成绩属于优 (≥90)、良 (≥80)、及格 (≥60) 或不及格(< 60)。USE cjb
ACCEPT ′ 请输入姓名:′ TO xmLOCATE FOR ALLTRIM(xingming)=ALLTRIM(xm)n = avcjDO CASE CASE n > =90 dj=″ 优″ CASE n > =80 dj=″ 良″ CASE n > =60 dj=″ 及格″ OTHERWISE dj=″ 不及格″ENDCASE@5,10 SAY xingming+[ 同学的成绩等级为: ]+ dj
A=3000DO CASE CASE A<1000 B=A/2 CASE A>=1000 B=A CASE A>=2000 B=2*A CASE A>=3000 B=3*AENDCASE? B
例 阅读下列程序段,写出运行结果:
Set talk offSet defa to f:\yyfoxclearcho=0@ 8, 18 SAY “**** 数据表操作命令菜单 ****”@ 9, 18 SAY “ 1. 打开工作数据表 ”@ 10, 18 SAY “ 2. 增加数据表记录 ”@ 11, 18 SAY “ 3. 删除数据表记录 ”@ 12, 18 SAY “ 4. 修改数据表记录 ”@ 14, 18 SAY “ 5. 关闭工作数据表 ”@ 15, 28 SAY “ 请选择相应代码:” GET choReadDo case case cho=1 accept “ 请输入表文件名:” to bm use &bm
例 利用 CASE 语句实现简单的菜单功能
case cho=2 append case cho=3 input “ 请输入要删除的记录号:” to jlh go jlh dele case cho=4 browse case cho=5 use otherwise @15, 28 SAY “ 选择代码错 !” endcaseSet talk on return
循环,就是按给定的条件连续地重复执行一段特定功能的程序。循环结构也称为重复结构。
9.4 9.4 循环结构程序设计循环结构程序设计
Visual FoxPro 给出了三种循环结构:
条件循环( DO WHILE……ENDDO)
计算循环( FOR……ENDFOR)
扫描循环( SCAN……ENDSCAN)
语句格式:
DO WHILE < 条件 > < 语句序列 1> [ LOOP ]
< 语句序列 2> [ EXIT ]
< 语句序列 3> ENDDO
循环体
ENDDO 后的语句
条件.T.
.F.
条件循环结构流程图
一、条件循环
循环体
功能:有条件连续地重复执行 DO WHILE与 ENDDO 之间的语句序列,直到 < 条件 >为假或因执行 EXIT 语句而结束。
条件
( 2)循环体中的 LOOP 是可选项。遇到 LOOP 时,不再执行后面的语句,转回 DO WHILE 处重新判断。其作用相当于一个特殊的“短路”返回控制。
( 3)循环体中的 EXIT也是可选项。遇到它时便无条件地退出循环,转到 ENDDO 后面的语句。其作用相当于一个紧急出口。
( 4)通常 LOOP 或 EXIT 出现在循环体内嵌套的分支语句中,根据条件来决定是 LOOP 回去,还是 EXIT 出去。
功能说明:
( 1)系统执行该语句时,先判断循环开始 DO WHILE 的条件是否成立, 如果条件为真,则执行循环体中的语句序列。当执行到 ENDDO 时,返回到 DO WHILE ,再次判断条件是否为真,以确定是否再次执行循环体。若条件为假,则结束循环 ,执行 ENDDO 后面的语句。 如果第一次判断条件时,条件即为假,则循环体一次都不执行,这就是称为“先判断后执行”的语句。
SET TALK OFF
SET TALK ON
RETURN
CLEAR
?[OK]
?[OK]
?[OK]
…
例 在屏幕上换行显示字符串“ OK”20次
i=1
? [OK]
i=i+1ENDDO
DO WHILE
SET TALK OFF
SET TALK ON
RETURN
CLEAR
i<=20
循环次数 循环前 i 值 循环后 i 值
1 1 2
2 2 3… … …
20 20 21
&& 设置循环变量初值
&& 修改循环变量
例 在屏幕上换行显示字符串 [OK]20 次
? [OK]
① DO WHILE 语句之前一定要有设置循环变量初 值的语句。
在以循环变量作为循环控制参数的条件循环中
② 循环体内一定要有修改循环变量的语句,否则 就会出现死循环。
注意注意
例 求自然数1至 4的和。
分析算法 :
s= s+i ;
i= i+1 ;
1. i=1 , s=0 ;
2. 累加第 i 个数
3. 累加次数加 1
4. 当 i<= 4 重复做 2 ;
5. ? s 。
例 求自然数1至 4的和。
SET TALK OFF
S=0
&& 定义一个变量表示和 ,并初始化
&& 指定以循环次数作判断条件 S=S+i && 把 S的值加上 i后再赋给 S,即求
和&& 修改循环变量
i=1
DO WHILE i<=4
i=i+1
ENDDO
? S && 输出求和的结果
SET TALK ON
RETURN
&& 设置循环变量的初值
程序流程图
S=0
i=1
1<=4
S=0+1
i=1+1
.T.
2<=4
S=1+2
i=2+1
3<=4
S=3+3
i=3+1
4<=4
S=6+4
i= 4+1
5<=4.F.
? 10
SET TALK OFF
S=0
i=1
DO WHILE i<=4
S=S+i
i=i+1
ENDDO
? S
SET TALK ON
RETURN
×
若求自然数 1至 N 的和呢?
[ 程序 :求自然数 1至 4的和 ]
SET TALK OFF
S=0 i=1
INPUT 〞请输入 N的值 : 〞 TO N
DO WHILE i<=4
S=S+i
i=i+1
ENDDO?S
SET TALK ON
RETURN
i<=N
推广 1
若求自然数 1至 N 的积呢?
[ 程序 :求自然数 1至 N的和 ]
SET TALK OFF
S=0 i=1
INPUT 〞请输入 N的值 : 〞 TO N
DO WHILE i<=N
S =S + i
i =i + 1
ENDDO?S
SET TALK ON
RETURN
推广 2
S=1
S=S*i
例 阅读程序,并说出程序的运行结果
IF i=3 LOOP
ENDIF
程序结果2
3
4
5
6
程序结果2
4
5
6
RETURN
SET TALK ON
SET TALK OFF
i=1
DO WHILE i<=5
i=i+1
ENDDO
? i
? “E” E
E
例 求 1~ 100 以内所有奇数的和。 SET TALK OFF
S=0
I=0
Do while I<100
I = I + 1
If int(I/2) = I/2
Loop
endif
S = S + I
Enddo
? “1到 100 的奇数和 S= ”, S
SET TALK ON
Return
以循环变量作为控制参数控制循环。
S=0
I=1
Do while I<100
S = S + I
I = I + 2
Enddo
? s
程序改进:
SET TALK OFF
CLEAR
USE zgb
ACCEPT “ 请输入要查找人的姓名 : ” TO N
LOCATE ALL FOR XM=N
DO WHILE .NOT. EOF( )
DISP
CONTINU
WAIT “ 按任意键继续,按 ESC 键退出”ENDDO
USE
?“查找结束”SET TALK ON
RETURN
例 编程:在 zgb.dbf 中查找某人。利用数据表的操作函数的返回值控制循环
——————
例 求连乘数 1*2*3*4*……,当积大于 720 时退出程序。
Set talk off
Clear
S=1
I=1
Do while .T.
S = S * I
I = I + 1
Enddo
? “ S= ”, S
Set talk on
Return
循环控制条件恒为真,要使用 EXIT语句结束循环
———
——IF S > 720
EXIT
ENDIF
例 求 [1,100] 内所有能被 3 或被 5整除的数的个数。
i=1DO WHILE i<=100
i=i+1ENDDO
IF MOD(i,3)=0 .OR. MOD(i,5)=0
N=N+1ENDIF
N= 0 && 定义一个变量表示个数 , 并初始化
&& 总个数增加 1
SET TALK OFF
? 〞满足条件的数的个数为〞 ,NSET TALK ON
RETURN
? i && 显示满足条件的这个数
语句格式:
FOR X = A TO B [ STEP C ]
< 语句序列 1>
[ LOOP ]
< 语句序列 2>
[ EXIT ]
< 语句序列 3>
ENDFOR | NEXT
二、计数循环
循环体
功能:将 FOR……ENDFOR循环中的 <语句序列 >执行指定的次数。
循环变量
循环初值
步长值
循环终值
例 求 1~ 100 之和。
SET TALK OFF
Clear
S=0
for I=1 to 100
S = S + I
Endfor
? “S = ”, S
SET TALK ON
Return
若求 100 的阶乘呢?思考 1
例 求 1~ 100 之奇数和。
SET TALK OFF
Clear
S=0
for I=1 to 100 step 2
S = S + I
Next
? “S = ”, S
SET TALK ON
Return
若求 1~ 100 的偶数和呢?思考 2
例 阅读程序,写出程序运行结果
SET TALK ON
SET TALK OFF
S=0 FOR K=1 TO 10 STEP 2
S=S+K
ENDFOR ? S
RETURN
IF K=7
LOOP
ENDIF
思考 3若改成 EXIT呢?
语句格式:
SCAN [ < 范围 > ][ FOR < 条件 > ]
< 语句序列 1>
[ LOOP ]
< 语句序列 2>
[ EXIT ]
< 语句序列 3>
ENDSCAN
三、表文件扫描循环
循环体
功能:在指定的范围内,扫描满足给定条件的记录,执行相应的语句。
SET TALK OFFUSE zgbACCEPT “请输入要查找人的姓名 : ” TO NSCAN FOR XM=N DISP WAIT “按任意键继续,按 ESC 键退出”ENDSCANUSE?“查找结束”SET TALK ONRETURN
例 用 SCAN 语句编程:在 zgb.dbf 中查找某人。
对数据表扫描时三种循环的等价格式 表文件扫描循环:
SCAN FOR ……
……
ENDSCAN
条件循环:
DO WHILE .NOT. EOF()……SKIP……
ENDDO
计数循环:
n=RECCOUNT() FOR i=1 TO n ……
GO i ……
ENDFOR
循环嵌套 循环体内又设置循环的情况称为多重循环,又称为循环嵌套。 内外循环的层次必须分明,不允许有交叉现象出现。 循环结构可以与分支结构嵌套,同样不允许有交叉现象出现。
以下交叉情形不允许出现:
例 已知 S1=1 , S2=1+2 , S3=1+2+3 ,……, Sn=1+2+3+……+N ,编程求 S1+S2+……+S100的和。
s=0n=1Do while n<=100 i=1 sub=0 Do while i<=n sub = sub + i i = i + 1 Enddo s = s + sub n =n + 1Enddo
? “ S1+S2+……+S100= ”, s
( 1)求 [1, 30] 之间所有偶数的乘积。
( 3)求 s=1!+2!+……+n!
练 习
( 2)已知 S=1*2*3*…*N 当 S>800 时退出,求此时最小的 S值
!
1
!2
1
!1
11
ns ( 4)求
ny
21
1
321
1
21
11( 5)求
9.5 程序的模块化 9.5.1 子程序、过程和函数 1. 子程序(1). 子程序的结构子程序与其他程序文件的惟一区别是其末尾或返回处必须有返回语句。命令格式: RETURN. [ TO.MASTER| TO.〈程序文件名〉|〈表达式〉]
(2). 子程序的调用 子程序调用命令与主程序执行命令相同,其格式都是: DO 〈程序文件名〉|〈过程名〉[ WITH.〈参数表〉](3). 子程序的嵌套调用 主程序可以调用子程序,子程序还可以调用另外的子程序,这就是子程序的嵌套调用。实际上,子程序和主程序都是相对的,任何一个程序可以调用其他程序,也可以被其他程序调用。每个被调用程序的末尾或返回处都要加上 RETURN 命令。
2. 自定义函数(1). 自定义函数的结构 [ FUNCTION.〈函数名〉][ PARAMETERS.〈参数表〉]〈命令组〉 RETURN. [〈表达式〉](2). 自定义函数的调用 调用格式是: 〈函数名〉 ( 〈自变量表〉 )
3. 过程与过程文件(1). 过程的结构 过程的一般格式是:PROCEDURE〈过程名〉[ PARAMETERS〈参数表〉]〈命令组〉 RETURN (2). 过程文件 一个过程可以以文件形式单独存在,也可以将多个过程合并到一个文件中,这个文件称为过程文件。在过程文件中,每个过程仍然是独立的,可以单独调用。
(3). 过程文件的打开与关闭 打开过程文件命令格式是: SET.PROCEDURE.TO. [〈过程文件名〉]关闭过程文件命令格式是:SET.PROCEDURE.TO 或者CLOSE.PROCEDURE
9.5.2 内存变量的作用域 1. 全局内存变量定义全局变量的命令格式:命令格式 1:PUBLIC〈内存变量表〉| ALL| ALL LINK 〈通配符〉|ALL EXCEPT〈通配符〉命令格式 2:PUBLIC. [ ARRAY ]〈数组名〉 ( 〈下标上界 1〉[ ,〈下标上界 2〉] )[ ,〈数组名〉 ( 〈下标上界 1〉[ ,〈下标上界 2〉] ),…]功能:定义全局内存变量或数组。
2. 局部内存变量 局部内存变量只能在定义它的程序及其下级程序中使用,一旦定义它的程序运行结束,它便自动被清除。也就是说,在某一级程序中定义的局部变量,不能进入其上级程序使用,但可以到其下级程序中使用,而且当在下级程序中改变了该变量的值时,在返回本级程序时被改变的值仍然保存,本级程序可以继续使用改变后的变量值。
3.隐藏内存变量 如果某级程序中使用的局部变量与上级程序中的局部变量或全局变量同名,就容易造成混淆。为了避免这种情况,可使用 PRIVATE 命令在该程序中将全局变量或上级程序定义的一些变量隐藏起来,这时就像这些内存变量不存在一样,可以再定义同名的内存变量。命令格式 : PRIVATE.〈内存变量表〉| ALL| ALL.LIKE.〈通配符〉| ALL.EXCEPT.〈通配符〉
9.5.3 调用子程序时的数据传递 调用子程序时的数据传递可以通过两种方式来解决。1.利用变量的作用域实现数据传递:合理地利用前面介绍的内存变量作用域特性,可以实现调用子程序时的数据传递。2.利用参数实现数据传递 。命令格式是: PARAMETERS.〈内存变量表〉功能:该命令指定子程序中的局部变量名,并由这些局部变量接收上级程序中用 DO…WITH传递来的参数。
9.6 程序调试 9.6.1 程序调试概述 程序调试就是确定程序出错的位置,然后加以改正,一直到满足预定的设计要求为止。程序调试往往是先分模块调试,当各模块都调试通过以后,再联合起来进行调试,通过联调后,便可试运行,试运行无误即可投入正常使用。 程序的错误有两类:语法错误和逻辑错误。
9.6.2调试器窗口 选择“工具”菜单中的“调试器”命令或在命令窗口输入 DEBUG命令,系统打开调试器窗口。 1.跟踪窗口 2.监视窗口 3. 局部窗口 4.调用堆栈窗口
9.6.3 设置断点 在调试器窗口可以设置以下 4种类型的断点: 类型 1 :在定位处中断。 类型 2 :如果表达式值为真则在定位处中断。 类型 3 :当表达式值为真时中断。 类型 4:当表达式值改变时中断。 不同类型断点的设置方法大致相同,但也有一些区别。
9.6.4“调试”菜单项 在调试器窗口中的“调试”菜单项包含执行程序、选择执行方式、终止程序执行、修改程序以及调整程序执行速度等命令。各命令的具体功能请参考教材。