FoxPro For Windows http://cc.synu.edu.cn 1
FoxPro程序设计
第 9讲 内存变量、数组及处理
FoxPro For Windows http://cc.synu.edu.cn 2
FoxPro程序设计
内存变量
小结:
?内存变量赋值和重新赋值
赋值的过程是生成内存变量的过程
【 例 】 内存变量 赋值
X=3
Y=x+5
STOR 'ABC ' TO x,y,z
* x,y,z的值都是字符 'ABC ?
ACCE '请输入姓名,' TO name
* name=?王强’
INPUT '请输入查询的学号 ' TO xh
* xh=990106
WAIT '继续查询吗? (Y/N)' TO jx
* jx=?Y?
?内存变量名
字母为首,10个长,字母、数字、
下划线组成。 M1,1m,m_1
?数据类型
和它存放的数据类型一致。
?内存中暂时存放常数、运算结
果的内存空间。
几个?
显示一下!
FoxPro For Windows http://cc.synu.edu.cn 3
FoxPro程序设计
LIST│DISPLAY MEMORY















LIST MEMORY LIKE X* &&通配符 *和?
变量名字 作用域 类型 值
内存变量显示
FoxPro For Windows http://cc.synu.edu.cn 4
FoxPro程序设计
存,将已定义的所有或部分内存变量保存到内存变量文件 (.MEM)中。
取,需要时从某个内存变量文件中恢复内存变量的有关信息。
从内存中删除已定义的内存变量,释放内存空间。
RELEASE <memvar list>
RELEASE ALL [LIKE<skel>|EXCEPT<skel>]
CLEAR ALL
CLEAR MEMORY
1)生成内存变量文件命令:
SAVE TO <file> [ALL LIKE|EXCEPT<skel>]
2)恢复内存变量文件命令:
RESTORE FROM <file> [ADDITIVE]
ADDITIVE 使恢复之前内存中所有内存变量有效,否则清除。
内存变量的存取







FoxPro For Windows http://cc.synu.edu.cn 5
FoxPro程序设计
【 例 】 ***lx.prg
SET TALK OFF
CLEA ALL
Y1=77
Y2=88
X1='99'
SAVE TO PK
RELE ALL EXCEPT Y* &&释放 X1
LIST MEMORY
X2='A'
RESTORE FROM PK ADDI
LIST MEMORY LIKE
SET TALK ON
Y1 Priv N 77
Y2 Priv N 88
X2 Priv C,A”
Y1 Priv N 77
Y2 Priv N 88
X1 Priv C,99,
Y1 Priv N 77
Y2 Priv N 88
X1 Priv C,99,
PK.mem
思考:删除 ADDI语句,结果如何?
FoxPro For Windows http://cc.synu.edu.cn 6
FoxPro程序设计
【 例 5.38】
**main.prg
SET TALK OFF
a=1
b=10
DO cx1
"c=",c+10
SET TALK ON
Return
**子程序 cx1
c=a+b
RETURN
全局:
a,命令窗口中
定义的。
b.用 PUBLIC
语句说明的。
c.调用程序定
义的对于被调
用程序具有全
局意义。
内存变量的作用域 ---全局与局部
全局变量 在任何程序中都有效,局部变量 只在定义它的程序中有效 。
局部:
a,在子程(过
程)定义的。
b,用 PRIVATE
语句说明的。 PUBLIC c &&定义 PUBLIC <memvar list>
&&出现错误提示,c变量未找到
FoxPro For Windows http://cc.synu.edu.cn 7
FoxPro程序设计
? 两个变量同名
? 用 PRIVATE声
明为局部,程
序执行完,将
被释放。
? 在调用程序中
定义的同名变
量又可以使用。
【 例 】
***MAIL1.PRG
SET TALK OFF
A=5
DO SUB1
A
***SUB1.PRG
A=10
RETU
主对子相当于全局
全局、局部变量辨析
【 例 】
***MAIN2.PRG
SET TALK OFF
A=5
DO SUB2
A
***SUB2.PRG
PRIVATE A
A=10
RETU
FoxPro For Windows http://cc.synu.edu.cn 8
FoxPro程序设计
【 例 5.39】 下面的程序将显示 PRIVATE语句的作用。
**main.prg
SET TALK OFF
SET PROC TO SUB.PRG
num1=100
num2=200
DO square
"在主程序中,num1=",num1,"num2=",num2
SET TALK ON
*sub.prg使用局部变量的过程
PROCEDURE square
PRIVATE num1
num1=100*100
num2=200*200
"在子程序中,num1=",num1,"num2=",num2
RETURN
FoxPro For Windows http://cc.synu.edu.cn 9
FoxPro程序设计
是什么? 数组是名字相同而下标不同的内存变量。
1、数组的定义:
DIMENSION <数组名 > (<下标 1>[,<下标 2>]……)
DECLARE <数组名 > (<下标 1>[,<下标 2>]……)
说明:
? 数组必须先定义;
? 一个下标为一维数组,两个下标为二维数组,前者为行,后者为列数;
? 内存中一维数组按顺序存放,二维数组先按行排列后按列排列;
? 排列有一个顺序号,称序号,序号从 1开始,对数组的访问按序号进行 。
数 组
【 例 】 DIME N(6),M(2,3)
一维数组,N(6) N(1),N(2),N(3),N(4),N(5),N(6)
二维数组,M(2,3) M(1,1),M(1,2),M(1,3),M(2,1),M(2,2),M(2,3)
序 号,1 2 3 4 5 6
FoxPro For Windows http://cc.synu.edu.cn 10
FoxPro程序设计
2、数组的赋值
数组生成后,系统自动以逻辑假值对其初始化。
数组元素下标的起始值为 1。
a.单个赋值,DIME A(3)
A(1)=5
A(2)='A'
A(3)={00/02/03}
b.为整个数组赋值,DIME B(2,3)
B=9
c,同一数组中的不同元素可以赋不同类型的值。
DIME a(2,2) &&定义一个含有 2*2=4个元素的二维数组
a(1,1)=10
a(1,2)='y'
a(2,1)=.t.
a(2,2)={00/08/01}
FoxPro For Windows http://cc.synu.edu.cn 11
FoxPro程序设计
d,可以用循环语句给数组元素赋值。
【 例 5.43】
DIME a(100)
FOR i=1 TO 100
a(i)=i
ENDFOR
A(1)=1
A(2)=2
A(3)=3
A(4)=4
……
A(100)=100
FoxPro For Windows http://cc.synu.edu.cn 12
FoxPro程序设计
【 例 5.44】 已知数组 M(10)求其中最小数。
M(1) M(2) M(3) M(4) M(5)……M(10)
12 20 5 9 33
SET TALK OFF
DIME M(10)
k=1
DO WHIL k<=10
INPUT ?M(k)=:? TO M(k) && 为 M数组各元素赋值
k=k+1
ENDD
MIN=M(1) &&假设 M(1)为最小
FOR k=1 TO 10
IF MIN>M(k) && 依次比较,使 MIN为最小
MIN=M(k)
ENDIF
ENDFOR
'MIN=',MIN
SET TALK ON
RETURN
解析:首先定义 M数组,并为其赋值;(用循环实现)
然后,逐一比较,取其最小。
FoxPro For Windows http://cc.synu.edu.cn 13
FoxPro程序设计
1、数组向数据库文件传递数据:
GATHER FROM <数组 >
? 将数组的数据传递到 当前数据库 的 当前记录 。
? 如数组元素数少于字段数,多余字段内容保持不变;
? 如数组元素数多于字段数,多余元素被忽略。
数组与数据库文件间的数据传递
M(1)
M(2)
.
.
M(6)
当前记录
聚集
A(6),A(1) A(2) A(3) A(4) A(5) A(6)
990107 张三 男 80/08/08 100 100
Use student
Append blank
Gather from a
990107 张三 男 80/08/08 100 100
FoxPro For Windows http://cc.synu.edu.cn 14
FoxPro程序设计
2、数据库向数组传递数据
SCATTER [FIELDS<字段 >] TO <数组 >
? 将指定字段值传给数组。
? 如数组元素数多于字段数,多余的数组元素内容不变;
? 如果数组元素数不足,系统自动生成新数组元素。
? 各数组元素的数据类型与相应字段的数据类型相同。
M(1)
M(2)
.
.
M(6)
当前记录
散开
DIME A(1)
USE STUDENT
GO BOTTOM
SCATTER TO A
A(1),A(1) A(2) A(3) A(4) A(5) A(6)
990107 张三 男 80/08/08 100 100
)
990107 张三 男 80/08/08 100 100
FoxPro For Windows http://cc.synu.edu.cn 15
FoxPro程序设计
【 例 5.45】 将数据库 student.dbf中,第 4条与第 6条记录内容交换。
SET TALK OFF
DIMENSION A(1),B(2)
USE student
GO 4
SCATTER TO A
GO 6
SCATTER TO B
GATHER FROM A
GO 4
GATHER FROM B
USE
SET TALK ON
RETURN
4
6
A
B
FoxPro For Windows http://cc.synu.edu.cn 16
FoxPro程序设计
【 例 】
Set talk off
Dime a(7)
Use stud
S=0
Do while,not.eof()
scatter to a
s=s+a(6)
skip
Enddo
,s=”,str(s,5)
Use
retu
STUD.DBF
Sno name sex birthday score schoship
(C,6) (C,6) (C,2) (D,8) (N,3) (N,3)
990105 王亚洲 男 19800524 556 120
990102 赵辉 男 19811203 600 180
990107 刘洋 男 19800520 515 100
990103 王丹 女 19810326 624 180
990104 李冬梅 女 19800415 525 100
990101 白雪 女 19810618 540 120
990106 陈小刚 男 19820816 510 100
S=900
FoxPro For Windows http://cc.synu.edu.cn 17
FoxPro程序设计
【 例 】
SET TALK OFF
DIMENSION X(5)
USE SCORE
GO 3
SCATTER TO X
X(4)+X(5)
USE
SET TALK ON
程序运行结果; ________。
【 例 】 用数组与数据库数据传递命令, 在 SCORE数据库末尾添加一条记录 。
SET TALK OFF
DIMENSION X(5)
USE SCORE
APPEND BLANK
X(1)='005'
X(2)='陈岩 '
X(3)='男 '
X(4)=68
X(5)=79
________________
RETURN
SCORE数据库如下,
Record# SNO NAME SEX SCORE1 SCORE2
( C,3) (C,6) (C,2) (N,2) (N,2)
1 001 王丹 女 78 89
2 002 李涯 男 90 67
3 003 白雪 女 86 82
4 004 徐刚 男 90 90
168
GATHER FROM X
FoxPro For Windows http://cc.synu.edu.cn 18
FoxPro程序设计
综合编程,【 例 】 编程打印数字表:
1 2 3
2 4 6
3 6 9
A(1,1) A(1,2) A(1,3)
A(2,1) A(2,2) A(2,3)
A(3,1) A(3,2) A(3,3)
1 * 1 1 * 2 1 * 3
2 * 1 2 * 2 2 * 3
3 * 1 3 * 2 3 * 3
SET TALK OFF
CLEAR ALL
DIME A(3,3)
I=1
DO WHILE I<4
J=1
DO WHILE J<4
A(I,J)=I*J
A(I,J)
J=J+1
ENDDO
I=I+1
ENDDO
SET TALK ON
RETURN
解析:使用二维数组
双重循环来实现
FoxPro For Windows http://cc.synu.edu.cn 19
FoxPro程序设计【 例 】 键盘任意输入 10个数,按由大到小顺序输出。
SET TALK OFF
DIME A(10)
I=1
DO WHILE I<=10
INPUT,A(I)=” TO A(I) &&从键盘输入 A数组的 10个数
I=I+1
ENDD
I=1
DO WHILE I<=9
J=I+1
DO WHILE J<=10
IF A(I)<A(J)
T=A(I)
A(I)=A(J)
A(J)=T
ENDI
J=J+1
ENDD
I=I+1
ENDD
I=1
DO WHIL I<=10
A(I)
I=I+1
ENDD
SET TALK ON
A(I)
A(J)
T
当 A(I)<A(J)时:



5 8 9 3 2 10
A(I) A(J)
8 5 9 3 2 10
A(I) A(J)
9 5 8 3 2 10
A(I) A(J)
9 5 8 3 2 10
A(I) A(J)
10 5 8 3 2 9
A(I) A(J)A(I) A(J)
FoxPro For Windows http://cc.synu.edu.cn 20
FoxPro程序设计
【 例 】 写出下列程序的运行结果
SET TALK OFF
STORE 0 TO A,B,N
DO WHILE.T.
A=A+1 &&1,2,3,4,5,6,7,8,9,10,11,12
DO CASE
CASE INT(A/3)<>A/3
B=B+A &&B=0+1+2+4+5+7+8+10+11
CASE A>10
EXIT
CASE A<=10
N=N+1 &&N=0+1+1+1
ENDCASE
ENDDO
N,B
RETURN
*程序执行到?命令处,输出的 N和 B的值分别是 ____。
*在 DO循环中,共循环了 ____次。
FoxPro For Windows http://cc.synu.edu.cn 21
FoxPro程序设计
【 例 】 写出下列程序的运行结果
SET TALK OFF
A=4
B=2
C=1
DO WHILE C>0
A=A*B &&A=2*4 8*5 40*40
B=B+A &&B=2+8 5+40 40+1600
IF A>50
A=A-5*C
C=C-1
A,B
ELSE
STORE B-5*C TO B &&B=5 40
N=B
ENDIF
ENDDO
"N=",N
RETURN
*第一条?命令显示的内容为 ____。
*第二条?命令显示的内容为 ____。
1595 1640
40
FoxPro For Windows http://cc.synu.edu.cn 22
FoxPro程序设计
【 例 】
SET TALK OFF
X1=77
Y1=VAL("88")
Y2=STR(99,2)
SAVE TO PK
RELEASE ALL EXCEPT Y *
LIST MEMORY
RESTORE FROM PK ADDITIVE
LIST MEMORY
CLEAR
*程序执行后,所建立的文件名是 ____。
*第一条 LIST MEMORY 命令显示的内存变量及数据是 ____。
*第二条 LIST MEMORY 命令显示的内存变量及数据是 ____。
PK.MEM
Y1=88 Y2=’99’
X1=77 Y1=88
Y2=’99’