第 6章 面向过程程序设计
6.1 应用程序基本操作
6.2 应用程序中的常用命令
6.4 分支结构程序设计
6.3 顺序结构程序设计
6.5 循环结构程序设计退出
6.6 过程结构程序设计
6.7 数组变量的应用
6.8 结构化程序设计举例
6.1 应用程序基本操作
6.1.3 应用程序的修改退出
6.1.2 应用程序的运行
6.1.1 应用程序的建立
1)应用程序:为完成某项任务所需执行的命令序列,这些命令按照一定的结构有机地组合在一起,并以文件的形式存储在磁盘上,
又称为命令文件。
2)应用程序的组成:
前言:注释语句设置区:设置程序的运行环境,多由 SET命令实现程序体:所有命令序列,一般包括数据的输入输出、数据的处理以及结果输出等命令整理部分:如关闭各种文件程序的退出:设置有关命令关闭文件返回到命令窗口状态或操作系统状态
6.1.1 应用程序的建立
( 1)菜单方式
( 2)命令方式,MODIFY COMMAND <程序名 >
说明,<程序名 >为主文件名,其扩展名的默认值为,PRG
示例:建立名为 L1.PRG的应用程序,使其能够打开表文件
,\VFP\ 学生表,DBF”,根据键入的学生姓名在该表文件中查找并输出该学生的基本情况,然后关闭该文件。
命令窗口,MODI COMM VFP\L1.PRG
编辑窗口,*L1.PRG
SET TALK OFF
USE VFP\ZGDA.DBF
ACCEPT,请输入学生姓名:,TO XM
LOCATE姓名 =XM
学号,姓名,性别,班级
USE
SET TALK OFF
RETURN
6.1.2 应用程序的运行
1,菜单方式
2,命令方式,DO 〈 应用程序名 〉?WITH <参数表 >?
说明,1) 在程序运行过程中执行到下述命令时将会中断运行而退出,它们退出后返回的系统状态分别是:
CANCEL:命令窗口状态 。
QUIT:操作系统状态 。
RETURN:调用点或命令窗口状态 。
2) 在程序运行过程中,若按下 ESC键可使运行强行中断 。 这时系统显示警告,并给用户三种选择:
取消:中断程序的运行 。 此为缺省选项 。
继续执行:忽略 ESC的中断作用,继续程序的执行 。
挂起:暂时中断程序的运行,返回命令窗口 。 当再次运行时可以从中断处继续运行 。
6.1.3 应用程序的修改
1)菜单方式
2)命令方式,MODIFY COMMAND <程序名 >
6.2 应用程序中的常用命令退出
6.2.2 常用辅助命令
6.2.1 交互输入命令
6.2.1 交互输入命令
1,键入字符串命令格式,ACCEPT?<提示信息 >? TO <内存变量 >
说明,1) 暂停程序的运行,等待用户键入字符型常量以赋给指定的内存变量 。
2) <提示信息 >是显示在屏幕上的,用于提示说明的字符型表达式 。
3) 如果不键入任何字符而只按回车键,则赋给内存变量的值将是一个空字符串 。
示例:编写可以打开任一数据表文件的通用命令 。
ACCEPT,请输入要打开的表文件名:,TO BM
USE &BM
2,输入单字符命令格式,WAIT?<提示信息 >TO <内存变量 >?
功能:暂停程序的运行,等待用户键入单个字符后再恢复程序运行 。
说明,1) <提示信息 >为可选项,其格式,功能与要求同 ACCEPT
命令 。 如果命令中无此选项,则系统默认的提示信息是,PRESS
ANY KEY TO CONTINUE……
2) TO <内存变量 >也为可选项,选用时,则键入的单个字符均作为字符型数据赋给内存变量 。 如果只是按下回车键,则只将一个空字符存入内存变量 。
示例:试编写一个 VFP程序,能够根据键入的系别代号 ( 单字符 )
在不同系的档案表文件中查找某一职工的情况 。
*L2.PRG
SET TALK OFF
CLEAR
WAIT,请输入系的代号:,TO DH
XH=“DH”+DH
USE &XH
ACCEPT,请输入职工姓名:,TO XM
LOCATE FOR 姓名 =XM
“职工姓名:,+姓名
“性别:,+性别
“年龄:,+STR(年龄,2)
………
WAIT
“职称:,+职称
“任教课程:,+任教课程
“教研室:,+教研室
………
WAIT
SET TALK ON
RETURN
2,输入单字符命令
3,键入表达式命令格式,INPUT [<提示信息 >] TO <内存变量 >
功能:暂停程序运行,等待键入表达式并将其值赋给指定的内存变量,待按回车键后,继续运行程序 。
说明:
1) <提示信息 >为可选项,其格式,功能与要求同 ACCEPT命令 。
2) 命令中的 <内存变量 >的类型决定于键入数据的类型,但不得为 M型数据 。
3) 若键入的是表达式,本命令将先计算出表达式的值,然后把其结果赋给 <内存变量 >。
4) 若键入字符型常量或逻辑型常量时应带有定界符 。
5) 在响应该命令时,若键入了无效表达式或只按下回车键,系统将会给出,句法错,的提示信息 。
示例:试运行下述交互输入命令 。
INPUT,请输入学生姓名:,TO XM
INPUT,请输入其班级:,TO BJ
INPUT,该人性别为:,TO XB
6.2.2 常用辅助命令格式 I,NOTE <注释内容 >
格式 II,*<注释内容 >
格式 III,…… &&<注释内容 >
说明,1) 注释命令为非执行语句
2) 注释内容最后一个字符是分号 (;),系统默认下一行内容仍为注释内容 。
示例 1,NOTE 打开学生表
USE 学生表,DBF
……
示例 2:
SET CONSOLE OFF &&取消窗口的输出显示
……
1,注释命令
SET TALK ON/off 设置是否在主窗口的状态栏中显示所有命令的执行结果 。
SET CONSOLE ON/off 设置是否把输出信息在窗口上显示 。
SET PRINTER on/OFF 设置是否在打印机上输出信息 。
SET SAFETY ON/off 设置在改写文件时,VFP是否显示对话框以确认改写有效 。
SET HEADING ON/off 设置在执行 LIST,DISPLAY等命令时是否显示字段名 。
SET STATUS ON/off 设置是否显示状态行 。
SET DEFAULT TO〈 盘符 〉 指定默认的驱动器 。
SET DEVICE TO SCREEN 把输出信息发送到 VFP的窗口
/PRINTER 屏幕或打印机 。
2,环境设置命令格式 I,CLEAR
说明:清除当前屏幕上的所有信息格式 II,CLEAR ALL
说明:关闭所有文件,清除所有内存变量格式 III,CLEAR TYPEAHEAD
说明:清除键盘缓冲区
3,清除命令
4,关闭文件命令格式 I,CLOSE ALL
说明:关闭所有的数据库,表以及索引文件格式 II,CLOSE <文件类型 >
说明:文件类型
DATABASE 数据库文件,索引文件,格式文件
INDEX 当前工作区的索引文件
FORMAT 当前工作区的格式文件
PROCEDURE 当前工作区的过程文件
5,运行中断和结束命令格式 I,QUIT
说明:退出 VFP,返回到操作系统状态格式 II,CANCEL
说明:结束本次程序的运行,返回到命令窗口状态格式 III,RETURN [TO MASTER]
说明:返回到调用点处 。
6,文本显示命令格式,TEXT
<文本内容 >
ENDTEXT
说明:将文本内容原样输出,需要 SET TEXTMERGE ON (允许嵌入表达式和函数 ) 7,定位输出命令格式,@ <行,列 > SAY <数据 >
说明:在指定的行、列处输出数据,SET DEVICE TO SCREEN
6.3 顺序结构程序设计
1)程序设计的过程:分析问题、确定任务、划分模块、建立模型、
组织数据、描述操作步骤、编写程序、上机调试、分析运行结果、写出程序说明书。
2)流程图:就是运用一些特定的图形符号和必要的文字来描述解题步骤的图示。
3)三种基本程序结构流程图:
A
B
条件
A B
条件
A
顺序结构 分支结构 循环结构
6.3 顺序结构程序设计
4)顺序结构程序:自始至终严格按照程序中语句的先后顺序逐条执行,是最基本、最普遍的结构形式。
5)示例 1:试在表文件中查看某学生的有关情况。
*L3.PRG
SET TALK OFF
CLEAR
USE 学生表,DBF
LOCATE FOR 姓名 =“林冲,
DISPLAY
USE
SET TALK ON
示例 2:编程,根据输入的半径值,计算出相应的圆的周长 。
SET TALK OFF
CLEAR
INPUT,请输入圆的半径:,TO R
L=2*3.1416*R
@10,10 SAY,圆的周长是:,+STR(L,6,3)
SET TALK ON
6.4 分支结构程序设计退出
6.4.2 多分支结构
6.4.1 两分支结构
6.4.1 两分支结构
1)简单分支的格式:
IF <条件表达式 >
<语句行序列 >
ENDIF
注意,IF和 ENDIF必须成对出现分支结构:就是按照一定的条件由判断语句或选择语句构成的双重或多重走向的程序
1,简单分支语 句 行条件表达式语句行序列
ENDIF后面的语句
Y
N
例:在“学生表”中查看“李清照”的基本情况。
SET TALK OFF
CLEAR
USE 学生表
LOCATE FOR 姓名 =”李清照”
IF FOUND()
DISP
ENDIF
USE
SET TALK ON
2,选择分支格式,IF <条件表达式 >
<语句行序列 1>
ELSE
<语句行序列 2>
ENDIF
语 句 行条件语句行序列 1 语句行序列 2
ENDIF后面的语句例 1:求解一元二次方程 AX2+BX+C=0,系数 A,B,C的值由用户通过键盘输入,当方程有实根时,屏幕显示出两根的值;当方程无实根时,屏幕显示出,方程无实根 !,
SET TALK OFF
CLEAR
INPUT,A=” TO A
INPUT,B=” TO B
INPUT,C=” TO C
D=B*B-4*A*C
IF D>=0
X1=(-B+SQRT(D))/(2*A)
X2=(-B-SQRT(D))/(2*A)
“方程的两根是:,+STR(X1,2)+SPACE(4)+STR(X2,2)
ELSE
”方程无实根 !,
ENDIF
SET TALK ON
RETURN
例 2:在表文件,分数,DBF”中查找学号为 99020203的学生成绩,
若其成绩满 60分则显示其学号,课程号和成绩;否则显示此人的学号,课程号并通知其补考 。
*L6.PRG
SET TALK OFF
USE 分数,DBF
CLEAR
LOCATE FOR 学号 =“99020203”
IF 成绩 >=60
“学号:,+学号
“课程号:,+课程号
“成绩:,+STR(成绩,6,2)
ELSE
“学号为,+学号 +“的学生应参加补考的课程号为:,+课程号
ENDIF
USE
SET TALK ON
3,判断语句嵌套
IF语句多重嵌套示意结构如下:
IF<条件表达式 1>
<语句行序列 1>
ELSE
IF<条件表达式 2>
<语句行序列 2>
ELSE
IF<条件表达式 3>
<语句行序列 3>
ELSE
………
ENDIF3
………
ENDIF2
………
ENDIF1
注意:
( 1) IF,ELSE(可不选 ),ENDIF一一 对应、
互相匹配
( 2)允许简单判断和选择判断语句自我嵌套或相互嵌套,但层次必须清楚,不得交叉
( 3)最好采用缩格
(缩进)的书写方式例:根据键入 X的值,计算下面分段函数的值,并显示结果 。
X2+4X-1 (X≤ 0)
3X2-2X+1 (0<X≤ 10)
X2+1 (X>10)
Y=
程序如下:
SET TALK OFF
CLEAR
INPUT,X=” TO X
IF X>0
IF X>10
Y=X*X+1
ELSE
Y=3*X*X-2*X+1
ENDIF
ELSE
Y=X*X+4*X-1
ENDIF
”分段函数值为:,+STR(Y,10,2)
SET TALK ON
RETURN
6.4.2 多分支结构格式:
DO CASE <条件表达式 1>
<语句行序列 1>
CASE <条件表达式 2>
<语句行序列 2>
……
CASE <条件表达式 2>
<语句行序列 2>
[OTHERWISE]
<语句行序列 N+1>
ENDCASE[注释内容 ]
例:用 DO CASE语句修改上面计算分段函数的例子 。
SET TALK OFF
CLEAR
INPUT,X=” TO X
DO CASE
CASE X<=0
Y=X*X+4*X-1
CASE X>0.AND.X<=10
Y=3*X*X-2*X+1
CASE X>10
Y=X*X+1
ENDCASE
”分段函数值为:,+STR(Y,10,2)
SET TALK ON
RETURN
6.5 循环结构程序设计退出
6.5.2 固定次数的循环结构
6.5.1 当型循环结构
6.5.4 多重循环结构
6.5.3 表扫描循环结构
6.5.1 当型循环结构循环结构程序:按照一定条件重复进行某种特定操作的程序称为循环结构程序。
格式,DO WHILE <条件表达式 >
<语句行序列 1>
[LOOP]
<语句行序列 2>
[EXIT]
<语句行序列 3>
ENDDO
说明:
结构组成:循环起始语句,循环体,
循环终端语句注意:在循环体内要设置修改循环条件的语句,避免死循环 。
ENDDO后面的语句语句行序列条件表达式循环体内语句修改条件表达式
Y
N
死循环示例,X=1
S=0
DO WHILE X>=1
S=S+X
X=X+1
ENDDO
例 1:编程求和 S=1+2+3+… +100。
SET TALK OFF
CLEAR
STORE 0 TO N,S
DO WHILE N<=100
S=N+S
N=N+1
ENDDO
”累加和 S=”,S
SET TALK ON
RETURN
例 2:编程显示学生表中所有女生的记录 。
SET TALK OFF
CLEAR
USE 学生表
INDEX ON 性别 TO 学生表 _性别
SEEK,女,
DO WHILE 性别 =”女,
DISP
SKIP
ENDDO
USE
SET TALK ON
RETURN
例 3:令计算机从 0开始计数,每计一个数,便判断该数是否为偶数,
若是偶数则接着计下一个数;若是奇数则将其累加,若累加和大于
250,则计数结束;若累加和不大于 250则继续计数,编写程序 。
SET TALK OFF
CLEAR
STORE 0 TO X,Y
DO WHILE,T.
X=X+1
DO CASE
CASE INT(X/2)=X/2
LOOP
CASE X+Y>250
EXIT
OTHERWISE
Y=Y+X?”Y=”,Y
ENDCASE SET TALK ON
ENDDO RETURN
例 4:编写程序能根据键盘输入的姓名,从学生表中查找该生的信息 。
SET TALK OFF
CLEAR
ACCEPT,请输入姓名:,TO XM
USE 学生表
DO WHILE,NOT.EOF()
IF 姓名 =XM
DISP
EXIT
ELSE
SKIP
ENDIF
ENDDO
USE
SET TALK ON
6.5.2 固定次数的循环结构格式:
FOR <循环控制变量 >=<初值 > TO <终值 > [STEP <步长 >]
<语句序列 1>
[LOOP]
<语句序列 2>
[EXIT]
<语句序列 3>
ENDFOR/NEXT
注意:步长可为正值和负值例 1:编程求和 S=1+2+3+… +100。
SET TALK OFF
CLEAR
S=0
FOR N=1 TO 100?”S=”,S
S=S+N SET TALK ON
ENDFOR RETURN
例 2:用下列级数的前 21项之和计算自然对数之底 e的近似值 。
*L10.PRG
SET TALK OFF
STORE 1 TO E,T
FOR X=1 TO 20
T=T*X
E=E+1/T
ENDFOR
“该级数前 21项之和是:,+STR(E,7,5)
SET TALK ON
RETURN
6.5.3 表扫描循环结构格式:
SCAN [<范围 >] [FOR <条件 >] [WHILE <条件 >]
<语句序列 1>
[LOOP]
<语句序列 2>
[EXIT]
<语句序列 3>
ENDSCAN
例 1:编程统计学生表中男学生的人数 。
SET TALK OFF
CLEAR
N=0
USE 学生表
SCAN FOR 性别 =”男,
N=N+1
ENDSCAN
”学生表中男学生的人数是:,,N
USE
SET TALK ON
RETURN
例 2:统计表文件,学生表,DBF”中各个班级的人数 。
*L1.PRG
SET TALK OFF
STORE 0 TO A,B
CLEAR
USE 学生表,DBF
SCAN
DO CASE
CASE 班级 =“电子,
A=A+1
CASE 班级 =“电信,
B=B+1
ENDCASE
ENDSCAN
“电子班的人数为:,+STR(A,3)
“电信班的人数为:,+STR(B,3)
USE
SET TALK ON
6.5.4 多重循环结构格式 ( 以当型循环结构为例 ),
DO WHILE 〈 条件表达式 1〉
〈 语句行序列 11〉
DO WHILE 〈 条件表达式 2〉
〈 语句行序列 21〉
DO WHILE 〈 条件表达式 3〉
〈 语句行序列 31〉
……
ENDDO3
〈 语句序列 22〉
ENDDO2
〈 语句行序列 12〉
ENDDO1
例 1:试用固定次数循环的嵌套格式编写一个打印九九乘法口诀表的程序 。
SET TALK OFF
CLEAR
FOR Y=1 TO 9
FOR X=1 TO 9
Z= Y * X
STR(Y,1)+“*”+STR(X,1)+“=”+STR(Z,2)+“”
ENDFOR
ENDFOR
SET TALK ON
RETURN
例 2:编写程序打印如下的图形
********
********
********
********
********
********
********
SET TALK OFF
CLEAR
A=1
DO WHILE A<=7
B=1
DO WHILE B<=8
@A,B+A SAY,*”
B=B+1
ENDDO
A=A+1
ENDDO
SET TALK ON
RETURN
例 3:编程打印如下图形:
*
***
*****
*******
*********
***********
*************
SET TALK OFF
CLEAR
A=1
DO WHILE A<8
B=1
DO WHILE B<=2*A-1
@A,40-B+A SAY,*”
B=B+1 ENDDO
ENDDO SET TALK ON
A=A+1 RETURN
6.6 过程结构程序设计退出
6.6.2 过程文件
6.6.1 过程的建立与调用
6.6.4 过程的带参调用
6.6.3 内存变量作用域
6.6.1 过程的建立与调用过程:可被调用的功能模块或能够完成某种特定功能的独立程序。
1,过程的建立:
MODIFY COMMAND <文件名 >
2,过程的调用
DO <过程名 >
3,过程中的返回命令
RETURN [TO MASETR]
4,过程的嵌套:一个过程又调用了另一个过程例 1:用过程编写一个求和与乘积的程序 。
*AA.PRG调用过程 BB *过程 BB
SET TALK OFF M=3
S=1 N=5
P=1 S=M+N
DO BB P=S*N
”S=”,S RETURN
”P=”,P
SET TALK ON
RETURN
例 2:试编写一程序求解 W=X!+Y!+Z!( 其中,X,Y,Z的值均为一位正整数 ) 。
主程序 过程
*MAIN_1.PRG *SUB_1.PRG
SET TALK OFF T=1
INPUT,X=” TO X FOR I=1 TO N
INPUT,Y=” TO Y T=T*I
NPUT,Z=” TO Z ENDFOR
N=X RETURN
DO SUB_1
A=T
N=Y
DO SUB_1
B=T
N=Z
DOU SUB_1
W=T+A+B
“W=”+STR(W,7) SET TALK ON
例 3:有一个名为 SCORE的数据表,具有如下的字段:学号 (C,5),姓名
(C,8),政治 (N,3),数学 (N,3),外语 (N,3),总分 (N,3),平均分 (N,6,2)。 编写一程序,分别求出政治课,数学课和外语课的总分 。
*主程序 CLASS.PRG
SET TALK OFF *计算单科总分的过程 JSZF.PRG
USE SCORE GO TOP
KCM=”政治,DO WHILE,NOT.EOF()
T=0 T=T+&KCM
DO JSZF SKIP
T1=T ENDDO
KCM=”数学,RETURN
T=0
DO JSZF
T2=T
KCM=”外语,
T=0?”政治课,数学课,外语课的总分分别是:,,T1,T2,T3
DO JSZF USE
T3=T SET TALK ON
6.6.2 过程文件
1,过程文件:过程的集合
2,过程文件的建立和修改
MODIFY COMMAND <过程文件名 >
3,过程文件的一般结构
PROCEDURE <过程名 1>
<过程名 1的语句行系列 >
RETURN
PROCEDURE <过程名 2>
<过程名 2语句行序列 >
RETURN
……
……
PROCEDURE <过程名 N>
<过程 N语句系列 >
RETURN
4、过程文件的打开命令格式,SET PROCEDURE TO <过程文件名 >
5、过程文件的关闭命令格式 I,SET PROCEDURE TO
格式 II,CLOSE PROCEDURE
例 1:编写程序,调用过程文件中的过程,并显示结果 。
过程文件 PROC.PRG
PROCEDURE PROC1
”I am from proc1.”
”* 10 11 12 13 14 15”
”平方 100 121 144 169 196 225”
RETURN
PROCEDURE PROC2
”I am from proc2.”
”** 10 11 12 13 14 15”
”立方 1000 1331 1728 2179 2774 3375”
DO PROC3
RETURN
PROCEDURE PROC3
”------------------------------------------------”
”I am from proc3.”
RETURN
主程序 MAIN.PRG
CLEAR
SET PROCEDURE TO PROC
DO PROC1
”========================”
DO PROC2
”========================”
CLOSE PROCEDURE
RETURN
例 2:试求 3~100之间的所有素数并显示之 。
算法:每产生一个 M的值则依次除以 3到 M的算术平方根之间的所有奇数,若均不能被整除,则 M即为素数,然后将其显示输出,否则,M就不是素数 。
主程序 过程文件
*MAIN_2.PRG *SUB_2.PRG
SET TALK OFF PROCEDURE JC
SET PROCEDURE TO SUB_2 ……
FOR M=3 TO 100 STEP 2 RETURN
I=3 PROCEDURE QS
N=INT(SQRT(M)) FOR I=3 TO N STEP 2
DO QS IF INT(M/I)=M/I
ENDFOR RETURN
SET PROCEDURE ENDIF
ENDFOR
M
RETURN
……
……
6.6.3 内存变量作用域作用域:内存变量的作用范围 。
1,全局变量
1) 全局变量:指在程序的任何嵌套中及在程序执行期间始终有效的变量 。
2) 格式,PUBLIC <内存变量表 >
例,在过程调用中,运用全局变量传递数据 。
主程序 过程
*MAIN_3.PRG *SUB_3.PRG
SET TALK OFF PUBLIC B,C,D
CLEAR B=2
PUBLIC A D=3
A=1?“在过程中,A,B,C,D=”,A,B,C,D
DO SUB_3 RETURN
“返回主程序,A,B,C,D=”,A,B,C,D
SET TALK ON
2,局部变量
1) 局部变量:未经 PUBLIC命令定义且只在建立它的过程及其下级过程中有效的内存变量 。
2) 局部变量的定义:
隐含定义方式,过程中未经特殊说明的内存变量 。
显示定义方式,PRIVATE [ALL [LIKE/EXCEPT <通配符 >]] [<内存变量表 >]
例:在过程调用中局部变量的应用 。
主程序
*MAIN_4.PRG
SET TALK OFF
A=1
B=2
“主程序中,A=”,A,“B=”,B
DO SUB_4
“返主程序后,A=”,A,“B=”,B,“C=”,C,“D=”,D
SET TALK ON
过程
*SUB_4.PRG
PRIVATE B
PUBLIC C
A=10
B=11
C=12
D=13
“在过程中,A=”,A,“B=”,B,“C=”,C,“D=”,D
RETURN
6.6.4 过程的带参调用
1,带参过程调用命令格式,DO <过程名 > WITH <参数表 >
说明:参数表中的参数也称 实参,可以为常量,已赋值的变量或数值表达式 。
2,接收参数命令格式,PARAMETERS <参数表 >
说明:参数表中的参数也称 形参形参与实参的数量应相等,类型要一致例 1:利用带参调用方法计算梯形面积。
主程序
*MAIN_5.PRG
SET TALK OFF
INPUT,输入梯形上底边长:,TO A
INPUT,输入梯形下底边长:,TO B
INPUT,输入梯形的高:,TO H
STORE 0 TO S
DO SUB_5.PRG WITH A+B,H,S
“所求梯形面积为:,,S
SET TALK ON
RETURN
过程
*SUB_5.PRG
PARAMETERS P,Q,T
T=P*Q/2
RETURN
6.7 数组变量的应用退出
6.7.2 数组变量的赋值
6.7.1 数组变量的建立
6.7.4 数组与数据表之间的数据交换
6.7.3 数组的重新定义
6.7.5 数组的释放
6.7.1 数组变量的建立
1、数组:一组变量的集合。
2、格式,DIMENSION/DECLARE <数组名 1>(<数值表达式 1>[,<数值表达式 2>])[,<数组名 2>(<数值表达式 3>[,<数值表达式 4>])]…
说明:数组一旦被定义之后,该数组的每个元素的初值为逻辑假值 。
例,DIMENSION AB(3),C[2,3]
6.7.2 数组变量的赋值三种赋值方式,STORE,=,命令文件例 1:给二维数组 X和一维数组 Y赋值 。
DIMENSION X(3,4),Y(3)
STORE 5 TO X
Y(1)=325
Y(2)=”ABC”
Y(3)=.T.
例 2:用命令文件为数组赋值 。
SET TALK OFF
CLEAR
DIMENSION A[10]
FOR I=1 TO 10
A[I]=I
A[I]
NEXT
SET TALK ON
RETURN
6.7.3 数组的重新定义
1,数组的重定义:数组在定义好之后,可以通过 DECLARE或
DIMENSION命令对数组的尺寸和维数进行改变 。
2,新旧数组之间数据的复制原则:
1) 将数组全部看成是一维数组,从序号 1开始顺序地复制到对应的新数组中;
2) 如果新数组的元素个数多于原数组的元素个数,新增加的数组元素取值为逻辑假值;
3) 如果新数组的元素个数少于原数组的元素个数,只取原数组中的前若干个值 。
3,数组下标的排列规则:数组从下标 1开始排列,二维数组的元素排列是先按行排,再按列排 。
例,CLEAR
SET TALK OFF
DIMENSION B[2,3] DIMENSION B[8]
FOR I=1 TO 2 FOR I=1 TO 8
FOR J=1 TO 3?”B(”+STR(I,1)+”)=”,B[I]
B[I,J]=(I-1)*3+J NEXT
NEXT SET TALK ON
NEXT RETURN
6.7.4 数组与数据表之间的数据交换
1,字段变量给数组赋值格式,SCATTER [FIELDS <字段名表 >/FIELDS LIKE <字段名描述表 1>/FIELDS EXCEPT <字段名描述表 2>][MEMO] TO <数组名 >
BLANK/MEMVAR/MEMVAR BLANK
示例,USE 学生表
GO 2
SCATTER FIELDS 姓名,性别,班级 TO B
2,数组对字段变量的对应替换格式,GATHER FROM <数组名 >/MEMVAR [FIELDS <字段名表
>/FIELDS LIKE <字段名描述表 1>/FIELDS EXCEPT <字段名描述表 2>][MEMO]
示例,USE 学生表
APPEND BLANK
GATHER FROM B FIELDS 姓名,性别,班级
DISP
格式 1,CLEAR ALL
格式 2,CLEAR MEMEORY
格式 3,RELEASE ALL [LIKE <通配符 >/EXCEPT <通配符 >]
6.7.5 数组的释放
6.1 应用程序基本操作
6.2 应用程序中的常用命令
6.4 分支结构程序设计
6.3 顺序结构程序设计
6.5 循环结构程序设计退出
6.6 过程结构程序设计
6.7 数组变量的应用
6.8 结构化程序设计举例
6.1 应用程序基本操作
6.1.3 应用程序的修改退出
6.1.2 应用程序的运行
6.1.1 应用程序的建立
1)应用程序:为完成某项任务所需执行的命令序列,这些命令按照一定的结构有机地组合在一起,并以文件的形式存储在磁盘上,
又称为命令文件。
2)应用程序的组成:
前言:注释语句设置区:设置程序的运行环境,多由 SET命令实现程序体:所有命令序列,一般包括数据的输入输出、数据的处理以及结果输出等命令整理部分:如关闭各种文件程序的退出:设置有关命令关闭文件返回到命令窗口状态或操作系统状态
6.1.1 应用程序的建立
( 1)菜单方式
( 2)命令方式,MODIFY COMMAND <程序名 >
说明,<程序名 >为主文件名,其扩展名的默认值为,PRG
示例:建立名为 L1.PRG的应用程序,使其能够打开表文件
,\VFP\ 学生表,DBF”,根据键入的学生姓名在该表文件中查找并输出该学生的基本情况,然后关闭该文件。
命令窗口,MODI COMM VFP\L1.PRG
编辑窗口,*L1.PRG
SET TALK OFF
USE VFP\ZGDA.DBF
ACCEPT,请输入学生姓名:,TO XM
LOCATE姓名 =XM
学号,姓名,性别,班级
USE
SET TALK OFF
RETURN
6.1.2 应用程序的运行
1,菜单方式
2,命令方式,DO 〈 应用程序名 〉?WITH <参数表 >?
说明,1) 在程序运行过程中执行到下述命令时将会中断运行而退出,它们退出后返回的系统状态分别是:
CANCEL:命令窗口状态 。
QUIT:操作系统状态 。
RETURN:调用点或命令窗口状态 。
2) 在程序运行过程中,若按下 ESC键可使运行强行中断 。 这时系统显示警告,并给用户三种选择:
取消:中断程序的运行 。 此为缺省选项 。
继续执行:忽略 ESC的中断作用,继续程序的执行 。
挂起:暂时中断程序的运行,返回命令窗口 。 当再次运行时可以从中断处继续运行 。
6.1.3 应用程序的修改
1)菜单方式
2)命令方式,MODIFY COMMAND <程序名 >
6.2 应用程序中的常用命令退出
6.2.2 常用辅助命令
6.2.1 交互输入命令
6.2.1 交互输入命令
1,键入字符串命令格式,ACCEPT?<提示信息 >? TO <内存变量 >
说明,1) 暂停程序的运行,等待用户键入字符型常量以赋给指定的内存变量 。
2) <提示信息 >是显示在屏幕上的,用于提示说明的字符型表达式 。
3) 如果不键入任何字符而只按回车键,则赋给内存变量的值将是一个空字符串 。
示例:编写可以打开任一数据表文件的通用命令 。
ACCEPT,请输入要打开的表文件名:,TO BM
USE &BM
2,输入单字符命令格式,WAIT?<提示信息 >TO <内存变量 >?
功能:暂停程序的运行,等待用户键入单个字符后再恢复程序运行 。
说明,1) <提示信息 >为可选项,其格式,功能与要求同 ACCEPT
命令 。 如果命令中无此选项,则系统默认的提示信息是,PRESS
ANY KEY TO CONTINUE……
2) TO <内存变量 >也为可选项,选用时,则键入的单个字符均作为字符型数据赋给内存变量 。 如果只是按下回车键,则只将一个空字符存入内存变量 。
示例:试编写一个 VFP程序,能够根据键入的系别代号 ( 单字符 )
在不同系的档案表文件中查找某一职工的情况 。
*L2.PRG
SET TALK OFF
CLEAR
WAIT,请输入系的代号:,TO DH
XH=“DH”+DH
USE &XH
ACCEPT,请输入职工姓名:,TO XM
LOCATE FOR 姓名 =XM
“职工姓名:,+姓名
“性别:,+性别
“年龄:,+STR(年龄,2)
………
WAIT
“职称:,+职称
“任教课程:,+任教课程
“教研室:,+教研室
………
WAIT
SET TALK ON
RETURN
2,输入单字符命令
3,键入表达式命令格式,INPUT [<提示信息 >] TO <内存变量 >
功能:暂停程序运行,等待键入表达式并将其值赋给指定的内存变量,待按回车键后,继续运行程序 。
说明:
1) <提示信息 >为可选项,其格式,功能与要求同 ACCEPT命令 。
2) 命令中的 <内存变量 >的类型决定于键入数据的类型,但不得为 M型数据 。
3) 若键入的是表达式,本命令将先计算出表达式的值,然后把其结果赋给 <内存变量 >。
4) 若键入字符型常量或逻辑型常量时应带有定界符 。
5) 在响应该命令时,若键入了无效表达式或只按下回车键,系统将会给出,句法错,的提示信息 。
示例:试运行下述交互输入命令 。
INPUT,请输入学生姓名:,TO XM
INPUT,请输入其班级:,TO BJ
INPUT,该人性别为:,TO XB
6.2.2 常用辅助命令格式 I,NOTE <注释内容 >
格式 II,*<注释内容 >
格式 III,…… &&<注释内容 >
说明,1) 注释命令为非执行语句
2) 注释内容最后一个字符是分号 (;),系统默认下一行内容仍为注释内容 。
示例 1,NOTE 打开学生表
USE 学生表,DBF
……
示例 2:
SET CONSOLE OFF &&取消窗口的输出显示
……
1,注释命令
SET TALK ON/off 设置是否在主窗口的状态栏中显示所有命令的执行结果 。
SET CONSOLE ON/off 设置是否把输出信息在窗口上显示 。
SET PRINTER on/OFF 设置是否在打印机上输出信息 。
SET SAFETY ON/off 设置在改写文件时,VFP是否显示对话框以确认改写有效 。
SET HEADING ON/off 设置在执行 LIST,DISPLAY等命令时是否显示字段名 。
SET STATUS ON/off 设置是否显示状态行 。
SET DEFAULT TO〈 盘符 〉 指定默认的驱动器 。
SET DEVICE TO SCREEN 把输出信息发送到 VFP的窗口
/PRINTER 屏幕或打印机 。
2,环境设置命令格式 I,CLEAR
说明:清除当前屏幕上的所有信息格式 II,CLEAR ALL
说明:关闭所有文件,清除所有内存变量格式 III,CLEAR TYPEAHEAD
说明:清除键盘缓冲区
3,清除命令
4,关闭文件命令格式 I,CLOSE ALL
说明:关闭所有的数据库,表以及索引文件格式 II,CLOSE <文件类型 >
说明:文件类型
DATABASE 数据库文件,索引文件,格式文件
INDEX 当前工作区的索引文件
FORMAT 当前工作区的格式文件
PROCEDURE 当前工作区的过程文件
5,运行中断和结束命令格式 I,QUIT
说明:退出 VFP,返回到操作系统状态格式 II,CANCEL
说明:结束本次程序的运行,返回到命令窗口状态格式 III,RETURN [TO MASTER]
说明:返回到调用点处 。
6,文本显示命令格式,TEXT
<文本内容 >
ENDTEXT
说明:将文本内容原样输出,需要 SET TEXTMERGE ON (允许嵌入表达式和函数 ) 7,定位输出命令格式,@ <行,列 > SAY <数据 >
说明:在指定的行、列处输出数据,SET DEVICE TO SCREEN
6.3 顺序结构程序设计
1)程序设计的过程:分析问题、确定任务、划分模块、建立模型、
组织数据、描述操作步骤、编写程序、上机调试、分析运行结果、写出程序说明书。
2)流程图:就是运用一些特定的图形符号和必要的文字来描述解题步骤的图示。
3)三种基本程序结构流程图:
A
B
条件
A B
条件
A
顺序结构 分支结构 循环结构
6.3 顺序结构程序设计
4)顺序结构程序:自始至终严格按照程序中语句的先后顺序逐条执行,是最基本、最普遍的结构形式。
5)示例 1:试在表文件中查看某学生的有关情况。
*L3.PRG
SET TALK OFF
CLEAR
USE 学生表,DBF
LOCATE FOR 姓名 =“林冲,
DISPLAY
USE
SET TALK ON
示例 2:编程,根据输入的半径值,计算出相应的圆的周长 。
SET TALK OFF
CLEAR
INPUT,请输入圆的半径:,TO R
L=2*3.1416*R
@10,10 SAY,圆的周长是:,+STR(L,6,3)
SET TALK ON
6.4 分支结构程序设计退出
6.4.2 多分支结构
6.4.1 两分支结构
6.4.1 两分支结构
1)简单分支的格式:
IF <条件表达式 >
<语句行序列 >
ENDIF
注意,IF和 ENDIF必须成对出现分支结构:就是按照一定的条件由判断语句或选择语句构成的双重或多重走向的程序
1,简单分支语 句 行条件表达式语句行序列
ENDIF后面的语句
Y
N
例:在“学生表”中查看“李清照”的基本情况。
SET TALK OFF
CLEAR
USE 学生表
LOCATE FOR 姓名 =”李清照”
IF FOUND()
DISP
ENDIF
USE
SET TALK ON
2,选择分支格式,IF <条件表达式 >
<语句行序列 1>
ELSE
<语句行序列 2>
ENDIF
语 句 行条件语句行序列 1 语句行序列 2
ENDIF后面的语句例 1:求解一元二次方程 AX2+BX+C=0,系数 A,B,C的值由用户通过键盘输入,当方程有实根时,屏幕显示出两根的值;当方程无实根时,屏幕显示出,方程无实根 !,
SET TALK OFF
CLEAR
INPUT,A=” TO A
INPUT,B=” TO B
INPUT,C=” TO C
D=B*B-4*A*C
IF D>=0
X1=(-B+SQRT(D))/(2*A)
X2=(-B-SQRT(D))/(2*A)
“方程的两根是:,+STR(X1,2)+SPACE(4)+STR(X2,2)
ELSE
”方程无实根 !,
ENDIF
SET TALK ON
RETURN
例 2:在表文件,分数,DBF”中查找学号为 99020203的学生成绩,
若其成绩满 60分则显示其学号,课程号和成绩;否则显示此人的学号,课程号并通知其补考 。
*L6.PRG
SET TALK OFF
USE 分数,DBF
CLEAR
LOCATE FOR 学号 =“99020203”
IF 成绩 >=60
“学号:,+学号
“课程号:,+课程号
“成绩:,+STR(成绩,6,2)
ELSE
“学号为,+学号 +“的学生应参加补考的课程号为:,+课程号
ENDIF
USE
SET TALK ON
3,判断语句嵌套
IF语句多重嵌套示意结构如下:
IF<条件表达式 1>
<语句行序列 1>
ELSE
IF<条件表达式 2>
<语句行序列 2>
ELSE
IF<条件表达式 3>
<语句行序列 3>
ELSE
………
ENDIF3
………
ENDIF2
………
ENDIF1
注意:
( 1) IF,ELSE(可不选 ),ENDIF一一 对应、
互相匹配
( 2)允许简单判断和选择判断语句自我嵌套或相互嵌套,但层次必须清楚,不得交叉
( 3)最好采用缩格
(缩进)的书写方式例:根据键入 X的值,计算下面分段函数的值,并显示结果 。
X2+4X-1 (X≤ 0)
3X2-2X+1 (0<X≤ 10)
X2+1 (X>10)
Y=
程序如下:
SET TALK OFF
CLEAR
INPUT,X=” TO X
IF X>0
IF X>10
Y=X*X+1
ELSE
Y=3*X*X-2*X+1
ENDIF
ELSE
Y=X*X+4*X-1
ENDIF
”分段函数值为:,+STR(Y,10,2)
SET TALK ON
RETURN
6.4.2 多分支结构格式:
DO CASE <条件表达式 1>
<语句行序列 1>
CASE <条件表达式 2>
<语句行序列 2>
……
CASE <条件表达式 2>
<语句行序列 2>
[OTHERWISE]
<语句行序列 N+1>
ENDCASE[注释内容 ]
例:用 DO CASE语句修改上面计算分段函数的例子 。
SET TALK OFF
CLEAR
INPUT,X=” TO X
DO CASE
CASE X<=0
Y=X*X+4*X-1
CASE X>0.AND.X<=10
Y=3*X*X-2*X+1
CASE X>10
Y=X*X+1
ENDCASE
”分段函数值为:,+STR(Y,10,2)
SET TALK ON
RETURN
6.5 循环结构程序设计退出
6.5.2 固定次数的循环结构
6.5.1 当型循环结构
6.5.4 多重循环结构
6.5.3 表扫描循环结构
6.5.1 当型循环结构循环结构程序:按照一定条件重复进行某种特定操作的程序称为循环结构程序。
格式,DO WHILE <条件表达式 >
<语句行序列 1>
[LOOP]
<语句行序列 2>
[EXIT]
<语句行序列 3>
ENDDO
说明:
结构组成:循环起始语句,循环体,
循环终端语句注意:在循环体内要设置修改循环条件的语句,避免死循环 。
ENDDO后面的语句语句行序列条件表达式循环体内语句修改条件表达式
Y
N
死循环示例,X=1
S=0
DO WHILE X>=1
S=S+X
X=X+1
ENDDO
例 1:编程求和 S=1+2+3+… +100。
SET TALK OFF
CLEAR
STORE 0 TO N,S
DO WHILE N<=100
S=N+S
N=N+1
ENDDO
”累加和 S=”,S
SET TALK ON
RETURN
例 2:编程显示学生表中所有女生的记录 。
SET TALK OFF
CLEAR
USE 学生表
INDEX ON 性别 TO 学生表 _性别
SEEK,女,
DO WHILE 性别 =”女,
DISP
SKIP
ENDDO
USE
SET TALK ON
RETURN
例 3:令计算机从 0开始计数,每计一个数,便判断该数是否为偶数,
若是偶数则接着计下一个数;若是奇数则将其累加,若累加和大于
250,则计数结束;若累加和不大于 250则继续计数,编写程序 。
SET TALK OFF
CLEAR
STORE 0 TO X,Y
DO WHILE,T.
X=X+1
DO CASE
CASE INT(X/2)=X/2
LOOP
CASE X+Y>250
EXIT
OTHERWISE
Y=Y+X?”Y=”,Y
ENDCASE SET TALK ON
ENDDO RETURN
例 4:编写程序能根据键盘输入的姓名,从学生表中查找该生的信息 。
SET TALK OFF
CLEAR
ACCEPT,请输入姓名:,TO XM
USE 学生表
DO WHILE,NOT.EOF()
IF 姓名 =XM
DISP
EXIT
ELSE
SKIP
ENDIF
ENDDO
USE
SET TALK ON
6.5.2 固定次数的循环结构格式:
FOR <循环控制变量 >=<初值 > TO <终值 > [STEP <步长 >]
<语句序列 1>
[LOOP]
<语句序列 2>
[EXIT]
<语句序列 3>
ENDFOR/NEXT
注意:步长可为正值和负值例 1:编程求和 S=1+2+3+… +100。
SET TALK OFF
CLEAR
S=0
FOR N=1 TO 100?”S=”,S
S=S+N SET TALK ON
ENDFOR RETURN
例 2:用下列级数的前 21项之和计算自然对数之底 e的近似值 。
*L10.PRG
SET TALK OFF
STORE 1 TO E,T
FOR X=1 TO 20
T=T*X
E=E+1/T
ENDFOR
“该级数前 21项之和是:,+STR(E,7,5)
SET TALK ON
RETURN
6.5.3 表扫描循环结构格式:
SCAN [<范围 >] [FOR <条件 >] [WHILE <条件 >]
<语句序列 1>
[LOOP]
<语句序列 2>
[EXIT]
<语句序列 3>
ENDSCAN
例 1:编程统计学生表中男学生的人数 。
SET TALK OFF
CLEAR
N=0
USE 学生表
SCAN FOR 性别 =”男,
N=N+1
ENDSCAN
”学生表中男学生的人数是:,,N
USE
SET TALK ON
RETURN
例 2:统计表文件,学生表,DBF”中各个班级的人数 。
*L1.PRG
SET TALK OFF
STORE 0 TO A,B
CLEAR
USE 学生表,DBF
SCAN
DO CASE
CASE 班级 =“电子,
A=A+1
CASE 班级 =“电信,
B=B+1
ENDCASE
ENDSCAN
“电子班的人数为:,+STR(A,3)
“电信班的人数为:,+STR(B,3)
USE
SET TALK ON
6.5.4 多重循环结构格式 ( 以当型循环结构为例 ),
DO WHILE 〈 条件表达式 1〉
〈 语句行序列 11〉
DO WHILE 〈 条件表达式 2〉
〈 语句行序列 21〉
DO WHILE 〈 条件表达式 3〉
〈 语句行序列 31〉
……
ENDDO3
〈 语句序列 22〉
ENDDO2
〈 语句行序列 12〉
ENDDO1
例 1:试用固定次数循环的嵌套格式编写一个打印九九乘法口诀表的程序 。
SET TALK OFF
CLEAR
FOR Y=1 TO 9
FOR X=1 TO 9
Z= Y * X
STR(Y,1)+“*”+STR(X,1)+“=”+STR(Z,2)+“”
ENDFOR
ENDFOR
SET TALK ON
RETURN
例 2:编写程序打印如下的图形
********
********
********
********
********
********
********
SET TALK OFF
CLEAR
A=1
DO WHILE A<=7
B=1
DO WHILE B<=8
@A,B+A SAY,*”
B=B+1
ENDDO
A=A+1
ENDDO
SET TALK ON
RETURN
例 3:编程打印如下图形:
*
***
*****
*******
*********
***********
*************
SET TALK OFF
CLEAR
A=1
DO WHILE A<8
B=1
DO WHILE B<=2*A-1
@A,40-B+A SAY,*”
B=B+1 ENDDO
ENDDO SET TALK ON
A=A+1 RETURN
6.6 过程结构程序设计退出
6.6.2 过程文件
6.6.1 过程的建立与调用
6.6.4 过程的带参调用
6.6.3 内存变量作用域
6.6.1 过程的建立与调用过程:可被调用的功能模块或能够完成某种特定功能的独立程序。
1,过程的建立:
MODIFY COMMAND <文件名 >
2,过程的调用
DO <过程名 >
3,过程中的返回命令
RETURN [TO MASETR]
4,过程的嵌套:一个过程又调用了另一个过程例 1:用过程编写一个求和与乘积的程序 。
*AA.PRG调用过程 BB *过程 BB
SET TALK OFF M=3
S=1 N=5
P=1 S=M+N
DO BB P=S*N
”S=”,S RETURN
”P=”,P
SET TALK ON
RETURN
例 2:试编写一程序求解 W=X!+Y!+Z!( 其中,X,Y,Z的值均为一位正整数 ) 。
主程序 过程
*MAIN_1.PRG *SUB_1.PRG
SET TALK OFF T=1
INPUT,X=” TO X FOR I=1 TO N
INPUT,Y=” TO Y T=T*I
NPUT,Z=” TO Z ENDFOR
N=X RETURN
DO SUB_1
A=T
N=Y
DO SUB_1
B=T
N=Z
DOU SUB_1
W=T+A+B
“W=”+STR(W,7) SET TALK ON
例 3:有一个名为 SCORE的数据表,具有如下的字段:学号 (C,5),姓名
(C,8),政治 (N,3),数学 (N,3),外语 (N,3),总分 (N,3),平均分 (N,6,2)。 编写一程序,分别求出政治课,数学课和外语课的总分 。
*主程序 CLASS.PRG
SET TALK OFF *计算单科总分的过程 JSZF.PRG
USE SCORE GO TOP
KCM=”政治,DO WHILE,NOT.EOF()
T=0 T=T+&KCM
DO JSZF SKIP
T1=T ENDDO
KCM=”数学,RETURN
T=0
DO JSZF
T2=T
KCM=”外语,
T=0?”政治课,数学课,外语课的总分分别是:,,T1,T2,T3
DO JSZF USE
T3=T SET TALK ON
6.6.2 过程文件
1,过程文件:过程的集合
2,过程文件的建立和修改
MODIFY COMMAND <过程文件名 >
3,过程文件的一般结构
PROCEDURE <过程名 1>
<过程名 1的语句行系列 >
RETURN
PROCEDURE <过程名 2>
<过程名 2语句行序列 >
RETURN
……
……
PROCEDURE <过程名 N>
<过程 N语句系列 >
RETURN
4、过程文件的打开命令格式,SET PROCEDURE TO <过程文件名 >
5、过程文件的关闭命令格式 I,SET PROCEDURE TO
格式 II,CLOSE PROCEDURE
例 1:编写程序,调用过程文件中的过程,并显示结果 。
过程文件 PROC.PRG
PROCEDURE PROC1
”I am from proc1.”
”* 10 11 12 13 14 15”
”平方 100 121 144 169 196 225”
RETURN
PROCEDURE PROC2
”I am from proc2.”
”** 10 11 12 13 14 15”
”立方 1000 1331 1728 2179 2774 3375”
DO PROC3
RETURN
PROCEDURE PROC3
”------------------------------------------------”
”I am from proc3.”
RETURN
主程序 MAIN.PRG
CLEAR
SET PROCEDURE TO PROC
DO PROC1
”========================”
DO PROC2
”========================”
CLOSE PROCEDURE
RETURN
例 2:试求 3~100之间的所有素数并显示之 。
算法:每产生一个 M的值则依次除以 3到 M的算术平方根之间的所有奇数,若均不能被整除,则 M即为素数,然后将其显示输出,否则,M就不是素数 。
主程序 过程文件
*MAIN_2.PRG *SUB_2.PRG
SET TALK OFF PROCEDURE JC
SET PROCEDURE TO SUB_2 ……
FOR M=3 TO 100 STEP 2 RETURN
I=3 PROCEDURE QS
N=INT(SQRT(M)) FOR I=3 TO N STEP 2
DO QS IF INT(M/I)=M/I
ENDFOR RETURN
SET PROCEDURE ENDIF
ENDFOR
M
RETURN
……
……
6.6.3 内存变量作用域作用域:内存变量的作用范围 。
1,全局变量
1) 全局变量:指在程序的任何嵌套中及在程序执行期间始终有效的变量 。
2) 格式,PUBLIC <内存变量表 >
例,在过程调用中,运用全局变量传递数据 。
主程序 过程
*MAIN_3.PRG *SUB_3.PRG
SET TALK OFF PUBLIC B,C,D
CLEAR B=2
PUBLIC A D=3
A=1?“在过程中,A,B,C,D=”,A,B,C,D
DO SUB_3 RETURN
“返回主程序,A,B,C,D=”,A,B,C,D
SET TALK ON
2,局部变量
1) 局部变量:未经 PUBLIC命令定义且只在建立它的过程及其下级过程中有效的内存变量 。
2) 局部变量的定义:
隐含定义方式,过程中未经特殊说明的内存变量 。
显示定义方式,PRIVATE [ALL [LIKE/EXCEPT <通配符 >]] [<内存变量表 >]
例:在过程调用中局部变量的应用 。
主程序
*MAIN_4.PRG
SET TALK OFF
A=1
B=2
“主程序中,A=”,A,“B=”,B
DO SUB_4
“返主程序后,A=”,A,“B=”,B,“C=”,C,“D=”,D
SET TALK ON
过程
*SUB_4.PRG
PRIVATE B
PUBLIC C
A=10
B=11
C=12
D=13
“在过程中,A=”,A,“B=”,B,“C=”,C,“D=”,D
RETURN
6.6.4 过程的带参调用
1,带参过程调用命令格式,DO <过程名 > WITH <参数表 >
说明:参数表中的参数也称 实参,可以为常量,已赋值的变量或数值表达式 。
2,接收参数命令格式,PARAMETERS <参数表 >
说明:参数表中的参数也称 形参形参与实参的数量应相等,类型要一致例 1:利用带参调用方法计算梯形面积。
主程序
*MAIN_5.PRG
SET TALK OFF
INPUT,输入梯形上底边长:,TO A
INPUT,输入梯形下底边长:,TO B
INPUT,输入梯形的高:,TO H
STORE 0 TO S
DO SUB_5.PRG WITH A+B,H,S
“所求梯形面积为:,,S
SET TALK ON
RETURN
过程
*SUB_5.PRG
PARAMETERS P,Q,T
T=P*Q/2
RETURN
6.7 数组变量的应用退出
6.7.2 数组变量的赋值
6.7.1 数组变量的建立
6.7.4 数组与数据表之间的数据交换
6.7.3 数组的重新定义
6.7.5 数组的释放
6.7.1 数组变量的建立
1、数组:一组变量的集合。
2、格式,DIMENSION/DECLARE <数组名 1>(<数值表达式 1>[,<数值表达式 2>])[,<数组名 2>(<数值表达式 3>[,<数值表达式 4>])]…
说明:数组一旦被定义之后,该数组的每个元素的初值为逻辑假值 。
例,DIMENSION AB(3),C[2,3]
6.7.2 数组变量的赋值三种赋值方式,STORE,=,命令文件例 1:给二维数组 X和一维数组 Y赋值 。
DIMENSION X(3,4),Y(3)
STORE 5 TO X
Y(1)=325
Y(2)=”ABC”
Y(3)=.T.
例 2:用命令文件为数组赋值 。
SET TALK OFF
CLEAR
DIMENSION A[10]
FOR I=1 TO 10
A[I]=I
A[I]
NEXT
SET TALK ON
RETURN
6.7.3 数组的重新定义
1,数组的重定义:数组在定义好之后,可以通过 DECLARE或
DIMENSION命令对数组的尺寸和维数进行改变 。
2,新旧数组之间数据的复制原则:
1) 将数组全部看成是一维数组,从序号 1开始顺序地复制到对应的新数组中;
2) 如果新数组的元素个数多于原数组的元素个数,新增加的数组元素取值为逻辑假值;
3) 如果新数组的元素个数少于原数组的元素个数,只取原数组中的前若干个值 。
3,数组下标的排列规则:数组从下标 1开始排列,二维数组的元素排列是先按行排,再按列排 。
例,CLEAR
SET TALK OFF
DIMENSION B[2,3] DIMENSION B[8]
FOR I=1 TO 2 FOR I=1 TO 8
FOR J=1 TO 3?”B(”+STR(I,1)+”)=”,B[I]
B[I,J]=(I-1)*3+J NEXT
NEXT SET TALK ON
NEXT RETURN
6.7.4 数组与数据表之间的数据交换
1,字段变量给数组赋值格式,SCATTER [FIELDS <字段名表 >/FIELDS LIKE <字段名描述表 1>/FIELDS EXCEPT <字段名描述表 2>][MEMO] TO <数组名 >
BLANK/MEMVAR/MEMVAR BLANK
示例,USE 学生表
GO 2
SCATTER FIELDS 姓名,性别,班级 TO B
2,数组对字段变量的对应替换格式,GATHER FROM <数组名 >/MEMVAR [FIELDS <字段名表
>/FIELDS LIKE <字段名描述表 1>/FIELDS EXCEPT <字段名描述表 2>][MEMO]
示例,USE 学生表
APPEND BLANK
GATHER FROM B FIELDS 姓名,性别,班级
DISP
格式 1,CLEAR ALL
格式 2,CLEAR MEMEORY
格式 3,RELEASE ALL [LIKE <通配符 >/EXCEPT <通配符 >]
6.7.5 数组的释放