第 七 章程序设计基础
Visual FoxPro
第七章 程序设计基础
Visual FoxPro的工作方式
命令方式、菜单方式、程序文件方式程序 是为了完成某一具体任务而编写的一系列指令。
程序设计 是利用系统所提供的设计工具,按照程序语言的规范,编写程序的过程。 程序中可包括一些如分支语句,循环语句、过程语句等编程语句。
VFP包含了 面向过程 与 面向对象 程序设计。
近年来,程序设计正从传统的面向过程的程序设计,逐步转向面向对象的程序开发。但我们不能放弃基本程序的设计方法,因为它是程序设计的基础。
§ 7.1.1 建立和编辑程序文件
VFP中提供了文本编辑器,可建立和编辑程序文件,也可在任何文本编辑软件中进行。
建立、编辑程序文件有两种方式,
1.命令方式,MODIFY COMMAND 〈 程序文件名 〉
默认文件的扩展名为,PRG
2.菜单方式打开,文件,菜单,选择,新建,;在,新建,窗口,选择
,程序,,在,程序文件,编辑窗口,输入程序文件,结束文件编辑可单击关闭按钮,或按 ctrl+w组合键。
§ 7.1 程序文件执行源程序执行,PRG 源程序有多种方法:
选择 [程序 ]菜单中的 [运行 ]命令,在运行对话框中选择要行执行的程序文件,单击,运行,按钮。
执行当前打开编辑的程序文件,只需单击常用工具栏中的
[! ] 按钮。
在命令窗口,执行命令,DO〈 程序文件名 〉,。 DO命令默认运行,PRG程序,要运行其它程序,须包括扩展名,如 DO
MCZZ.QPR。
§ 7.1.2 程序的运行为了提高程序的运行速度,VFP会自动对程序编译并产生与主名相同的 目标程序 (,FXP) (磁盘中同时保留,PRG和,FXP两种文件,
优先执行,FXP文件。 )目标程序是紧凑的非文本文件,运行速度快,
并可起加密的作用。
§ 7.2 输入、输出命令
1,WAIT命令 (等待命令)
[格式 ]
WAIT [<字符型表达式 >][TO <内存变量 >][WINDOW [AT <行
>,<列 >][NOWAIT][TIMEOUT <数值表达式 >]
[功能 ] 暂停程序执行,等待用户从键盘输入一键,然后 继续执行,也可用于输出一条提示信息。
说明:
该命令只能从键
lllllllllllllllllllllllllllllllllllllllllllllllll
lllllllllllllllllllllllllllllllllllllllllllllllll
lllllllllllllllllllllllllllllllllllllllllllll盘接收一个字符,选 TO缺语将接收的字符赋值给内存变量。
〈 字符表达式 〉 为提示语,缺省为,按任意键继续 ……”
选择 WINDOW短语,则将 〈 字符表达式 〉 提示语显示在屏幕右上角的窗口中;再选 AT项,提示语在屏幕指定坐标位置显示;缺省 WINDOW时提示信息显示在光标当前位置。
选 NOWAIT短语,显示提示语后,光标仍处于当前控制窗口中。
选 TIMEOUT短语,〈 数值表达式 〉 以秒为单位给出最大等待时间,若不按键自动终止该命令。
2.输入字符串命令
[格式 ]
ACCEPT [<提示信息 >] TO <内存变量名 >
[功能 ] 首先在屏幕上显示命令中的提示信息,随后等待用户从键盘输入。待用户输入后,即把输入内容赋值给指定的内存变量。
说明:输入的字符串不需要用定界符括起来,输入完按回车键来结束。
3.输入任意型数据命令
[格式 ] INPUT [<提示信息 >] TO <内存变量名 >
[功能 ] 从键盘输入数值型、字符型、日期型、逻辑型、货币型数据给内存变量。
说明,输入的常量必须用符号表示出数据类型,输入完毕后按回车结束。如:
3.1416
,男,
{ ^2000-10-01}
,T.
$987.65
4.屏幕格式输入、输出命令为了使用户界面美观,符合一定的格式要求,控制信息的输入、输出格式是非常重要的。屏幕格式输入、输出命令功能很强,选项很多,这里仅介绍基本功能。
[基本格式 ]
@ <行,列 >[ SAY <表达式 1>][GET <变量名 >] [DEFAULT <表达式 2>][VALID <条件表达式 >] [RANGE [<下限表达式 >][,<
上限表达式 >] ]
说明:
(1)<行,列 >是控制输出、输入时光标的行、列坐标,用数值表达式表示。根据 X—Y平面坐标系系统将整个屏幕划分为:
25行 ╳ 80列。桌面、主窗口或用户定义的窗口第一行、第一列的编号都为 0。
(2)用于 输出 时,先显示 <表达式 1>的值,再显示 <变量 >的值;
变量可以是内存变量和字段变量,内存变量应先定义,否则可以用[ DEFAULT]短语定义内存变量及初值。
(3)用于 输入 时,显示完 <表达式 1>的值和 <变量 >的值后,等待其后面的 READ 语句来激活 GET后面的变量。
(4)VALID <条件表达式 > 用来控制输入数据的有效性,输入的数据必须使 <条件表达式 >的值为,T.,否则将提示重新输入直至输入正确,也可以按 Esc退出编辑。
RANGE短语 指定输入字符、数值和日期型数据的允许范围,
值的上、下限,缺省一个时只对一个边界进行限制。
举例:编写程序,在 sb.dbf数据表中,指定设备的编号,用格式输出、输入语句显示并修改该记录内容。(见,T1.PRG“)
§ 7.3 程序的三种基本结构
VFP和其他结构化程序设计语言一样,提供了程序设计的三种基本结构:顺序结构、分支结构和循环结构。
§ 7.3,1 顺序结构程序设计程序最基本的执行方式,就是按程序中语句的先后顺序依次执行每一条语句,这就是程序的顺序结构。
A
B
C
D
A
B
C
D
1.注释语句
[格式一] NOTE <注释内容 > 或 * <注释内容 >
[格式二] && <注释内容 >
说明:格式一对前后程序段进行注释格式二放在某条语句的后面对本语句注释。
2.系统初始化命令
[格式 ] CLEAR ALL
说明:清除所有内容变量和数组,关闭所有打开的各类文件。
此外,还有一些语句是经常使用的,下面分别加以介绍。
3.清屏命令
[格式 ] CLEAR
说明:清除当前屏幕上所有信息,光标定位在屏幕左上角。
4.信息显示控制命令
[格式 ] SET TALK ON|OFF
说明:有些命令执行后,会在屏幕上返回有关信息,实现与用户,对话,(Talk)。程序中设置为 OFF将关闭对话,由程序控制信息的显示,默认为 ON状态。
5.警告信息显示控制命令
[格式 ] SET SAFETY ON | OFF
说明:为了安全,在执行一些不能再恢复的操作之前,系统将在屏幕上显示,警告信息,,提示用户谨慎操作。例如,
用 ZAP命令删除记录、用 INDEX 命令覆盖索引文件等。设置为
OFF状态将不作提示而直接操作,默认为 ON状态。
6.输出文本信息语句
[格式 ] TEXT
<文本信息 >
ENDTEXT
说明:在光标当前位置显示文本信息,TEXT — ENDTEXT
成对出现。
TEXT
床前明月光,疑是地上霜;
举头望明月,低头思故乡。
ENDTEXT
7.终止程序执行命令
[格式 ] CANCEL
说明:该语句将中止正在运行的程序。在程序中一般与条件语句配合使用,有条件地中止程序执行。
8.返回语句
[格式 ] RETURN [TO MASTER|TO <程序名 >| <表达式 >]
说明:结束程序的执行。如果程序是被另一程序调用,则返回到调用程序,否则返回到命令窗口。
§ 7.3.2 分支结构程序设计程序运行一般情况是顺序执行。但有时根据处理问题的实现情况,可能有两种或多种情况选择解决,要根据具体的条件要求选择其中的一种。对应于程序设计就产生程序的分支结构。
1.简单条件分支语句
[格式 ] IF <条件表达式 >
<语句序列 A>
[ELSE
<语句序列 B>]
ENDIF
条件
A B
N
Y
举例 1,输入三角形的三个边长A、B、C,若A、B、C
能构成三角形,则计算出三角形面积;否则提示,不能构成三角形!,。若构成的三角形为直角三角形,也给出,构成直角三角形,的提示。
面积 S=
式中 W=(A+B+C)/ 2
(见,三角形面积,PRG” )
))()(( CWBWAWW
举例 2:编写程序,由键盘输入 A,B,C三个数,按值的大小顺序显示出来。
(先比较任意两个数,并将其中的大数存入内存变量 M,小数存入 N。再将第三个数与 M及 N比较得到三个数的大小顺序。 )
( 见,三个数排序,PRG”)
编程序由键盘输入一个数,利用 IIF( )函数求出该数所对应的函数 F(X) 的值。
SET TALK OFF
CLEAR
INPUT,X=” TO X
,F(X)=”,IIF(X<0,X,IIF(X<1,2*X,IIF(X<2,X^2,
SQRT(X))))
SET TALK ON
RETURN
)2(
)21(
)10(
)0(
x
x
x
x
X
X
X
X
XF 2
2
)(
2.多重分支条件语句多分支结构可以利用 IF 语句的多重嵌套来实现,但程序结构复杂不易阅读。 VFP提供了 DO CASE语句,很方便实现多分支程序结构。
[格式 ] DO CASE
CASE <条件表达式 1>
<语句序列 1>
CASE <条件表达式 2>
<语句序列 2>
……
CASE <条件表达式 n>
<语句序列 n>
[OTHERWISE
<语句序列 n+1>]
ENDCASE
说明,
(1)依次判断每一个 CASE 后面的条件,若判断到一个条件满足,则执行该条件下的语句序列,然后转到 ENDCASE 后面的语句执行。如果所有条件都不满足,并且有 OTHERWISE
语句则执行其后的语句序列,否则不执行任何语句。
(2)若有多个条件成立,则系统只执行第一个满足条件的语句序列,然后即转至 ENDCASE后面的语句执行。
(3)DO CASE语句本身可以嵌套,也可以与 IF语句互相嵌套。
举例 1:编程序用 DO CASE语句实现前例中求 F(X)函数的值。
SET TALK OFF
CLEAR
INPUT,X=,TO X
DO CASE
CASE X<0
Y=X
CASE X<1
Y=2*X
CASE X<2
Y=X^2
OTHERWISE
Y=SQRT(X)
ENDCASE
,F(X)=“,Y
SET TALK ON
RETURN
)2(
)21(
)10(
)0(
x
x
x
x
X
X
X
X
XF 2
2
)(
举例2:某班学生计算机考试成绩已登记到 COMPUTER.DBF自由表的 成绩 (N型 )字段中,另有 评估 (C型 )字段。编程序将每个学生的计算机成绩进行评估,评估分为:,优秀,(90
- 100),,良好,(80- 89),,中等,(70- 79),,及格,(60- 69),,不及格,(0- 59)五个等级,并将评估结果写到评估字段中。 学号 成绩 评估
01080301 56
01080302 90
01080303 82
01080304 67
01080305 77
Computer.dbf
SET TALK OFF
CLEAR
USE COMPUTER.DBF
DO WHILE,NOT.EOF( )
DO CASE
CASE 成绩 >= 90
REPLACE 评估 WITH"优秀"
CASE 成绩 >= 80
REPLACE 评估 WITH"良好"
CASE 成绩 >= 70
REPLACE 评估 WITH"中等"
CASE 成绩 >= 60
REPLACE 评估 WITH“及格,
OTHERWISE
REPLACE 评估; WITH,不及格,
ENDCASE
SKIP
ENDDO
LIST
USE
SET TALK ON
RETURN
§ 7.3.3 循环结构程序设计在解决实际问题时,有许多操作,需要对数据的重复处理。在程序中,可以用循环结构处理需要重复执行的某段程序。
VFP提供了三种循环结构语句。
DO WHILE 循环语句
FOR循环语句
SCAN语句条件
A
B
[格式 ] DO WHILE <条件表达式 >
<语句序列 1>
[ LOOP ]
…,..
[ EXIT ]
……
ENDDO [<注释 >]
DO WHILE与 ENDDO必须配对使用,循环嵌套,ENDDO找最近的 DO WHILE语句配对。
<条件表达式 >可以是逻辑型的常量、变量、函数、关系表达式及逻辑表达式。
在循环体中,执行 LOOP将提前返回到 DO WHILE语句;执行
EXIT则立即退出循环。 LOOP和 EXIT语句常放在条件语句中。
1,DO WHILE 循环语句 计算条件表达式的值值为真?
语句组
LOOP
EXIT
N
Y
三种控制循环执行的方式
1)循环次数固定的循环用内存变量作“计数器”,控制循环次数。
举例:计算 10!的值并输出。
SET TALK OFF
CLEAR
S=1 && 暂存阶乘值
N=1 && 控制循环次数
DO WHILE N<=10
S=S*N
N=N+1
ENDDO
,10!=”,S
SET TALK ON
RETURN
2)随机次数的循环有些情况下,在编写程序时无法预知循环次数,而是在运行程序时,根据需要随机退出循环。
举例1,利用 DO WHILE,T.的形式,控制随机循环。在
RSDA.DBF数据表中,按编号连续查询。 ( 见,随机循环
T.PRG”)
举例2,利用 DO WHILE <循环控制变量表达式 > 的形式,控制随机循环。
编写程序向人事管理,DBC数据库的 RSDA.DBF数据表中追加任意个记录。 ( 见,随机循环 YN.PRG”程序文件 )
3)用记录指针控制循环若依次对数据表中的每一个记录进行某种数据处理,
可用记录指针控制循环,待最后一条记录处理完,循环即结束。
举例:学院举行普通话比赛,各选手信息及七个评委的打分都已录入到 SPEAK.DBF自由表中。比赛的记分规则是:去掉一个最高分,去掉一个最低分,剩余五个评委的平均分作为选手的最后得分。表 SPEAK.DBF包括以下字段:编号( C型),姓名( C型),PW1,……,PW7
(各评委打分,N型 ),最高分 (N型 ),最低分 (N型 ),得分
(N型 ),名次 (N型 )。
编程序统计每个选手的最高分、最低分、得分及名次。
得分相同名次并列,但须空出下一名次。 ( 见,比赛,PRG” )
2,FOR循环语句循环次数已知的循环,除了 DO WHILE语句外还可以使用 FOR循环语句。
[格式 ]
FOR <内存变量 > = <数值表达式 1> TO <数值表达式 2> STEP <数值表达式 3>
<语句序列 >
[ EXIT ]
………,
[ LOOP ]
………,
ENDFOR | NEXT
(1)<内存变量 >作为 循环变量计数器 控制循环,<数值表达式 1>为循环变量初值; <数值表达式 2>为循环变量终值,循环变量超过终值循环结束。
(2)FOR语句每循环一次,循环变量的值便改变一次,STEP设置增量,
由 <数值表达式 3>设置。正值为增加,负值为减少,缺省默认为 1。
(3)FOR语句可以嵌套。 ENDFOR 和 NEXT任选其一。
set talk off
clea
s=0
for i=1 to 1000 step 2
s=s+i
next
"1+3+5+....+999=",s
set talk on
retu
举例:用 FOR循环求解 1000以内所有奇数的总和。
举例:用试探法求解百鸡问题,,鸡翁一,值钱五;
鸡母一,值钱三;鸡雏三,值钱一,百钱百鸡,问鸡翁、母、雏各几何?,
设,X—公鸡,Y—母鸡,Z—小鸡
( 见,百鸡问题,PRG”)
3,SCAN语句该语句是为处理数据表而设计的循环语句。
[格式 ]SCAN [<范围 >] [ FOR|WHILE <条件表达式 >]
<语句序列 >
[ EXIT ]
………,
[ LOOP]
……,.,
ENDSCAN
说明,通过循环依次处理给定范围符合条件的每一条记录,语句本身自动移动记录指针。
如:
Use rsgz
Scan
Repl 实发工资 with 实发工资 +200
endscan
举例:某中学招收高中一年级新生 12个班,学生入学成绩已登记在 STUDENTS.DBF自由表中,表中包含姓名 (C
型 )、总分 (N型 )、班级 (N型 )等字段。编程序根据总分成绩将学生均匀搭配到 12个班中,使各记录班级字段值为班级序号。再将同班的记录分别拷贝到 CLASS1.DBF、
CLASS2.DBF,……,CLASS12.DBF自由表中。分配班级时,按照巡回折转的顺序进行(如,总分第 11名分给
11班,第 12名分给 12班,第 13名分给 12班,第 14名分给第 11班,…… )。
( 见,分班,PRG”)
§ 7.4 子程序及其调用对于两个具有调用关系的程序文件,称调用程序为 主程序,
被调用的程序称 子程序 。
主程序和子程序在逻辑意义有主从调用关系,但在物理意义上都是独立的命令文件,存储于磁盘上。
§ 7.4.1 子程序调用调用子程序时经常需要在主程序和子程序之间传递数据。
传递数据有两种常用方法:
一是利用内存变量传递数据,(见举例 1)
二是利用 参数传递 数据。
举例 1,用 内存变量 在主程序和子程序之间传递数据。
已知 m和为 n正整数,且 m>n,计算组合,
其中 m和 n的值由键盘输入,用子程序求任意数的阶乘。
(见,求组合,PRG 主程序,
和,JC.PRG 子程序,)
)!(!
!
nmn
mC n
m
利用内存变量传递数据
1.子程序调用语句 (在主程序中)
[格式 ] DO <子程序名 > [ WITH <实参表 >]
说明,使用参数传递数据,应使用 WITH短语。
2.参数传递语句 (在子程序中)
[格式 ] PARAMETERS < 形参表 >
说明,它必须是子程序第一条可执行语句。
形参与实参,在数量、位置、数据类型上应相互对应。
P138 例 4-13
(见,求组合 1.PRG 主程序,
和,JC1.PRG 子程序,)
利用参数传递数据
§ 7.4.2 返回主程序语句
[格式 ]
RETURN [ TO MASTER | TO <程序名 > | <表达式 > ]
说明:结束子程序的运行,返回主程序中调用子程序语句的下一条语句继续执行。
TO MASTER是在多级程序被调用时直接返回主程序,
TO <程序名 >则返回到指定程序。
<表达式 >只用于用户自定义函数,将表达式的值返回给函数。
RETURN 可以放在子程序的最后,也可以放置在子程序的其它地方,作为有条件返回主程序的出口,但一般应遵循单入口单出口的原则。
§ 7.4.3 内存变量的作用域定义内存变量时,在不同的程序中可能出现同名的内存变量,处理不当易造成数据混乱。
VFP有几种类型的内存变量,各自的作用范围不同,防止互相干扰。
1.局部型内存变量程序中未加任何定义说明的内存变量都是局部变量。它具有如下性质:
( 1)局部变量在定义它的程序运行结束后立即被清除。
( 2)主程序中定义的局部变量在子程序中继续有效,
上一级子程序定义的局部变量在下一级子程序继续有效,反之则不可以,具有单向性。
2.全局型内存变量
[格式 ] PUBLIC <内存变量名表 >
说明:
全局型内存变量定义后对所有程序都有效,包括主程序、各级子程序及其它项目的程序,并一直保留在内存中,除非用 RELEASE或 CLEAR ALL命令清除。
命令窗口中定义的内存变量为全局型变量。
3.隐蔽型内存变量
[格式 ] PRIVATE <内存变量名表 >
或 PRIVATE ALL [ LIKE <标识符 > | EXCEPT <标识符 >]
说明,该命令对先前程序定义的同名内存变量进行屏蔽。可以在定义它的程序以及被该程序调用的程序中有效。一旦定义它的程序运行完毕,PRIVATE变量将从内存中释放。
命令中选择 ALL将所有内存变量隐蔽; ALL LIKE <标识符 >
仅隐蔽与标识符匹配的变量; ALL EXCEPT <标识符 > 仅隐蔽与标识符不匹配的变量。
标识符中使用通配符,*” 和,?”进行匹配。
4.区域型内存变量区域型内存变量仅限于定义它的程序中使用。
[格式 ] LOCAL <内存变量名表 >
( 见,7-15.PRG”和,sub1.PRG”)。
SET TALK OFF
SET PROCEDURE TO PG123
PUBLIC A,B
A=1
DO PG1
"A=",A
STORE 1 TO B,C
DO PG2
"B=",B
"C=",C
CLOSE PROCEDURE
SET TALK ON
RETURN
PROCEDURE PG1
A=A+5
RETURN
ENDPROC
PROCEDURE PG2
PRIVATE B
B=A*5
C=C*5
DO PG3
RETURN
ENDPROC
PROCEDURE PG3
LOCAL C
C=12
B=C*B
C=C*B
“B=",B
“C=",C
RETURN
ENDPROC
5
1
1
30
4320
360
B=1,C=1
6
变量的作用域示例程序:
5
§ 7.5 过程、过程文件及其调用
§ 7.5.1 过程、过程文件
1.过程及过程文件的概念子程序是完成某一功能的程序,它以独立的文件形式存储在磁盘中。子程序在调用过程存在一些缺点:
( 1)多次调用子程序时,访问磁盘文件会降低程序运行速度。
( 2)在子程序多层嵌套时,需要同时打开多个文件,会增加系统的负担,且系统能同时打开的文件数量是有限的。
( 3)程序文件再小也要占据一个基本存贮空间,当子程序很多时,会浪费存贮空间,也不便于管理和维护。
解决问题的方法( 过程 ),把每一个子程序作为一个,过程,,
并将这些过程集中作为一个过程文件。调用过程时,先打开过程文件,而后从内存中调用过程,(不象调用子程序从磁盘中调用)。此外,过程也可以放在程序文件的后面,但要在逻辑上与主程序分开,过程只能放在主程序之后。
说明:
过程名是标识符,最多 254个字符,定义规则同变量名。
过程中如果用参数传递数据,形参表有两种表示形式。
一是放在过程名后面的园括号中;
二是使用参数传递语句 PARAMETERS ( <形参表 >)。
RETURN语句可以缺省
[ 过程格式 ]
PROCEDURE <过程名 > [ (<形参表 >) ]
[ PARAMETERS <形参表 > ]
< 过程语句序列 >
[ RETURN ]
ENDPROC
2.建立过程文件方法同建立程序一样,默认扩展名,PRG,过程文件中可含若干个过程。
§ 7.5.2 过程文件的使用及过程的调用
1.打开过程文件在调用过程之前,要先打开过程文件。
[格式 ]SET PROCEDURE TO <过程文件名 1> [,<过程文件名 2>…… ][ADDITIVE]
说明:打开一个或多个过程文件。选择 [ADDITIVE]时,在打开新的过程文件时,不关闭已打开的过程文件。
2.调用过程
[格式 ] DO <过程名 > [ WITH <实参表 >]
说明:可以随时用该语句调用过程文件中的过程、本程序中的过程,以及嵌套中任一个程序中所包含的过程,还可以调用子程序。
查找所调用过程的顺序是:( 1)本程序中的过程( 2)已打开过程文件中的过程( 3)嵌套中某子程序中的过程( 4)与过程名相同的子程序文件。
3.关闭过程文件
[格式 ] SET PROCEDURE TO
或 CLOSE PROCEDURE
此外,CLOSE ALL,CLEAR ALL在关闭所有文件时也关闭过程文件。
4.过程的嵌套调用过程中调用其他过程就是过程的 嵌套 调用,若过程中调用过程本身,称为,递归,调用。
( 见,7-19.PRG”)。
( 见,7-16.PRG”和,7-17.PRG”)。
( 见,7-18.PRG”)。
§ 7.6 用户自定义函数
VFP系统为用户提供了很多函数,但也允许用户自己定义函数。每一个自定义函数都对应于一个程序段,在 VFP
中它与过程及子程序非常相似,而且存储形式也相仿。
但是函数可以在表达式中调用,并返回一个函数值。
§ 7.6.1 独立自定义函数独立自定义函数与子程序很相似,单独以命令文件形式存储,文件名即函数名。
[格式 ][ PARAMETERS <形参表 >]
<自定义函数语句序列 >
RETURN <表达式 >
说明:
自定义函数调用形式是:函数名( <实参数 >),并且自定义函数中应该有参数传递语句
PARAMETERS <形参表 >定义形式参数,
RETURN <表达式 > 返回自定义函数值。不能省略举例:利用自定义函数求组合
)!(!
!
nmn
mC n
m
* ZH.PRG求组合
SET TALK OFF
CLEAR
INPUT,M=” TO M
INPUT,N=” TO N
ZH=JC(M)/JC(N)/JC(M-N)
,组合 =”,ZH
SET TALK ON
* JC.PRG求阶乘自定义函数
PARAMETERS K
STORE 1 TO I,Z
DO WHILE I<=K
Z=Z*I
I=I+1
ENDDO
RETURN Z && 返回阶乘值
§ 7.6.2 依附自定义函数依附自定义函数也称为内部自定义函数。
与过程一样,内部自定函数放在过程文件中或放在调用它的程序后面。
[自定义函数格式 ]
FUNCTION <自定义函数名 > [ (<形参表 >) ]
[ PARAMETERS <形参表 > ]
< 自定义函数语句序列 >
RETURN <表达式 >
ENDFUNC
和过程一样,内部自定义函数如果用参数传递数据,形参表也有两种表示形式。
RETURN <表达式 > 不能省略,其后的表达式返回函数值。
( 见,7-21.PRG”)。
( 见,7-22.PRG”)。
1.结构化程序的三种基本结构是顺序结构、分支结构和( )。
A)模块结构 B)循环结构 C)表结构 D)条件结构
2,ACCEPT命令可以接收( )型的数据。
A) N B) L C) C D) D
3.如果 VAR2是当前表中的一个字段名,同时也是内存变量名,则执行( )
命令可以显示当前记录的字段值。
A)? VAR2 B)? M.VAR2 C)? field_VAR2 D) LIST M->VAR2
4.在 VFP窗口中,执行 wait to qw命令后,按一次数字键,1”,再执行?type(“qw”)命令的结果是( )。
A) 1 B) qw C) C D) N
5.打开数据工作期窗口的命令是( )。
A) select B) set C) open box D) modify data
7,执行下列程序的结果是 ( ) 。
var= "1234567890"
do while,t.
right (var,1)+var
exit
var=var+2
Enddo
A) 1234567890 B) 0987654321
C.) 01234567890 D) 0123456789
6.如果要指定默认的盘和文件夹,应使用( )命令进行设置。
A) set default B) set system C) set deletedD) set safety
8,执行下列程序的结果是 ( ) 。
s=1
for n=1 to 8 step 2
s=s*n
endfor
s
A) 36 B) 16 C) 40320 D.) 105
9,如果执行 list name off命令后依次显示:计算机,电视,计数器,
则接着执行下列命令的结果是 ( ) 。
go top
scan while left( name,2) =“计,
name
endscan
A.) 计算机 B) 计算机计数器 C) 电视 D) 计数器
10,下列程序的运新结果是 ( ) 。
for m=3 to 5
space (m-2) +str (m,1)
Endfor
A) 1 B) 1 C.) 3 D) 3
2 3 4 4
3 5 5 5
二,填充和编写程序
1,下列程序将,中华人民共和国,显示为,中 华 人 民 共 和 国,。
SET TALK OFF
CLEAR
X=“中华人民共和国,
Y=“”
DO WHILE LEN( X) >=4
Y=Y+SUBSTR( X,1,2) +,”
X=SUBSTR( X,3)
ENDDO
? __________
SET TALK ON
RETURN
Y+X
2,求矩形面积 。
SET TALK OFF
INPUT“长 =”TO L
INPUT“宽 =”TO W
MJ=0
DO JS WITH ______
,面积 =”,______
RETU
**过程文件 (JS.PRG)
______ A,B,C
C=A*B
RETU
L,W,MJ
MJ
PARAM
3,编写程序,打印下面图形 。
程序 1
SET TALK OFF
CLEAR
FOR I=1 TO 5
FOR J=1 TO 2*I-1
@ I,40-I+J SAY "*"
NEXT J
NEXT I
程序 2
SET TALK OFF
CLEAR
FOR I=5 TO 1 STEP -1
FOR J=1 TO 2*I-1
@ 10-I,10-I+J SAY "*"
NEXT J
NEXT I
Visual FoxPro
第七章 程序设计基础
Visual FoxPro的工作方式
命令方式、菜单方式、程序文件方式程序 是为了完成某一具体任务而编写的一系列指令。
程序设计 是利用系统所提供的设计工具,按照程序语言的规范,编写程序的过程。 程序中可包括一些如分支语句,循环语句、过程语句等编程语句。
VFP包含了 面向过程 与 面向对象 程序设计。
近年来,程序设计正从传统的面向过程的程序设计,逐步转向面向对象的程序开发。但我们不能放弃基本程序的设计方法,因为它是程序设计的基础。
§ 7.1.1 建立和编辑程序文件
VFP中提供了文本编辑器,可建立和编辑程序文件,也可在任何文本编辑软件中进行。
建立、编辑程序文件有两种方式,
1.命令方式,MODIFY COMMAND 〈 程序文件名 〉
默认文件的扩展名为,PRG
2.菜单方式打开,文件,菜单,选择,新建,;在,新建,窗口,选择
,程序,,在,程序文件,编辑窗口,输入程序文件,结束文件编辑可单击关闭按钮,或按 ctrl+w组合键。
§ 7.1 程序文件执行源程序执行,PRG 源程序有多种方法:
选择 [程序 ]菜单中的 [运行 ]命令,在运行对话框中选择要行执行的程序文件,单击,运行,按钮。
执行当前打开编辑的程序文件,只需单击常用工具栏中的
[! ] 按钮。
在命令窗口,执行命令,DO〈 程序文件名 〉,。 DO命令默认运行,PRG程序,要运行其它程序,须包括扩展名,如 DO
MCZZ.QPR。
§ 7.1.2 程序的运行为了提高程序的运行速度,VFP会自动对程序编译并产生与主名相同的 目标程序 (,FXP) (磁盘中同时保留,PRG和,FXP两种文件,
优先执行,FXP文件。 )目标程序是紧凑的非文本文件,运行速度快,
并可起加密的作用。
§ 7.2 输入、输出命令
1,WAIT命令 (等待命令)
[格式 ]
WAIT [<字符型表达式 >][TO <内存变量 >][WINDOW [AT <行
>,<列 >][NOWAIT][TIMEOUT <数值表达式 >]
[功能 ] 暂停程序执行,等待用户从键盘输入一键,然后 继续执行,也可用于输出一条提示信息。
说明:
该命令只能从键
lllllllllllllllllllllllllllllllllllllllllllllllll
lllllllllllllllllllllllllllllllllllllllllllllllll
lllllllllllllllllllllllllllllllllllllllllllll盘接收一个字符,选 TO缺语将接收的字符赋值给内存变量。
〈 字符表达式 〉 为提示语,缺省为,按任意键继续 ……”
选择 WINDOW短语,则将 〈 字符表达式 〉 提示语显示在屏幕右上角的窗口中;再选 AT项,提示语在屏幕指定坐标位置显示;缺省 WINDOW时提示信息显示在光标当前位置。
选 NOWAIT短语,显示提示语后,光标仍处于当前控制窗口中。
选 TIMEOUT短语,〈 数值表达式 〉 以秒为单位给出最大等待时间,若不按键自动终止该命令。
2.输入字符串命令
[格式 ]
ACCEPT [<提示信息 >] TO <内存变量名 >
[功能 ] 首先在屏幕上显示命令中的提示信息,随后等待用户从键盘输入。待用户输入后,即把输入内容赋值给指定的内存变量。
说明:输入的字符串不需要用定界符括起来,输入完按回车键来结束。
3.输入任意型数据命令
[格式 ] INPUT [<提示信息 >] TO <内存变量名 >
[功能 ] 从键盘输入数值型、字符型、日期型、逻辑型、货币型数据给内存变量。
说明,输入的常量必须用符号表示出数据类型,输入完毕后按回车结束。如:
3.1416
,男,
{ ^2000-10-01}
,T.
$987.65
4.屏幕格式输入、输出命令为了使用户界面美观,符合一定的格式要求,控制信息的输入、输出格式是非常重要的。屏幕格式输入、输出命令功能很强,选项很多,这里仅介绍基本功能。
[基本格式 ]
@ <行,列 >[ SAY <表达式 1>][GET <变量名 >] [DEFAULT <表达式 2>][VALID <条件表达式 >] [RANGE [<下限表达式 >][,<
上限表达式 >] ]
说明:
(1)<行,列 >是控制输出、输入时光标的行、列坐标,用数值表达式表示。根据 X—Y平面坐标系系统将整个屏幕划分为:
25行 ╳ 80列。桌面、主窗口或用户定义的窗口第一行、第一列的编号都为 0。
(2)用于 输出 时,先显示 <表达式 1>的值,再显示 <变量 >的值;
变量可以是内存变量和字段变量,内存变量应先定义,否则可以用[ DEFAULT]短语定义内存变量及初值。
(3)用于 输入 时,显示完 <表达式 1>的值和 <变量 >的值后,等待其后面的 READ 语句来激活 GET后面的变量。
(4)VALID <条件表达式 > 用来控制输入数据的有效性,输入的数据必须使 <条件表达式 >的值为,T.,否则将提示重新输入直至输入正确,也可以按 Esc退出编辑。
RANGE短语 指定输入字符、数值和日期型数据的允许范围,
值的上、下限,缺省一个时只对一个边界进行限制。
举例:编写程序,在 sb.dbf数据表中,指定设备的编号,用格式输出、输入语句显示并修改该记录内容。(见,T1.PRG“)
§ 7.3 程序的三种基本结构
VFP和其他结构化程序设计语言一样,提供了程序设计的三种基本结构:顺序结构、分支结构和循环结构。
§ 7.3,1 顺序结构程序设计程序最基本的执行方式,就是按程序中语句的先后顺序依次执行每一条语句,这就是程序的顺序结构。
A
B
C
D
A
B
C
D
1.注释语句
[格式一] NOTE <注释内容 > 或 * <注释内容 >
[格式二] && <注释内容 >
说明:格式一对前后程序段进行注释格式二放在某条语句的后面对本语句注释。
2.系统初始化命令
[格式 ] CLEAR ALL
说明:清除所有内容变量和数组,关闭所有打开的各类文件。
此外,还有一些语句是经常使用的,下面分别加以介绍。
3.清屏命令
[格式 ] CLEAR
说明:清除当前屏幕上所有信息,光标定位在屏幕左上角。
4.信息显示控制命令
[格式 ] SET TALK ON|OFF
说明:有些命令执行后,会在屏幕上返回有关信息,实现与用户,对话,(Talk)。程序中设置为 OFF将关闭对话,由程序控制信息的显示,默认为 ON状态。
5.警告信息显示控制命令
[格式 ] SET SAFETY ON | OFF
说明:为了安全,在执行一些不能再恢复的操作之前,系统将在屏幕上显示,警告信息,,提示用户谨慎操作。例如,
用 ZAP命令删除记录、用 INDEX 命令覆盖索引文件等。设置为
OFF状态将不作提示而直接操作,默认为 ON状态。
6.输出文本信息语句
[格式 ] TEXT
<文本信息 >
ENDTEXT
说明:在光标当前位置显示文本信息,TEXT — ENDTEXT
成对出现。
TEXT
床前明月光,疑是地上霜;
举头望明月,低头思故乡。
ENDTEXT
7.终止程序执行命令
[格式 ] CANCEL
说明:该语句将中止正在运行的程序。在程序中一般与条件语句配合使用,有条件地中止程序执行。
8.返回语句
[格式 ] RETURN [TO MASTER|TO <程序名 >| <表达式 >]
说明:结束程序的执行。如果程序是被另一程序调用,则返回到调用程序,否则返回到命令窗口。
§ 7.3.2 分支结构程序设计程序运行一般情况是顺序执行。但有时根据处理问题的实现情况,可能有两种或多种情况选择解决,要根据具体的条件要求选择其中的一种。对应于程序设计就产生程序的分支结构。
1.简单条件分支语句
[格式 ] IF <条件表达式 >
<语句序列 A>
[ELSE
<语句序列 B>]
ENDIF
条件
A B
N
Y
举例 1,输入三角形的三个边长A、B、C,若A、B、C
能构成三角形,则计算出三角形面积;否则提示,不能构成三角形!,。若构成的三角形为直角三角形,也给出,构成直角三角形,的提示。
面积 S=
式中 W=(A+B+C)/ 2
(见,三角形面积,PRG” )
))()(( CWBWAWW
举例 2:编写程序,由键盘输入 A,B,C三个数,按值的大小顺序显示出来。
(先比较任意两个数,并将其中的大数存入内存变量 M,小数存入 N。再将第三个数与 M及 N比较得到三个数的大小顺序。 )
( 见,三个数排序,PRG”)
编程序由键盘输入一个数,利用 IIF( )函数求出该数所对应的函数 F(X) 的值。
SET TALK OFF
CLEAR
INPUT,X=” TO X
,F(X)=”,IIF(X<0,X,IIF(X<1,2*X,IIF(X<2,X^2,
SQRT(X))))
SET TALK ON
RETURN
)2(
)21(
)10(
)0(
x
x
x
x
X
X
X
X
XF 2
2
)(
2.多重分支条件语句多分支结构可以利用 IF 语句的多重嵌套来实现,但程序结构复杂不易阅读。 VFP提供了 DO CASE语句,很方便实现多分支程序结构。
[格式 ] DO CASE
CASE <条件表达式 1>
<语句序列 1>
CASE <条件表达式 2>
<语句序列 2>
……
CASE <条件表达式 n>
<语句序列 n>
[OTHERWISE
<语句序列 n+1>]
ENDCASE
说明,
(1)依次判断每一个 CASE 后面的条件,若判断到一个条件满足,则执行该条件下的语句序列,然后转到 ENDCASE 后面的语句执行。如果所有条件都不满足,并且有 OTHERWISE
语句则执行其后的语句序列,否则不执行任何语句。
(2)若有多个条件成立,则系统只执行第一个满足条件的语句序列,然后即转至 ENDCASE后面的语句执行。
(3)DO CASE语句本身可以嵌套,也可以与 IF语句互相嵌套。
举例 1:编程序用 DO CASE语句实现前例中求 F(X)函数的值。
SET TALK OFF
CLEAR
INPUT,X=,TO X
DO CASE
CASE X<0
Y=X
CASE X<1
Y=2*X
CASE X<2
Y=X^2
OTHERWISE
Y=SQRT(X)
ENDCASE
,F(X)=“,Y
SET TALK ON
RETURN
)2(
)21(
)10(
)0(
x
x
x
x
X
X
X
X
XF 2
2
)(
举例2:某班学生计算机考试成绩已登记到 COMPUTER.DBF自由表的 成绩 (N型 )字段中,另有 评估 (C型 )字段。编程序将每个学生的计算机成绩进行评估,评估分为:,优秀,(90
- 100),,良好,(80- 89),,中等,(70- 79),,及格,(60- 69),,不及格,(0- 59)五个等级,并将评估结果写到评估字段中。 学号 成绩 评估
01080301 56
01080302 90
01080303 82
01080304 67
01080305 77
Computer.dbf
SET TALK OFF
CLEAR
USE COMPUTER.DBF
DO WHILE,NOT.EOF( )
DO CASE
CASE 成绩 >= 90
REPLACE 评估 WITH"优秀"
CASE 成绩 >= 80
REPLACE 评估 WITH"良好"
CASE 成绩 >= 70
REPLACE 评估 WITH"中等"
CASE 成绩 >= 60
REPLACE 评估 WITH“及格,
OTHERWISE
REPLACE 评估; WITH,不及格,
ENDCASE
SKIP
ENDDO
LIST
USE
SET TALK ON
RETURN
§ 7.3.3 循环结构程序设计在解决实际问题时,有许多操作,需要对数据的重复处理。在程序中,可以用循环结构处理需要重复执行的某段程序。
VFP提供了三种循环结构语句。
DO WHILE 循环语句
FOR循环语句
SCAN语句条件
A
B
[格式 ] DO WHILE <条件表达式 >
<语句序列 1>
[ LOOP ]
…,..
[ EXIT ]
……
ENDDO [<注释 >]
DO WHILE与 ENDDO必须配对使用,循环嵌套,ENDDO找最近的 DO WHILE语句配对。
<条件表达式 >可以是逻辑型的常量、变量、函数、关系表达式及逻辑表达式。
在循环体中,执行 LOOP将提前返回到 DO WHILE语句;执行
EXIT则立即退出循环。 LOOP和 EXIT语句常放在条件语句中。
1,DO WHILE 循环语句 计算条件表达式的值值为真?
语句组
LOOP
EXIT
N
Y
三种控制循环执行的方式
1)循环次数固定的循环用内存变量作“计数器”,控制循环次数。
举例:计算 10!的值并输出。
SET TALK OFF
CLEAR
S=1 && 暂存阶乘值
N=1 && 控制循环次数
DO WHILE N<=10
S=S*N
N=N+1
ENDDO
,10!=”,S
SET TALK ON
RETURN
2)随机次数的循环有些情况下,在编写程序时无法预知循环次数,而是在运行程序时,根据需要随机退出循环。
举例1,利用 DO WHILE,T.的形式,控制随机循环。在
RSDA.DBF数据表中,按编号连续查询。 ( 见,随机循环
T.PRG”)
举例2,利用 DO WHILE <循环控制变量表达式 > 的形式,控制随机循环。
编写程序向人事管理,DBC数据库的 RSDA.DBF数据表中追加任意个记录。 ( 见,随机循环 YN.PRG”程序文件 )
3)用记录指针控制循环若依次对数据表中的每一个记录进行某种数据处理,
可用记录指针控制循环,待最后一条记录处理完,循环即结束。
举例:学院举行普通话比赛,各选手信息及七个评委的打分都已录入到 SPEAK.DBF自由表中。比赛的记分规则是:去掉一个最高分,去掉一个最低分,剩余五个评委的平均分作为选手的最后得分。表 SPEAK.DBF包括以下字段:编号( C型),姓名( C型),PW1,……,PW7
(各评委打分,N型 ),最高分 (N型 ),最低分 (N型 ),得分
(N型 ),名次 (N型 )。
编程序统计每个选手的最高分、最低分、得分及名次。
得分相同名次并列,但须空出下一名次。 ( 见,比赛,PRG” )
2,FOR循环语句循环次数已知的循环,除了 DO WHILE语句外还可以使用 FOR循环语句。
[格式 ]
FOR <内存变量 > = <数值表达式 1> TO <数值表达式 2> STEP <数值表达式 3>
<语句序列 >
[ EXIT ]
………,
[ LOOP ]
………,
ENDFOR | NEXT
(1)<内存变量 >作为 循环变量计数器 控制循环,<数值表达式 1>为循环变量初值; <数值表达式 2>为循环变量终值,循环变量超过终值循环结束。
(2)FOR语句每循环一次,循环变量的值便改变一次,STEP设置增量,
由 <数值表达式 3>设置。正值为增加,负值为减少,缺省默认为 1。
(3)FOR语句可以嵌套。 ENDFOR 和 NEXT任选其一。
set talk off
clea
s=0
for i=1 to 1000 step 2
s=s+i
next
"1+3+5+....+999=",s
set talk on
retu
举例:用 FOR循环求解 1000以内所有奇数的总和。
举例:用试探法求解百鸡问题,,鸡翁一,值钱五;
鸡母一,值钱三;鸡雏三,值钱一,百钱百鸡,问鸡翁、母、雏各几何?,
设,X—公鸡,Y—母鸡,Z—小鸡
( 见,百鸡问题,PRG”)
3,SCAN语句该语句是为处理数据表而设计的循环语句。
[格式 ]SCAN [<范围 >] [ FOR|WHILE <条件表达式 >]
<语句序列 >
[ EXIT ]
………,
[ LOOP]
……,.,
ENDSCAN
说明,通过循环依次处理给定范围符合条件的每一条记录,语句本身自动移动记录指针。
如:
Use rsgz
Scan
Repl 实发工资 with 实发工资 +200
endscan
举例:某中学招收高中一年级新生 12个班,学生入学成绩已登记在 STUDENTS.DBF自由表中,表中包含姓名 (C
型 )、总分 (N型 )、班级 (N型 )等字段。编程序根据总分成绩将学生均匀搭配到 12个班中,使各记录班级字段值为班级序号。再将同班的记录分别拷贝到 CLASS1.DBF、
CLASS2.DBF,……,CLASS12.DBF自由表中。分配班级时,按照巡回折转的顺序进行(如,总分第 11名分给
11班,第 12名分给 12班,第 13名分给 12班,第 14名分给第 11班,…… )。
( 见,分班,PRG”)
§ 7.4 子程序及其调用对于两个具有调用关系的程序文件,称调用程序为 主程序,
被调用的程序称 子程序 。
主程序和子程序在逻辑意义有主从调用关系,但在物理意义上都是独立的命令文件,存储于磁盘上。
§ 7.4.1 子程序调用调用子程序时经常需要在主程序和子程序之间传递数据。
传递数据有两种常用方法:
一是利用内存变量传递数据,(见举例 1)
二是利用 参数传递 数据。
举例 1,用 内存变量 在主程序和子程序之间传递数据。
已知 m和为 n正整数,且 m>n,计算组合,
其中 m和 n的值由键盘输入,用子程序求任意数的阶乘。
(见,求组合,PRG 主程序,
和,JC.PRG 子程序,)
)!(!
!
nmn
mC n
m
利用内存变量传递数据
1.子程序调用语句 (在主程序中)
[格式 ] DO <子程序名 > [ WITH <实参表 >]
说明,使用参数传递数据,应使用 WITH短语。
2.参数传递语句 (在子程序中)
[格式 ] PARAMETERS < 形参表 >
说明,它必须是子程序第一条可执行语句。
形参与实参,在数量、位置、数据类型上应相互对应。
P138 例 4-13
(见,求组合 1.PRG 主程序,
和,JC1.PRG 子程序,)
利用参数传递数据
§ 7.4.2 返回主程序语句
[格式 ]
RETURN [ TO MASTER | TO <程序名 > | <表达式 > ]
说明:结束子程序的运行,返回主程序中调用子程序语句的下一条语句继续执行。
TO MASTER是在多级程序被调用时直接返回主程序,
TO <程序名 >则返回到指定程序。
<表达式 >只用于用户自定义函数,将表达式的值返回给函数。
RETURN 可以放在子程序的最后,也可以放置在子程序的其它地方,作为有条件返回主程序的出口,但一般应遵循单入口单出口的原则。
§ 7.4.3 内存变量的作用域定义内存变量时,在不同的程序中可能出现同名的内存变量,处理不当易造成数据混乱。
VFP有几种类型的内存变量,各自的作用范围不同,防止互相干扰。
1.局部型内存变量程序中未加任何定义说明的内存变量都是局部变量。它具有如下性质:
( 1)局部变量在定义它的程序运行结束后立即被清除。
( 2)主程序中定义的局部变量在子程序中继续有效,
上一级子程序定义的局部变量在下一级子程序继续有效,反之则不可以,具有单向性。
2.全局型内存变量
[格式 ] PUBLIC <内存变量名表 >
说明:
全局型内存变量定义后对所有程序都有效,包括主程序、各级子程序及其它项目的程序,并一直保留在内存中,除非用 RELEASE或 CLEAR ALL命令清除。
命令窗口中定义的内存变量为全局型变量。
3.隐蔽型内存变量
[格式 ] PRIVATE <内存变量名表 >
或 PRIVATE ALL [ LIKE <标识符 > | EXCEPT <标识符 >]
说明,该命令对先前程序定义的同名内存变量进行屏蔽。可以在定义它的程序以及被该程序调用的程序中有效。一旦定义它的程序运行完毕,PRIVATE变量将从内存中释放。
命令中选择 ALL将所有内存变量隐蔽; ALL LIKE <标识符 >
仅隐蔽与标识符匹配的变量; ALL EXCEPT <标识符 > 仅隐蔽与标识符不匹配的变量。
标识符中使用通配符,*” 和,?”进行匹配。
4.区域型内存变量区域型内存变量仅限于定义它的程序中使用。
[格式 ] LOCAL <内存变量名表 >
( 见,7-15.PRG”和,sub1.PRG”)。
SET TALK OFF
SET PROCEDURE TO PG123
PUBLIC A,B
A=1
DO PG1
"A=",A
STORE 1 TO B,C
DO PG2
"B=",B
"C=",C
CLOSE PROCEDURE
SET TALK ON
RETURN
PROCEDURE PG1
A=A+5
RETURN
ENDPROC
PROCEDURE PG2
PRIVATE B
B=A*5
C=C*5
DO PG3
RETURN
ENDPROC
PROCEDURE PG3
LOCAL C
C=12
B=C*B
C=C*B
“B=",B
“C=",C
RETURN
ENDPROC
5
1
1
30
4320
360
B=1,C=1
6
变量的作用域示例程序:
5
§ 7.5 过程、过程文件及其调用
§ 7.5.1 过程、过程文件
1.过程及过程文件的概念子程序是完成某一功能的程序,它以独立的文件形式存储在磁盘中。子程序在调用过程存在一些缺点:
( 1)多次调用子程序时,访问磁盘文件会降低程序运行速度。
( 2)在子程序多层嵌套时,需要同时打开多个文件,会增加系统的负担,且系统能同时打开的文件数量是有限的。
( 3)程序文件再小也要占据一个基本存贮空间,当子程序很多时,会浪费存贮空间,也不便于管理和维护。
解决问题的方法( 过程 ),把每一个子程序作为一个,过程,,
并将这些过程集中作为一个过程文件。调用过程时,先打开过程文件,而后从内存中调用过程,(不象调用子程序从磁盘中调用)。此外,过程也可以放在程序文件的后面,但要在逻辑上与主程序分开,过程只能放在主程序之后。
说明:
过程名是标识符,最多 254个字符,定义规则同变量名。
过程中如果用参数传递数据,形参表有两种表示形式。
一是放在过程名后面的园括号中;
二是使用参数传递语句 PARAMETERS ( <形参表 >)。
RETURN语句可以缺省
[ 过程格式 ]
PROCEDURE <过程名 > [ (<形参表 >) ]
[ PARAMETERS <形参表 > ]
< 过程语句序列 >
[ RETURN ]
ENDPROC
2.建立过程文件方法同建立程序一样,默认扩展名,PRG,过程文件中可含若干个过程。
§ 7.5.2 过程文件的使用及过程的调用
1.打开过程文件在调用过程之前,要先打开过程文件。
[格式 ]SET PROCEDURE TO <过程文件名 1> [,<过程文件名 2>…… ][ADDITIVE]
说明:打开一个或多个过程文件。选择 [ADDITIVE]时,在打开新的过程文件时,不关闭已打开的过程文件。
2.调用过程
[格式 ] DO <过程名 > [ WITH <实参表 >]
说明:可以随时用该语句调用过程文件中的过程、本程序中的过程,以及嵌套中任一个程序中所包含的过程,还可以调用子程序。
查找所调用过程的顺序是:( 1)本程序中的过程( 2)已打开过程文件中的过程( 3)嵌套中某子程序中的过程( 4)与过程名相同的子程序文件。
3.关闭过程文件
[格式 ] SET PROCEDURE TO
或 CLOSE PROCEDURE
此外,CLOSE ALL,CLEAR ALL在关闭所有文件时也关闭过程文件。
4.过程的嵌套调用过程中调用其他过程就是过程的 嵌套 调用,若过程中调用过程本身,称为,递归,调用。
( 见,7-19.PRG”)。
( 见,7-16.PRG”和,7-17.PRG”)。
( 见,7-18.PRG”)。
§ 7.6 用户自定义函数
VFP系统为用户提供了很多函数,但也允许用户自己定义函数。每一个自定义函数都对应于一个程序段,在 VFP
中它与过程及子程序非常相似,而且存储形式也相仿。
但是函数可以在表达式中调用,并返回一个函数值。
§ 7.6.1 独立自定义函数独立自定义函数与子程序很相似,单独以命令文件形式存储,文件名即函数名。
[格式 ][ PARAMETERS <形参表 >]
<自定义函数语句序列 >
RETURN <表达式 >
说明:
自定义函数调用形式是:函数名( <实参数 >),并且自定义函数中应该有参数传递语句
PARAMETERS <形参表 >定义形式参数,
RETURN <表达式 > 返回自定义函数值。不能省略举例:利用自定义函数求组合
)!(!
!
nmn
mC n
m
* ZH.PRG求组合
SET TALK OFF
CLEAR
INPUT,M=” TO M
INPUT,N=” TO N
ZH=JC(M)/JC(N)/JC(M-N)
,组合 =”,ZH
SET TALK ON
* JC.PRG求阶乘自定义函数
PARAMETERS K
STORE 1 TO I,Z
DO WHILE I<=K
Z=Z*I
I=I+1
ENDDO
RETURN Z && 返回阶乘值
§ 7.6.2 依附自定义函数依附自定义函数也称为内部自定义函数。
与过程一样,内部自定函数放在过程文件中或放在调用它的程序后面。
[自定义函数格式 ]
FUNCTION <自定义函数名 > [ (<形参表 >) ]
[ PARAMETERS <形参表 > ]
< 自定义函数语句序列 >
RETURN <表达式 >
ENDFUNC
和过程一样,内部自定义函数如果用参数传递数据,形参表也有两种表示形式。
RETURN <表达式 > 不能省略,其后的表达式返回函数值。
( 见,7-21.PRG”)。
( 见,7-22.PRG”)。
1.结构化程序的三种基本结构是顺序结构、分支结构和( )。
A)模块结构 B)循环结构 C)表结构 D)条件结构
2,ACCEPT命令可以接收( )型的数据。
A) N B) L C) C D) D
3.如果 VAR2是当前表中的一个字段名,同时也是内存变量名,则执行( )
命令可以显示当前记录的字段值。
A)? VAR2 B)? M.VAR2 C)? field_VAR2 D) LIST M->VAR2
4.在 VFP窗口中,执行 wait to qw命令后,按一次数字键,1”,再执行?type(“qw”)命令的结果是( )。
A) 1 B) qw C) C D) N
5.打开数据工作期窗口的命令是( )。
A) select B) set C) open box D) modify data
7,执行下列程序的结果是 ( ) 。
var= "1234567890"
do while,t.
right (var,1)+var
exit
var=var+2
Enddo
A) 1234567890 B) 0987654321
C.) 01234567890 D) 0123456789
6.如果要指定默认的盘和文件夹,应使用( )命令进行设置。
A) set default B) set system C) set deletedD) set safety
8,执行下列程序的结果是 ( ) 。
s=1
for n=1 to 8 step 2
s=s*n
endfor
s
A) 36 B) 16 C) 40320 D.) 105
9,如果执行 list name off命令后依次显示:计算机,电视,计数器,
则接着执行下列命令的结果是 ( ) 。
go top
scan while left( name,2) =“计,
name
endscan
A.) 计算机 B) 计算机计数器 C) 电视 D) 计数器
10,下列程序的运新结果是 ( ) 。
for m=3 to 5
space (m-2) +str (m,1)
Endfor
A) 1 B) 1 C.) 3 D) 3
2 3 4 4
3 5 5 5
二,填充和编写程序
1,下列程序将,中华人民共和国,显示为,中 华 人 民 共 和 国,。
SET TALK OFF
CLEAR
X=“中华人民共和国,
Y=“”
DO WHILE LEN( X) >=4
Y=Y+SUBSTR( X,1,2) +,”
X=SUBSTR( X,3)
ENDDO
? __________
SET TALK ON
RETURN
Y+X
2,求矩形面积 。
SET TALK OFF
INPUT“长 =”TO L
INPUT“宽 =”TO W
MJ=0
DO JS WITH ______
,面积 =”,______
RETU
**过程文件 (JS.PRG)
______ A,B,C
C=A*B
RETU
L,W,MJ
MJ
PARAM
3,编写程序,打印下面图形 。
程序 1
SET TALK OFF
CLEAR
FOR I=1 TO 5
FOR J=1 TO 2*I-1
@ I,40-I+J SAY "*"
NEXT J
NEXT I
程序 2
SET TALK OFF
CLEAR
FOR I=5 TO 1 STEP -1
FOR J=1 TO 2*I-1
@ 10-I,10-I+J SAY "*"
NEXT J
NEXT I