m程序设计 第9讲内存变量、数组及处理 FoxproForWindowshttp://cc.synu.edu.cn
FoxPro For Windows http://cc.synu.edu.cn 1 FoxPro程序设计 第9讲 内存变量、数组及处理
m程序设计 几个? 里示一下! 内存变量 【例】内存袞量赋值 小结: X=3 内存变量赋值和重新赋值 Y=x+5 赋值的过程是生成内存变量的过程 STOR 'ABC TO X,y, z 内存变量名 ACcE请输入姓名: TO name下划线组成:、数字 *x,yz的值都是字符ABC 字母为首,10个长 n name=王强 数据类型 NPUT请输入查询的学号Toxh 和它存放的数据类型一致。 xh=990106 WAT继续查询吗?(Y/N)TojX *jx=“Y 内存中暂时存放常数、运算结 果的内存空间。 FoxproForWindowshttp://cc.synu.edu.cn 2
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 •数据类型 和它存放的数据类型一致。 •内存中暂时存放常数、运算结 果的内存空间。 几个? 显示一下!
m程序设计 内存变量显示 LIST DISPLAY MEMORY Pub C Pub C“ABC 关问 Pub CABC 机题 NAME Pub C“王强 XH Pub 990106 Pub C“"y 已定义6个变量,古用了52个字节 1018个变量可用 LIST MEMORY LIKE X &通配符和? 后内存变量保留吗 Pub H Pub H990106 变量名字 作用域类型值 FoxproForWindowshttp://cc.synu.edu.cn 3
FoxPro For Windows http://cc.synu.edu.cn 3 FoxPro程序设计 LIST│DISPLAY MEMORY 问 题 : 关 机 后 , 内 存 变 量 保 留 吗 ? LIST MEMORY LIKE X* &&通配符*和? 变量名字 作用域 类型 值 内存变量显示
内存变量的存取 m程序设计 存:将已定义的所有或部分内存变量保存到内存变量文件(MEM中。 取:需要时从某个内存变量文件中恢复内存变量的有关信息。 1)生成内存变量文件命令: SAVE TO [ALL LIKEJEXCEPT 2)恢复内存变量文件命令: RESTORE FROM [ADDITIVE] ADDITIVE使恢复之前内存中所有内存变量有效,否则清除。 内存变量的释放 从内存中删除已定义的内存变量,释放内存空间 RELEASE RELEASE ALL [LIKE<skeP EXCEPT<ske] CLEAR ALL CLEAR MEMORY FoxproForWindowshttp://cc.synu.edu.cn
FoxPro For Windows http://cc.synu.edu.cn 4 FoxPro程序设计 存:将已定义的所有或部分内存变量保存到内存变量文件(.MEM)中。 取:需要时从某个内存变量文件中恢复内存变量的有关信息。 从内存中删除已定义的内存变量,释放内存空间。 RELEASE RELEASE ALL [LIKE|EXCEPT] CLEAR ALL CLEAR MEMORY 1)生成内存变量文件命令: SAVE TO [ALL LIKE|EXCEPT] 2)恢复内存变量文件命令: RESTORE FROM [ADDITIVE] ADDITIVE 使恢复之前内存中所有内存变量有效,否则清除。 内存变量的存取 内 存 变 量 的 释 放
m程序设计 【例】**xprg SET TALK OFF CLEAALL PK. mem Y1=77 Priv Y2=88 Priv N88 X1 Priv C“99“ X1=99 SAVE TO PK RELE ALL EXCEPT Y*&&释放X1 LIST MEMORY PP N88 X2=A RESTORE FROM PK ADDI Priv C“A Priv NNC 77 LISTMEMORY LIKE ? Y2 Priv 88 X1 P rIV 99“ SET TALK ON 思考:删除ADD语句,结果如何? FoxproForWindowshttp://cc.synu.edu.cn 5
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语句,结果如何?
内存变量的作用域-全局与局部 m程序设计 全局变量在任何程序中都有效,局部变量只在定义它的程序中有效。 全局: 【例538】 a.命令窗口中 *水 main. prg 定义的 SET TALK OFF b用 PUBLIO 语句说明的。 a=1 c调用程序定 b=10 DO CX1 有全 局意义。 ?"c="c+10&&出现错误提示:(变量末找到 SET TALK ON 局部 嘉过 Return b.用PR|VATE 子程序cx1 语句说明的。 PUBLICC&&定义 PUBLIC c=a+b RETURN FoxproForWindowshttp://cc.synu.edu.cn 6
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 &&出现错误提示:c变量未找到
m程序设计 全局、局部变量辨析 两个变量同名 【例】 例】 ***MAIL1 PRG *≠MAN2PRG SET TALK OFF SET TALK OFF 用 PRIVATE声 A=5 A=5 明为局部,程 DO SUB1 DO SUB2 序执行完,将 ?A 被释放。 ?A SUB1.PRG ***SUB2. PRG 在调用程序中 A=10 PRIVATE A 定义的同名变 RETU 量又可以使用。 A=10 RETU 主对子相当于全局 FoxproForWindowshttp://cc.synu.edu.cn 7
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
m程序设计 【例539】下面的程序将显示 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 1 num1=100*100 num2=200*200 ?"在子程序中,num1="um1,"num2=",num2 RETURN FoxproForWindowshttp://cc.synu.edu.cn 6
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
m程序设计 数组 是数组是名字相同而下标不同的内存变量 、数组的定义: DIMENSION(1…) DECLARE(,1……) 说明: 数组必须先定义; 一个下标为一维数组,两个下标为二维数组前者为行,后者为列数 内存中—维数组按顺序存放,二维数组先按行排列后按列排列; 排列有—个顺序号,称序号,序号从1开始,对数组的访问按序号进行。 【例】DMEN(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(12),M(1,3),M(2,1),M(22,M(2,3) 序号: 2 3 4 5 6 FoxproForWindowshttp://cc.synu.edu.cn 9
FoxPro For Windows http://cc.synu.edu.cn 9 FoxPro程序设计 是什么?数组是名字相同而下标不同的内存变量。 1、数组的定义: DIMENSION ([,]……) DECLARE ([,]……) 说明: • 数组必须先定义; • 一个下标为一维数组,两个下标为二维数组,前者为行,后者为列数; • 内存中一维数组按顺序存放,二维数组先按行排列后按列排列; • 排列有一个顺序号,称序号,序号从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
m程序设计 2、数组的赋值 数组生成后,系统自动以逻辑假值对其初始化。 数组元素下标的起始值为1 a单个赋值:DMEA(3) A(1)=5 A(2)=A A(3)={00/02/03} b为整个数组赋值:DMEB(2,3) B=9 c同一数组中的不同元素可以赋不同类型的值。 DMEa(2,2)&&定义一个含有2*2=4个元素的二维数组 a(1,1)=10 a(1,2)=y a(2,1)=t a(2,2)={00/08/01} FoxproForWindowshttp://cc.synu.edu.cn 10
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}