480 likes | 652 Views
第三章 数据与数据运算. 信息工程系 李希敏. VFP 中的常量和变量 常量、变量、内存变量常用命令 表达式 数值表达式、字符表达式、日期时间表达式、关系表达式、逻辑表达式 常用函数 数值函数、字符函数、日期和时间函数、数据类型转换函数及测试函数. 本章的主要内容. 重点 常量、变量 表达式和常用函数 难点 数组变量、数组与表之间的数据交换 关系表达式和逻辑表达式的使用. 重点和难点. 在 Visual FoxPro 系统中,数据可用常量、变量、表达式和函数来表示。.
E N D
第三章 数据与数据运算 信息工程系 李希敏
VFP中的常量和变量 常量、变量、内存变量常用命令 表达式 数值表达式、字符表达式、日期时间表达式、关系表达式、逻辑表达式 常用函数 数值函数、字符函数、日期和时间函数、数据类型转换函数及测试函数 本章的主要内容
重点 常量、变量 表达式和常用函数 难点 数组变量、数组与表之间的数据交换 关系表达式和逻辑表达式的使用 重点和难点
在Visual FoxPro系统中,数据可用常量、变量、表达式和函数来表示。
常量用来表示一个具体的、不变的值。不同类型的常量有不同的书写格式。 Visual FoxPro按常量取值的数据类型,将常量分为6种类型:数值型常量、货币型常量、字符型常量、逻辑型常量、日期型常量、日期时间型常量。 3.1 常量和变量 3.1.1 常量
1.数值型常量 由数字、小数点和正负号组成,表示整数或实数值。 如;100,-21,15.31,-21092.5041等分别是数值型常量中的整数和实数。 也可用科学计数法形式书写。如:用-2.10925041E4表示-21092.5041(即-2.10925041×104)。 2.货币型常量 用来表示货币值,其书写格式与数值型常量相似,但要加一个前置的符号$。货币型数据在存储和计算时,采用4位小数位,如$45.78925会存储为$45.7893 。货币型常量没有科学计数法形式。如:$458900、$123.1457等。 3.逻辑型常量 逻辑型常量只有逻辑真和逻辑假两个值。分别用.T.、.t.或.Y.、.y.和.F.、.f.或.N.、.n.表示。在表示逻辑型常量的字母左右必须加句点定界符。另外,逻辑型常量只占一个字节的存储空间。
4.字符型常量 字符型常量又称为字符串。为与其他类型常量、变量和标识符相区别,Visual FoxPro要求将字符串中所有字符,用半角双引号、单引号或方括号作为定界符括起来。 注意: ①定界符必须成对出现; ②如果某种定界符也是字符串的内容,则需要用另一种定界符为该字符串定界。 ③不包含任何字符的字符串(’’)叫空串。空串与包含空格的字符串(’’)不同。 如:“I am a student.”、‘中华人民共和国’、[VFP6.0系统] 、’adsd[45210]’都是合法的字符串表示。
5.日期型常量 日期型常量的定界符是一对花括号。花括号内包括年、月、日三部分内容,各部分内容之间用分隔符(斜杠/、连字号-、句点.和空格)分隔,其中/是系统在显示日期数据时使用的默认分隔符。 日期型常量的两种表示:传统的日期格式和严格的日期格式。这里主要介绍严格的日期格式。 用{^yyyy-mm-dd}书写的日期能表达一个确切的日期。书写时应注意:花括号内的第一个字符必须是^;年份必须是4位;年月日的次序不能颠倒、缺省。该格式在任何情况下均可使用。
6.日期时间型常量 包括日期和时间两部分内容:{<日期>,<时间>} 日期部分和日期型常量相似,也有传统的和严格的两种格式。 其严格的日期时间格式是: {^yyyy/mm/dd [,] hh:mm:ss[a|p]} 其中a和p分别表示AM(上午)和PM(下午)。 日期值和日期时间值的输入格式与输出格式并不完全相同,特别是输出格式受系统环境设置的影响,用户可根据应用需要在“工具/选项“对话框中的“区域”选项卡中进行相应调整和设置。 如:{^1997/12/25}表示1997年12月25日。 {^2006/10/01 11:30 a}表示2006年10月1日下午11点30分。
3.1.2 变量 变量是指在操作过程中可以改变其取值或数据类型的数据项。在Visual FoxPro中,变量分为字段变量和内存变量两种。 确定一个变量,需要确定其三个要素:变量名、数据类型和变量值。
在Visual FoxPro系统中,变量的命名有若干“命名约定”供用户参考,以提高操作命令与程序的可读性和规范性。 ⑴使用字母,下划线和数字命名。一般建议不采用汉字命名; ⑵变量名以字母或下划线开头;除自由表中字段名、索引的TAG标识名最多只能10个字符外,其他的命名可使用1~128个字符; ⑶避免使用 Visual FoxPro的保留字。
字段变量 表由若干记录构成,每个记录都包含若干个数量相同的字段,同一字段在不同记录中分别对应不同的字段值,因此,表中的字段名就是变量。 与其他变量不同的是:字段变量是定义在表中的变量,随表的存取而存取,因而是永久性变量。字段名就是变量名;变量的数据类型为Visual FoxPro中任意数据类型,字段值就是变量值。 内存变量 内存变量是内存中的一个存储区域,变量值就是存储在这个区域里的数据,变量的类型取决于变量值的类型。 内存变量的数据类型包括字符型C、数值型N、货币型Y、逻辑型L、日期型D和日期时间型T。
1.简单内存变量 ⑴内存变量的建立 建立内存变量就是给内存变量赋值。内存变量赋值既可定义一个新的内存变量,也可改变已有内存变量的值或数据类型。 命令格式: STORE <表达式> TO <内存变量表> <内存变量> = <表达式> 命令功能:计算<表达式>的值并赋值给指定内存变量。 注意: ①第一种格式可同时给多个变量赋同一个值,第二种格式一次只能给一个变量赋值。 ②当内存变量和字段变量同名时,系统优先访问字段变量。如果要访问同名的内存变量,则必须在变量名前加前缀M.或M->。
2.数组 数组是内存中连续的一片存储区域,它由一系列数组元素组成,每个数组元素相当于一个简单内存变量。 数组元素的名称(变量名)用数组名加下标构成。下标必须用圆括号对括;必须是非负数值,可以是常量、变量、函数或表达式,下标值会自动取整。 如AA(1)表示一维数组AA的第1个元素, BB(2,3)表示二维数组BB中第2行第3列的元素;可以给各元素分别赋值,一个数组中各数组元素的数据类型可以不同。 Visual FoxPro中允许使用一维数组(相当于数列)和二维数组(相当于行列式或矩阵)。一维数组的元素只有一个下标,二维数组的元素有两个以逗号分隔的下标。 与简单内存变量不同,数组必须先定义后使用。
⑴数组的定义 命令格式:DIMENSION|DECLARE <数组名1>(<expN1>[,<expN2>])[,<数组名2>(<expN3>[,<expN4>])…] 命令功能:定义指定的各个数组。数组创建后,系统自动给每个数组元素赋予逻辑假.F.。 如:dimension a(5),b(3,4) 指定义了一个一维数组a和一个二维数组b。 ⑵数组的赋值与引用 ①数组元素的赋值与引用,与普通内存变量的规则相同。 ②整个数组的数据类型为A(array)。赋值语句使用数组时,整个数组的每个元素将得到同一个值。 ③可以用一维数组的形式访问二维数组;在同一个运行环境下,数组名不能与简单变量名重复。
⑶内存变量与表中数据的交换 ①将表中的当前记录复制到数组 命令格式:scatter [fields <字段名表>] [memo] to <数组名> [blank] 命令功能:在<字段名表>处直接指名要复制的字段,如果不指定字段,则复制除备注型和通用型以外的所有字段。[memo]表示复制备注型字段, [blank]表示生成一个空数组。 如:use 学生 scatter to a scatter fields 学号,姓名 to b ②将数组中的数据赋值到表的当前记录 命令格式:gather from <数组名> [fields <字段名表>] [memo] 命令功能:从数组中将数据复制到当前表的当前记录中。
3.1.3 内存变量常用命令 1.表达式值的显示输出 命令格式:?|?? <表达式表> 命令功能:计算表达式表中各表达式的值并在屏幕上输出。?命令先回车换行,再计算并输出表达式的值;??命令在屏幕上当前位置计算并直接输出表达式的值。 2.内存变量的显示 命令格式:DISPLAY|LIST MEMORY [LIKE <通配符>][TO PRINTER [PROMPT]| TO FILE <文本文件名>] [NOCONSOLE] 命令功能:显示指定内存变量的当前信息,包括变量名、作用域、类型、取值。
3.内存变量的清除 Visual FoxPro系统对定义内存变量的数量是有限制的,应及时清理,尽量减少内存的占用。 命令格式: 格式1:CLEAR MEMORY 格式2:RELEASE <内存变量名表> 格式3:RELEASE ALL [EXTENDED] 格式4:RELEASE ALL [LIKE <通配符>|EXCEPT <通配符>] 命令功能: 格式1清除所有的内存变量,在人机交互方式下格式3和格式1作用相同,如果出现在程序中,则要加上短语EXTENDED,否则不能清除公共内存变量;格式2和格式4清除指定的内存变量。
在Visual FoxPro中,表达式是由常量、变量、函数通过特定的运算符连接起来的式子。 运算符是对数据对象进行加工处理的符号,根据其处理数据对象的数据类型,运算符分为算术(数值)运算符、字符运算符、日期时间运算符、逻辑运算符和关系运算符五类,相应的,表达式也分为数值(算术)表达式、字符表达式、日期时间表达式、关系表达式和逻辑表达式五类。 常量、变量和函数可作为表达式的特例。 3.2 表达式
1.数值表达式 数值表达式又称算术表达式,其运算对象和运算结果均为数值型数据。数值运算符的功能及运算优先顺序如下表所示。表中运算符按运算优先级别从高到低顺序排列。 运算符 功能 表达式举例 运算结果 优先级别 ( ) 圆括号 (2-5)*(3+2) -15 最高 | | | | 最低 - 取相反数 -(3-8) 5 **、^ 乘幂 2**5、3^2 32、9 *、/ 乘、除 2*10、25/5 20、5 % 取余数 15%-4 -1 +、- 加、减 36+19、29-47 55、-18 3.2.1 数值、字符与日期表达式
2.字符表达式 字符表达式是由字符运算符将字符型数据对象连接起来进行运算的式子。字符运算的对象是字符型数据对象,运算结果是字符常量或逻辑常量。下表列出了字符运算符的功能。(两个连接运算的优先级别相同,但高于$的比较运算。) 运算符 功能 表达式举例 运算结果 + 串1+串2:两串顺序相连接 ’12 ‘+’56’ ’12 56’ - 串1-串2:串1尾空格移到串2尾后再顺序相连接 ’12 ‘-‘56’ ‘1256 ‘ $ 串1$串2:串1是否为串2子串 ‘1234’$ ‘a12345’ ‘1234’$ ‘34512’ .T. .F.
3.日期表达式 由日期运算符将一个日期型或日期时间型数据与一个数值型数据连接而成的运算式称为日期表达式。日期运算符分为“+”和“-”两种,其作用分别是在日期数据上增加或减少一个天数,在日期时间数据上增加或减少一个秒数。两个运算的优先级别相同。 例如:?{^2001-03-19}+10,{^2001-03-19}-{^2000-04-16} 03/29/01 337 ?{^2001-03-19 11:10:45}+10 03/19/01 11:10:55 AM
由关系运算符连接两个同类数据对象进行关系比较的运算式称为关系表达式。关系表达式的值为逻辑值:表达式成立则其值为“真”,否则为“假”。关系运算符没有优先级别,如下表所示。 运算符 功能 表达式举例 结果 < 小于 15<4*6 .T. > 大于 ‘A’ > ‘1’ .T. = 等于 2+4 = 3*5 .F. <>、#、!= 不等于 5 <> -10 .T. <= 小于或等于 'abc' <= 'AB' .F. >= 大于或等于 {10-10-02}>={10/01/02} .T. == 字符串恒等 ‘abc’==’abcabc’ .F. 3.2.2 关系表达式
注意: ① 运算符==和$仅适用于字符型数据。其他运算符适用于任何类型的数据。 ② 在用=运算符比较两个字符串时,运算结果与set exact on/off命令的设置有关。 ③两个字符串比较大小时,排序次序与set collate to语句的设置有关。
由逻辑运算将逻辑型数据对象连接而成的式子称为逻辑表达式。逻辑表达式的运算对象与运算结果均为逻辑型数据。下表列出了逻辑运算符的功能。逻辑运算符前后一般要加圆点“.”标记,以示区别。 运算符 功能 优先级别 ( ) 圆括号 最高 | | 最低 .NOT.或! 逻辑非 .AND. 逻辑与 .OR. 逻辑或 3.2.3 逻辑表达式
对于各种逻辑运算,其运算规则可由逻辑运算真值表确定。下表为逻辑运算真值表: A B A .AND.B A .OR. B .NOT A .T. .T. .T. .T. .F. .T. .F. .F. .T. .F. .F. .T. .F. .T. .T. .F. .F. .F. .F. .T.
对于两个逻辑型数据,一般不用比较的方式来确定它们之间的关系,而是直接运用逻辑运算的方式进行处理。如对表中记录实施选择运算时,是用FOR <条件>或WHILE <条件>进行逻辑判断,其中<条件>就是一个关系表达式或逻辑表达式。 对于以逻辑型字段进行逻辑判断的情况,一般不用关系表达式而直接用逻辑表达式。如“性别”是一个逻辑型字段,并约定“真”表示男性,“假”表示女性。那么判断某记录对应人员是否为男性,用FOR 性别,而不用FOR 性别=.T.,判断是否为女性,用FOR .NOT. 性别,不用FOR 性别=.F.。
Visual FoxPro的函数由函数名与自变量两部分组成。函数名是Visual FoxPro保留字,自变量必须用圆括号对括起来,如有多个自变量,各自变量以逗号分隔;有些函数可省略自变量,或不需自变量,但也必须保留括号;自变量数据类型由函数的定义确定,数据形式可以是常量、变量、函数或表达式等。 函数是一类数据项,除个别(如宏替换)函数外,函数都不能像命令一样单独使用,只能作为命令的一部分进行操作运算。 3.3 常用函数
数值函数用于数值运算,其自变量与函数都是数值型数据。 1.取绝对值函数ABS( ) 格式:ABS(<nExp>) 功能:计算nExp的值,并返回该值的绝对值。 2.取整函数INT( ) 格式:INT(<nExp>) 功能:计算nExp的值,返回该值的整数部分。 3.平方根函数SQRT( ) 格式:SQRT(<nExp>) 功能:求非负nExp的平方根。 4.上界函数CEILING( ) 格式:CEILING(<nExp>) 功能:计算nExp的值,返回一个大于或等于该值的最小整数。 3.3.1 数值函数
5.下界函数FLOOR( ) 格式:FLOOR(<nExp>) 功能:计算nExp的值,返回一个小于或等于该值的最大整数。 6.求余数函数MOD( ) 格式:MOD(<nExp1>,<nExp2>) 功能:返回nExp1除以nExp2的余数。余数的符号与nExp2相同。 7.四舍五入函数ROUND( ) 格式:ROUND(<nExp1>,< nExp2>) 功能:返回nExp1四舍五入的值, nExp2表示保留的小数位数。 8.π函数PI( ) 格式:PI( ) 功能:返回常量π的近似值
9.最大值函数MAX( ) 格式:MAX(<nExp1>,< nExp2>[,< nExp3>...]) 功能:返回数值表达式中的最大值。 10.最小值函数MIN( ) 格式:MIN(<nExp1>,< nExp2>[,< nExp3>...]) 功能:返回数值表达式中的最小值。 注意: 这最大值和最小值函数的自变量可以是N型、Y型、C型、D型及T型。
字符函数是处理字符型数据的函数,其自变量或函数值中至少有一个是字符型数据。函数中涉及的字符型数据项,均以cExp表示。 1.字符串长度函数LEN( ) 【格式】LEN(<cExp>) 【功能】返回cExp串的字符数(长度)。函数值为N型。 2.空格函数SPACE( ) 【格式】SPACE (<nExp>) 【功能】返回一个包含nExp个空格的字符串。 3.大小写字母转换函数LOWER( ) 和UPPER( ) 【格式】LOWER (<cExp>) UPPER (<cExp>) 【功能】LOWER( )将cExp串中字母全部变成小写字母,UPPER( )将cExp串中字母全部变成大写字母,其它字符不变。 3.3.2 字符函数
4.取左子串函数LEFT( ) 【格式】LEFT(<cExp>,<nExp>) 【功能】返回从cExp串中第一个字符开始,截取nExp个字符的子串。 5.取右子串函数RIGHT( ) 【格式】RIGHT(<cExp >,< nExp>) 【功能】返回从cExp串中右边第一个字符开始,截取nExp个字符的子串。有关说明同LEFT( )函数。 6.取子串函数SUBSTR( ) 【格式】SUBSTR (<cExp>,<nExp1> [,< nExp2>] ) 【功能】返回从串cExp中第nExp1个字符开始,截取nExp2个字符的子串。
7.删除字符串前后空格函数 【格式】LTRIM(<cExp>) TRIM(<cExp>) ALLTRIM(<cExp>) 【功能】LTRIM()删除cExp串的前导空格字符。 TRIM( )删除cExp串尾部空格字符。 ALLTRIM( )删除cExp串的首尾空格字符。 8.计算子串出现次数函数 【格式】OCCURS(<cExp1, cExp2>) 【功能】返回第一个字符串在第二个字符串中出现的次数,函数值为数值型.若第一个字符串不是第二个字符串的子串,函数值为0。 例如:x=‘agfdsgfdhgfh’ ?occurs(‘f’,x),occurs(‘h’,x), occurs(‘gh’,x) 3 2 0
9.子串位置函数 【格式】AT(<cExp1>,<cExp2>) 【功能】返回串cExp1在串cExp2中的起始位置。函数值为整数。如果串cExp2不包含串cExp1,函数返回值为0。 10.字符串替换函数STUFF( ) 【格式】STUFF(<cExp1>,<nExp1>,<nExp2>,<cExp2>) 【功能】从nExp1指定位置开始,用cExp2串替换 cExp1串中nExp2个字符。 11.字符复制函数 REPLICATE( ) 【格式】REPLICATE (<cExp>,<nExp>) 【功能】返回将cExp串重复nExp次的字符串。
12.宏替换函数 & 【格式】& < cVar >[.< cExp >] 【功能】替换出字符型变量cVar中字符。 例如:m=‘30’ n=‘m’ ?&m+20,&n+’05’ 50 3005 注意: 这里的50是数值型数据,3005是字符串。
日期时间函数是处理日期型或日期时间型数据的函数。其自变量为日期型表达式dExp或日期时间型表达式tExp。 1.系统日期函数DATE( ) 【格式】DATE() 【功能】返回当前系统日期,此日期由Windows系统设置。函数值为D型。 2.系统时间函数TIME( ) 【格式】TIME([<nExp>]) 【功能】返回当前系统时间,时间显示格式为hh:mm:ss。若选择了nExp ,则不管为何值,返回的系统时间还包括秒的小数部分,精确至小数点后两位。函数值为C型。 3.3.3 日期和时间函数
3.日期函数DAY( ) 【格式】DAY(<dExp>) 【功能】返回dExp式中的天数。函数值为N型 4.月份函数MONTH( )、CMONTH( ) 【格式】MONTH(<dExp>) CMONTH(<dExp>) 【功能】MONTH( )函数返回dExp式中月份数。函数值为N型。CMONTH( )函数则返回月份的英文名。函数值为C型。 5.年份函数YEAR( ) 【格式】YEAR(<dExp>) 【功能】函数返回dExp式中年份值。函数值为N型。
6.时、分、秒函数 【格式】HOUR(<tExp>) MINUTE(<tExp>) SEC(<tExp>) 【功能】函数HOUR()返回tdExp式中的小时部分(24小时制)。 MINUTE()返回tExp式中的分钟部分。 SEC()返回tExp式中的秒数部分。 这三个函数的函数值均为N型。
在数据库应用的过程中,经常要将不同数据类型的数据进行相应转换,满足实际应用的需要。Visual FoxPro系统提供了若干个转换函数,较好地解决了数据类型转换的问题。 主要有以下两类: ①数值型与字符型数据之间的相互转换 ②日期或日期时间型与字符型之间的相互转换 3.3.4 数据类型转换函数
1.数值型转换为字符型函数STR( ) 【格式】STR(<nExp1>[,< nExp2>][,< nExp3>]) 【功能】将nExp1的数值转换成字符串形式。函数值为C型。 例如:n=-123.4567 ?str(n,9,2), str(n,6,2), str(n), str(n,4,2), str(n,2) -123.46 –123.5 -123 –123 **
2.字符型转换为数值型函数VAL( ) 【格式】VAL(<cExp>) 【功能】将cExp串中数字转换成对应数值,转换结果取两位小数。若字符串中出现非数字字符,则只转换前面部分;若字符串的首字符不是数字字符,则返回0,但忽略前导空格。函数值为N型。 例如:x=‘678kjd45’ y=‘ssd123’ ?val(x),val(y) 678.00 0.00
3.字符型转换为日期或日期时间型函数 【格式】CTOD(<cExp>) CTOT(<cExp>) 【功能】CTOD()把 cExp串转换成对应的日期值。 CTOT()把 cExp串转换成对应的日期时间型。函数值为D型。 注意:cExp串部分的格式要和set date to 命令设置的格式一致。
4.日期字符型转换函数DTOC( ) 【格式】DTOC(<dExp>[,1]) TTOC(<tExp>[,1]) 【功能】DTOC()把日期dExp转换成相应的字符串。函数值为C型。 注意: DTOC()格式中,如果使用选项1,则字符串的格式总是为YYYYMMDD,共8个字符;TTOC()格式中,如果使用选项1,则字符串的格式总是为YYYYMMDDHHMMSS,采用24小时制,共14个字符。
在数据库应用的操作过程中,用户需要了解数据对象的类型、状态等属性,Visual FoxPro提供了相关的测试函数,使用户能够准确地获取操作对象的相关属性。 3.3.5 测试函数
1.数据类型函数VARTYPE( ) 【格式】VARTYPE(<Exp>) 【功能】测试Exp的数据类型,返回一个表示数据类型的大写字母,函数值是字符型。 各字母的含义如下:C(字符型),D(日期型),N(数值型),L(逻辑型), M(备注型),G(通用型),U(未定义)。 2.条件测试函数IIF( ) 【格式】IIF(<lExp>,<eExp1>,<eExp2>) 【功能】逻辑表达式lExp值为真(.T.),返回表达式eExp1的值,否则返回表达式eExp2的值。eExp1和eExp2可以是任意数据类型的表达式。
3.表结束标志测试函数EOF( ) 【格式】EOF([<工作区号> | <别名>]) 【功能】测试记录指针是否移到表结束处。如果记录指针指向表中尾记录之后,函数返回真(.T.),否则为假(.F.)。 4.表起始标识测试函数BOF ( ) 【格式】BOF ([<工作区号> | <别名>]) 【功能】测试记录指针是否移到表起始处。如果记录指针指向表中首记录前面,函数返回真(.T.),否则为假(.F.)。工作区说明见EOF()函数。
5.当前记录号函数RECNO() 【格式】RECNO([<工作区号> | <别名>]) 【功能】返回指定工作区中表的当前记录的记录号。对于空表返回值为1。 6.当前记录逻辑删除标志测试函数DELETED( ) 【格式】DELETED([<工作区号> | <别名>]) 【功能】测试指定工作区中表的当前记录是否被逻辑删除。如果当前记有逻辑删除标记,函数返回真(.T.),否则为假(.F.)。 7.记录数函数RECCOUNT( ) 【格式】RECCOUNT ([<工作区号> | <别名>]) 【功能】返回指定工作区中表的记录个数。如果工作区中没有打开表则返回0。