670 likes | 780 Views
第 3 章 数据、函数与表达式. 常量. 其值不发生变化的量,分为四种类型: 1)数值型(N):直接由数字或+、-、小数点构成。 2)字符型(C):由字符、汉字组成,需加定界符。如’沈阳’、”沈阳”、[沈阳],同一定界符不能嵌套,如:“ AB ”CD” ”, 但 ‘AB ”CD” ’ 是合法的。 3)日期型(D):用{}定界。 如{00-08-30} 或CTOD(“01/08/30”) 4)逻辑型(L):用.定界。如 .t.、.f.,.Y.,.N.等
E N D
常量 其值不发生变化的量,分为四种类型: 1)数值型(N):直接由数字或+、-、小数点构成。 2)字符型(C):由字符、汉字组成,需加定界符。如’沈阳’、”沈阳”、[沈阳],同一定界符不能嵌套,如:“ AB ”CD” ”,但 ‘AB ”CD” ’是合法的。 3)日期型(D):用{}定界。 如{00-08-30} 或CTOD(“01/08/30”) 4)逻辑型(L):用.定界。如 .t.、.f.,.Y.,.N.等 说明:请注意C、D、L型常量的定界符。注意区分”2010”为字符型常量,而不是数值型常量。逻辑型常量必须用“.”定界。注意各类型数据的宽度。
变量 变量: • 程序运行中,值可能会发生变化的量 • 变量是内存中的一个存储单元的位置 • 变量名是存储位置的符号标识 • 存储位置中存放的数据在程序操作期间通过该名称来读写
变量分类: 1)字段名变量 • 数据表中已定义的数据项 • 每一个字段可有不同的取值 • 表有一个记录指针,它指向的记录定义为当前记录,字段名变量现值,就是当前记录中对应字段值。 • 记录指针是可以移动的,因此,字段名的取值随着指针的移动而改变,所以它是变量 2)内存变量:独立于数据库之外的
变量的创建 • 赋值格式: • Store 表达式 to 变量 • 变量 = 表达式 • 在赋值的同时,完成了变量的创建STORE 3 TO nVar nVar = 3
访问变量 • 如字段变量和内存变量同名: • 则字段变量具有更高的优先权 • 此时内存变量访问 • M.内存变量 • M->内存变量
字段名变量 • 数据表中已定义的数据项 • 每一个字段可有不同的取值 • 表有一个记录指针,它指向的记录定义为当前记录,字段名变量的现值,就是当前记录中对应字段的值。 • 记录指针是可以移动的,因此,字段名的取值随着指针的移动而改变,所以它是变量 • 当前记录:记录指针指向的记录 • **表刚打开,当前记录是第一条记录 • 移动记录指针: • GO TOP|BOTTOM|[<数值表达式>]:绝对移动记录指针。 • SKIP [<数值表达式>]:相对移动记录指针
编号 姓名 • 101 张三 • 102 王一 • 103 刘六 • 104 李四 • 105 赵七 • 朱八 2 表一 移动记录指针实例 • Go 1 • Skip 2 • ? 编号 • skip • Go bottom • ? 编号 • Skip –1 • ? 编号
内存变量 • 变量名: • 是以汉字、字母、数字或下划线组成的字符串,串长最多为10个字符或5个汉字 • 变量名必须以字母或汉字开头,下划线必须嵌在变量名中间,但不能嵌入空格符 • 内存变量分为四种类型: • 数值型、字符型、逻辑型和日期型 • 变量赋值格式: • 〈内存变量〉=〈表达式〉 • STORE 〈表达式〉to <内存变量表〉 功能:把〈表达式〉的值送到内存变量中
数组: • 名字相同、用下标区分的内存变量称为数组 • 主要有以下特点: (1)数组元素的类型,由所赋的值来决定 (2)数组和数据表之间可相互转换 即数据表中数据可以转换为数组数据 数组数据也可以转换为数据表中的数据
1.定义数组 • 数组名的取法和一般的变量名取法相同 • 定义数组命令: DIMENSION <数组名>(<数值表达式1>[,<数值表达式2>]) [,<数组名>(<数值表达式1>…] • 命令功能:定义一个或多个内存变量数组。 • 说明: • 最多可有3600个元素,显示内存时只算一个变量 • 数组下标起始值是1 • 数组元素隐含的逻辑值为“假” **二维数组,可用一维下标来存取。这是由于在内存中,二维数组元素是按行列次序排列 • 它们每个元素都可看作单独一个内存变量使用,
DIMENSION A(2,3) ? A4 ? A(2,1) ? A6 ? A(2,3) A(1,1) A(1,2) A(1,3) 12 3 A(2,1) A(2,2) A(2,3) 4 5 6 数组实例
变量: • 专用 • 在程序中用DIMENSION建立的数组为专用 • 公用 • 命令窗口下建立的数组为公用 • 在程序中建立公用的数组用PUBLIC命令 • 格式为: PUBLIC〈数组名〉(<N表达式1>,[<N表达式2>]) • 例如: DIMENSIOM A(4),B(2,3) • 建立一维数组A和二维数组B • 二维数组有六个元素: • 分别为 B(1,1)、B(1,2)、B(1,3) B(2,1)、B(2,2)、B(2,3)
数组的赋值 • 格式: • STORE 〈表达式〉 TO 〈数组名〉 〈数组名〉=〈表达式〉 • 命令功能: • 将表达式的值赋给数组变量 • 上述两个命令是完全等价的
表达式 • 表达式: • 是由常数、变量、函数和运算符组成的一个有物理意义的式子 • 表达式总有一定的运算结果,即有一个值,所以表达式也是一种数据 • 表达式分为(表达式结果): • 数值表达式 • 字符表达式 • 关系表达式 • 逻辑表达式
表达式的输出命令: • 格式: ?[[?]<表达式>,[<表达式>]] • 功能: 计算表达式的值,并在屏幕或打印机上输出 • 例如: ? 4*6+10 34
1.数值表达式 • 数值表达式: • 是由算术运算符和数值型常数、变量、函数组成。 • 运算结果为数值型数据。 • 算术运算符为:+ - * / ^ ( ) • 优先次序: • 括号、函数、乘方、乘除和加减,同级运算从左到右依次进行 • 如: • 3+6/2-EXP(8) LOG(20) 2^5
2.字符表达式 • 字符表达式: • 是由字符运算符和字符型常数(即用定界符括起来的字符串)、变量、函数组成 • 运算结果是字符型数据 • 三种字符串运算: *完全连接运算 • 格式:"〈字符串1〉"+"〈字符串2〉" • 功能:将两个字符串连接为一个字符串。 • 例如: ? "THIS IS "+"A PEN" THIS IS A PEN *完全连接是指两个字符串合并,即包括空格在内的字符串中所有字符相加。
不完全连接运算 • 格式:"〈字符串1〉"-"〈字符串2〉" • 功能: • 也是将两个字符串连接为一个字符串,但是删去字符串1尾部的空格符 • 例如: • ? “首都∶***"-"北京" • 首都:北京*** • 注:串1尾部的空格移到串1后
包含运算 • 格式: • 〈串1〉$〈串2〉 • 功能: • 如串1包含在串2中,表达式的值为真,否则为假 • 例如: • "AB"$"ACBTE"结果为假(.F.) • "AB"$"ABCDE"结果为真(.T.) • 注: • 包含运算是字符串的关系运算 • 关系运算返回的是逻辑值
3.关系表达式 • 关系表达式: • 是由关系运算符与字符表达式或数值表达式组成 • 结果是一个逻辑值 • 关系成立结果取真(.T.),不成立结果取假(.F.) • 关系运算符两边的数据类型要一致,(同类型) • 关系运算符有6种: <=,<,=, >=,>, <>、#或!= • 注: • 字符的比较是ASCII码值的大小 • 空格<0-9<A-Z<a-z • 例: • ? 123>100 • ? "CH"<"CA"
表达式例: 1)算术表达式:结果为数值型。如 3+2 2)字符表达式:结果为字符型 如 ’Good ’+’Morning’ 或’Good ’-’Morning’ 3)日期表达式:结果为日期或数值。如 DATE()+5 、DATE()-5 或 DATE()-{00-08-20} 4)关系表达式:结果为逻辑型。如 ”AB”$”ABCD”、”AB”<”BC” 5)逻辑表达式:结果为逻辑型。如 3>2 .AND. .NOT.5>6
说明: ▲在日期型表达式中,两个日期表达式相减,结果为数值,表示两日期之间相差的天数,两日期表达式相加,属非法表达式;一个日期表达式与一个数值表达式相加,结果为日期型表达式,表示从当前日期往后数N天;一个日期表达式与一数值表达式相减,表示从当前日期向前数N天。 ▲逻辑表达式包含关系表达式,关系表达式中包含算术表达式。注意,关系表达式与逻辑表达式的结果都为逻辑型。
常用函数 • 函数是用程序来实现的一种数据运算或转换。每一个函数都有特定的数据运算或转换功能,它往往需要若干个自变量,即运算对象,但只能有一个运算结果,称为函数值或返回值。函数可以用函数名和一对圆括号加以调用,自变量放在圆括号里,如LEN(x)。函数调用可以出现在表达式里,表达式将函数的返回值作为自己运算的对象。函数调用也可作为一条命令使用,但此时系统忽略函数的返回值。本章将常用函数分为数值函数、字符处理函数、日期类函数、数据类型转换函数、测试函数5类,通过举例分别介绍。
数值函数 • 数值函数是指函数值为数值的一类函数,它们的自变量和返回值往往都是数值型数据。 1.绝对值函数 • 格式:ABS(〈数值表达式〉) • 功能:返回指定的数值表达式的绝对值。 • 例如: ? ABS(10),ABS(-5) 10 5
数值函数 2.符号函数 • 格式:SIGN(〈数值表达式〉) • 功能:返回指定数值表达式的符号。当表达式的运算结果为正、负和零时,函数值分别为1、-1和0。 • 例如: ? SIGN(-10),SIGN(0),SIGN(5) -1 0 1
数值函数 3.求平方根函数 • 格式:SQRT(〈数值表达式〉) • 功能:返回指定表达式的平方根。自变量表达式的值不能为负。 • 例如: ? SQRT(4) 2
数值函数 4.圆周率函数 • 格式:PI() • 功能:返回圆周率π(数值型)。该函数没有自变量。
数值函数 5.求整数函数 • 格式与功能: INT(〈数值表达式〉) 返回指定数值表达式的整数部分 CEILING(〈数值表达式〉) 返回大于或等于指定数值表达式的最小整数 FLOOR(〈数值表达式〉) 返回小于或等于指定数值表达式的最大整数 例如: X=5.8 ? INT(X);INT(-X);CEILING(X);CEILING(-X);FLOOR(X);FLOOR(-X) 5 -5 6 -5 5 -6
数值函数 6.四舍五入函数 • 格式:ROUND(〈数值表达式1〉,〈数值表达式2〉) • 功能:返回指定表达式在指定位置四舍五入后的结果。 • 说明:〈数值表达式2〉指明四舍五入的位置。若〈数值表达式2〉大于等于0,那么它表示的是要保留的小数位数:若〈数值表达式2〉小于0,那么它表示的是整数部分的舍入位数。 • 例如: X=645.345 ? ROUND(X,2) ROUND(X,1),ROUND(X,0),ROUND(X,-1) 645.35 645.3 645 650
数值函数 8.求最大值和最小值函数 • 格式: MAX(〈数式1〉,〈数式2〉,[,〈数式3〉…] MIN(〈数式1〉,〈数式2〉,[,〈数式3〉…] • 功能: MAX( ) 计算各自变量表达式值,并返回其中的最大值。 MIN( ) 计算各自变量表达式值,并返回其中的最小值。 • 说明:自变量表达式的类型可以是数值型、字符型、货币型、双精度型、浮点型、日期型和日期时间型,但所有表达式的类型必须相同。 • 例如: ? MAX(8,100),MAX(‘8’,‘100’) 100 8
字符函数 • 字符函数是指自变量一般是字符型数据的函数。 1.求字符串长度函数 • 格式:LEN(〈字符表达式〉) • 功能:返回指定字符表达式值的长度,即所包含的字符个数。函数值为数值型。 • 例如: X="book“ ? LEN(X) 4
字符函数 2.空格字符串生成函数 • 格式:SPACE(〈数值表达式〉) • 功能:返回由指定数目的空格组成的字符串。 3.删除前后空格函数 TRIM(〈字符表达式〉) 返回指定字符表达式值去掉尾部空格后形成的字符串 LTRIM(〈字符表达式〉) 返回指定字符表达式值去掉前导空格后形成的字符串 ALLTRIM(〈字符表达式〉) 返回指定字符表达式值去掉前导和尾部空格后形成的字符串 例如: STORE SPACE(1)+"VFP"+SPACE(3) TO X ? TRIM(X) +LTRIM(X)+ALLTRIM(X) VFPVFP VFP ? LEN(X),LEN(TRIM(X)),LEN(LTRIM(X)),LEN(ALLTRIM(X)) 7 4 6 3
字符函数 4.取子串函数 格式与功能: LEFT(〈字符表达式〉,〈长度〉) 从指定表达式值的左端取一个指定长度的子串作为函数值 RIGHT(〈字符表达式〉,〈长度〉) 从指定表达式值的右端取一个指定长度的子串作为函数值 SUBSTR(〈字符表达式〉,〈起始位置〉[,〈长度〉]) 从指定表达式的值起始位置取指定长度的子串作为函数值 说明:在SUBSTR()函数中,若缺省第三个自变量〈长度〉,则函数从指定位置一直取到最后一个字符。 例如: STORE "GOOD BYE!" TO X ? LEFT(X,2),SUBSTR(X,6,2)+SUBSTR(X,6),RIGHT(X,3) GO BYBYE! YE!
字符函数 11.字符串匹配函数 • 格式:LIKE(〈字符表达式1〉,〈字符表达式2〉) • 功能:比较两个字符串对应位置上的字符,若所有对应字符都相匹配,则函数返回逻辑真(.T.),否则返回逻辑假(.F.)。 • 说明:〈字符表达式1〉中可以包含通配符*和?。*可与任何数目字符相匹配,?可以与任何单个字符相匹配。 • 例如: STORE "abc" TO X STORE "abcd" TO y ?LIKE("ab*",x),LIKE("ab*",y),LIKE(x,y),LIKE("?b?",x),LIKE("Abc",x) .T. .T. .F. .T. .F.
日期和时间函数 日期和时间函数的自变量一般是日期型数据或日期时间型数据。 1.系统日期和时间函数 • 格式与功能: DATE( ) 返回当前系统日期,函数值为日期型。 TIME( ) 以24小时制、hh:mm:ss格式返回当前系统时间,函数值为字符型。 DATETIME( ) 返回当前系统日期时间,函数值为日期时间型。 • 例如: ? DATE(),TIME(),DATETIME() 08/25/03 16:59:05 08/25/03 04:59:05PM
日期和时间函数 2.求年份、月份和天数函数 格式与功能: YEAR(〈日期表达式〉|〈日期时间表达式〉) 从指定的日期表达式或日期时间表达式中返回年份 MONTH(〈日期表达式〉|〈日期时间表达式〉) 从指定的日期表达式或日期时间表达式中返回月份 DAY(〈日期表达式〉|〈日期时间表达式〉) 从指定的日期或日期时间表达式中返回月里面的天数 说明:这三个函数的返回值都为数值型。 例如: STORE {^2001-08-25} TO d ? YEAR(d),MONTH(d),DAY(d) 2003 8 25
日期和时间函数 3.时、分和秒函数 • 格式与功能: HOUR(〈日期时间表达式〉) 从指定的日期时间表达式中返回小时部分(24小时制) MINUTE(〈日期时间表达式〉) 从指定的日期时间表达式中返回分种部分 SEC(〈日期时间表达式〉) 从指定的日期时间表达式中返回秒数部分 • 说明:这三个函数的返回值都为数值型。 • 例如: STORE {^2003-08-25 04:20:40 P} TO t ? HOUR(t),MINUTE(t),SEC(t) 16 20 40
数据类型转换函数 • 数据类型转换函数的功能是将某一种类型的数据转换成另一种类型的数据。 1.数值转换成字符串 • 格式:STR(〈数式〉[ ,〈长度〉[,〈小数位数〉]]) • 功能:将〈数值表达式〉的值转换成字符串,转换时根据需要自动进行四舍五入。 • 说明: (1) 返回字符串的理想长度L应该是〈数式〉值的整数部分位数加上〈小数位数〉值,再加上1位小数点 (2)如果〈长度〉值大于L,则字符串加前导空格以满足规定的〈长度〉要求; (3)如果〈长度〉值大于等于〈数式〉值的整数部分位数(包括负号)但又小于L,则优先满足整数部分而自动调整小数位数;
数据类型转换函数 (4)如果〈长度〉值小于〈数值表达式〉值的整数部分位数,则返回一串星号(*)。 (5)〈小数位数〉的默认值为0,〈长度〉的默认值为10。 • 例如: STORE -834.456 TO X ? "X="+STR(X,8,3) X=-834.456 ? STR(X,9,2),STR(X,6,2),STR(X,3),STR(X,6),STR(X) -834.46 -834.5 *** -834 -834
数据类型转换函数 2.字符串转换成数值 • 格式:VAL(〈字符表达式〉) • 功能:将由数字符号(包括正负号、小数点)组成的字符型数据转换成相应的数值型数据。 • 说明: (1)若字符串内出现非数字字符,那么只转换前面部分; (2)若字符串的首字符不是数字符号,则返回数值零,但忽略前导空格。 • 例如:
数据类型转换函数 STORE '-6789'TO x STORE '.23' TO y STORE 'A42'TO z ? VAL(x),VAL(x+y),VAL(x+z),VAL(z+y) -6789 -6789.23 -6789.00 0.00
数据类型转换函数 3.字符串转换成日期或日期时间 • 格式与功能: CTOD(〈字符式〉) 将〈字符式〉值转换成日期型数据 CTOT(〈字符表达式〉) 将〈字符式〉值转换成日期时间型数据 • 说明:字符串中的日期部分格式要与SET DATE TO 命令设置的格式一致。其中的年份可以用四位,也可以用两位。如果用两位,则世纪由SET CENTURY TO 语句指定。 • 例如:
SET DATE TO YMD SET CENTURY ON SET CENTURY TO 19 ROLLOVER 51 d1=CTOD('2003/07/25') ? d1,CTOD('50/01/01'),CTOD('51/01/01') 2003/07/25 2050/01/01 1951/01/01 这里,SET CENTURY TO语句指定:小于51的两位数年份属于21世纪(19+1),而大于等于51的两位数年份属于20世纪(19)。
数据类型转换函数 4.日期或日期时间转换成字符串 • 格式与功能 DTOC(〈日期表达式〉|〈日期时间表达式〉[,1]) 将日期型数据或日期时间数据的日期部分转换成字符串 TTOC(〈日期时间表达式〉[,1]) 将日期时间数据转换成字符串。 • 说明: (1)字符串中日期部分的格式与SET DATE TO语句的设置和SET CENTURY ON|OFF(ON 为四位年份,OFF为两位数年份)语句的设置有关。 (2)时间部分的格式与SET HOURS TO 12|24语句的设置有关。 (3)DTOC()函数,如果使用选项1,则字符串的格式总是YYYYMMDD,共8个字符。对TTOC()来说,如果使用选项1,则字符串的格式总是为YYYYMMDDHHMMSS,采用24小时制,共14个字符
数据类型转换函数 • 例如: STORE DATETIME() TO t ? t 08/25/03 10:54:49 PM ? DTOC(t),DTOC(t,1),TTOC(t),TTOC(t,1) 08/25/03 20030825 08/25/03 19:54:49PM 20030825225449
数据类型转换函数 5.宏替换函数 • 格式:&〈字符型变量〉[.] • 功能:替换出字符型变量的内容,即&的值是变量中的字符串。 • 说明:如果该函数与其后的字符无明确分界,则要用“.”作函数结束标识。宏替换可以嵌套使用。 • 例如: STORE "ZGDA" TO X USE & X &&相当于USE ZGDA XM="姓名" ? &XM +"你好!" &&相当于? 姓名+"你好!" 张黎黎你好! &&字段变量姓名的值是张黎黎 SKIP &&转到下条记录 ? XM,& XM &&相当于? XM,姓名 姓名 李艳
测试函数 • 在数据处理过程中,有时用户需要了解操作对象的状态。例如,要使用的文件是否存在、数据库的当前记录号、是否到达了文件尾、检索是否成功、某工作区中记录指针所指的当前记录是否有删除标记、数据类型等信息。尤其是在运行应用程序时,常常需要根据测试结果来决定下一步的处理方法或程序走向。 1.空值(NULL值)测试函数 • 格式:ISNULL(〈表达式〉) • 功能:判断一个表达式的运算结果是否为NULL值,若是NULL值返回逻辑真(.T.),否则返回逻辑假(.F.)。 • 例如: STORE .NULL.TO X ? X,ISNULL(X) .NULL. .T.
测试函数 • 2.“空”值测试函数 • 格式:EMPTY(〈表达式〉) • 功能:根据指定表达式的运算结果是否为“空”值,返回逻辑真(.T.)或逻辑假(.F.)。 • 说明: (1)这里所指的“空”值与NULL值是两个不同的概念。函数EMPTY(.NULL.)的返回值为逻辑假(.F.)。 (2)该函数自变量表达式的类型可以是数值型、字符型、逻辑型、日期型等类型。不同类型数据的“空”值,有不同的规定,如表3.6所示。
测试函数 • 表3.6 不同类型数据的“空”值规定 ——————————————————————————————— 数据类型 “空”值 数据类型 “空”值 ——————————————————————————————— 数值型 0 双精度型 0 货币型 0 日期时间 空(如CTOT(")) 浮点型 0 逻辑型 .F. 整型 0 备注字段 空(无内容) 日期型 空(如CTOD(")) 字符型 空串、空格、 制表符、回车、换行 —————————————————————————————————