数据和数据运算.docx
《数据和数据运算.docx》由会员分享,可在线阅读,更多相关《数据和数据运算.docx(31页珍藏版)》请在冰豆网上搜索。
数据和数据运算
第3章数据和数据运算
VisualFoxPro能处理的数据类型多种多样,运算符和函数也很丰富,不同类型的数据有着不同的运算符和处理方式。
本章主要讲解VisualFoxPro中各类数据的表示方法及运算规则等。
教学要求
通过本章的学习,读者应该掌握以下内容。
●VisualFoxPro的数据类型。
●VisualFoxPro的运算符。
●VisualFoxPro的函数。
3.1常量与变量
在VisualFoxPro中,将用于存储数据的变量、数组、字段、记录等称为数据的存储容器,它们决定了数据的类型和存储方法。
3.1.1常量
常量是在命令操作或程序执行的过程中其值固定不变的数据,是一个具体的、不变的值,VisualFoxPro6.0的常量类型有6种:
N(数值型)、C(字符型)、L(逻辑型)、D(日期型)、T(日期时间型)、Y(货币型)。
1.数值型常量
数值型常量是一个常数,用来表示大小,可由数字、小数点、正负号组成,例如356、35.6、-356。
为了表示很大或很小的数值型常量,可以使用科学计数法,例如3.56E+10表示3.561010,2.4E-6表示2.410-6。
2.字符型常量
字符型常量是用定界符(英文的双引号、单引号或方括号)括起来的字符串,例如"中华人民共和国"、'2008'、[happy]。
定界符不作为字符型常量本身的内容,它只是规定了常量的类型以及常量的起始和终止界限。
定界符必须配对使用,不能起始和终止位置用不同的定界符。
如果字符串中已有定界符中的一种符号,则定界符应选用另一种。
【例3.1】在VisualFoxPro6.0中显示数值型常量56和字符型常量"2008年奥运会"、[“三个代表”重要思想]、"‘apple’的中文含义是‘苹果’"。
在命令窗口中输入下列命令:
?
56
?
"2008年奥运会"
?
[“三个代表”重要思想]
?
"‘apple’的中文含义是‘苹果’"
注意:
①不包含任何字符的字符串叫空串,即定界符中间无任何字符。
只含有空格的字符串不是空串。
②1234为数值型常量,而加上定界符后,即变为"1234"后,即成为字符型常量。
3.逻辑型常量
逻辑型常量表示逻辑判断的结果,只有“真”和“假”两种值。
在VisualFoxPro中,逻辑真用.T.、.t.、.Y.或.y.表示,逻辑假用.F.、.f.、.N.或.n.表示。
注意:
逻辑常量中的前后两个圆点是逻辑常量的定界符,是必不可少的。
4.日期型常量
表示某个确定的日期时需要用到日期型常量。
日期型常量的定界符是一对花括号,花括号内以“^”开始,包括年、月、日三部分内容,各部分内容之间用分隔符分隔。
系统默认的分隔符为左斜杠(/),也可以用短横线(-)、圆点(.)或空格。
其严格格式为{^年-月-日},例如{^2011-07-07}。
5.日期时间型常量
日期时间型常量包括日期和时间两部分内容,也要放在一对花括号中,格式为{^<日期>,<时间>}。
<日期>部分与日期型常量类似;<时间>部分的格式为[HH[:
MM[:
SS]]A/P],其中HH、MM和SS分别代表时、分、秒,A和P分别代表上午和下午。
若指定的小时数大于等于12,则为下午时间。
例如{^2011-07-07,09:
18:
19A}。
6.货币型常量
货币型常量用于表示货币值,其书写格式与数值型常量类似,但是需加一个前置符号“$”。
货币型数据在存储和计算时,采用4位小数。
若小数位不足4位,则补0替代;若超过4位,则四舍五入取4位。
【例3.2】货币型常量的显示。
在命令窗口中依次输入:
?
$123
?
$123.34567
工作区中的显示结果分别为:
123.0000
123.3457
货币型常量没有科学计数形式。
3.1.2变量
变量是指在命令操作期间或程序执行过程中其值可以改变的量。
VisualFoxPro6.0的变量有字段变量和内存变量两种。
确定一个变量需要3个要素:
变量名、数据类型和变量值。
每一个变量都有一个名字,可以通过变量名来访问变量。
变量名由字母或汉字开头,由字母、数字、汉字、下划线组成,长度不超过254个字符。
变量名应避免与VisualFoxPro6.0的保留字同名。
如果当前表中存在一个同名的字段变量,则在访问内存变量时,必须在变量名前加上前缀M.或M->,否则系统会默认访问同名的字段变量。
1.字段变量
字段变量就是表中的字段名,它是表中最基本的数据单元。
字段变量是一种多值变量,一个表有多少条记录,那么该表的每一个字段就有多少个值,当使用字段变量时,其值就是表中当前记录对应字段的值。
在表中,对字段必须先定义后赋值,然后再使用。
对字段变量的定义是在定义表结构时完成的,主要给出变量名、变量数据类型、变量数据宽度等。
字段变量的类型有N、C、D、L、备注型和通用型等。
2.内存变量
VisualFoxPro6.0的内存变量可分为系统内存变量和用户定义的内存变量。
系统内存变量是VisualFoxPro6.0自带的变量,以“_”开头,由系统命名创建并维护,可供用户使用。
系统内存变量不能被删除。
用户定义的内存变量是一种临时工作单元,它独立于表文件而存在,常用来保存在命令或程序执行中临时用到的数据,由用户根据需要创建或删除。
内存变量又包括简单内存变量和数组。
内存变量的类型由赋值给它的数据类型决定,有字符型(C)、数值型(N)、日期型(D)、日期时间型(T)、货币型(Y)和逻辑型(L)等。
1)内存变量的赋值
格式1:
STORE<表达式>TO<内存变量名列表>
格式2:
<内存变量名>=<表达式>
说明:
①STORE命令可以将一个值同时赋给若干个内存变量,各内存变量间用逗号隔开。
例如,STORE3TOX,Y的功能是使变量X和Y的值都为3。
“=”号命令一次只能给一个变量赋值。
②进行赋值时,若该变量不存在,则在赋值时被建立;若该变量已存在,则其值为赋值后的值。
③在执行赋值命令时,首先要计算表达式的值,然后再将其赋值给指定的变量。
内存变量的数据类型取决于表达式值的类型。
可以通过对内存变量重新赋值来改变其值和类型。
【例3.3】内存变量的赋值。
数值型:
年龄=35
字符型:
姓名=“朱小明”
逻辑型:
婚否=.T.
日期型:
出生日期={^1972-11-27}
STORE3+4TOA1,B1,C1
2)内存变量的显示
格式1:
LISTMEMORY[LIKE<通配符>][TOPRINTER/TOFILE<文件名>]
格式2:
DISPLAYMEMORY[LIKE<通配符>][TOPRINTER/TOFILE<文件名>]
功能:
显示内存变量的当前信息,包括变量名、作用域、类型、值。
说明:
①选用LIKE选项时,只显示与通配符相匹配的内存变量。
通配符有*和?
,*表示任意多个字符,?
表示任意一个字符。
例如,a*包括ab、abc、ax等,即变量名以字母a开头的所有变量;a?
包括ab、ax等,即变量名以字母a开头且长度为2的所有变量。
②可选项TOPRINTER或TOFILE<文件名>分别用于在显示内存变量的同时把显示结果送往打印机或存入给定文件名的文件中,文件扩展名为.txt。
③LIST命令一次显示所有内存变量,如果内存变量很多,一屏显示不下,则自动向上滚动,直到显示完毕为止。
DISPLAY命令分屏显示所有内存变量,如果内存变量很多,显示满屏时暂停,按任意键后再继续显示下一屏。
【例3.4】在例3.3的基础上,显示内存变量名为两个字符,且第一个字符任意、第二个字符为1的内存变量,并将满足条件的内存变量保存在文件BL中。
在命令窗口中输入:
LISTMEMORYLIKE?
1TOFILEBL
工作区中的显示结果为:
A1PubN7
B1PubN7
C1PubN7
3)表达式的显示
格式1:
?
[表达式清单]
格式2:
?
?
表达式清单
功能:
计算表达式清单中所有表达式的值,并输出显示。
说明:
①格式1中若无表达式清单,则会输出一个换行符,即光标换到下一行起始处,等待下一批数据的输出。
若格式1中指定了表达式清单,则将计算后的值在下一行的起始处输出。
②格式2是在当前光标处直接输出显示计算后的表达式的值。
【例3.5】在例3.3的基础上,在命令窗口中分别输入下列命令:
?
A1,B1
?
?
姓名,年龄
LISTMEMORYLIKEA?
工作区中的显示结果为:
77朱小明35
A1PubN7
(4)保存内存变量
存储内存变量的文件称为内存变量文件,默认的扩展名为.MEM。
格式:
SAVETO内存变量文件名[ALL[LIKE|EXCEPT<通配符>]]
说明:
ALL表示将全部内存变量存入文件中;ALLLIKE<通配符>表示把内存变量中所有与通配符相匹配的内存变量都存入文件中;ALLEXCEPT<通配符>表示把与通配符不匹配的全部内存变量存入文件中。
【例3.6】将变量名以字母A开头的所有内存变量存储到文件NCBL中。
SAVETONCBLALLLIKEA*
5)内存变量的恢复
将已存入内存变量文件中的内存变量从文件中读出,装入内存中。
格式:
RESTOREFROM内存变量文件名[ADDITIVE]
说明:
参数ADDITIVE表示恢复内存变量时,只覆盖原内存中的同名变量,原内存中的其他变量保留。
【例3.7】将内存文件NCBL中的变量恢复并追加到内存。
RESTOREFROMNCBLADDITIVE
6)内存变量的清除
清除内存变量即取消原内存中为变量开辟的内存单元。
(1)清除所有内存变量
格式:
CLEARMEMORY
(2)清除指定内存变量
格式1:
RELEASE内存变量清单[EXTENDED]
格式2:
RELEASE[ALLLIKE|ALLEXCEPT<通配符>]
说明:
格式1用于程序中时需用可选项[EXTENDED],否则不能删除公共内存变量。
【例3.8】清除内存如下变量。
RELEASE出生日期,婚否&&清除内存变量“出生日期”,“婚否”
RELEASEALLLIKE?
1&&清除变量名第二个字符为1的变量
RELEASEALL&&清除所有内存变量
3.数组
在VisualFoxPro中,数组是一组按一定顺序排列的内存变量,数组中的各个变量称为数组元素。
数组元素用数组名及该元素在数组中排列位置的下标一起表示,下标的个数称为数组的维数。
数组要先定义然后再引用。
定义数组的命令格式:
DECLARE/DIMENSION数组名1(下标上界[,<下标上界…>])[,…]
功能:
定义一维数组或二维数组以及有关数组各下标的上界值,下标上界值默认为1。
如A
(1)、A
(2)是一维数组元素,B(1,2)、B(2,3)是二维数组元素。
数组中各数组元素的取值类型可以互不相同,数组一经定义,它的每个元素就有了逻辑型初值.F.,可用赋值命令给数组元素赋值。
给数组名赋值等同于给该数组的每一个元素赋同一值。
二维数组各元素以行的顺序在内存中存储,它们也可以按排列的相对位置以一维数组元素的形式存取。
【例3.9】定义一维数组A和二维数组B,赋值后显示。
DIMENSIONA(4),B(3,2)&&定义一维数组A和二维数组B
STORE5TOA&&数组A中所有元素赋值为5
B
(1)="HELLO"
B(4)=365
B(6)=.T.
A
(2)="HAPPY"
?
A
(1),A
(2),A(3),A(4)
?
B(1,1),B(1,2),B(2,1)
?
B(4),B(5),B(6)
工作区中的显示结果为:
5HAPPY55
HELLO.F..F.
365.F..T.
注意:
字段变量是指存放在数据表中的数据项,内存变量是指存放单个数据的内存单元,数组变量是指存放多个数据的内存单元组。
4.系统变量
系统变量是由VisualFoxPro自身提供的内存变量。
系统变量名都以下划线开始,它与一般变量有相同的使用方法。
为避免与系统变量冲突,在定义内存变量和数组时,不要以下划线开始。
3.2运算符与表达式
3.2.1运算符
VisualFoxPro提供5种类型的运算符,包括算术运算符、字符运算符、日期及日期时间运算符、关系运算符和逻辑运算符。
1.算术运算符
算术运算符包括+(加)、-(减)、*(乘)、/(除)、%(取余)、**或^(乘方),其运算级别为先乘方,后乘除和求余,最后为加、减,有括号先算括号。
【例3.10】算术表达式的显示。
?
5+7&&显示结果为:
12
?
45/(4+5)&&显示结果为:
5
?
45%(7+5)&&显示结果为:
9
?
2*3**2&&显示结果为:
18.00
2.字符运算符
字符运算符包括+(完全连接)、-(不完全连接)和$(包含运算符)。
(1)+(完全连接):
连接两个字符型数据。
(2)-(不完全连接):
将前一字符型数据尾部空格移到后一字符型数据之后,再连接。
(3)$(包含运算符):
前一字符串是否包含于后一字符串,若包含于,则其结果为.T.,否则为.F.。
【例3.11】字符串连接运算(下述表达式中的“”代表空格)。
?
"计算机"+"考试"&&显示结果为:
计算机考试
?
"计算机"-"考试"&&显示结果为:
计算机考试
?
"BC"$"ABC123"&&显示结果为:
.T.
?
"B2"$"ABC123"&&显示结果为:
.F.
3.日期与日期时间运算符
日期运算由算术运算符“+”“-”完成。
“日期+整数”为增加整数天后的日期,“日期-整数”为减少整数天前的日期,“日期-日期”为两日期间的天数。
“日期时间+整数”为增加若干秒后的日期时间,“日期时间-整数”为减少若干秒前的日期时间,“日期时间-日期时间”为两个日期时间之间相差的秒数。
【例3.12】日期与日期时间运算符的使用及输出。
?
{^2015-07-07}+35&&显示结果为:
08/11/15
?
{^2015-07-07}-{^2015-01-01}&&显示结果为:
187
?
{^2015-07-078:
00:
00}+3600&&显示结果为:
07/07/1509:
00:
00AM
4.关系运算符
关系运算符包括>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、#或!
=或<>(不等于)、=(等于)、==(全等于)。
关系运算符由运算的先后顺序和括号来决定运算次序,关系比较的结果为逻辑值。
需注意的是,符号“=”(等于)在此表示比较运算符,不是赋值命令。
1)数值型数据的比较
这种比较按数值大小进行比较。
货币型、浮点型、双精度型、整型都与数值型类似。
2)字符型数据的比较
当两个字符串进行比较时,系统对两个字符串的字符自左向右逐个进行比较,一旦发现对应的两个字符不同,就根据这两个字符的排列顺序决定两个字符串的大小。
比较之前首先要设置字符的排列次序,VisualFoxPro提供了三种字符排序次序。
(1)Machine(机器)次序:
按照机内码顺序排序,即英文字符按照ASCII码值排序,汉字的一级汉字比二级汉字小,一级汉字内按汉语拼音顺序排序。
(2)PinYin(拼音)次序:
按照拼音次序排序。
对于英文字符而言,其顺序为:
空格<数字<小写字母<大写字母。
(3)Stroke(笔画)次序:
无论中文英文,都按照书写笔画的多少排序。
设置排序序列的具体操作:
选择【工具】|【选项】命令,打开【选项】对话框,在【数据】选项卡中的【排序序列】下拉列表框中选择排序序列后,单击【确定】按钮,如图3.1所示。
图3.1设置排序序列
用“==”(全等于)比较两个字符串时,只有当两个字符串完全相同时,运算结果才为.T.,否则为.F.。
用“=”(等于)比较两个字符串时,运算结果与命令SETEXACTON/OFF有关。
(1)SETEXACTON:
在较短的字符串尾部加上空格使两个字符串长度相等,然后再进行比较。
(2)SETEXACTOFF:
只要右边的字符串与左边的字符串的前面部分内容相匹配,结果即为.T.。
SETEXACT对字符串比较的影响如表3.1所示。
表3.1SETEXACT对字符串比较的影响
比较
=(EXACTOFF)
=(EXACTON)
==(EXACTOFF/ON)
"abc"="abc"
.T.
.T.
.T.
"ab"="abc"
.F.
.F.
.F.
"abc"="ab"
.T.
.F.
.F.
"ab"="ab"
.T.
.T.
.F.
"ab"="ab"
.F.
.T.
.F.
"ab"=""
.T.
.F.
.F.
3)日期型、日期时间型数据的比较
日期型、日期时间型数据按时间的先后顺序确定大小,时间在前的小,时间在后的大。
【例3.13】日期型、日期时间型数据运算举例。
?
{^2015-09-01,09:
09:
09}<{^2015-09-01,09:
09:
10}&&显示结果为:
.T.
?
{^2015-07-07}>{^2015-01-01} &&显示结果为:
.T.
5.逻辑运算符
逻辑运算符包括AND(逻辑与)、OR(逻辑或)、NOT(逻辑非),优先级别由高到低为NOT、AND、OR,运算规则如表3.2所示。
表3.2逻辑运算规则
A
B
NOTA
AANDB
AORB
.T.
.T.
.F.
.T.
.T.
.T.
.F.
.F.
.F.
.T.
.F.
.T.
.T.
.F.
.T.
.F.
.F.
.T.
.F.
.F.
注释
结果与A相反
只有当两个操作数都为真时,结果才为真,否则为假
当两个操作数之一为真时,结果就为真,否则为假
【例3.14】逻辑运算并输出其结果。
?
3>5.AND.6<7&&显示结果为:
.F.
?
"AB"<="XY".OR."3"$"35"&&显示结果为:
.T.
?
.NOT."春">"秋"&&显示结果为:
.T.
3.2.2表达式
表达式是由各种类型的常量、变量、函数和运算符组成的一个有意义的式子。
1.表达式的书写格式
(1)所有内容在一行内写完,写不完时用分号(;)续行。
(2)所有括号只能使用圆括号。
(3)乘除号不能省略。
(4)分子分母一般要括起来,以免产生歧义。
2.各类运算符的优先级
在每一类运算符中,各个运算符有一定的优先级。
不同类型的运算符也可能出现在同一个表达式中。
圆括号作为运算符,其中的内容作为整个表达式的子表达式,其结果首先要被计算出来,然后先执行算术运算符、字符运算符和日期运算符,其次执行关系运算符,最后执行逻辑运算符。
【例3.15】运算符综合使用举例。
?
5+4>9.OR."X"+"Y"$"XYZ".AND."56"<"23"&&显示结果为:
.F.
?
12*3>=50.AND..NOT."AB"-"B"$"BCA"&&显示结果为:
.F.
3.3常用函数
为了增强系统的功能和方便用户使用,VisualFoxPro提供了许多内部函数,每个函数可实现某项功能或完成某种运算,用户可以随时调用。
函数调用的一般形式为:
函数名([参数表])
其中,参数表用方括号括起来,表示有些函数不需要参数。
本节主要根据功能分类介绍一些常用函数。
根据函数返回值的类型,可以将函数分为数值函数、字符串函数、日期和时间函数、类型转换函数、测试函数等。
3.3.1数值函数
数值函数是指函数值为数值的一类函数,它们的自变量与函数值往往都是数值型数据。
1.求绝对值函数
命令格式:
ABS(数值表达式)
命令功能:
返回指定数值表达式的绝对值。
【例3.16】求绝对值并显示其结果。
?
ABS(-4*3)&&显示结果为:
12
?
ABS(2*6)&&显示结果为:
12
2.求算术平方根函数
命令格式:
SQRT(数值表达式)
命令功能:
返回指定数值表达式的算术平方根,数值表达式的值必须为非负数。
【例3.17】求平方根并显示其结果。
?
SQRT(2*5)&&显示结果为:
3.16
3.取整函数
命令格式:
INT(数值表达式)
命令功能:
计算一个数值表达式的值,并返回其整数部分。
【例3.18】取整并显示其结果。
?
INT(-4*3.2)&&显示结果为:
-12
?
INT(2*6.8)&&显示结果为:
13
4.取最大值函数
命令格式:
MAX(数值表达式1,数值表达式2,…)
命令功能:
比较几个表达式的值,返回其中最大的值。
【例3.19】取最大值并显示其结果。
?
MAX(18,-4*3.2,6)&&显示结果为:
18
?
MAX(MAX(10,2*6.8),-12)&&显示结果为:
13.60
5.取余数函数
命令格式:
MOD(数值表达式1,数值表达式2)
命令功能:
求数值表达式1除以数值表达式2的余数。
【例3.20】用求余函数求值并显示其结果。
?
MOD(12,8)&&显示结果为:
4
?
MOD(3,7)&&显示结果为:
3
6.四舍五入函数
命令格式:
ROUND(数值表达式1,数值表达式2)
命令功能:
根据数值表达式2指定的小数位求数值表达式1四舍五入后的值。
【例3.21】对给出的数做四舍五入处理,并显示其结果。
?
ROUND(365.467,2)&&显示结果为:
365.47
?
ROUND(365.467,4)&&显示结果为:
365.4670
?
ROUND(365.467,0)&&显示结果为:
365
?
ROUND(365.467,-2)&&显示结果为:
400
?
ROUND(365.467,-3)&&显示结果为:
0
注意:
若要求4位正整数X的每一位数字,相应的表达式可以是:
个位数字:
MOD(X,10)十位数字:
MOD(INT(X/10),10)
百位数字:
MOD(INT(X/100),10)千位数字:
INT(X/1000)
3.3.2字符串函数
字符串函数是处理字符型数据的函数,其自变量或函数值中至少有一个是字符型数据。
1.宏代换函数&
命令格式:
&<字符型内存变量>[.字符表达式]
命令功能:
用于代换一个字符变量的内容,即调用字符型内存变量,表达式中的“.”用于表示宏代换变量的结束。
【例3.22】宏替换函数的使用。
a1="abc"
abc="happy"
?
a1,abc&&显示结果为:
abchappy
?
&a1&&显示结果为:
abc
?
"&abcnewyear!
"&&显示结果为:
happynewyear!
2.求字符串长度函数
命令格式:
LEN(字符串表达式)
命令功能:
求字符串表达式的值,并返回字符串结果的长度。
【例3.23】求字符串的长度,并显示其结果。
?
LEN("爱我中华")&&显示结果为:
8
?
LEN("北京"+"奥运")&&显示结果为:
9
3.生成空格函数
命令格式:
SPACE(数值表达式)
命令功能:
产生由数值表达式结果指定数目的空格,返回结果为字符型。
【例3.24】空格函数的使用举例。
?