第2章VFP表达式及应用

更新时间:2024-05-07 13:23:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第2章 VFP表达式及应用

数据是程序加工处理的对象,并以某种特定的形式存在。在VFP中,各个数据的类型可能不同,不同数据类型决定了数据不同的存储方式与运算方法。表达式是运算符连接常数、变量和函数等构成的运算式。表达式作为命令的重要组成部分,主要完成各种计算任务。

2.1 数据类型与常数

常数是在命令或程序执行过程中保持不变的量,而变量则指其值可以变化的量。

2.1.1 数值型数据

数值型数据,即能参与算术运算的数据,由数字0~9、小数点与正负号组成,其数据类型用符号N表示。数值型数据在内存中占8个字节,能表示1~20位数据,整数在-6899999999999998至6899999999999998之间无误差;能表示的小数位数为0~19,小数位数≤15位(不含符号位)无误差。

数值型常数是整数或实数,如:23、-153和123.48,也可以用科学计数法表示数

4

值型数据,如:用2.34e+4表示2.34×10,即23400。

2.1.2 字符型数据

字符型数据是英文字母、汉字或数字等符号组成的一串字符,其数据类型用符号C表示。一个字符型数据最多可由16777184个字符组成,半角英文字符占一个字节,一个汉字或全角字符占两个字节。

字符型常数也称为字符串,是用定界符括起来的一串字符。定界符可以是半角的单引号、双引号或方括号,必须成对使用。如:’我是学生’、”I Study VFP”和[男]都是字符型常数。定界符本身不作为字符型常数的内容,当某种定界符是字符串中的内容时,必须用另一种定界符作为标志,如:’老师说:”明天交作业 ”’和[“Windows”操作]。

字符串长度是指字符串中所含字符的个数(1个半角字符长度为1,1个汉字或全角字符长度为2)。如:字符串常数”说:'What'”的长度为9。

2.1.3 货币型数据

货币型数据作为一种特殊的数值型数据,用来表示货币值。其数据类型用符号Y表示。货币型常数是在数值前加货币符号$,如:$12.34。

货币型常数在存储和计算时,系统自动保留4位小数,小数多于4位时四舍五入。如:$123.456789将自动存储为$123.4568。货币型数据在内存中占8个字节,取值范围为-922337203685477.5807~922337203685477.5807。

与数值型数据不同,货币型常数不能用科学计数法表示。

2.1.4 日期型数据

日期型数据可表示某一个日期。数据类型用符号D表示,占8个字节,取值范围为:0001年1月1日~9999年12月31日。

日期型常数用一对大括号“{ }”括起来,其中包含年、月、日三部分内容,各部分内容之间可以用斜杠(/)、连字号(-)、小数点(.)或空格等进行分隔。

1. 设置传统/严格日期格式

日期型常数有传统和严格两种格式。传统的默认格式是美语日期格式{ mm/dd/yy}。传统格式受命令Set Date 和Set Century的影响。不同设置状态,VFP对同一个日期型常数的解释不一样。 如:对日期型常数{08/10/01},VFP可能认为是2008年10月1日或2001年8月10日。

严格日期格式为{^yyyy-mm-dd}或{^yyyy/mm/dd}。用符号“^”作为严格日期常数的开始符号,年月日的次序不能改变,年份必须为4位,它不受命令Set Date和Set Century命令的影响,在任何情况下都表示唯一确切的日期。两种日期常数格式可通过命令进行设置:

命令格式:Set Strictdate To 0|1

命令说明:设置传统日期格式(0)或严格日期格式(1)。 【 例2.1 】

Set Strictdate To 0 && 设置成传统日期格式 Set Date Ansi Set Century On

X={07.10.01} && X赋值成:2007年10月1日 ? X && 输出结果为:2007.10.01 Set Strictdate To 1 && 设置成严格日期格式 Y={^2008/10/01} && Y赋值成:2008年10月1日 ? Y && 输出结果为:2008.10.01

2. 设置日期分隔符

命令格式:Set Mark To <字符表达式>

命令说明:设置显示日期时的分隔符。字符表达式值中的首字符为分隔符。若省略<字符表达式>,则恢复系统默认的分隔符。

【 例 2.2 】

Set Date ANSI Set Century On Set Mark To “–”

? {^2007/10/01} && 输出结果为:2007-10-01 Set Mark To [.]

? {^2007/10/01} && 输出结果为:2007.10.01 Set Mark To ‘w’

? {^2007/10/01} && 输出结果为:2007w10w01 Set Mark To

? {^2007/10/01} && 输出默认的分隔符,结果为:2007.10.01

3. 设置世纪值

命令格式:Set Century To <世纪值> Rollover <年份参照值>

命令说明:世纪值范围为1~99,年份值范围为0~99。此命令仅对两位年份的日期有影响。执行此命令后,设某日期数据为MM/DD/YY,当YY≥年份参照值时,系统将该日期数据视为:MM/DD/世纪值*100+YY;当YY<年份参照值时,系统将该日期数据视为:MM/DD/(世纪值+1)*100+YY。

【 例 2.3 】

Set Date ANSI Set Century On

Set Century To 19 Rollover 10 Set Mark To \

? Ctod(“49.10.01”) && 由于年份值49>年份参照值10,输出:1949.10.01 ? Ctod(“09.10.01”) && 由于年份值09<年份参照值10,输出:2009.10.01

2.1.5 日期时间型数据

日期时间型数据表示日期和时间,其数据类型用符号T表示。日期时间型数据占8个字节。

日期时间型常数由日期和时间两部分组成,日期部分取值范围为0001年1月1日至9999年12月31日,时间部分为00:00:00 Am至11:59:59 Pm。

日期部分也有传统和严格两种格式。系统默认采用严格的日期时间格式: {^yyyy-mm-dd[,]hh:mm:ss [a|p]},日期和时间之间可以用逗号或空格分隔,a(或AM) 表示上午;p(或PM) 表示下午,默认是AM。如:

{^2008-8-1 8:18:30 } 表示2008年8月1日上午8点18分30秒。 {^2008-8-1 8:18:30 P} 表示2008年8月1日下午8点18分30秒。

2.1.6 逻辑型数据

逻辑型数据用来表示逻辑判断的结果,比如条件成立与否,事物的真或假、是与非等。其数据类型用符号L表示,逻辑型数据占1个字节。

逻辑型常数只有真和假两种值。用.T.、.t.、.Y.或.y.表示真;用.F.、.f.、.N.或.n.表示假。作为逻辑型常数定界符的前后小数点“.”不能省略。

2.2 简单内存变量

变量分为内存变量和字段变量两类。内存变量又分为简单变量和数组变量两类。 内存变量存储在内存中,用来存放程序执行中的原始数据或中间结果。内存变量名由字母、汉字、数字或下划线组成,不能以数字开头。如X、年龄和_No都是内存变量名。而1月工资、$12.3和a+B不是正确的内存变量名。

在VFP中,允许内存变量和字段变量同名,如果内存变量与当前表中的字段(变量)出现重名,在引用内存变量时,需要加前缀“M.”或“M->”,明确指出内存变量。如果不加前缀,将引用同名字段变量的值。如:M.姓名表示引用内存变量姓名的值。

2.2.1 内存变量赋值

使内存变量有确切值的操作称为内存变量赋值。在VFP 中,使用内存变量前必须先赋值。通过赋值命令为内存变量首次赋值时,就创建(定义)了内存变量,既规定了变量名,又指定了变量的值。所赋值的数据类型决定了内存变量的数据类型。有许多为内存变量赋值的命令,典型的命令有:

命令格式1:<内存变量名>=<表达式>

命令格式2:Store <表达式> To <内存变量名表>

命令说明:两条命令的功能都是将表达式的值赋给内存变量。

格式1只能给一个内存变量赋值;格式2可以同时给多个内存变量赋相同的值。 【 例 2.4 】

M =”男” && 执行后m的值为:男,其数据类型为字符型 Store 2*3 To X,Y && 执行后X和Y的值都是6,数据类型都为数值型

2.2.2 内存变量的清除

内存变量使用完毕,应该从内存中将其清除,以便释放更多的可用内存空间。清除(释放)内存变量的命令有:

命令格式1:Clear Memory

命令格式2:Release <内存变量名表>

命令说明:格式1清除全部内存变量和数组,格式2清除指定的内存变量和数组。

【 例 2.5 】

Store 2*4 To X, Y, Z Release X

? Y && 内存变量仍然存在,输出8

? X && 由于X被清除,故系统提示:找不到变量X

命令格式3:Clear All

命令说明:用于关闭所有打开的文件,清楚全部内存变量和数组,也称初始化命令。 命令格式4:Release All [Like <变量名通配符> | Except <变量名通配符>] 命令说明:变量名通配符中可以包含“?”或“*”,表示一批变量。其中“?”代表其出现位置的任意一个字符(如果出现在最后,也表示没有字符),例如,“X?”表示以X开头,最多由两个字符组成的一批变量名;通配符“*”代表其出现位置的任意多个(包括没有)字符, 即字符个数是任意的,每位上的字符也是任意的。如:“X*”表示变量名以X开头的所有变量。各选项的含义为:

(1)All:清除所有内存变量和数组。

(2)All Like <变量名通配符>:清除与“变量名通配符”匹配的变量和数组。 (3)All Except <变量名通配符>:清除与“变量名通配符”不能匹配的变量和数组。 【 例 2.6 】

Store 1 To X, X1, X11, X12, Y, Y1, Y2, Y11, Y12, M1, M12, N1, N12 Release All Like Y1? && 清除Y1, Y11和Y12 Release All Like X* && 清除X, X1, X11和X12 Release All Except M* && 仅保留M1和M12

Clear All && 释放全部内存变量,并关闭所有文件

2.2.3 输出表达式值

可以通过VFP命令输出表达式的值(即运算结果)。 命令格式1:? [<表达式表>] 命令格式2:?? [<表达式表>]

命令说明:先计算“表达式表”中每个表达式的值,再依次输出这些值。格式1从下一行开始位置输出计算结果,若省略“表达式表”,则输出一个空行。格式2从当前位置开始输出计算结果。

【 例 2.7 】

? '总成绩', 62+20

?? \分\ 输出:总成绩 82分

2.3 数值型表达式

表达式是运算符连接常数、变量和函数等运算对象所构成的运算式。运算符是对数

据进行操作的符号。单个常数、变量和函数是表达式的特例,即只有一个运算对象,没有运算符。表达式的运算结果称为表达式的值,根据表达式值的数据类型可分为数值表达式、字符表达式、日期表达式、关系表达式和逻辑表达式。在VFP中只有同类型的数据(除日期与数值运算外)才能进行运算。

2.3.1 数值运算符

VFP中的数值运算符如表2.1。

表2.1 数值运算符

优先级别 1 2 3 4 算术运算符 +、- ** 或 ^ * 、/、% + 、- 说 明 取正负 乘方 乘、除、求余 加、减 数学表达式 -(+X) 3X 2÷X?1 X+Y-1 3X?1转换成VFP表达式 -(+X) X ^3或x**3 2/((3*X+1)/(X-1)) X+Y-1

在表2.1中,取负运算的优先级别最高,其次是乘方,然后是乘、除法与求余运算(同级),最后是加与减运算(同级)。

当两个同符号数求余运算(%)时,结果为第一个数除以第二个数的余数;当两个异符号数求余时,结果为第一个数除以第二个数的余数再加上第二个数。

【 例 2.8 】

? 8%3, 8 %-3, -8%3, -8%-3 && 输出结果为:2 -1 1 -2

2.3.2 常用数值型函数

函数作为一种特殊的表达式,可分为系统函数和用户自定义函数。系统函数也称为标准函数,是VFP系统定义的函数,可以直接使用。自定义函数是用户编写的子程序。通常调用一个函数需要带有参数,调用结束后会有一个运算结果,称运算结果为函数返回值或函数值。返回值的类型决定了函数的数据类型。数值型函数指函数值为数值型。

1. 符号函数

函数格式:Sign(<数值表达式>)

函数说明:返回值表示数值表达式值的符号。表达式的值为正、零和负值时,函数值分别是1、0和-1。

【 例 2.9 】

X=2*4

? Sign(X), Sign(X-8), Sign(-X) && 输出结果为:1 0 -1

2. 求绝对值函数

函数格式:Abs(<数值表达式>)

函数说明:返回值为数值表达式的绝对值。

【 例 2.10 】

X= -2*3

? Abs( X+3 ) && 输出结果为:3

3. 求平方根函数

函数格式:Sqrt(<数值表达式>)

函数说明:返回值是数值表达式值的算术平方根,数值表达式值必须大于或等于0。 【 例 2.11 】

? Sqrt(16)

&& 输出结果为:4.00

4. 求指数函数

函数格式:Exp(<数值表达式>)

x

函数说明:若数值表达式的值为x,则函数返回值是e。 【 例 2.12 】

? Exp(0),Exp(2)

&& 输出结果为:1.00 7.39

5. 求自然对数函数

函数格式:Log (<数值表达式>)

函数说明:函数返回值是以e为底数,表达式值的对数。数值表达式值必须大于0。 【 例 2.13 】

? Log( 10 ) , Log ( Exp (2) ) && 输出结果为:

2.30 2.00

6. 求余函数

函数格式:Mod (<数值表达式1> ,<数值表达式2>)

函数说明:函数值是数值表达式1除以数值表达式2的余数。功能与“<数值表达式1>%<数值表达式2>”相同。

【 例 2.14 】

? Mod(8,3) , Mod(8,-3) , Mod(-8,3) , Mod(-8,-3) && 输出结果是:2 -1 1 -2

7. 求圆周率函数

函数格式:Pi( )

函数说明:函数返回值是圆周率。其精度与Set Decimal to <小数位数>命令有关,系统默认显示到小数点后两位。

【 例 2.15 】

Set Decimal to 10 && 设置小数点后显示10位 ? Pi( )*10*10 && 输出结果为:314.1592653590

8. 求最大值和最小值函数

函数格式: Max(<表达式表)

Min(<表达式表)

函数说明:Max函数是求表达式表中所有表达式值的最大者。Min函数是求最小者。

各表达式的数据类型必须一致,,可以是数值型、字符型、货币型、日期型、日期时间型或逻辑型等。此类函数可以有多个参数,至少要有两个参数。

【 例 2.16 】

? Max(8,-2*3,10,3), Min(8,-2*3,10,3) && 输出:10 -6 ? Max(‘A’,’B’,’C’), max(.f.,.T.,.n.) && 输出: C .T. ? Max($200,$100,$300) && 输出:300.0000

9. 求整函数

函数格式1:Int(<数值表达式>)

函数格式2:Ceiling(<数值表达式>) 函数格式3:Floor(<数值表达式>)

函数说明:Int函数的值是数值表达式的整数部分,而不是四舍五入;Ceiling函数值是大于或等于数值表达式值的最小整数;Floor函数值是小于或等于数值表达式值的最大整数。

【 例 2.17 】

? Int (2.8) , Int (-2.8 ) && 输出结果为:2 -2 ? Ceiling (2.8) , Ceiling(-2.8) && 输出结果为:3 -2 ? Floor (2.8) , Floor(-2.8) && 输出结果为:2 -3

10. 四舍五入函数

函数格式:Round (<数值表达式1>,<数值表达式2>)

函数说明:返回值为数值表达式1的值在指定位置上四舍五入后的结果。四舍五入位置由数值表达式2的值决定。若数值表达式2的值小于0,数值表达式2的绝对值表示对数值表达式1在整数位(0为个位)上进行四舍五入,即0表示在小数点后第一位上进行四舍五入,保留到个位;-1表示在个位上进行四舍五入,保留到十位;依次类推。

【 例 2.18 】

? Round(2.56,1), Round(2.56,0), && 输出:2.6 3 ? Round(2.56,-1),Round(7.56,-1) && 输出:0 10

11. 求ASCII码值函数

函数格式:Asc (<字符表达式>)

函数说明:返回值是字符表达式值中首字符的ASCII码值。 【 例 2.19 】

? Asc(”English Abc”) && 输出结果为E的ASCII码值: 69

12. 求字符串长度函数

函数格式:Len(<字符表达式>)

函数说明:返回值是字符表达式值中所含字符的个数,空格也计算在内。每个汉字占两个字符位置。

【 例 2.20 】

? Len(”学习︼VFP6.0”) && 输出结果为:11

13. 求子串起始位置函数

函数格式: At (<字符表达式1>,<字符表达式2>[,<数值表达式>])

Atc(<字符表达式1>,<字符表达式2>[,<数值表达式>])

函数说明:设<数值表达式>值的整数部分为n,当n=1时,可以省略<数值表达式>。函数值是字符表达式1的值在<字符表达式2>值中第n出现(由左至右)的开始位置,如果出现次数小于n,则函数值为0。At函数区分字母大小写,而Atc函数不区分字母大小写,其余功能两个函数一致。

【 例 2.21 】

? AT('AR','cadARA'), AT('AA','cadAARA',2), ATC('A','cadARA') && 输出: 4 0 2

14. 求子串出现次数函数

函数格式:Occurs (<字符表达式1>,<字符表达式2>)

函数说明:计算字符表达式1的值在字符表达式2值中出现的次数。 【 例 2.22 】

? Occurs(“ab”,”cabdabe”),Occurs(“ab”,”cadbaeb”) && 输出:2 0

15. 求年份函数

函数格式:Year(<日期表达式>)

函数说明:函数值是日期表达式值的年份值,值范围为0001~9999。 【 例 2.23 】

? Year({^2007-10-01})

&& 输出: 2007

16. 求月份函数

函数格式:Month (<日期表达式>)

函数说明:函数值是日期表达式值中的月份值,值范围为1~12。 【 例 2.24 】

? Month ( {^2007-10-01} )

&& 输出: 10

17. 求星期函数

函数格式:Dow(<日期表达式>)

函数说明:函数值是日期表达式值对应的星期几。值范围为1~7,其中1代表星期日、2代表星期一、??、7代表星期六。

【 例 2.25 】

? Dow({^1949/10/01}) && 输出: 7,代表星期六

18. 求日数函数

函数格式:Day(<日期表达式>)

函数说明:函数值是日期表达式值的日数,值范围为1~31。 【 例 2.26 】

? Day({^2007-03-15}) && 输出: 15

19. 求小时函数

函数格式:Hour(<日期时间表达式>)

函数说明:函数值表示小时,采用24小时制。 【 例 2.27 】

? Hour({^2007-05-01 1:22:33 p}) && 输出: 13

20. 求分钟函数

函数格式:Minute(<日期时间表达式>) 函数说明:函数值表示分钟。 【 例 2.28 】

? Minute({^2007-05-01 1:22:33 p}) && 输出: 22

21. 求秒钟函数

函数格式:Sec(<日期时间表达式>) 函数说明:函数值表示秒数。 【 例 2.29 】

? Sec({^2007-05-01 1:22:33 p}) && 输出结果为: 33

22. 字符转换成数值函数

函数格式:Val(<字符表达式>)

函数说明:将字符表达式值的首部可转换的子串转换成数值型数据,作为函数的返回值。如果字符串的首字符不是可转换符号,则函数返回值为0。

【 例 2.30 】

? Val(\输出结果为:-6.00 36.00 ? Val(\输出结果为: 2.46 0.00

2.4 字符型表达式

字符表达式是字符运算符连接字符型数据的运算式,运算结果是字符型数据。

2.4.1 字符运算符

VFP中有两种字符运算符:

(1)+: 将两个字符型数据依次连接起来,构成一个新的字符型数据。

(2)-: 先将第一个字符型数据的尾部空格移动到第二个字符型数据的尾部,再依次连接成一个新的字符型数据。

【 例 2.31 】

S1='︼学︼生︼︼'

S2='︼成︼绩︼'

? S1 + S2 + '︼表︼A' && 输出: ︼学︼生︼︼︼成︼绩︼︼表︼A ? S1-S2 + '︼表︼A' && 输出: ︼学︼生︼成︼绩︼︼︼︼表︼A

可见运算符“-”并不移动第一个字符型数据的中间空格位置。

2.4.2 常用字符型函数

字符型函数是指函数值为字符型数据的函数。 1. 生成空格函数

函数格式:Space(数值表达式)

函数说明:数值表达式的值应大于或等于0。设其整数部分为n,利用此函数可以产生由n个空格的字符串。若n等于0,则函数产生一个空字符串,即长度为0的字符串。

【 例 2.32 】

? ’VFP’+Space(3)+’6.0版’

&& 输出结果为: VFP︼︼︼6.0版

2. 删除空格函数

函数格式:Ltrim(<字符表达式>)

Trim(<字符表达式>) Rtrim(<字符表达式>) Alltrim(<字符表达式>)

函数说明:利用Ltrim、Trim 和Alltrim函数可分别去掉字符表达式值的左端空格、尾部空格和两端空格。Trim和Rtrim功能相同。

【 例 2.33 】

? Ltrim('︼成︼绩︼') ? Alltrim(')成)绩)' )

&& 输出:成︼绩︼ && 输出:成︼绩

? Trim ( '︼成︼绩︼' ) && 输出:︼成︼绩

可见这3个函数都不能去掉字符表达式值的中间空格。 3. 取左子串函数

函数格式:Left (<字符表达式>,<长度>)

函数说明:<长度>是数值表达式。设其值的整数部分为n,从字符表达式值的左端第一个字符开始取n个字符作为函数值。

【 例 2.34 】

? Left(”VFP 6.0”,3)

&& 输出结果为: VFP

4. 取右子串函数

函数格式:Right(<字符表达式>,<长度>)

函数说明:从字符表达式值的最右端开始向左取子串,其他同left函数。 【 例 2.35 】

? Right(”吉林大学”,4)

&& 输出结果为:大学

5. 取任意子串函数

函数格式:Substr(<字符表达式>,<起始位置>[,<长度>]) 函数说明:从<字符表达式>值的<起始位置>取指定<长度>的子串作为函数值。<起始位置>和<长度>都是数值表达式,系统对<起始位置>和<长度>自动取整。

【 例 2.36 】

X=”2008年北京奥林匹克运动会”

? Substr(X,7,6)+ Substr(X,19,2)+ Substr(X,23,2) && 输出结果为:北京奥运会

6. 复制字符函数

函数格式:Replicate (<字符表达式>,<数值表达式>)

函数说明:将字符表达式值复制后形成新的字符串,复制次数由数值表达式值的整数部分确定。

【 例 2.37 】

? Replicate(”***”,4) && 输出结果为:************

7. 子串替换函数

函数格式:Stuff(<字符表达式1>,<开始位置>,<长度>,<字符表达式2>)

函数说明:<开始位置>,<长度>都为数值表达式,系统自动取整,设<长度>值的整数部分为n。函数的功能是用字符表达式2的值替换字符表达式1值中开始位置的n个字符。若长度值是0,则将字符表达式2的值插在开始位置字符之前;若字符表达式2的值是空字符串,则删除字符表达式1中开始位置的n个字符。

【 例 2.38 】

? Stuff('ABC',2,1,'XY'), Stuff('ABCDE',3.98,0,’XY’) && 输出:AXYC ABXYCDE ? Stuff('ABCDE', 3.98 , 2, ’’) && 输出: ABE

8. 字符翻译函数

函数格式:Chrtran(<字符表达式1>,<字符表达式2>,<字符表达式3>)

函数说明:对字符表达式1值中的每个字符在字符表达式2值中确定其出现位置n,若n>0且小于或等于字符表达式3值的长度,则用字符表达式3值中的第n个字符替换字符表达式1中的当前字符;若n大于字符表达式3值的长度,则从字符表达式1值中删除当前字符;若n=0,则字符表达式1值中的当前字符不变。

【 例 2.39 】

? Chrtran('ABACAD','AC','XY') && 输出结果: XBXYXD ? Chrtran('ABCD','AC','X') && 输出结果: XBD

? Chrtran('ABCDE','BC','XYZ ') && 输出结果: AXYDE

9. 字符匹配函数

函数格式:Like(<字符表达式1>,<字符表达式2>))

函数说明:若字符表达式1与字符表达式2的值相匹配,则函数值是.T.,否则函数值是.F.。字符表达式1中允许使用“*”和“?”通配符。字符表达式2中出现的“*”

和“?”是普通字符。

【 例 2.40 】

? Like('*A*','GCADFR'), Like('GCADFR','*A*') && 输出结果: .T. .F.

10. 大小写字母转换函数

函数格式: Lower(<字符表达式>)

Upper(<字符表达式>)

函数说明:Lower函数将字符表达式值中的大写字母转换为小写;Upper函数将字符表达式值中的小写字母转换为大写。在转换时其他字符不变。

【 例 2.41 】

? Lower(”英语2AbC”),Upper(”英语2AbC”) && 输出: 英语2abc 英语2ABC

11. 系统时间函数

函数格式:Time ([<数值表达式>])

函数说明:函数返回值为字符型数据,值为系统当前时间,数值表达式可以是任意值,表示时间精确到百分秒。格式为:hh:mm:ss[.<百分秒>],采用24小时制。

【 例 2.42 】

? ”现在时间是”+ Time( ) && 输出:现在时间是14:20:30 ? ”现在时间是”+ Time(1) && 输出:现在时间是14:20:30.85

12. 数值转换成字符函数

函数格式:Str(<数值表达式>[,<长度>[,<小数位数>]])

函数说明:将数值表达式值转换成字符型数据。<长度>和<小数位数>是数值型表达式,系统自动取整。<长度>指转换后字符串的整数、小数和1位小数点的总长度。

【 例 2.43 】

? Str(3.146,5,3) && 输出结果为:3.146 ? Str(3.146,6,1) && 输出结果为:︼︼︼3.1

设: <长度>为m,<小数位数>为n,<数值表达式>值的整数位数为k。

(1)省略m和n:系统默认m是10,n是 0。若k>10,则用科学记数法表示结果;若k<10,则数据右对齐且左补空格。

【 例 2.44 】

? Str(12345678999.123) && 输出结果为:︼1.234E+10

? Str(123.456) && 输出结果为:︼︼︼︼︼︼︼123

(2)m=0:则结果为空串。 【 例 2.45 】

? Str(123456789.983,0,3)

(3)m=6,则结果为整数,且用科学记数法表示结果。

【 例 2.46 】

? Str(12345.987,4,3) && 输出结果为: ****

? Str(123456789.983,7,3) && 输出结果为: ︼1.2E+8

(4)在m,n和k不能全满足要求时:保证顺序:m→k→n。当m>k时,则保留m-k-1位小数(留1位放小数点),转换时在保留位的后1位上进行四舍五入。

【 例 2.47 】

? Str(123.45678,6,3) && 输出结果为: 123.46

(5)转换后的字符串长度小于m:则数据右对齐且左补空格。 【 例 2.48 】

? Str(1.234,6,2) && 输出结果为: ︼︼1.23

13. 日期转换成字符函数

函数格式:Dtoc(<日期表达式>)

函数说明:将日期表达式的值转换成字符型数据。函数值的格式与Set Date和Set Century的设置有关。

【 例 2.49 】

Set Date ANSI Set Century On

? '建国日期是' +Dtoc({^1949/10/01}) && 输出:建国日期是1949.10.01

14. 数据类型函数

函数格式:Vartype(<表达式>)

Type(’<表达式>’)

函数说明:Vartype与Type函数的功能类似,函数值都是大写数据类型符号,用以指出表达式值的数据类型。

两个函数的区别:Type函数将字符常数的内容作为表达式测试,而Vartype函数直接测试表达式;若表达式值为.Null.,则Vartype函数值为X,而Type函数值可能为U或某种数据类型符号;若测试的表达式中包含运算符和不符合运算要求的运算项(如未定义的变量和数据类型不一致等)只能用Type函数测试(函数值为U),而Vartype函数可以直接测试一个未定义的变量(函数值为U)。

【 例 2.50 】

? Vartype(123.4), Vartype('123.4'), Vartype($123.4) && 输出: N C Y ? Type('123.4 '),Type(\输出: N C Y ? Vartype(Date()), Vartype( Time()), Vartype(Datetime()) && 输出:D C T M =”A” N =1 K=3 K= .Null.

? Vart(M), Vart(N), Vart(Y) , Vart (.Null.),Vart(K) && 输出: C N U X X ? Type( 'M'),Type(\输出:C N U U N

2.5 日期及日期时间型表达式

日期型表达式是日期运算符连接日期或数值型数据所构成的运算式,运算结果可能是日期或数值型数据。日期时间型表达式是日期时间运算符连接日期时间或数值型数据所构成的运算式,运算结果可能是日期时间或数值型数据。

2.5.1 日期运算符

日期运算符有“+”和“-”。 1. 日期与数值运算

运算格式:<日期表达式>±<数值表达式>

运算说明:数值表达式的值表示天数,运算时对数值表达式自动取整。设数值表达式值的整数为n,则“+”表示求日期表达式值n天后的日期;“-”表示求日期表达式值n天前的日期。

【 例 2.51 】

Set Century On Set Date ANSI

? {^2008-09-10}+1,{^2008-09-10}-1 && 输出:2008.09.11 2008.09.09 ? {^2008-10-01}+1.56 && 对1.56自动取为1。输出: 2008.10.02 ? {^2008-10-03}-1.12 && 对1.12自动取为2。输出:2008.10.01

2. 日期与日期运算

运算格式:<日期表达式>-<日期表达式>

运算说明:运算结果表示两个日期之间相差的天数。 【 例 2.52 】

? {^2007-05-04}-{^2006-05-04}, {^2005-05-04}-{^2005-05-06} && 输出:365 -2

2.5.2 日期时间运算符

日期时间运算符有“+”和“-”。 1. 日期时间与数值运算

运算格式:<日期时间表达式>±<数值表达式>

运算说明:数值表达式的值表示秒数,运算时取整数为n。则“+”表示求日期时间表达式值n秒后的日期时间;“-”表示求日期时间表达式值n秒前的日期时间。

【 例 2.53 】

Set Century On Set Date ANSI

? {^2007-05-01 22:22:33}+3 && 输出结果为:2007.05.01 10:22:36 PM ? {^2007-05-01 22:22:33}+3.12 && 输出结果为:2007.05.01 10:22:36 PM ? {^2007-05-01 22:22:33}+3.98 && 输出结果为:2007.05.01 10:22:37 PM ? {^2007-05-01 22:22:33}-1.2 && 输出结果为:2007.05.01 10:22:32 PM ? {^2007-05-01 22:22:33}-1.98 && 输出结果为:2007.05.01 10:22:31 PM

2. 日期时间与日期时间运算

运算格式:<日期时间表达式>-<日期时间表达式>

运算说明:运算结果表示两个日期时间之间相差的秒数。 【 例 2.54 】

? {^2007-05-01 22:22:33}-{^2007-05-01 22:21:33} && 输出结果为:60 ? {^2007-05-01 22:22:33}-{^2007-05-01 22:23:33} && 输出结果为:-60

2.5.3 常用日期型函数

日期函数的返回值是日期型数据。 1. 系统日期函数

函数格式:Date( )

函数说明:函数值为系统当前日期。 【 例 2.55 】

Set Date ANSI Set Century On

? Date( ) && 输出系统的当前日期

2. 字符转换成日期函数

函数格式:Ctod(<字符表达式>)

函数说明:将符合日期格式的字符表达式值转换成日期型数据。若字符表达式值不符合日期格式要求,则返回空日期型数据。

【 例 2.56 】

Set Date ANSI Set Century On

? Ctod('2008.10.01') + 2 && 输出结果为:2008.10.03

2.6 关系表达式

关系表达式,也称为比较表达式,采用关系运算符将同类型数据连接起来,以便进行比较。可以对字符型、数值型、日期、日期时间型或逻辑型数据进行关系运算。关系运算的结果是逻辑型数据。当关系成立时,运算结果为真(.T.);否则运算结果为假

(.F.)。关系运算符如表2.2。

表2.2 关系运算符

运算符 说 明 > 大于 < 小于 举 例 2>3 值为.F. .T.<.F 值为.F. '丁 '<>'于' 值为.T. 'Abc'=='Ab' 值为.F. 运算符 说 明 >= 大于或等于 <= 小于或等于 = 等于 $ 测试子串包含 举 例 {^2007-10-2}>={^2007-10-1} 值为.T. 2<=3 值为.T. 2<=2 值为.T. '章'='张 ' 值为.F. 2*3=6 值为.T. 'Bc'$'ABcd' 值为.T. <>、!=不等于 或 # == 字符精确相等

各种关系运算符的优先级别相同,运算符“$”只能对字符型数据进行比较。在进行关系运算时,数值型数据依据数学上的比较规则;日期及日期时间型数据比较时,较后的日期(时间)大于较前的日期(时间);逻辑型数据比较时,逻辑真(.T.)大于逻辑假(.F.)。字符型数据的比较结果取决于当前的比较规则和“排序次序”。

2.6.1 字符型数据的比较规则

字符型数据的比较规则有精确比较和非精确比较两种规则。在不同规则下,两个字符型数据的比较结果可能不同。通过VFP命令可以设置字符型数据的比较规则。

命令格式:Set Exact On | Off

命令说明:Set Exact On是精确比较规则;Set Exact Off(系统默认)是非精确比较规则。

运算符“==”不受Set Exact状态影响,它要求两个字符串(包含空格)必须完全一致,运算结果才是真(.T.)。

1.精确比较规则

精确比较是对两个字符型数据去掉尾部空格后的字符串自左向右按对应字符进行比较。如果比较到某位字符不相等,则包含小字符的字符串较小;如果比较到较短字符串的末尾还没比较出大小关系,则短字符串较小;如果两个字符串完全相同(对应字符和长度均相同),则运算结果为相等(=)。

【 例 2.57 】

Set Exact On

? 'BAG'='BAG︼', 'CAME'<'COM', 'BEE'<='BE' && 输出为:.T. .T. .F.

2.非精确比较规则

非精确比较是对两个字符型数据(含空格)自左向右按对应字符进行比较。如果比较到某位字符不相等,则包含小字符的数据较小;如果运算符右侧整个数据是左侧数据的首部子串,或两个数据完全相同,则运算结果为相等(=);如果运算符左侧整个数据是右侧数据的首部子串,则左侧数据较小。

【 例 2.58 】

Set Exact Off

? 'BAG'<'BAY', 'BEE'='BE', 'BAG'<'BAG︼', '李'<'李明' && 输出为:.T. .T. .T. .T.

无论执行字符型数据的哪个比较规则和“排序次序”,字符的排序规律为:数字小

于英文字母,英文字母小于汉字。

2.6.2 字符数据的“排序次序”

VFP的“排序次序”对字符串比较结果有影响。系统提供了Machine(机内码)、Pinyin(拼音)和Stroke(笔划)3种“排序次序”,系统默认“排序次序”是Machine。设置字符“排序次序”的方法有:

方法一:“工具”菜单→“选项”→“数据”选项卡→从“排序序列”下拉列表框中选择排序次序→“设置为默认值”→“确定”。

方法二:在命令窗口或程序中使用VFP命令方式。 命令格式:Set Collate To “<排序次序名>”

命令说明:排序次序名为Machine、Pinyin或Stroke之一,必须用单引号、双引号或方括号将排序次序名括起来。

1. Machine(机内码)

按机内码顺序:'︼' < '0' < '1' ?< '9' < 'A' <'B' ?<' Y' < 'Z' < 'a' < 'b' ? <'y'< 'z' < '<汉字>',汉字按拼音顺序由小到大排列。

【 例 2.59 】

Set Collate To 'Machine'

? '︼'<'2', '8'<'A’, ’a'<'A', ’Z’<’a’ && 输出:.T. .T. .F. .T. ? 'zz'<'阿', '阿'<'子' && 输出: .T. .T.

2. Pinyin(拼音)

按拼音排序:'︼' < '0' < '1' ? < '9' < 'a' <'A'< 'b' <'B' ?<'y'< 'Y'<'z' < 'Z' < '<汉字>',汉字按拼音顺序由小到大排列。

【 例 2.60 】

Set Collate To 'PinYin'

? '︼'<'2', '8'<'A’, ’a'<'A',‘Z’<’a’ && 输出:.T. .T. .T. .F. ? 'zz'<'阿','阿'<'子' && 输出:.T. .T.

3. Stroke(笔划)

排序次序: '︼' < '0' < '1' ? < '9' < 'a' <'A'< 'b' <'B' ? <'y'< 'Y'<'z' < 'Z' < '<汉字>'。汉字依据书写笔划的多少排序,笔划少的汉字小。

【 例 2.61 】

Set Collate To 'Stroke'

? '︼'<'2', '8'<'A’, ’a'<'A', 'Z’<’a’ && 输出:.T. .T. .T. .F. ? 'zz'<'阿', '阿'<'子' && 输出:.T. .F.

2.6.3 子串包含运算

运算格式:<字符表达式1> $ <字符表达式2>

运算说明:若字符表达式1的值是字符表达式2值的子串,即字符表达式2的值完整地包含字符表达式1的值,则运算结果为真(.T.);否则,运算结果为假(.F.)。

【 例 2.62 】

X=\中文版\

? 'VFP中文版'$X , 'VFP6.0'$X && 输出结果为:.F. .T.

事实上,子串包含运算与表达式:AT(<字符表达式1>,<字符表达式2>)>0的作用完全相同。

2.7 逻辑表达式

逻辑表达式是逻辑运算符连接逻辑型数据构成的运算式,运算结果仍然是逻辑型数据真(.T.)或假(.F.)。

2.7.1 逻辑运算符

逻辑运算有“非”、“与”以及“或”3种运算符,功能说明及优先级别如表2.3。书写时Not、And或Or前后应加一个半角圆点(.)或空格。

表2.3 逻辑运算符

优先级别 1 2 3 逻辑运算符 .Not. Not ! .And. And .Or. Or 说 明 非运算 与运算 或运算 1. 非运算

运算格式:.Not. <逻辑值表达式>

运算说明:对逻辑值表达式值取反。即:若逻辑值表达式的值为真(.T.),则非运算结果为假(.F.);若逻辑值表达式值为假(.F.),则运算结果为真(.T.)。

【 例 2.63 】

? .NOT. 2>3 , !“a”<”ab” && 输出结果为: .T. .F.

2. 与运算

运算格式:<逻辑值表达式1> .And. <逻辑值表达式2>

运算说明:仅当逻辑值表达式1和逻辑值表达式2的值都为真(.T.)时,运算结果

才为真(.T.);否则,运算结果为假(.F.)。

【 例 2.64 】

A=1 B=2

? A=1 And B<3, A>0 And B>5, A>2 .And. B<3, A>2 .And. B>3 && 输出:.T. .F. .F. .F.

3. 或运算

运算格式:<逻辑值表达式1>.Or.< 逻辑值表达式2>

运算说明:仅当逻辑值表达式1和逻辑值表达式2的值都为假(.F.)时,运算结果才为假(.F.);否则,运算结果为真(.T.)。

【 例 2.65 】

Name=’张大伟’

? ‘张’$ Name .Or.‘伟’$ Name && 输出结果为:.T.

2.7.2 常用逻辑型函数

逻辑型函数是指返回逻辑值的函数。 1. 字母函数

函数格式:Isalpha(<字符表达式>)

函数说明:若字符表达式值的首字符是英文字母,则函数值为真(.T.);否则,函数值为假(.F.)。

【 例 2.66 】

? Isalpha(”A12b34cd”),Isalpha(”1a”),Isalpha(”*1a”) && 输出为:.T. .F. .F.

2. 数字函数

函数格式:Isdigit(<字符表达式>)

函数说明:若字符表达式值的首字符是数字,则函数值为真(.T.);否则,函数值为假(.F.)。

【 例 2.67 】

? Isdigit (\输出结果为:.T. .F.

3. 小写字母函数

函数格式:Islower(<字符表达式>)

函数说明:若字符表达式值的首字符是小写英文字母,则函数值为真(.T.);否则,函数值为假(.F.)。

【 例 2.68 】

? Islower (”aBc”), Islower (”Abc”) && 输出结果为:.T. .F.

4. 大写字母函数

函数格式:Isupper(<字符表达式>)

函数说明:若字符表达式值的首字符是大写英文字母,则函数值为真(.T.);否则,函数值为假(.F.)。

【 例 2.69 】

? Isupper(”aBc”), Isupper(”Abc”) && 输出结果为:.F. .T.

5. 文件存在函数

函数格式:File(<字符表达式>)

函数说明:判断字符表达式值表示的文件名(应包含路径和文件全名)是否存在。若磁盘文件存在,则函数值为真(.T.);否则,函数值为假(.F.)。

【 例 2.70 】假设D:\\XSA.DBF文件存在,而D:\\XSB.DBF文件不存在。

? File(“D:\\XSA.DBF”), File(“D:\\XSA”) && 输出:.T. .F. ? File(‘D:\\XSB.DBF') && 输出:.F.

6. 测试空值函数

函数格式:Empty (<表达式>)

函数说明:判断表达式值是否为空值(Empty)。若表达式值是空值,则函数值为真(.T.);否则,函数值为假(.F.)。VFP中常用数据类型的空值如表2.4。

表2.4 空值(Empty)定义

数据类型 数值型 字符型 货币型 数据类型 0 日期型 空串、空格串、Tab串等 日期时间型 $0 逻辑型 空值定义 空值定义 空日期 空日期时间 .F.

【 例 2.71 】

? Empty(Ctod(space(0))), Empty(Ctot(space(2))) && 输出结果为:.T. .T. ? Empty(Space(0)), Empty(Space(3)) && 输出结果为:.T. .T. ? Empty (2*3-6), Empty ($10) && 输出结果为:.T. .F. ? Empty(2<3), Empty (“ABC”==”AB”) && 输出结果为:.F. .T.

7. 测试.Null.值函数

函数格式:Isnull(<表达式>)

函数说明:若表达式值是不确定的.Null.值,则函数值为真(.T.);否则,函数值为假(.F.)。

.Null.表示没有确定的值。例如,对“商品”表中未定价的商品,可以将“价格”字段设为.Null.。又如,对“成绩”表中没有考试科目的“成绩”字段也可以设为.Null.。

【 例 2.72 】

? Isnull(0),Isnull(.Null.),Empty(.Null.) && 输出:.F. .T. .F.

8. 测试值域函数

函数格式:Between(<表达式1>,<表达式2>,<表达式3>)

函数说明:若表达式1的值大于或等于表达式2的值并且小于或等于表达式3的值,则函数值为真(.T.);否则,函数值为假(.F.)。3个表达式值的数据类型必须一致,可以是数值型、字符型、日期型、日期时间型或货币型数据等。

【 例 2.73 】

? Between(2+5,2*3, 4*3), Between(Date(), Date()-1,Date()+1) && 输出为: .T. .T.

2.7.3 表达式综述

在VFP的同一个表达式中,允许含有多种运算符。各类运算符的优先级别由高到低依次为:数值运算、字符运算、日期运算和日期时间运算同级别;关系运算;逻辑运算。

优先级别相同的运算按从左到右的顺序进行,小括号优先级别最高,可以通过加小括号改变优先级顺序,多个小扩号嵌套时,最里层的小扩号先运算。

【 例 2.74 】

M=5 N='ABC'

? !(M-2)*2>5 Or 'D'+N =='ABC' And M>3

&& 输出:.F.

2.8 宏替换及其使用

在VFP中,使用宏替换函数处理数据可以提高程序的通用性及灵活性。 函数格式:&<字符型内存变量>[.]

函数说明:用字符型内存变量的值替换整个宏替换函数所在的位置。当宏替换函数是命令中最后一项或其后有分隔符(如空格、运算符号和逗号等),则宏替函数末尾的圆点“.”可以省略。宏替换函数的应用如下:

1. 作为常数的一部分 【 例 2.75 】

X=\大学\? \吉林&X\

&& 输出结果为:吉林大学

2. 作为变量名的一部分 【 例 2.76 】

XH1=\N=”1”

? XH&N && 输出结果为:202

3. 作为表达式的一部分 【 例 2.77 】

X=\” Y=\

Y5=”Z” Z=2+4

? 1+&X*3 && 相当于求1+2*3的值,输出结果为:7 ? &Y.&X && 相当于求3/2的值,输出结果为:1.50。

? &Y 5 && 由于有空格作为明显的分隔符,圆点可省略。输出结果为:0.60 ? &Y5 && 相当于输出Z的值:6

4. 替换文件名 【 例 2.78 】

Accept \请输入表名:\输入一串字符作为变量BM的值 Use &BM && 打开以BM变量值为文件名的数据表

5. 替换一条命令 【 例 2.79 】

X=\

&X && 等同于执行命令:? Date( )

2.9 对话框函数

在应用程序执行过程中,有时需要弹出对话框与用户进行交互。利用Messagebox函数,可以创建对话框。

函数格式:Messagebox(<字符表达式1> [,<数值表达式>[,<字符表达式2>]]) 函数说明:定义带按钮和图标的对话框,函数返回值由用户选择的按钮而定(如表2.8)。函数中各个表达式的作用为: (1)字符表达式1:设置对话框中要显示的信息。

(2)数值表达式:用于说明对话框类型,对话框类型由按钮、图标和默认按钮组合而成,数值表达式的值是按钮编码(表2.5)、图标编码(表2.6)和默认按钮编码(表2.7)组合值,系统默认值为0。例如,289=1+32+256,表示对话框有“确定”和“取消”按钮,图标为“?”,默认按钮是第2个(取消)按钮。

(3)字符表达式2:设置对话框的标题。若省略此表达式,则对话框标题为“Microsoft Visual FoxPro”。

表2.5 对话框函数的按钮设置表 表2.6 对话框函数的图标设置表 编码 0 1 2 3 4 5 按钮对象 仅包含”确定”按钮 “确定”和“取消”按钮 “终止”、“重试”和“忽略”按钮 “是”、“否”和“取消”按钮 “是”和“否”按钮 “重试”和“取消”按钮 编码 0 16 32 48 64 图标对象 无图标 × ? ! i 表2.7 对话框函数的默认按钮设置表 表2.8 对话框函数值表 编码 0 256 512 包含对象 第1个按钮是默认按钮 第2个按钮是默认按钮 第3个按钮是默认按钮

选择按钮 确定 终止 忽略 否 函数值 1 3 5 7 选择按钮 取消 重试 是 函数值 2 4 6

【 例 2.80 】

? Messagebox(\请关闭电源\警示\

执行语句时,系统弹出“警示”对话框(如图2.1),显示“请关闭电源”,有“确定”、“取消”按钮和“!”图标,“取消”按钮是默认按钮。如果单击“确定”按钮,则输出1;若单击“取消”按钮,则输出2。

图2.1 例2.80执行效果

通常将Messagebox函数单独作为一条命令使用,忽略函数的返回值,提示用户某些信息。

【 例 2.81 】

If not File (\

Messagebox(\文件默认目录中没有XSB.DBF,退出后检查文件位置\Cancel EndIf

2.10 数组及其使用

数组是一组变量名相同而下标不同的内存变量。其中每个内存变量称为数组元素,简称元素。在VFP中,可以定义一维或二维数组,每个数组中最多可以含65000个元素,同一个数组中各个元素的数据类型可以不同。

2.10.1 定义数组

在使用一个数组之前,必须先对其进行定义。

命令格式:Dimension <数组名1>(<行下标1>[,<列下标1>])

[,<数组名2>(<行下标2>[,<列下标2>])]??

Declare <数组名1>(<<行下标1>[,<列下标1>]])

[,<数组名2>(<行下标2>[,<列下标2>])]??

命令说明:用于定义数组,在命令中用圆括号或方括号将数组的维数括起来,数组中每个元素的初值都是逻辑假(.F.)。两条命令的功能完全相同。各项说明如下:

(1)数组名:数组名必须依据内存变量的命名规则,不允许与系统函数重名,数组名也不能与简单内存变量重名。

(2)行下标:定义数组的行数。

(3)列下标:定义数组的列数。若省略,则定义一维数组。

<行下标>和<列下标>都是数值表达式,执行此命令时自动取整。VFP规定各下标的下界是1。

【 例 2.82 】

Dimension A(3),BC[2,2]

同时定义了两个数组:一维数组A中有A (1)、A (2)和A (3)共3个元素,二维数组BC中有BC(1,1)、BC(1,2)、BC(2,1)和BC(2,2)共4个元素。

2.10.2 使用数组元素

VFP中凡可以使用简单内存变量的地方,都可以使用数组元素;给简单内存变量赋值的方法适用于数组元素。引用数组元素的方法:

引用格式:<数组名>(<行下标>[,<列下标>])

引用说明:在数组名后用圆括号或方括号将行下标和列下标括起来,各下标值是大于或等于1的数值表达式,引用时自动取整。行下标与列下标之积不能超出数组中元素总数。

【 例 2.83 】

Dimension B (2,3)

B[1,1]=7 && B(1,1)赋值为7

B[1,2]={^2008-05-01} && B(1,2)赋值为2008-05-01

B(2,1)= B(1,1)+ B(1,2) && 引用数组元素B(1,1)和B(1,2),并为B(2,1)赋值 ? B[2,1] && 输出B(2,1)的值

在对数组名赋值时,将为数组中每个元素赋相同的值;引用数组名时,实际上是引用数组中的第1个元素。

【 例 2.84 】

Dimension A(2,3)

A=1 && 对数组名A赋值,将数组A中的6个元素都赋值成1 A(1,1)='图书' A(1,2)= 2*3

? A && 仅引用数组名A,实际上引用的是A(1,1),输出:图书

2.11 内存变量管理

VFP提供了一批内存变量专用命令,除了内存变量赋值(定义)和清除(释放)命令外,还有内存变量信息查看、保存和恢复等命令。

2.11.1 查看内存变量

实际应用中,有时需要查看目前内存中的变量情况,可以用下列命令查看内存变量: 命令格式1:List Memory [Like<变量名通配符>] [To Printer][To File<文件名>] 命令格式2:Display Memory [Like<变量名通配符>]

[To Printer][To File<文件名>]

命令说明:输出内存变量的有关信息,包括变量名、作用域、数据类型和变量值。当显示的内容较多时,Display每显示一屏后暂停,按任意键后继续输出下一屏;list无暂停。List和Display的功能基本一致,各选项说明如下:

(1)Like <变量名通配符>:只输出与“变量名通配符”匹配的变量和数组。通配符的作用同Release命令中的通配符。省略此选项,则输出所有内存变量。

(2)To Printer:在VFP主窗口显示的同时,将查看的结果送打印机打印。 (3)To File <文件名>:输出结果保存到文本文件中,文件扩展名是TXT。 【 例 2.85 】依次执行下列命令,执行结果如图2.2。

Clear Memory X=”张明” X1={^1990/12/01} X12=.F.

Dimension XS(2,2) XS(1)=”2003010” XS(4)={^1990/12/01} Y=$1234.56

Display Memory Like X* && 显示X, X1、X12和XS数组的各元素 变量名 作用域 数据类型 变量值 表示数组 图2.2 内存变量信息

2.11.2 保存内存变量

为了以后重启VFP后能使用当前定义的内存变量,可以将当前内存变量的信息保存到磁盘文件中。

命令格式:Save To <文件名> [All Like | All Except <变量名通配符>]

命令说明:将当前有效的内存变量信息保存到指定的内存变量文件中,系统默认文件扩展名为MEM。若省略所有选择项,则保存当前有效的全部内存变量。

【 例 2.86 】

Clear Memory X1=1 X2=2 Y1=3 Y2=4

Save To MA && 将当前所有的内存变量保存到文件MA.MEM 中 Save To MB All Like X* && 将所有以X开头的内存变量保存到文件MB.MEM中 Save To MC All Except X* && 将所有非X开头的内存变量保存到文件MC.MEM中

2.11.3 恢复内存变量

可以恢复内存变量文件中的变量,即:再次读到内存中,以便重新引用。 命令格式:Restore From <文件名> [Additive]

命令说明:将内存变量从指定的文件读到内存中。若不选Additive,则用文件中的变量覆盖当前内存中的全部变量;若选Additive,则恢复文件中变量的同时保留当前的内存变量,若当前内存与文件中的变量同名,则取文件中变量的值。

【 例 2.87 】

Clear Memory X1=10

Restore From MA Additive

? X2,Y1,Y2 && 输出结果为:2 3 4 ? X1 && X1是文件中X1的值1 Y1=30

Restore From MC

? Y1 && Y1是文件中Y1的值3 ? Y2 && Y2是文件中Y2的值4

习 题 二

一、 用适当内容填空

1.VFP中的变量分为:【 】和字段变量。 2.VFP中的内存变量分为:【 ① 】和【 ② 】。 3. VFP中,内存变量名由【 ① 】 、汉字、数字和下划线组成,且不能以 【 ② 】 开头。

4.内存变量保存在【 ① 】中,变量的数据类型由【 ② 】时表达式的数据类型决定。退出VFP时,内存变量将被【 ③ 】。

5. 若当前有一个字段变量和内存变量“XM”同名,则直接引用“XM”是指【 】变量。

24

6. 对应数学式10÷(2X+6X-3)+e的VFP表达式为【 】。 7. 函数Len(‘学习”VFP6.0”’)的值是【 】。

8.Left(“123456”,Len(“程序”))的计算结果是【 】。 9. Str(1234.5678,7,3)的结果是【 】。

10. 表达式\的值是【 】。

11.VFP规定只有【 】数据类型的数据(除日期和数值型外)才能进行运算。 12. 与数学式“X≤Y

14.VFP中Not、Aad和Or运算符的优先级从高到低依次为【 ① 】、【 ② 】、【 ③ 】。

15.在关系、逻辑和数值运算中,运算级由高到低依次是:【 ① 】、【 ② 】、【 ③ 】。

16. 表达式1-8>7.Or.\的运算结果为【 】。 17.命令 ? Vartype(Time( )) 的输出结果是【 】。

18. 设X=’2008/10/01’。函数Vartype(&X)的值是【 ① 】;函数Vartype(“&X”)的值是【 ② 】;Type(“&X”)的值是【 ③ 】。

19. 若a=5,b=\,则:?Type(b)的输出结果是【 ① 】,?Vartype(b)的输出结果为【 ② 】,?Vartype(&b)的输出结果为【 ③ 】。

20. 执行命令 Dime array(3,3) 后,array(3,3)的值为【 】。 21. 使用【 】命令,可以把以X开头的所有内存变量都存入磁盘文件A.MEM中。

二、 从参考答案中选择一个最佳答案

1. 下面常数中正确的是【 】。 A. 3.4E2.5 B. 张明 C. .T. D. 2004/01/12

2. 以下日期中,正确的是【 】。

A. {\C. {^2001-05-25} D. {[^2001-05-25]} 3.下列变量名中不正确的是【 】。

A. 学号 B. 1季度 C. No_1 D. _12 4. 当前数据表中含有Name字段,系统中有一内存变量名称也为Name,执行命令?Name后,【 】。

A. 显示的结果是内存变量Name的值 B. 显示的结果是字段变量Name的值

C. 随机显示,或是内存变量、或是字段变量Name的值 D. 显示出错信息

5. 执行命令 Store 1 To A,B,C,D 的结果是【 】。

A. 使A、B、C、D四个变量值都为1 B. 仅A值为1,其他变量值为0 C. 仅A值为1,其他变量值为.F. D. 仅A值为.F.,其他变量值为1 6. 以下赋值命令正确的是【 】。

A. Store 1 To X,Y B. Store 1,2 To X,Y C. X=1,Y=2 D. X,Y=1 7. 下列各项,除【 】外均是常数。

A. XY B. 'XY' C. .T. D. 1998 8. 下列选项中,不是常数的是【 】。

A. 李伟 B. [abc] C. 1.4E+2 D. {^1999/21/31} 9.【 】是逻辑型常数。

A.“Y” B. “N” C. “NOT” D. .F. 10. 2E-4是一个【 】。

A. 字符变量 B. 内存变量 C. 数值常数 D. 非法表达式 11. 不属于字符常数定界符的是【 】。

A. 半角单引号 B. 大括号 C. 双引号 D. 方括号 12. 下列字符型常数的表示中,错误的是【 】。

A. ’1+2’ B. [[吉林]] C. [\日报\13. 表达式12-7%3*3的值是【 】。

A.6 B. 9 C. 15 D. 18 14.下面表达式的值为数值型数据的是【 】。

A.2*3=6 B. Ctod(’11/03/99’)+1 C. [10]-[2] D. Len(’ABC’)

15. 表达式Len('CHINESE')+Val('86')+({^1998/04/05}-{^1998/04/03})的值是【 】数据。

A. 字符型 B. 日期型 C. 数值型 D. 逻辑型 16.函数Round(1234.567,-2)的返回值为【 】。 A. 1200 B. 1234.57 C. 1234.00 D. 1234

17. 设变量P=3.1415926,执行命令 ? Round (P,4) 后的输出结果为【 】。 A. 3.1410 B. 3.1415 C. 3.1416 D. 3.0000 18. 以下可以输出“程序”的命令是【 】。

A. ? Substr(\程序设计基础\程序设计基础\C.? Substr(\程序设计基础\? Substr(\程序设计基础\19. 设S=\,表达式Upper(Subs(S,1,1))+Lower(Subs(S,2))的值是【 】

A.visual foxpro B. Visual foxpro C. VISUAL FOXPRO D. VFP 20. 在下列函数中,函数值为数值型数据的是【 】。

A. Substr(Dtoc(Date( )),7) B. Ctod(\C. Time( ) D. At(\群众\人民群众\21. 下列表达式值的类型为字符型的是【 】。

A. \C. \ D. Dtoc(Date( ))> \22. 函数 Chrtran('ABAC','A','XY') 的值是【 】。 A. ABAC B. XYBXYC C. XBXC D. BC

23. 在下面的VFP表达式中,不正确的是【 】。

A. {^2008-10-01}-Date( ) B. {^2008-10-01}+Date( )

C. {^2008-10-01}+10 D. {^2008-10-01 10:10:10 AM}-10 24. 运算符 = = 的作用为【 】。

A. 任何时候都等价于运算符 = B. 不是VFP的运算符 C. 字符串精确比较 D. 用于精确比较两个数值数据 25. 执行Set Exact Off命令后,执行 ?“上海市”=“上海” 命令。其结果为【 A. .T. B. .F. C. 0 D. 1

26. 设x=1,y=2, z=3,则表达式x+y=z的值是【 】。 A. x+y B. 3 C. .T. D. U 27.【 】的运算结果一定是逻辑值。

A. 字符表达式 B. 数值表达式 C. 关系表达式 D. 日期表达式 28. 与 !(y<=0.Or.y>=1) 等价的条件是【 】。

A. y>0.Or.y<1 B. y<0.Or.y>1 C. y<0.And.y>1 D. y>0.And.y<1 29. 设X=\,Y=2*3,下列正确的表达式是:【 】。

A.Sqrt(X) B. Y<4 .Or.X>’XH’ C. Subs(Y,1,1) D. X+10 30. \是小于10的非负数\,在VFP中用表达式表示成【 】。

A. 0<=X<10 B. 0<=X<10 C. 0<=X And X<10 D. 0<=X Or X<10 31. 下列叙述中,不正确的是【 】。

A. 数值运算符的优先级高于其他类型的运算符 B. 字符运算符“+”和“-”优先级相等

。 】

C. 逻辑运算符的优先级高于关系运算符 D. 所有关系运算符的优先级都相等

32. 设X=\”,Y=\,下列表达式结果为.F.的是【 】。

A. Not(X>=Y) B. Not(X$Y) C. Not(X$Y)Or(X<>Y) D. Not(X==Y)And(X$Y) 33. 下列表达式肯定不符合VFP规则的是【 】。

A. F + T B. 08/08/13 C. 3X>18 D. Val(“123”) 34. 关于“?”和“??”命令,下列说法中错误的是【 】。

A. ?和??只能输出多个同类型的表达式值 B. ??从当前位置开始输出 B. ?从下一行开始位置输出 D. ?和??后可以没有表达式 35. 设M=2,N=3,K=\,表达式4*&K的值是【 】。 A.2*M-N B. 2*( M-N) C. 4 D. 5 36. 依次执行如下命令序列:

YA=1 YB=2 YAB=3 N=\M=\? &M

最后输出结果是【 】。

A. 1 B. 2 C. 3 D. Y&N

37. 设X=1+2、Y=\、Z=\,则正确的表达式是【 】。 A.X+Y B. X+Z C. X+&Y D. X+&Z 38. 【 】函数返回值是.T.。

A. Isnull(0) B. Isnull(\39.设 date=\,命令:? Type(\的输出结果是【 】。 A. C B. N C. D D. U

40. 变量F没有定义,执行【 】命令后,显示U。

A. ? Type(F) B. ? Type(.F.) C. ? Type(\41.在VFP中,关于数组的错误叙述是【 】。 A. VFP只支持一维数组和二维数组 B. 数组必须先定义后使用 C. 新定义数组的元素初值为.F.

D. 一个数组中的各个数组元素必须是同一种数据类型

42. 命令Dimension N(3,2)定义的数组含【 】个数组元素。 A. 3 B. 2 C. 5 D. 6 43. 下列选项中,正确的命令是【 】。

A. Dime A(1,2,3) B. Dime A(2),B(3,4) C. Dime A D. Dime A,B(1,2)

44. 使用Save To AB命令可把内存变量存储到磁盘上,该文件名是【 】。 A. AB.mem B. AB.Var C. AB.sav D. AB.disk

三、 从参考答案中选择全部正确答案

1. 以下各项中,可作为常数的数据有【 】。 A. \B. 2008/09/10 C. .F. D. 身份证号 E. 1+2=3 2. 以下各表达式中,值不是数值型数据的是【 】。

A. Len(\C. Substr(\am a student.\Str(345,6,2) E. Date()-(Date()-1) 3. 【 】表达式的运算结果是数值型数据。

A. 10+20=30 B. \–\–1 D. Ctod([08/04/02])–10 E. Asc(\4. 运算结果是\优秀学生\的表达式是【 】 A. \优秀 \学生\优秀 \学生\

C. \优秀\学生\优秀 \学生\E. Trim(\优秀 \学生\5. 【 】不是字符型数据。

A. Date( ) B. Time( ) C. Dtoc(Date( )) D. Space(3) E. Str(123.56,9) F. At(“b”,”abc”) 6.【 】是逻辑型常数。

A. ”Y” B. “F” C. .T. D. L E. .F. 7. 以下各表达式的值,【 】不是逻辑型数据。

A.2<3 B. 2+3 C. 2=3 D. Date( )+1 E. \8. 【 】表达式的值是逻辑型数据。

A. \邮政\中国邮政\邮政\中国邮政\中国\邮政\D. \中国邮政\邮政\邮政\中国邮政\

9.VFP中的 “+”和“-” 运算符,可用于【 】数据之间的运算。 A.数值型 B. 字符型 C. 逻辑型 D. 备注型 E. 通用型 10. 【 】组中的两个函数值相同。 A. Left(\与Substr(\

B. Substr(Dtoc(Date( )),7,2) 与Year(Date( )) C. Type(\与Vartype(2*3)

D. 若M=\与M+N

E. Trim(“ VFP 6.0 ”)与AllTrim(“ VFP 6.0 ”) 11. 【 】函数返回值是.F.。

A. Empty(Ctod(Space(0))) B. Empty(Ctot(Space(3))) C. Empty (\D. Empty (2*3-6) E. Empty (“ABC”==”AB”) F. Empty( .Null.)

思 考 题 二

1.在任何时候,是否内存变量名前都需加前缀“M.”或“M->”,以明确指出是内存变量?

2.两个日期型数据间可以进行+与-运算吗? 3.两个日期时间型数据间可以进行+与-运算吗?

4.Alltrim(<字符表达式>)函数可以去掉字符表达式值中的所有空格吗?

5.字符匹配函数Like中,<字符表达式1>和<字符表达式2>中都可以使用“*”和“?”作为通配符吗?

6. Time( )函数的数据类型是时间型吗? 7.利用Str(<数值表达式>[,<长度>[,<小数位数>]])函数,在任何时候都可以把数值表达式值转换成相应的字符型数据吗?

8.Vartype与Type函数的功能完全相同吗?

9.在VFP中,除数值型数据可以比较大小外,其他类型的数据可以比较吗? 10.VFP的3种字符“排序次序”,所指定的字符串比较规则的异同点是什么? 11. 在VFP中,可以认为“由于空值和空白值的含义是相同的,因此Empty 和Isnull函数的功能是相同的”吗?

12.只要是:&符号后面紧跟一个内存变量(即:&<内存变量>)形式,就可以将其看作是宏替换函数吗?

13.在VFP中,同一个数组中各个元素的数据类型必须相同吗?同一个元素,其前后数据类型也必须相同吗?

实 验 题 二

实验一

实验题目:设置日期型数据的输出格式,调试例2.1到例2.3。

实验要求:通过在命令窗口执行各条命令,观察执行结果,掌握基本的设置日期型

数据输出格式的方法。

注意事项:各项之间用空格分开,命令中关键字的符号一律用半角。 思 考 题:日期型数据的输出格式有哪些?如何设置?

实验二

实验题目:练习内存变量的建立与清除,调试例2.4到例2.6。

实验要求:通过在命令窗口执行各条命令,观察执行结果,体会通配符的使用。 注意事项:命令中的变量要多一些,以便观察通配符使用的效果。

思 考 题:内存变量与字段变量的建立方法是否相同呢?

实验三

实验题目:掌握数值型函数的使用,调试例2.8到例2.30。

实验要求:通过在命令窗口执行各条命令,观察执行结果,掌握数值型函数的功能。 注意事项:为观察执行效果,使用”?”命令输出数值型函数的值到VFP主窗口中。 思 考 题:运算结果是数值型的函数,其参数一定是数值型数据吗?

实验四

实验题目:掌握字符型函数的使用,调试例2.31到例2.52。

实验要求:通过在命令窗口执行各条命令,观察执行结果,重点掌握字符型函数的

功能。

注意事项:为观察执行效果,可使用“?”和“??”命令将字符型函数输出。 思 考 题: Substr与Str函数的功能有哪些不同?

实验五

实验题目:掌握日期和日期时间型表达式的使用,调试例2.53到例2.58。

实验要求:通过在命令窗口执行各条命令,观察执行结果,重点掌握日期和日期时

间型函数的功能和使用。

注意事项:为观察执行效果,应设置日期时间的格式或使用严格的日期常数。 思 考 题:有时命令执行后的输出效果与预想的不一样,问题可能出在哪里呢?

实验六

实验题目:掌握关系表达式的使用,调试例2.59到例2.64。

实验要求:通过在命令窗口执行各条命令,观察执行结果,重点掌握各种关系运算

符的的功能和使用规则。

注意事项:对字符型常数,书写时区分大小写。

思 考 题:各种类型数据所能进行的关系运算是否都是一样的?

实验七

实验题目:掌握逻辑表达式的使用,调试例2.65到例2.76。

实验要求:通过在命令窗口执行各条命令,观察执行结果,重点掌握各种逻辑运算

符及逻辑型函数的功能和使用规则。

注意事项:书写逻辑运算符时,用空格或圆点( .)作为与其他数据隔开的分隔符。 思 考 题:只有逻辑运算符参与的表达式,其运算结果才是逻辑型数据吗?

实验八

实验题目:掌握宏替换函数的使用,调试例2.77到例2.81。

实验要求:通过在命令窗口执行各条命令,观察执行结果,掌握宏替换函数的功能

和格式。

注意事项:宏替换函数应以半角的”&”开始,其后内存变量应是字符型变量。 思 考 题:宏替换函数与其后数据的分隔符有哪些?

实验九

实验题目:掌握数组的使用,调试例2.84到例2.86。

实验要求:通过在命令窗口执行各条命令,观察执行结果,掌握数组的定义及数组

元素的使用方法。

注意事项:<数组名>(<行下标>[,<列下标>])在Dimension(或 Declare)命令中出

现是定义数组,其他场合出现表示引用数组元素。

思 考 题:一个数组与任意的一组内存变量有什么不同?

实验十

实验题目:掌握内存变量的查看、保存与恢复方法,调试例2.87到例2.89。

实验要求:通过在命令窗口执行各条命令,观察执行结果,掌握查看、保存和恢复

内存变量命令的功能和格式。

注意事项:为避免当前内存变量影响命令执行效果,最先执行Clear Memory命令,

以净化系统环境。

思 考 题:如何查看系统内存变量?使用Restore命令恢复先前保存过的变量时,

对当前的内存变量有何影响?

本文来源:https://www.bwwdw.com/article/omxg.html

Top