530 likes | 642 Views
第 3 章 数据类型、函数与表达式. 本章主要内容 数据类型 常量与变量 表达式 常用函数. 本章重点: 各种常量的表示方法 变量的基本操作 常用函数的使用 本章难点: 变量的概念及用法 函数的使用. 本章学习要求 掌握常量的表示方法、变量的基本操作 熟悉常用函数的使用. 3.1 常量、内存变量和数组. 3.1.1 常量 一、常量的概念 常量是一个命名的数据项。 VFP 对常量的表示法有一些规定。 (1) 数值型常量可直接使用。例: 23.6 、 1100000 或 1.1E+6
E N D
本章主要内容 • 数据类型 • 常量与变量 • 表达式 • 常用函数
本章重点: • 各种常量的表示方法 • 变量的基本操作 • 常用函数的使用 本章难点: • 变量的概念及用法 • 函数的使用
本章学习要求 • 掌握常量的表示方法、变量的基本操作 • 熟悉常用函数的使用
3.1 常量、内存变量和数组 3.1.1 常量 一、常量的概念 常量是一个命名的数据项。VFP对常量的表示法有一些规定。 (1) 数值型常量可直接使用。例: 23.6、1100000或1.1E+6 (2) 字符型常量必须用英文状态下的单引号、双引号或方括号括起,这些符号总称为字符括号或定界符。 例: “工程师" [工程师] ‘工程师’
(3) 逻辑型常量必须用英文句点括起,而且只有真和假两个取值。 例: .T. 、.Y.、.y.或.t.表示逻辑真; .F. 、.N.、.n.或.f.表示逻辑假。 (4) 日期型常量及日期时间型常量用花括号括起,且一般应严格按照如下格式表示: {^YYYY-MM-dd[, ][hh[:mm[:ss]][a|p]]} 例: {^1993-11-12} • {^2000-01-01, 10:00:00 } (5) 货币型常量前加$符号。 例: $4.3
3.1.2 内存变量 一、关于变量 在VFP语言中,有两种变量:字段变量、内存变量,内存变量存在于内存之中,独立于数据库文件。退出VFP时,内存中的所有内存变量都将消失,不在磁盘上自动保存。 内存变量有字符型、数值型、货币型、逻辑型、日期型、日期时间型6类。对这6类数据类型的使用与同类型字段数据类型的使用相同。 内存变量必须先定义后使用。VFP中,有两种最基本的内存变量定义方法,它们是: (1) STORE <表达式> TO <内存变量名清单>
(2) <内存变量名> = <表达式>。 说明:格式(1)的功能是把语句中表达式的值赋给<内存变量名清单>中的所有内存变量。 格式(2)的功能是把等号右边< 表达式 >的值赋给等号左边的一个内存变量。 表达式值的类型就是内存变量的类型。若内存变量原来已经存在,执行了赋值语句后,原值即被取代。 例: STORE 245 TO A, B, C 执行了这个命令,内存变量A、B、C中的值均为245。 例: X=10 X=X+1
两条命令执行后,内存变量X的值为11。 用户可直接用内存变量名对内存变量进行访问。但若内存变量名与某字段变量名相同时,必须用如下格式访问: M -> < 内存变量名> m-->xm 或 M .< 内存变量名> m.xm
2. 内存变量操作 1) 输出内存变量的值 最简单的输出内存变量的值的命令是?和??。 基本命令格式: ?/??<表达式清单> [AT <数值表达式>]
说明: 此两命令均为输出命令,输出命令中<表达式清单>的值。用“?”命令时,在输出表达式值之前首先执行一次回车换行;使用“??”,则直接输出。 使用[AT < 数值表达式>]任选项时,该数值表达式的值决定输出的起始列号。 2) 显示内存变量情况命令——DISPLAY/LIST MEMORY 命令格式:DISPLAY/LIST MEMORY[LIKE<通配符>] 一屏时,DISPLAY分页显示,LIST则滚动显示。
DISPLAY MEMORY和LIST MEMORY两条命令的功能基本相同,都显示当前内存中所有内存变量的名、类型和当前值,所有数组变量名及每一个数组的下标变量的类型和当前值,正在使用的变量个数、共占字节数、还可建立多少变量等。两命令的不同点在于:当显示内容超过LIKE<通配符>:选用本子句后,命令只显示变量名与通配符相匹配的内存变量和数组。
3) 清除变量命令 ① 清除部分或全部变量命令——RELEASE。 此命令可分为4种格式。 格式1:RELEASE <变量名表> 此格式的RELEASE命令将从内存中清除掉<变量名表>中所列的全部内存变量和数组。
格式2:RELEASE ALL 采用此格式,RELEASE命令将从内存中清除所有内存变量和数组。 格式3:RELEASE ALL LIKE<通配符> 此格式把内存中所有变量名与通配符相匹配的内存变量和数组都清除掉。(不匹配的保留。) 格式4:RELEASE ALL EXCEPT<通配符> 此格式把内存中所有变量名与通配符不匹配的内存变量和数组都清除掉。(匹配的保留。)通配符是指“?”和“*”。其中,问号“?”代表任何单个字符,星号“*”代表任何一个字符串。
例 清除内存中全部内存变量和数组。 RELEASE ALL 例 清除变量名中第二个字符为A,第三个字符为C的所有内存变量和数组。 RELEASE ALL LIKE ?AC * 例 清除变量名的第三个字符不为B的所有内存变量和数组。 RELEASE ALL EXCEPT ??B *
② 清除全部变量命令——CLEAR MEMORY。 该命令的功能与RELEASE ALL命令完全相同,清除掉内存中全部内存变量和数组 3.1.3数组 数组是一种特殊的内存变量。在VFP中,用户可以使用数组,但首先应定义数组。 1) 定义数组命令——DIMENSION 命令格式:DIMENSION/DECLARE < 数组名1> (<数值表达式1> [,<数值表达式2 >]) [,< 数组名2> (<数值表达式1> [,<数值表达式2 >])…] 本命令可以定义若干个一维、二维数组。 例 DIMENSION X(4),Y(2,3)
执行该命令后,将建立两个数组X 和 Y。数组X由1列4行组成,共4个单元;数组Y由2行3列组成,共6个单元。 此命令执行后,所建数组的所有单元都赋了一个逻辑型的初值 .F.,但以后可以给各单元赋不同类型的值。 2) 使用数组——下标变量 尽管一个数组是一个变量(数组变量),但它的每一个单元都可像一个一般变量那样被使用。数组单元是以下标来区分的,也称为下标变量。下标的起始值为1。 例如,在上面的例子中,数组X有4个下标:X(1),X(2),X(3),X(4);数组Y有6个下标:Y(1,1),Y(1,2),Y(1,3),Y(2,1),Y(2,2),Y(2,3)。
例 依次执行以下命令序列: DIMENSION X(2,3) STORE "BOY" TO X(1,2) STORE "GIRL" TO X(2,3) X(1,1)=300 STORE CTOD("12/31/88") TO X(1,3) X(2,1)=.T. DISPLAY MEMORY LIKE X 执行结果为:
X Pub A ( 1, 1) N 300 ( 1, 2) C "BOY" ( 1, 3) D 12/31/88 ( 2, 1) L .T. ( 2, 2) L .F. ( 2, 3) C "GIRL" 总结:(1) 一个数组只算作一个内存变量,但每个单元都可像一个内存变量一样使用,因此,称为下标变量。
(2) 数组必须先定义,后使用。定义时,各下标变量都是逻辑型 .F.,但以后可存入其它类型的值。 (3) 每个字符型下标变量需占内存数为该字符变量的字符个数加7,其它类型的下标变量不增加额外的内存空间。 (4) 二维下标变量可用单下标方式访问。如,二维数组X(2, 3) 中,各下标变量的存储顺序为(1,1),(1,2),(1,3),(2,1),(2,2),(2,3)。因此,下标变量X(2, 1)可用X(4)调用。为清晰起见,用单下标访问二维数组时,单下标称为序号。 (5) 定义数组时,也可用方括号。方括号与圆括号完全等价。 例如,DIMENSION AA[2,4]与DIMENSION AA(2,4)是等价的。
(6) 可以用DIMENSION命令重新定义一个已经存在的数组,以改变它的维数和大小。重新定义后,只要下标变量个数增加了,则原数组的各下标变量值将依次拷贝到新数组的下标变量中,多出来的下标变量值为 .F.;相反,若下标变量个数减少了,被减少的下标变量及其内容将被删掉。
3.2 基本函数 VFP提供了许多函数,本节只介绍一些基本函数,其它见本教材附录二。 1.算术运算函数 1) ABS——绝对值函数 格式:ABS(<数值表达式>) ABS函数给出<数值表达式>值的绝对值
2) INT——取整函数 格式:INT(<数值表达式>) INT函数返回<数值表达式>的整数部分。 例?INT(12.4) &&得12 ?INT(–12.5) &&得 –12 3 ) MAX——最大值函数 格式:MAX(<表达式清单>)
(<表达式清单>)由相同类型的数值型、货币型、日期型、日期时间型、字符型表达式组成。当它是数值型或货币型时,函数返回最大的一个表达式值;当它是日期型时,返回最后面的日期;当它是日期时间型时,返回最后面的日期和时间;当它是字符型时,返回ASCII码值最大的那个表达式。(<表达式清单>)由相同类型的数值型、货币型、日期型、日期时间型、字符型表达式组成。当它是数值型或货币型时,函数返回最大的一个表达式值;当它是日期型时,返回最后面的日期;当它是日期时间型时,返回最后面的日期和时间;当它是字符型时,返回ASCII码值最大的那个表达式。 例 ?MAX(5,8,7) &&得8 ?MAX({^1994-12-12},{^1993-12-15}) &&得12/12/94 ?MAX("ABCD","abcd") &&ABCD ?MAX({^1994-12-10,01:00:00},{^1993-12-20,10:10:10}) &&得12/10/94 1:00:00 AM
4) MIN——最小值函数 格式:MIN (<表达式清单>) (<表达式清单>)由相同类型的数值型、货币型、日期型、日期时间型、字符型表达式组成。当它是数值型或货币型时,函数返回其中最小值;当它是日期型时,返回最前面的日期;当它是日期时间型时,返回最前面的日期和时间;当它是字符型时,返回ASCII码值最小的字符串。 例?MIN(5,8,7) &&得5
?MIN({^1994-12-12},{^1993-12-15}) &&得12/15/93 思考:任给三个数a、b、c,怎样返回中间数?
5) MOD——求模(余数)函数 格式:MOD(<数值表达式1>, <数值表达式2>) <数值表达式1>是被除数, <数值表达式2>是除数,函数返回相除的余数。本函数与%运算符等价。 <数值表达式1>的小数位数决定了结果的小数位数。<数值表达式2>与结果同号。 例 ?MOD(36,10) &&6 ?MOD(25,–2.0) &&–1 ?MOD(25.0,2) &&1.0
6) PI——函数返回圆周率p的值(3.141 592) 例?PI( ) &&3.14 ?PI( ) *2.30**2 &&16.619 0 7) RAND——随机数函数 格式:RAND([<数值表达式>]) 该函数返回一个0~1之间的随机数。 在第一次使用此函数时,选择一个负值的<数值表达式>,以后使用本函数时即使不选用选择项也能得到真正的随机数。
若第一次使用时缺省项选择,则默认为100001。并可在任何时刻使用RAND(100001)恢复缺省状态。若第一次使用时缺省项选择,则默认为100001。并可在任何时刻使用RAND(100001)恢复缺省状态。 8 )ROUND——四舍五入函数 格式:ROUND(<数值表达式1>,<数值表达式2>) <数值表达式1>是被四舍五入者,<数值表达式2>决定四舍五入的位数。当<数值表达式2>为负数时,其绝对值为整数部分四舍五入的位数;为正数时,其值是小数部分保留的位数。
例 ?ROUND(25.71543,2) &&25.72 ?ROUND(25.71543,–1) &&30
9) SIGN——符号函数 格式:SIGN(<数值表达式>) 根据<数值表达式>值为正、为负、为零,函数分别返回1、–1、0。 10) SQRT——平方根函数 格式:SQRT(<数值表达式>) 函数返回<数值表达式>值的平方根。<数值表达式>值必须是非负的。 例 ?SQRT(10) &&3.16
2.字符运算函数 1) &——宏代换函数 格式: &<字符型内存变量>. 此函数值为函数中字符型内存变量的值。 例 name="胡一民" ? "你好!&name" &&输出:你好!胡一民 ? “你好!&name.同志” &&输出:你好!胡一民同志 这里,用“.”作为内存变量的结束符。如果&后不跟有效内存变量名,&只是一字符。
2) AT——子串寻找函数 格式:AT(<字符串表达式1>,<字符串表达式2>) 当第一项是第二项(也可是备注型字段)的子串时,AT( )返回第一项在第二项中第一次出现的开始位置数;否则,返回零。 例 ?AT("IS", "This IS a boy") && 6 3) LEN——字符串长度函数 格式:LEN(<字符串表达式>) 本函数返回<字符串表达式>值的长度。 例 ?LEN("FOXPRO") && 6
4) LOWER——变小写函数 格式:LOWER (<字符串表达式>) 本函数把<字符串表达式>值中所有大写英文字母都变成小写输出。 例 ?LOWER("WE") && we 5) UPPER——变大写函数 格式:UPPER(<字符表达式>) 函数返回全部由大写字母表示的<字符表达式>的值。
6) LTRIM——删除头部空格函数 格式:LTRIM (<字符串表达式>) 本函数返回已删除头部空格的<字符串表达式>值。 7) TRIM——去尾部空格函数 格式:TRIM(<字符表达式>) 函数返回已移去尾部空格的<字符串表达式>值。 8) SPACE——空格函数 格式:SPACE (<数值表达式>) 本函数返回一个完全由空格组成的字符串。空格数由<数值表达式>决定。 例 STORE SPACE(15) TO X ?LEN(X) && 15
9) LEFT——左子串函数 格式:LEFT (<字符串表达式>,<数值表达式>) 第一项给出源字符串,第二项给出字符个数。本函数返回从第一项最左字符开始,指定(字符)个数组成的子串。若第二项值大于第一项的字符个数,则返回整个第一项值;若第二项值不大于零,则返回空串。 例?LEFT("FOXPRO", 2) && FO 10) RIGHT——尾子串函数 格式:RIGHT (<字符串表达式>,<数值表达式>) 函数从<字符串表达式>尾部取一子串,子串长度由<数值表达式>决定。 例 ?RIGHT("FOXPRO", 2) && RO
11) SUBSTR——子串函数 格式:SUBSTR (<字符串表达式>,<数值表达式1>[,<数值表达式2>]) 函数从<字符表达式>中取出一子串,<数值表达式1>规定了子串的开始位置,<数值表达式2>规定了子串的长度。当<数值表达式1>的值大于<字符串表达式>的值时,得一空串;当<数值表达式2>的值大于子串起始位置到结尾宽度时,省略此项并取到字符串结束止。 例 SUBSTR("FOXPRO", 2, 3) &&得OXP
3.日期和时间函数 1) DATE——系统日期函数 格式:DATE() 给出系统日期,格式为月/日/年,其中,月、日、年都是两位数。 2) DATETIME——系统日期时间函数
格式:DATETIME( ) 给出系统当前的日期和时间。 例 ?DATETIME( ) &&11/24/00 12:07:51 PM 3) MONTH——月份函数 格式:MONTH(<日期型表达式>) 给出代表月份的数字。
4) DAY——日期函数 格式:DAY(<日期型表达式>)给出一个数值,代表日期号。 5) YEAR——年函数 格式:YEAR(<日期型表达式>)以一个4位数给出表达式的年份。
4.转换函数 1) ASC——求ASCII码函数 格式:ASC(<字符串表达式>) 返回<字符串表达式>值首字符的ASCII码值。 2) CHR——求字符函数 格式:CHR(<数值表达式>) 返回以<数值表达式>值为ASCII码的字符。
3) CTOD——字符型转换成日期型函数 格式:CTOD(<字符表达式>) <字符表达式>值必须是一个日期形式的字符串,对应日期为1/1/100~12/31/9999,函数返回日期型数据。 例 X=CTOD("10/25/86") ? X+10 &&11/04/86 4) DTOC——日期型转换成字符型函数 格式:DTOC(<日期表达式>[,1]) 返回与<日期表达式>相应的字符串,无选择项时,为××/××/××; 有选择项时,返回形式为×××××××,前4位为年,最后两位为日,其余两位为月。
例 STORE CTOD("10/31/92") TO X ?DTOC(X) &&10/31/92 ?DTOC(X,1) &&19921031 5) STR——数字型转换成字符型函数 格式:STR(<数值表达式1>[,<数值表达式2>[,<数值表达式3>]]) 把<数值表达式1>的值转换成字符型数据。<数值表达式2>决定返回字符串长度;<数值表达式3>决定小数部分的输出位数。 若第二项不足以表达该数的整数部分,结果将输出一串“*”,表示溢出。 例 ?STR(3.1416,6,4) &&得3.1416
6)VAL——字符型转换成数值型函数 格式:VAL(<字符串表达式>) 返回与<字符串表达式>值中数字相对应的数值型数。 VAL函数在字符串中从左到右处理数字,一旦遇到一个非数字字符(前导空格除外)则停止,若字符串中第一个字符不是数字,则返回零。 例 ?VAL("12")+VAL("13") && 得25
3.3 表达式 任何一个字段变量、内存变量、常量或函数都是表达式,用操作符把表达式正确地连接起来的式子也是表达式。表达式值的类型称为表达式的类型。表达式的类型与所含变量的类型有关,但还与所进行的操作有关。变量的类型不同,所能进行的操作也不同。 VFP提供数值型、关系型、逻辑型和字符型等4类运算。 1.数值型运算 这类运算共有以下7种操作: (1)加法:+(单目运算时为“正”号) (2)乘法:*
(3)减法:–(单目运算时为“负”号) (4)除法:/ (5)指数:** 或 ^ 3**(1/3) (6)括号:() (7)取模(余数):% 格式:<数值表达式1> % <数值表达式2> 其中,<数值表达式1>为被除数,<数值表达式2>为除数。此操作结果为两数相除的余数。被除数的小数位数决定了结果中的小数位数。除数值为正,结果为正;除数值为负,结果值为负。除数不能为零。
数值型运算符的运算顺序为:① 括号;② 单目运算;③ 指数运算;④ 乘除取模运算;⑤ 加减运算。 2.关系型运算 关系型运算有以下6种操作: (1)小于:< (2)不等于:< >(也可用 # 或 !=) (3)大于:> (4)大于等于:>= (5)等于:= (6)字符串精确等于:= = (7)小于等于:<=
关系型运算只能在数值型数据之间、字符型数据之间、日期型数据之间或日期时间型数据之间进行:数值型数据按其值的大小比较;字符型数据按其ASCII码值的大小比较;汉字按其拼音(一级字库)或部首(二级字库)比较;对于日期型或日期时间型数据,日期(时间)在前的为小,日期(时间)在后的为大。关系运算的结果是逻辑值:“真”(.T.)或“假”(.F.)。关系型运算只能在数值型数据之间、字符型数据之间、日期型数据之间或日期时间型数据之间进行:数值型数据按其值的大小比较;字符型数据按其ASCII码值的大小比较;汉字按其拼音(一级字库)或部首(二级字库)比较;对于日期型或日期时间型数据,日期(时间)在前的为小,日期(时间)在后的为大。关系运算的结果是逻辑值:“真”(.T.)或“假”(.F.)。 3.逻辑型运算 逻辑型运算共有以下4种操作,结果是逻辑值: (1)逻辑与:.AND. (2)逻辑非:.NOT. (3)逻辑或:.OR. (4)括号:( )
令A、B是两个逻辑型数据,则前三种逻辑运算符的功能见表3–1所示。令A、B是两个逻辑型数据,则前三种逻辑运算符的功能见表3–1所示。 逻辑型运算的运算结果是逻辑型。其运算顺序为:① 括号;② 非运算;③ 与运算;④ 或运算。