Download - 本 章 内 容

Transcript
Page 1: 本  章  内  容

本 章 内 容§3.1 Visual FoxPro数据类型

§3.2 数据存储 §3.2.1 常量 §3.2.2 变量 §3.2.3 数组 §3.2.4 字段变量

第三章 数据与数据运算

§3.3 函数 §3.3.1   VFP 函数与分类 §3.3.2  常用系统函数的概念

§3.4 运算符

§3.5 表达式 §§3.5.1  表达式概述 §3.5.2  各类表达式

Page 2: 本  章  内  容

3.1   Visual FoxPro 数据类型 数据概念的内含包括两方面:数据内容和数据形式。数据内容用于描述客观事物的特征,即数据的“值”;数据形式是指数据内容存储于媒体中的形式,即数据的“类型”。 在 Visual FoxPro 中,数据可以存放在常量、变量、数组、字段、记录和对象等数据容器中。 数据类型定义之后,就确定了其存储方式和使用方式。只有相同类型的数据之间才能进行运算,否则就会导致数据类型不匹配的错误。

Page 3: 本  章  内  容

表 3- 1   VFP 数据类型

数据类型 代码 

特                征  占用存储字节数 

字符型  C 表示名字、地址等非数值运算的数据,可以是任意文本(包括字母、汉字、数字、空格和符号等) 

0~254个字符,每一个字符占用 1个字节 

数值型  N 由数字 0~9、符号+、-以及小数点组成的整数或小数 

在内存中占用 8节,在表中占用 1~20个字节 

整型  I  表示 -2147483647~2147483646之间的整数  4个字节 

浮点型  F  与数值型等价,但它以用浮点的形式存储 

在内存中占用 8节,在表中占用 1~20个字节 

双精度型  B  表示更高精度的数值  8个字节 

货币型  Y  表示货币量  8个字节 

日期型  D  表示包含有年、月、日的数据  8个字节 

日期时间型  T  表示包含有年、月、日及时、分、秒的数据  8个字节 

逻辑型  L  “ ” “ ”表示 真 或 假 布尔值  1个字节 

备注型  M  保存较大的文本数据  4个字节 

通用型  G  连接和嵌入 OLE对象  4个字节 

Page 4: 本  章  内  容

说明:( 1 )表 3- 1 未列出二进制字符型和二进制备注型这两种数据类型。( 2 )表的字段可使用全部的数据类型,而常量和内存变量只能使用字符型、数值型、货币型、日期型、日期时间型和逻辑型这 6 种类型的数据。

Page 5: 本  章  内  容

§3.2  数据存储 在 Visual FoxPro 中,数据不但可以存放在常量、变量、数组中,还可以存放在字段、记录和对象中。常量、变量、数组以及字段、记录和对象统称为 Visual FoxPro 数据容器,如下图所示。

常量 字段变量 变量 简单变量VFP数据 内存变量 下标变量(数组元素)

系统函数 函数 自定义函数

Page 6: 本  章  内  容

§3.2.1 常量 常量是指在操作过程中其值保持不变的量。有 N、 Y、 C、 D、 T和 L共 6 种类型。 1 .数值( N )型常量:正负整数或小数。( 1 )普通记数法: 12 ,- 24, 3.1416

( 2 )科学记数法: 5.863E12 && 表示 5.863×1012

3.246E-8 && 表示 3.246×10-8

2 .货币( Y )型常量:用于表示货币值的常量。 货币型常量的前置符为 $ ,小数保留 4 位,超过 4 位小数,则自动四舍五入。 3 .字符( C )型常量:用一对定界符( " ", ' ', [ ] )括起来的字符串。( 1 )半角的定界符要成对匹配使用。( 2 )当字符串本身包含定界符时,要使用其他定界符。如: ["ABC" 'abc']

( 3 )不包含任何字符的字符串( "" )为空串。

Page 7: 本  章  内  容

4 .日期( D )型常量( 1 )传统格式的日期常量 1 )格式: {mm/dd/yy}或 {mm-dd-yy}或 {mm.dd.yy}

2 )说明: ①传统格式日期只能在 SET STRICTDATE TO 0 状态下使用。 ②分隔符“ /” (默认)、“ -” 和“ .” 三者等效。可以使用 SET MARK TO "/"|"-"|"." 命令来指定日期的分隔符。 ③传统格式日期的格式受到 SET 命令影响。 命令格式: SET CENTURY ON|OFF

功能:用于设置年份的位数。若选用 OFF (默认值),则年份用 2位数表示;若选用 ON ,则年份用 4 位数(包含世纪)表示。 命令格式: SET DATE TO AMERICAN|ANSI

功能:设置日期显示的格式。若选用 AMERICAN (默认值),则日期显示的格式为 mm/dd/yy ;若选用 ANSI ,则日期显示的格式为 yy-mm-dd 。

Page 8: 本  章  内  容

( 2 )严格格式的日期常量 1 )格式: {^yyyy-mm-dd}

2 )说明: ①VFP 默认在日期中使用严格格式,这样就可以避免“千年虫”的问题。 ②严格格式日期不受有关日期的 SET 语句的影响。 ③分隔符“ /” (默认)、“ -” 和“ .” 三者等效。 5 .日期时间( T )型常量( 1 )格式: {< 日期 >[,|][hh[:mm[:ss]]][a|p]}

( 2 )说明: 1) < 日期 > 包含传统格式和严格格式两种。 2) [,|] 表示 < 日期 >和 < 时间 > 之间的分隔符可用逗号或空格。 3) VFP 默认使用 12 小时制, a 表示上午, p 表示下午。 日期和时间的格式不但可以用命令设置,还可以使用“选项”对话框设置。

Page 9: 本  章  内  容

6 .逻辑( L )型常量:只有逻辑真和逻辑假两个值。 用户输入时,逻辑真可用 .T. 、 .t. 、 .Y. 和 .y. 中的任意一种;逻辑假可用 .F. 、 .f. 、 .N. 和 .n. 中的任意一种。 VFP 输出时,逻辑真用 .T. ,逻辑假用 . F. 。

小结: 字符( C )型常量的定界符是一对双引号、单引号或方括号;日期( D )型和日期时间( T )型常量的定界符是一对花括号;逻辑( L )型常量的定界符是一对圆点。

Page 10: 本  章  内  容

§3.2.2   变量 1 .变量概述( 1 )变量的意义:计算机中的变量是内存中一个存储区域,变量

名是存储区域的标识名,变量值是存放在该存储区域中的数据。( 2) VFP 的变量分类

字段变量 变量 简单变量 内存变量 下标变量(数组元素)

Page 11: 本  章  内  容

( 3 )确定一个变量需要 3 个要素:变量名、数据类型和变量值。( 4 )字段变量是在创建表文件时定义的变量。字段变量的类型在创建表文件时定义。( 5 )内存变量是独立于表文件之外而保存于内存中的变量。内存变量的类型取决于它所存储的数据的类型。 2 .内存变量( 1 )内存变量的类型( 2 )内存变量的命名 1 )内存变量名用于标识内存变量。内存变量名的构成约定如下:可以由字母、汉字、数字和下划线组成;必须以字母或汉字开头;内存变量名中不能嵌入空格;内存变量名最长为 128 个字符。 2 )在 VFP 中,内存变量名允许与系统保留字(已经用于 VFP命令的关键词和函数名)同名,但尽量不用保留字作为内存变量名。

Page 12: 本  章  内  容

( 3 )内存变量赋值命令格式 1: < 内存变量名 >=< 表达式 >

格式 2: STORE < 表达式 > TO < 内存变量名表 >

功能:将表达式的值存放入内存变量。说明:“ =” 不等同于等号,在这里它是赋值操作符。【例 3- 2】X=200+300 && X, X 为 N 型内存变量职称 =" 工程师 " && “职称”为 C 型内存变量STORE 3,4,5 TO X,Y,Z &&该命令出错,为什么?STORE 3 TO X,Y,Z &&该命令等价于 X=3, Y=3, Z=3三条命令? X &&输出 X 的值为 3 ,内存变量的类型和值取决于最后一次赋值。

Page 13: 本  章  内  容

3 .内存变量常用命令( 1 )显示内存变量格式: LIST|DISPLAY MEMORY [LIKE < 通配符 >] [TO PRINTER|TO FILE < 文件名 >]

功能:显示内存当前的信息 , 包括内存变量的名、作用域、类型和取值。说明: 1 )命令动词表示做什么,必须写在命令的开头;短语又称子句,表示操作的对象及怎么做,其位置可以任意。 2 )使用 LIST ,则连续滚动显示;使用 DISPLAY ,则分屏显示,按任意键后继续显示。 3 )通配符 ? 代表该位置任意一个字符;通配符 * 代表该位置若干个连续字符。 4 )若选用 TO PRINTER ,则由打印机输出显示的内容;若选用 TO FILE < 文件名 > ,则将输出内容写到指定名字的文件;若缺省,则输出到 VFP 的主窗口(屏幕)。

Page 14: 本  章  内  容

( 2 )清除内存变量格式 1: CLEAR MEMORY

功能 1 :清除所有内存变量。格式 2: RELEASE < 内存变量名表 >

功能 2 :清除(释放)指定的内存变量。格式 3: RELEASE ALL [ LIKE < 通配符 > | EXCEPT < 通配符 >]

功能 3 :若选用 LIKE 子句,则清除与通配符相匹配的内存变量;若选用 EXCEPT 子句,则清除与通配符不相匹配的内存变量。

Page 15: 本  章  内  容

§3.2.3   数组 1 .数组的概念( 1 )数组:数组是一种特殊的内存变量,是一组同名下标变量的总称。( 2 )数组元素:组成数组的下标变量。( 3 )数组维数:数组维数决定于数组元素的下标个数,而不是数组元素的个数。( 4 )数组变量名:数组包含若干个下标变量,但只占用一个变量名。

Page 16: 本  章  内  容

2 .数组的定义格式: DIMENSION < 数组名 >( < 下标上限 1> [ , < 下标上限 2> ] )

[ , …]

功能:定义数组。说明:( 1 )一个语句可定义多个不同维数的数组【例 3- 3】

DIMENSION X(5) ,Y(2,3) &&一个语句可定义多个不同维 数的数组? X(5) ,Y(1,2) &&输出数组元素的值 .F. .F. &&数组元素的初值为 .F.

Page 17: 本  章  内  容

( 2 )一切使用简单变量的地方,均可以使用数组元素。或者说数组元素可与简单变量等同使用。

【例 3- 4】CLEAR MEMORY

DIMENSION Y(2,2) &&数组元素为 Y(1,1), Y(1,2),Y(2,1)    和 Y(2,2),其初值皆为 .F.

STORE “XXX” TO X1,Y(1,1) &&等价于X1=“XXX”, Y(1,1)="XXX"

Y(2,1)={^2001-03-23}

X2=$123.23

DISPLAY MEMORY LIKE Y* &&命令执行结果见下页

Page 18: 本  章  内  容

Y Pub(Public 公用 ) A(Array 数组 )

( 1, 1) C "XXX"

( 1, 2) L .F.

( 2, 1) D 03/23/01

( 2, 2) L .F.

XY3={^2001-08-22,11:30p} && X开头的内存变量有:X1, X2, XY3

DISPLAY MEMORY LIKE X*

RELEASE ALL EXCEPT X*

DISPLAY MEMORY LIKE X*

X1 Pub Y 123.2300

X2 Pub C "XXX"

XY3 Pub T 08/22/01 11:30:00PM

Page 19: 本  章  内  容

【例 3- 5】DIMENSION A(3)

A=8 &&等效于 A(1)=8,A(2)=8,A(3)=8

? A(1),A(2),A(3)

8 8 8

( 4 )数组可以与简单变量同名。【例 3- 6】

DIMENSION B(3)

B=8

? B(1), B(2), B(3),B

8 8 8 8

( 5 )在赋值语句中,表达式的位置可以出现数组名。【例 3- 7】

DIMENSION C(2,3)

D=C &&等价于 D=C(1,1),即 D=.F.

? D

.F.

Page 20: 本  章  内  容

§3.2.4   字段变量

1 .字段变量( 1 )字段变量是随着表文件的建立而定义的变量。( 2 )字段变量是多值变量 , 当前记录所对应的值为字段变量的值。( 3 )表文件打开后,字段变量即可用。2 .变量的优先级( 1 )允许内存变量与字段变量同名。( 2 )同名时默认字段变量优先。( 3 )可用“ M-> 变量名”或“ M. 变量名”指定内存变量。

§3.2.4   字段变量

Page 21: 本  章  内  容

【例 3- 9 】假设已经建立了职工简况表 Zgjk.dbf ,查看以下的执行命令执行的结果,体会变量的优先级的含义。USE Zgjk && 打开“ Zgjk.dbf” 表文件LIST && 显示表的全部记录,执行后记录指针指向表的结束标记 EOF

GO 1 && 把记录指针移到第 1 记录? 姓名 && 输出字段变量“姓名”的值李成华姓名 =" 赵小辉“    &&“ 姓名”为内存变量名 , 允许内存变量与字段变量同名? 姓名 && 同名时默认字段变量优先,所以此时“姓名”是字段变量李成华  && 字段变量“姓名”的值为“李成华”? M-> 姓名  && 指定“姓名”为内存变量赵小辉  && 内存变量的值为“赵小辉”? M. 姓名  && 指定“姓名”为内存变量赵小辉  && 内存变量的值为“赵小辉”

Page 22: 本  章  内  容

§3.3  函数

1. VFP 函数的概念( 1) VFP 函数实质是一段具有特定功能的程序,只不过程序代

码对用户是不可见的,用户只需知道函数的功能和用法。( 2) VFP 函数在形式与使用上都与数学函数相似。( 3 )各函数的参数(自变量)必须是特定类型的数据。( 4 )函数有一个返回值(函数值),返回值的类型不一定与参数

的数据类型一致。( 5 )函数的类型取决于返回值的类型。若不注意到这一点,在构

造表达式时,将可能产生数据类型不匹配的错误。

§3.3.1   VFP 函数的概念与分类

Page 23: 本  章  内  容

2. VFP 函数的分类( 1 )按函数提供的方式分类按提供的方式函数可分为:系统函数和自定义函数两大类。( 2 )按数据类型分类按数据类型函数可分为:数值函数、字符函数、日期函数、日期

时间函数、逻辑函数等。( 3 )按函数功能分类按功能函数可分为:转换函数、测试函数、宏替换函数等。

Page 24: 本  章  内  容

1 .数值函数( 1 )取整值函数格式: INT(< 数值表达式 >)

功能:返回数值表达式值的整数部分。【例 3- 10】

X=5.89

? INT(X) , INT(-X)

5 -5

§3.3.2  常用系统函数

Page 25: 本  章  内  容

( 2 )四舍五入函数格式: ROUND(< 数值表达式 1>,< 数值表达式 2>)

功能:返回 < 数值表达式 1> 的四舍五入结果, < 数值表达式 2> 指定要保留的小数位数。

【例 3- 11】X=345.345

? ROUND(X,2), ROUND(X,1), ROUND(X,0), ROUND(X,-1)

345.35 345.3 345 350

Page 26: 本  章  内  容

( 3 )求余数函数格式: MOD(< 数值表达式 1>,< 数值表达式 2>)

功能:返回 < 数值表达式 1> 除以 < 数值表达式 2> 的余数。若被除数与除数同号,则函数值为两数相除的余数;若被除数与除数异号,则函数值为两数相除的余数再加上除数的值。【例 3- 12】

? MOD(10,3), MOD(10,-3), MOD(-10,3), MOD(-10,-3)

1 -2 2 -1

求余数的运算的原理如下图所示。

Page 27: 本  章  内  容

( 4 )求最大值函数格式: MAX(< 数值表达式 1>,< 数值表达式 2>,[< 数值表达式3>…])

功能:计算各表达式的值,返回其中的最大值。【例 3- 13】 ? MAX(345,-3.71,57)

345

( 5 )求最小值函数格式: MIN(< 数值表达式 1 > , < 数值表达式 2 > , [ < 数值表达式 3 > …] )

功能:计算各表达式的值,返回其中的最小值。【例 3- 14】 ? MIN(345,-3.71,57)

- 3.71

Page 28: 本  章  内  容

2 .参数是字符的函数 函数参数(自变量)是字符型,函数返回值的类型不一定是字符型。函数的类型取决于返回值的类型。所以参数是字符型的函数不一定是字符型函数。( 1 )求字符串长度函数格式: LEN(< 字符表达式 >)

功能:返回字符表达式值的长度。说明:该函数是 N 型函数(不是 C 型函数)。【例 3- 15】

? LEN(”Visual Foxpro”)

13

Page 29: 本  章  内  容

( 2 )大小写转换函数格式 1: UPPER(< 字符表达式 >)

格式 2: LOWER(< 字符表达式 >)

功能 1 :将表达式中的字母转为大写。功能 2 :将表达式中的字母转为小写。说明:该函数是 C 型函数。【例 3- 16】

? UPPER("Visual FoxPro") , LOWER("Visual FoxPro")

VISUAL FOXPRO visual foxpro

Page 30: 本  章  内  容

( 3 )生成空格字符串函数格式: SPACE(< 数值表达式 >)

功能:生成空格字符串,长度由数值表达式值决定。说明:该函数是 C 型函数。【例 3- 17】

? " 北京 "+SPACE(4)+"2008 奥运会 "

  北京 2008 奥运会

Page 31: 本  章  内  容

( 4 )删除字符串前后空格函数格式 1: TRIM(< 字符表达式 >)

功能 1 :删除字符表达式值的尾部空格。格式 2: LTRIM(< 字符表达式 >)

功能 2 :删除字符表达式值的前导部空格。格式 3: ALLTRIM(< 字符表达式 >)

功能 3 :删除字符表达式值的前导和尾部空格。说明:该函数是 C 型函数。【例 3- 18】

? LEN(" TEST ")

12

? LEN(TRIM(" TEST "))

8

? LEN(LTRIM(" TEST "))

8

? LEN(ALLTRIM(" TEST "))

4

Page 32: 本  章  内  容

( 5 )取子串函数格式 1: LEFT(< 字符表达式 >,< 长度 >)

功能 1 :从字符表达式值(字符串)的左端开始取出指定长度的子串作为函数值。格式 2: RIGHT(< 字符表达式 >,< 长度 >)

功能 2 :从字符表达式值(字符串)的右端开始取出指定长度的子串作为函数值。格式 3: SUBSTR(< 字符表达式 >,< 起始位置 >,< 长度 >)

功能 3 :从字符表达式值(字符串)的指定位置开始取出指定长度的子串作为函数值。若缺省 < 长度 > ,则 从指定位置开始一直取到最后一个字符。说明:该函数是 C 型函数。【例 3- 19】X="GOOD BYE!" &&注意:空格也是一个字符? LEFT(X,2), RIGHT(X,4), SUBSTR(X,6,2), SUBSTR(X,6)

GO BYE! BY BYE!

Page 33: 本  章  内  容

( 6 )求子串位置函数格式: AT(< 字符表达式 1>,< 字符表达式 2>)

功能:若 < 字符表达式 1>是 < 字符表达式 2> 的子串,则返回< 字符表达式 1> 值的首字符在 < 字符表达式 2> 值中首次出现的位置;若不是子串,则返回 0 。说明:该函数是 N 型函数。【例 3- 20】

? AT("Fox","Visual FoxPro") , AT("fox","Visual FoxPro")

8 0

Page 34: 本  章  内  容

3 .参数是日期和日期时间的函数( 1 )系统日期和时间函数格式 1: DATE( )

功能 1 :返回系统当前日期,为 D 型函数。格式 2: TIME( )

功能 2 :返回系统当前时间,为 C 型函数。格式 3: DATETIME( )

功能 3 :返回系统当前日期时间,为 T 型函数。【例 3- 21】? DATE( ) , TIME( ) , DATETIME( )

10/06/04 20:41:02 10/06/04 08:41:02 PM

Page 35: 本  章  内  容

( 2 )求年份、月份、天数函数格式 1: YEAR(< 日期表达式 >|< 日期时间表达式 >)

功能 1 :从 D 型表达式或 T 型表达式的值中返回年份,为 N 型函数。格式 2:MONTH(< 日期表达式 >|< 日期时间表达式 >)

功能 2 :从 D 型表达式或 T 型表达式的值中返回月份,为 N 型函数。格式 3: DAY(< 日期表达式 >|< 日期时间表达式 >)

功能 3 :从 D 型表达式或 T 型表达式的值中返回日数,为 N 型函数。【例 3- 22】

D=DATE( )

? YEAR(D), MONTH(D), DAY(D)

2004 10 6

Page 36: 本  章  内  容

( 3 )求时、分、秒函数格式 1: HOUR(< 日期时间表达式 >)

功能 1 :从 T 型表达式的值中返回小时,为 N 型函数。格式 2:MINUTE(< 日期时间表达式 >)

功能 2 :从 T 型表达式的值中返回分钟,为 N 型函数。格式 3: SEC(< 日期时间表达式 >)

功能 3 :从 T 型表达式的值中返回秒数,为 N 型函数。【例 3- 23】

T= DATETIME( )

? HOUR(T), MINUTE(T), SEC(T)

20 45 34

Page 37: 本  章  内  容

( 1 )数值转换成字符串函数( N 型→ C 型)格式: STR(< 数值表达式 >[,< 长度 >[,< 小数位 >]])

功能:将 < 数值表达式 > 的值转换成字符串。说明:1 )若 < 长度 > 小于 < 数值表达式 > 值的整数部分 , 返回 *( 表示无法转换 ) 。

2 )小数点和负号都单独占一位。3 )转换时自动对小数进行四舍五入。4 )若缺省 < 长度 > ,则默认 10 ;缺省 < 小数位 > ,则默认 0 。【例 3- 24】N = -123.456

? STR(N,9,2) ,STR(N,6,1) ,STR(N,3) , STR(N,6) , STR(N)

□□-123.46 - 123.5 *** □□-123 □□□□□□ -123

Page 38: 本  章  内  容

( 2 )字符串转换成数值函数( C 型→ N 型)格式: VAL(< 字符表达式 >)

功能:将字符型数字(由正负号、数字和小数点组成)转换成 数值。说明:遇到非数字字符即停止转换。【例 3- 25】

? VAL("-123.45"), VAL("-12A.45"), VAL("A-123.45")

-123.45 -12.00 0.00

( 3 )字符串转换成日期函数( C 型→ D 型)格式: CTOD(< 字符表达式 >)

功能:将 < 字符表达式 > 的值转换成日期型数据。【例 3- 26】

? CTOD("09/10/2003")

09/10/03

Page 39: 本  章  内  容

( 4 )字符串转换成日期时间函数( C 型→ T 型)格式: CTOT(< 字符表达式 >)

功能:将 < 字符表达式 > 的值转换成日期型数据。【例 3- 27】

? CTOT("09/10/2003 20:09:52")

09/10/03 08:09:52 PM

( 5 )日期或日期时间函数转换成字符串( D或 T 型→ C型)

格式: DTOC(< 日期表达式 >|< 日期时间表达式 >[,1])

功能:将表达式值的日期部分换成字符型数据。说明:在 DTOC( ) 函数中,若使用选项“ ,1” ,则字符串的

格 式为 YYYYMMDD ,共 8 个字符。

Page 40: 本  章  内  容

【例 3- 28  】C1=DTOC(DATE()) &&将系统日期转换成字符串 , 并放入内存变量C1

C2=DTOC(DATE(),1) &&指定转换成的字符串格式为 YYYYMMDD

? C1 , C2

10/06/04 20041006

T1=DTOC(DATETIME())

T2=DTOC(DATETIME (),1)

? T1,T2

10/06/04 20041006

Page 41: 本  章  内  容

( 6 )日期时间函数转换成字符串( T 型→ C 型)格式: TTOC(< 日期时间表达式 >[,1])

功能:将日期时间型数据换成字符型数据。说明:在 TTOC( ) 函数中,若使用选项“ ,1” ,则字符 串 的格式为 YYYYMMDDHHMMSS ,共 14 个字符。【例 3- 29】? TTOC(DATETIME())

10/06/04 09:19:17 PM

? TTOC(DATETIME(),1)

20041006211917

Page 42: 本  章  内  容

( 7 )宏替换函数格式: &< 字符型内存变量 >[.]

功能:替换出字符型内存变量的内容。说明: 1 )圆点 [.] 作为函数结束的标记。 2 )它是惟一不带圆括号的函数。【例 3- 30 】使用宏替换函数表示表文件名和字段变量名。

NAME="Zgjk"

USE &NAME &&等价于 USE  Zgjk

XM=" 姓名 " &&XM为字符型内存变量? &XM+" 你好! " &&等价于 ? 姓名 +"你好! "

李成华 你好! &&姓名是字段变量,李成华是字段变量的值SKIP &&记录指针前移一条记录? &XM+" 你好! "

李小敏 你好!

Page 43: 本  章  内  容

【例 3- 31 】在宏替换函数中使用圆点作为结束的标记。 ZY=" 财会 "

? "&ZY3班 "

&ZY3 班 &&替换结果不是预期的目的 ? "&ZY.3班 "

财会 3 班 &&替换结果正确5 .测试函数( 1 )数据类型测试函数格式: TYPE("< 表达式 >")

功能:测试 < 表达式 > 的类型,返回数据类型的代码字母。说明:1 )被测试的表达式要用一对定界符括起来。2 )该函数为 C 型函数。

Page 44: 本  章  内  容

【例 3- 32】

X="TCL" &&内存变量 X 的数据类型为 C

Y=10 &&内存变量 Y 的数据类型为 N

Z=$100.2 &&内存变量 Z 的数据类型为 Y

? TYPE("X"),TYPE("Y"),TYPE("Z")

C N Y

? TYPE("DATE()"), TYPE("DATETIME()")

D T

? TYPE("W")

U && U表示被测表达式的数据类型未定义

Page 45: 本  章  内  容

( 2 )空值测试函数格式: EMPTY(< 表达式 >)

功能:若 < 表达式 > 的值为“空”,则返回 .T. ;否则返回 .F. 。说明:1 )该函数为 L 型函数。2) EMPTY( ) 函数参数表达式取表 3- 3 所列的“空”值时,函数返回值为 .T. 。注意空值 (.NULL.) 的返回值为 .F 。【例 3- 33】X=0

Y=2.18

Z=.F.

? EMPTY(X), EMPTY(Y) , EMPTY(Z) , EMPTY(.NULL.) .T. .F. .T. .F.

? EMPTY(CTOD("")),EMPTY(CTOT(""))

.T. .T.

Page 46: 本  章  内  容

( 3 )表文件结束标记测试函数格式: EOF([< 工作区号 >|< 表别名 >])

功能:若记录指针指向表文件结束标记 EOF ,则返回 .T. ;否则返回 .F. 。说明:1 )该函数为 L 型函数。2 )表文件结束标记 EOF 不是记录。3 )表文件刚打开时,记录指针指向首记录。4 )若表文件只有结构,没有记录,则函数的返回值为 .T. 。5 )若在指定工作区号没有打开表文件,则函数的返回值为 .F. 。

Page 47: 本  章  内  容

( 4 )表文件开始标记测试函数格式: BOF([< 工作区号 >|< 表别名 >])

功能:若记录指针指向表文件开始标记 BOF ,则返回 .T. ;否则返回 .F. 。说明:1 )该函数为 L 型函数。2 )表文件结束标记 BOF 不是记录。3 )表文件刚打开时,记录指针指向首记录。4 )若表文件只有结构,没有记录,则函数的返回值为 .T. 。5 )若在指定工作区号没有打开表文件,则函数的返回值为 .F. 。

Page 48: 本  章  内  容

( 5 )记录号测试函数格式: RECNO([< 工作区号 >|< 表别名 >])

功能:返回当前记录(记录指针指向的记录)的记录号。说明:1 )该函数为 N 型函数。2 )若记录指针指向 BOF ,则返回 1 。3 )若记录指针指向 EOF ,则返回总记录数 +1 。4 )若在指定工作区号没有打开表文件,则返回 0 。

Page 49: 本  章  内  容

【例 3- 34】USE Zgjk &&打开表文件 Zgjk.dbf,指针指向第一记录BROWSE &&在浏览窗口中显示表记录? BOF() , RECNO() .F. 1SKIP -1 &&记录指针倒退一个记录? BOF(),RECNO() .T. 1GO BOTTOM? EOF() , RECNO() .F. 8SKIP &&等价于 SKIP  1或 SKIP  +1? EOF(),RECNO() .T. 9GO 3 &&记录指针移到第 3 记录? BOF() , EOF() , RECNO() .F. .F. 3

Page 50: 本  章  内  容

( 6 )条件测试函数格式: IIF(< 逻辑表达式 >,< 表达式 1>,< 表达式 2>)

功能:若 < 逻辑表达式 > 的值为 .T. ,则返回 < 表达式 1> 的值;若 < 逻辑表达式 > 的值为 .F. ,则返回 < 表达式 2> 的值。【例 3- 35】

成绩 =72 &&成绩为 N 型 内存变量,其值为 72

? IIF( 成绩 >=60 , " 及格“  , " 不及格 ")

及格

Page 51: 本  章  内  容

§3.4  运算符 1 .算术运算符( 1 )算术运算符的操作与示例如下表所示。( 2 )求余运算符 % 与求余函数

MOD( ) 的作用相同。( 3 )算术运算优先级: ( ) → ^ 或 ** → *、 /、% → + 或 -

( 4 )同级运算自左向右。

运 算 符 操  作 示        例

( ) 优先 (5+3)*(5-3)

+ 加

- 减

* 乘

/ 除 3/2

**或 ^ 乘方 10**2或 10^2 && 表示 102

% 求余 10%3 && 等价于 MOD(10,3)

Page 52: 本  章  内  容

2 .字符连接运算符( 1 )字符连接运算符的操作与示例如下表 5 所示。( 2 )字符连接运算符的优先级相同。( 3 )同级运算自左向右。

运 算 符 操  作 示        例

+ 完全连接? " 中国□□□□ "+" 北京“中国□□□□北京

- 移空格连接? " 中国□□□□ "+" 北京“中国北京□□□□

Page 53: 本  章  内  容

3 .关系运算符(又称比较运算符)( 1 )关系运算符又称为比较运算符,关系运算符的操作与示例如表 3- 6 所示。( 2 )关系运算符无优先级。( 3 )同级运算自左向右。( 4 )运算符( ==, $ )专用于字符串比较。其他关系运算符可以对 N、 C、 D、 L 型数据进行比较。

Page 54: 本  章  内  容

运 算 符 操  作 示        例

> 大于 ? "two">"three" && 字符按 ASCII 码值进行比较.T.

< 小于 ? 2<3.T.

= 等于

? " 福建商专 "=" 福建 " && 非精确比较,比到右串结束即结束

.T.? " 福建 "=" 福建商专 ".F.

>= 大等于 ? " 福建商专 ">=" 福建 ".T.

<= 小等于 ? " 福建商专 "<=" 福建 ".T.

<>或 !=或#

不等于 ? " 福建商专 "<>"福 ".F.

== 字符串精确比较 ? " 福建商专 "=="福 " && 两字符串完全相等才相等.F.

$ 字符串包含 ? "金 "$" 李金斗 ".T.

Page 55: 本  章  内  容

4 .逻辑运算符( 1 )逻辑运算符的操作与示例如下表所示。

运 算 符 操  作 示    例.AND. 逻辑与 基本工资 >=1000.AND. 基本工资 <=1200

.OR. 逻辑或 车间 =" 铸造“ .OR. 车间 =" 机修 "

.NOT. 或 ! 逻辑非 .NOT. EOF()

( 2 )逻辑运算优先级: .NOT.→.AND.→.OR.

Page 56: 本  章  内  容

( 3 )逻辑运算符含义  1 )逻辑与(又称逻辑乘)运算符 .AND. 为双目运算符。 设: 1 表示逻辑真 .T., 0 表示逻辑假 .F. ,逻辑与的含义如下表所示。

X Y X .AND. Y

1 1 1×1=1

1 0 1×0=0

0 1 0×1=0

0 0 0×0=0

Page 57: 本  章  内  容

2 )逻辑或(又称逻辑加)运算符 .OR. 为双目运算符。 设: 1 表示逻辑真 .T., 0 表示逻辑假 .F. ,逻辑或的含义如下表所示。

X Y X.OR.Y

1 1 1+ 1=1

1 0 1+ 0=1

0 1 0+ 1=1

0 0 0+ 0=0

3 )逻辑非运算符 .NOT. 为单目运算符。 设: 1 表示逻辑真 .T., 0 表示逻辑假 .F. ,逻辑非的含义如下表所示。

X .NOT. X

1 0

0 1

Page 58: 本  章  内  容

3 )逻辑非运算符 .NOT. 为单目运算符。设: 1 表示逻辑真 .T., 0 表示逻辑假 .F. ,逻辑非的含义如下表所示。

X .NOT.X

1 0

0 1

5 .运算符的优先级  各类运算符及其优先级如下表 3- 11 所示。

Page 59: 本  章  内  容

.NOT.

.AND.

.OR.

逻辑

相同= > < >= <= <>、 #或 !=

= = $关系

+或 -

*、 /或%

^高

( )

算术

优 先 级运    算    符运算符类型

  5 .运算符的优先级  各类运算符及其优先级如下表所示。

Page 60: 本  章  内  容

§3.5  表达式

1 .表达式的基本概念( 1 )表达式的定义:用运算符把常量、变量和函数连接起来的式子。( 2 )数据运算的规则:只有类型相同的数据之间才能进行运算操作。所以,在构造表达式时,数据类型要统一,运算符与数据类型也要统一。( 3 )表达式的值:即表达式的运算结果。( 4 )表达式的类型:取决于表达式数据的类型。( 5 )常量、变量和函数可以看作表达式的简单特例。

§3.5.1  表达式概述

Page 61: 本  章  内  容

2 .表达式书写规则( 1 )表达式要写在同一行内。( 2 )在表达式中,运算嵌套关系的表示只用圆括号 ( ) ,不用方括号 [ ] 或花括号 { } 。( 3 )乘号 * 不能省略。

Page 62: 本  章  内  容

1 .数值表达式(又称算术表达式) 用算术运算符把数值型数据连接起来的式子称为数值表达式。

【例 3- 36 】设 a=2, b=6, c=3 ,求

在命令窗口中键入以下表达式:a=2 &&为赋值表达式,表示将常数 2 放入内存变量 a

b=6

c=3

  &&表达式写在同一行内,乘号 *不能略,只用圆括号 ( )。? (– b + sqrt ( b*b-4*a*c ) )/ (2 *a )

- 0.6340

a

acbb

2

42

§3.5.2  各类表达式

Page 63: 本  章  内  容

2 .字符表达式 用字符连接运算符( +或 - )把字符型数据连接起来的式子称为字符表达式。【例 3- 37】

   在命令窗口中键入以下表达式:X="How□"

Y="are□you!"

? X+Y &&当运算对象是字符型时,加号表示连接How□are□you!

Page 64: 本  章  内  容

3 .日期时间表达式 用运算符把日期时间型数据连接起来的式子称为日期时间表达式。 日期时间表达式的格式、运算结果和类型如表 3- 12 所示。【例 3- 38】

? DATE()-{^2002-12-8} &&若用 + 号则出错

小结: 运算符“ +” 与“ -” 可运算的数据类型有: N (算术运算)、 C (连接运算), D和 T 。

Page 65: 本  章  内  容

格      式 结  果 类  型< 日期 >+< 天数 > < 日期 > D

< 天数 >+< 日期 > < 日期 > D

< 日期 >-< 天数 > < 日期 > D

< 日期 >-< 日期 > < 天数 > N

< 日期时间 >+< 秒数 > < 日期时间 > T

< 秒数 >+< 日期时间 > < 日期时间 > T

< 日期时间 >-< 秒数 > < 日期时间 > T

< 日期时间 >-< 日期时间 > < 秒数 > N

< 日期 >+< 日期 > 出错

< 日期时间 >+< 日期时间 > 出错

表 3 - 12 日期时间表达式的格式、运算结果和类型

Page 66: 本  章  内  容

4 .关系表达式( 1 )关系表达式:用关系运算符把同类型的表达式(数据)连接而成的式子。关系运算的结果是逻辑值。( 2 )关系运算规则: 1) N 型和 Y 型数据的比较:按值的大小。 2) D 型和 T 型数据的比较:按早晚,越早越小,越晚越大。 3) L 型数据的比较:规定 .T. 大于 .F. 。 4 )关系表达式的值是 L 型数据。

Page 67: 本  章  内  容

【例 3- 39 】字符串非精确比较。1) SET EXACT OFF &&系统初态默认值 , 比较到比较运算符

右边的字符串结束即结束。在命令窗口中键入: ? " 福建商专 "=" 福建 " &&比较到右串 " 福建 " 结束即结束 .T.

2) SET EXACT ON &&设置等长比较。先在较短字符串的尾部添加空格,使两个字符串等长,

然后进行比较。在命令窗口中键入: SET EXACT ON &&设置等长比较 ? “ 福建商专” =“ 福建”             &&等效于: ? " 福建商专 "="福建□□□□ "

.F.

Page 68: 本  章  内  容

【例 3- 40 】字符串精确比较。1 )格式: < 字符表达式 1>==< 字符表达式 2>

2 )功能:若两个字符串完全相等,则返回 .T. ;否则返回 .F. 。3 )说明:不受 SET EXACT OFF|ON 状态开关的影响。 【例 3- 41】

    在命令窗口中键入:? " 福建商专 "==" 福建 " &&两个字符串完全相等才相等.F.

Page 69: 本  章  内  容

5 .逻辑表达式 逻辑表达式:用逻辑运算符把逻辑型数据连接而成的式子。【例 3- 42】

    在命令窗口中键入:? 5>3 .AND. 5<3 && 关系表达式 5>3和 5<3 的运算结果是逻辑值

.F.

? 6*8<=45 .AND. 4*5=20

.F.

? .NOT. 3+5>6

.F.