第2章 数据及其运算.docx
《第2章 数据及其运算.docx》由会员分享,可在线阅读,更多相关《第2章 数据及其运算.docx(64页珍藏版)》请在冰豆网上搜索。
第2章数据及其运算
第2章数据及其运算
数据是计算机管理和操作的对象,VisualFoxPro6.0中使用的数据都属于某种数据类型,每一种数据类型决定了本类型数据的取值方式和运算方式,可以依据数据的这种特性将数据划分为不同的类型。
VisualFoxPro6.0处理的数据可以分为常量、变量、函数和表达式四种形式。
本章主要介绍VisualFoxPro6.0系统中各种数据类型,以及数据的存储、表示方式和操作运算方法。
2.1数据类型
VisualFoxPro6.0的所有数据都有一个特定的数据类型,它定义了各种数据的允许值和这些值的范围及大小。
在定义了数据类型后,VisualFoxPro6.0就可有效地存储和操作该数据。
通常,VisualFoxPro6.0提供14种数据类型,其中可用于内存变量和数组的数据类型有:
数值型、字符型、日期型、日期时间型、逻辑型、货币型和对象型共7种;用于数据库表文件字段中的数据类型有:
数值型、字符型、日期型、日期时间型、逻辑型、货币型、浮点型、整型、双精度型、备注型、通用型、二进制字符型和二进制备注型共13种。
1.数值型
数值型(Numeric)数据是用来表示数量并可以进行算术运算的数据,如工资、奖金、成绩等。
它可由数字0~9、可选符号(+或-)、字母E和小数点(.)组成。
数值型数据的长度为1~20位,精度15位,多于15位的精度可能丢失。
数值型数据占8个字节。
其取值范围为:
-0.9999999999E+19~0.9999999999E+20。
数值型数据用N表示。
2.字符型
字符型(Character)数据一般用来表示不能进行算术运算的文本信息,如姓名、家庭地址等。
它由字母、汉字、数字、空格、符号和标点组成。
字符数据的长度为0~254位,每个字符占1个字节,每个汉字占2个字节。
字符型数据用C表示。
注意:
如果要表示不用于数学计算的文本信息,如:
学号、电话号码和邮政编码,尽管它们主要包含的是数字,但实际上最好还是表示为字符值。
3.日期型
日期型(Date)数据用来表示日期数据,如出生年月等。
日期型数据的显示格式有多种,它受系统日期格式设置的影响。
日期的默认格式是{mm/dd/yy},其中mm表示月份,dd表示日期,yy表示年份。
日期型数据的长度固定为8个字节,用D表示。
4.日期时间型
日期时间型(DateTime)数据用来表示日期和时间。
日期时间的默认格式是{mm/dd/yyhh:
mm:
ss},其中mm、dd、yy的意义与日期型相同,而hh表示小时,mm(时间中的mm)表示分钟,ss表示秒数。
日期时间型数据固定长度为8个字节(其中前4个字节保存日期,后4个字节保存时间)。
日期时间型数据用T表示。
5.逻辑型
逻辑型(Logic)数据用来表示只有两个值的数据,保存判断的结果是“真”还是“假”。
如性别、是否团员等。
存入的值只有真(.T.)和假(.F.)两种状态,固定长度为1个字节。
逻辑型数据用L表示。
6.货币型
货币型(Currency)数据用来表示货币值或精确金融计算,如金额等。
货币型数据只保留4位小数,小数位数超过4位时,VisualFoxPro6.0将四舍五入到四位。
每个货币型数据占8个字节。
其取值的范围为:
-922337203685477.5807~922337203685477.5807,并在数据前加上一个美元符号“$”前缀。
货币型数据用Y表示。
7.浮点型
浮点型(Float)数据的功能等同于数值型数据,主要是为了保持与其他开发软件和系统的兼容性。
浮点型数据只能用于数据库表文件中字段的定义。
其长度为1~20位,精度为15位,每个数据占8个字节。
浮点型数据用N表示。
8.整型
整型(Integer)数据用来表示不包含小数部分的数值型数据,以二进制形式存储,占用4个字节。
其取值范围为:
-2147483647~2147483646。
整型数据用N表示。
9.双精度型
双精度型(Double)数据用来表示具有更高精度的数值型数据。
它采用固定长度浮点格式存储,占用8个字节,其取值范围为:
±4.940654645841247E-324~±8.9884656743115E+307。
双精度型数据用N表示。
10.备注型
备注型(Memo)用于存储内容较多的文本信息,如个人的简历、产品的说明等。
它只能用于数据表中字段的定义。
长度固定为4个字节,并用这4个字节来引用备注的实际内容。
备注型数据存放在与表文件同名的备注文件(.FPT)中,长度根据数据的内容而定。
备注型数据用M表示。
11.通用型
通用型(General)数据用于存放OLE(对象链接与嵌入)对象的数据,如电子表格、文档、图片或声音等。
它只能用于数据表中字段的定义。
长度固定为4个字节,并用这4个字节指向真正内容。
OLE对象的实际内容、类型和数据量则取决于链接或嵌入OLE对象的操作方式。
如果采用链接OLE对象的方式,则表中只包含对OLE对象的引用说明,以及对创建该OLE对象的应用程序的引用说明;如果采用嵌入OLE对象方式,则表中除包含对创建该OLE对象的应用程序的引用说明,还包含OLE对象中的实际数据。
这时,通用字段存储OLE对象的大小仅受磁盘空间的限制。
通用型数据用G表示。
12.二进制字符型
二进制字符型(Characterbinary)数据的使用方法与字符型数据类似,只是这种数据可直接以二进制将字符存储在文件中,最多可存254个字符。
二进制字符型数据用C表示。
13.二进制备注型
二进制备注型(Memobinary)数据的使用方法与备注型数据类似,只是这种数据可直接以二进制将字符存储在备注文件中,占4个字节。
二进制备注型数据用M表示。
14.对象型
对象型数据是Windows应用程序中生成的对象,用O表示。
例如,VisualFoxPro6.0的主窗口对象为:
_SCREEN。
2.2常量与变量
在VisualFoxPro6.0中,常量和变量是数据运算和处理的基本对象。
在进行数据库操作时,需要掌握各种类型常量的表示方法,各种变量的命名、定义、赋值以及其他操作。
2.2.1常量
在操作过程中,始终保持不变的数据称为常量。
常量在命令或程序中可以直接引用。
常量一旦定义,其值就不再改变。
由于数据类型多种多样,VisualFoxPro6.0提供了6种类型的常量:
数值型、字符型、逻辑型、日期型、日期时间型和货币型。
1.数值型常量
数值型常量也就是常数,用来表示数量的大小,由数字0~9、正负号、字母E和小数点组成。
数值型常量可以是整数和实数,如9、-300、6.325等。
在VisualFoxPro6.0中,数值型常量有两种表示方法:
一种是小数形式,如-10.6、36.6;另一种是指数形式,即科学记数法,如-6.21E-5表示-6.21×10-5、3.56E6表示3.56×106。
数值型常量的长度包括正负号、整数位数、小数位数和小数点。
如,-3.2561长度为7位。
2.字符型常量
字符型常量也称为字符串,用半角西文单引号('')、双引号("")或方括号([])定界符括起来的字符串。
例如:
'VisualFoxPro6.0'、"计算机"、[3.1415926]。
VisualFoxPro6.0字符串的最大长度为254个字符。
定界符必须成对出现,并且是在英文状态下输入的定界符号。
当定界符本身作为字符型常量的一部分时,必须用另一种定界符括起来。
例如,"That'sright!
"或[That'sright!
]。
注意:
不包括任何字符的字符串称为空串("")。
空串与包含空格的字符串("")不同,前者长度为0,后者长度为空格的个数。
3.逻辑型常量
逻辑型常量表示逻辑判断的结果,只有逻辑真和逻辑假两种值。
逻辑真常量用.T.、.t.、.Y.、.y.表示;逻辑假常量用.F.、.f.、.N.、.n.表示。
注意字母前后的圆点不能缺少,否则就变成了变量。
4.日期型常量
日期型常量用来表示日期值。
必须用花括号({})括起来,花括号内包括年、月、日三部分内容,每部分内容之间可用分隔符(“/”、“-”、“.”或空格等)分隔。
VisualFoxPro6.0的默认日期格式是{mm/dd/yy},如{05/20/07}和{05/20/2007}都表示2007年5月20日这一日期常量值;{}或{/}表示一个空日期。
5.日期时间常量
日期时间型常量用来表示一个具体的日期与时间。
其写法与日期型常量类似,也必须用花括号括起来,只是在“年/月/日”后面加上“小时:
分钟:
秒”即可,例如:
{05/20/0710:
30:
23AM}表示2007年5月20日上午10时30分23秒。
日期值和日期时间值的输入格式与输出格式并不完全相同,特别是输出格式受系统环境设置的影响,用户可根据应用需要进行相应的调整和设置。
下面介绍VisualFoxPro6.0系统中的日期格式有关的命令和设置操作。
(1)日期格式中的世纪值
通常日期格式中用2位数表示年份。
如果将年份显示为4位世纪值,VisualFoxPro6.0提供了设置命令对其进行相应的设置。
格式:
SETCENTURYON|OFF
功能:
设置显示日期时是否显示世纪。
说明:
①ON:
以世纪值显示日期值的年份(4位)。
日期数据显示10位,年份占4位。
②OFF:
日期值年份的默认显示方式。
日期数据显示8位,年份占2位。
(2)设置日期显示格式
用户可以通过SETDATE调整、设置日期的显示输出格式。
格式:
SETDATE[TO]AMERICAN|ANSI|BRITISH|FRENCH|GERMAN|ITALIAN
|JAPAN|USA|MDY|DMY|YMD
功能:
指定日期的显示输出格式。
日期的默认设置是AMERICAN。
SETDATE命令只在当前数据工作期有效,即下一次系统启动时又恢复默认设置。
SETDATE的设置值以及日期格式如表2-1所示。
表2-1SETDATE的设置值及日期格式
设置值
日期格式
设置值
日期格式
AMERICAN
mm/dd/yy
ANSI
yy.mm.dd
GRITISH/FRENCH
dd/mm/yy
GERMAN
dd.mm.yy
ITALIAN
dd-mm-yy
JAPAN
yy/mm/dd
USA
mm-dd-yy
MDY
mm/dd/yy
DMY
dd/mm/yy
YMD
dd/mm/yy
(3)设置日期分隔符
格式:
SETMARKTO<字符>
功能:
设置显示日期时使用的分隔符,如/、-、.等。
如没有指定任何分隔符,则恢复系统默认的斜杠分隔符。
(4)设置严格的日期格式
通常日期型和日期时间型数据的结果与SETDATE命令和SETCENTURY命令的设置状态及当前系统时间有关。
同一数据的结果可能会因系统时间与相应设置的不同有不同的解释。
如日期值{8/6/10}可以解释为1910年8月6日、2010年8月6日、1910年6月8日、2010年6月8日或者1908年6月10日等。
这显然会导致系统混乱,甚至造成2000年兼容性错误,影响系统正常运行。
为了避免上述问题,VisualFoxPro6.0增加了一种所谓严格的日期格式。
不论哪种设置,按严格日期格式表示的日期型和日期时间型数据,都具有相同的值和表示形式。
严格的日期格式是:
{^yyyy-mm-dd[,][hh[:
mm[:
dd]][a|p]]}
其中,^符号表明该格式是严格的日期格式,并按照YMD的格式解释日期型和日期时间型数据,它是严格日期格式的标志,不可缺少。
有效的日期型和日期时间型数据分隔符为:
/、-、.和空格。
如{^2007-5-10}、{^2007-5-109:
10:
45AM},分别表示2007年5月10日及该日上午9时10分45秒。
VisaulFoxPro6.0默认采用严格的日期格式,并以此检测所有日期型和日期时间型数据的格式是否规范、合法。
格式:
SETSTRICTDATETO[0|1|2]
功能:
设置是否对日期格式进行检测
说明:
①0:
表示不进行严格的日期格式检测
②1:
表示进行严格的日期格式检测(默认值),要求所有日期型和日期时间型数据均按严格的格式。
③2:
表示进行严格的日期格式检测,且对CTOD()和CTOT()函数的格式也有效。
④若省略可选项,等价于1的设置。
实际上,日期型和日期时间型数据的各种格式,包括世纪值的年份格式、显示输出格式、分隔符及严格的日期格式除了可用命令方式实现外,还可以用菜单方式实现:
执行“工具”菜单中的“选项”命令,打开“选项”对话框,选择“区域”标签,在日期和时间区域对话中选择:
显示日期时是否显示世纪、输出格式及分隔符。
执行“工具”菜单中的“选项”命令,打开“选项”对话框,选择“常规”标签,单击展开“2000年兼容性”栏中的“严格的日期级别”下拉列表框,选择其中某个设置项,然后单击【确定】确认此格式设置。
6.货币型常量
货币型常量用来表示货币值,其书写格式与数值型常量类似,只要在前面要加上一个符号“$”即可。
例如,货币型常量$30.5,表示30.5元。
货币型常量在存储和计算时,系统自动四舍五入到小数4位,例如$35.56785,计算结果为$35.5679。
2.2.2变量
变量是在命令操作及程序运行过程中可以改变其值的数据对象。
在VisualFoxPro6.0中变量通常分为内存变量、字段变量和系统变量3种。
实际上,VisualFoxPro6.0作为面向对象的程序设计语言引入了对象的概念,在面向对象程序设计中,还有一种对象型变量,它主要用来在程序中定义、存取各种对象信息,是一种组合变量。
这将在第5章进行介绍。
变量的分类如图2-1所示。
图2-1变量的种类
2.2.2.1命名规则
变量通常须先定义后使用。
每个变量都有一个名称,叫做变量名,VisualFoxPro6.0通过相应的变量名来引用变量的值。
在VisualFoxPro6.0中所有操作对象均需命名以相互区别,VisualFoxPro6.0有以下的命名规则:
(1)由字母、汉字、下划线和数字组成。
(2)必须以字母、汉字或下划线开头。
除自由表中字段名、索引的TAG标识名最多只能10个字符外,其他的命名可使用1~128个字符。
(3)为减少误解、混淆,避免使用VisualFoxPro6.0中的系统保留字。
所谓系统保留字是指VisualFoxPro6.0语言使用的命令名、函数名等,例如,USE命令就是一个系统保留字。
2.2.2.2内存变量
内存变量实际上是内存中的一个存储区域,用来存储数据。
用户在使用它时,需定义内存变量的名称并给内存变量赋初值。
以变量名来对变量进行标识和引用,变量的值就存放在这个存储区域。
内存变量的类型有字符型、数值型、货币型、逻辑型、日期型和日期时间型等。
内存变量的类型与其中存放数据的类型密切相关。
使用内存变量应注意:
(1)内存变量建立后,其所存储的信息就一直留在内存中,直到用户释放该内存变量,或断电或离开变量的作用域才丢失。
(2)变量是按名访问的,如果当前表中的字段名与内存变量同名,在访问内存变量时,必须按如下格式访问内存变量:
M.<内存变量名>或M-><内存变量名>
否则系统将优先访问同名的字段变量。
(3)每个内存变量由变量名、变量属性、变量的类型及变量值等4部分组成,如图2-2所示。
图2-2内存变量的组成
在这个例子里,定义了A、B和C共3个内存变量。
变量属性定义了该变量的作用范围,详细介绍见第4章。
1.内存变量的建立
内存变量的建立就是给内存变量赋值,有两种赋值的方法:
格式1:
<内存变量>=<表达式>
格式2:
STORE<表达式>TO<内存变量表>
功能:
这两条命令的功能都是先计算表达式的值,然后将其值赋给指定的内存变量。
说明:
(1)格式1与格式2的区别,格式1每次只能给一个变量赋值,其中“=”称为赋值号,没有等号的含义。
格式2每次可以将表示的值依次赋值给TO后的多个变量。
(2)内存变量类型由所赋数据的类型决定。
(3)当多次给同一个变量赋值时,变量的值及其类型以最后一次赋的值为准。
(4)<表达式>的内容可以是常量、变量或用运算符连接起来的有意义的式子。
(5)格式1和格式2有计算赋值的双重功能。
例2.1内存变量的赋值示例。
VAR1="世界杯"&&该变量被赋一个字符串,其类型为C。
VAR2=3.5&&该变量被赋一个数值型数据,其类型为N。
STORE{^2007/05/01}TOVAR3 &&该变量被赋一个日期值数据,其类型为D。
STORE"hello"TOVAR4,VAR5,VAR6 &&VAR4,VAR5,VAR6三个变量被同时赋一个
&&字符串,变量类型都为字符型。
LG=.T.&&该变量被赋一个逻辑真值,其类型为L。
NAM=VAR2&&将VAR2中的值赋给变量NAM,其类型为N。
NAM1=VAR2+5&&先计算表达式的值为8.5,再将8.5赋给变量NAM1,其类型为N。
说明:
&&表示注释,其后的内容为对&&前的语句进行解释,目的是增加语句的可读性(下同)。
2.表达式值的显示
表达式值的显示就是将变量中存放的表达式的值显示在屏幕上。
表达式是指由常量、变量及函数构成的一个式子。
格式:
?
|?
?
<表达式表>[AT<列号>]
功能:
计算表达式的值,并将计算的值显示在屏幕上。
说明:
(1)?
表示从下一行的第一列开始显示结果。
(2)?
?
表示从当前行的当前列开始显示结果。
(3)<表达式表>表示可以是常量、变量或用运算符连结起来的式子。
当为多个表达式时,表达式之间要用半角西文标点逗号“,”分隔,命令执行时,遇到逗号空一格。
(4)AT<列号>:
为可选项,参数<列号>表示从指定列开始显示结果。
例2.2?
及?
?
的使用示例
?
VAR1,VAR4
世界杯hello &&从下一行显示VAR1,VAR4变量的值
?
?
VAR1,VAR2
世界杯8.5&&在上次显示结果后(当前行)显示变量的值。
?
VAR3
05/01/07
?
VAR4AT20&&从下一行的第20列位置显示变量的值。
hello &&显示结果
3.内存变量的显示
将变量中存放的表达式的值显示在屏幕上或打印机上或保存到磁盘文件中,来查看已定义内存变量的情况,包括变量名、数据类型和变量存储值。
格式1:
DISPLAYMEMORY[LIKE<通配符>][TOPRINTER|TOFILE<文件名>]
格式2:
LISTMEMORY[LIKE<通配符>][TOPRINTER|TOFILE<文件名>]
功能:
显示内存变量的当前信息,包括变量名、变量属性、变量类型、变量值。
说明:
(1)使用LIKE子句,只显示与通配符相匹配的内存变量。
通配符包括*和?
。
*表示任意多个字符,?
表示任意一个字符。
(2)DISPLAYMEMORY命令分屏显示内存变量,一屏显示不下会暂停显示,用户按任意键后再继续显示下一屏。
(3)LISTMEMORY命令一次显示所有与通配符相匹配的内存变量,一屏显示不下会自动翻屏。
(4)使用TOPRINTER或TOFILE<文件名>子句,则在显示内存变量的同时送打印机或指定的文本文件。
例2.3显示内存变量。
DISPLAYMEMORYLIKEVAR?
*显示结果如下:
变量名 变量属性变量类型 变量值
VAR1 Pub C "世界杯"
VAR2 Pub N 3.5(3.50000000)
VAR3 Pub D 05/01/07
VAR4 Pub C "hello"
VAR5 Pub C "hello"
VAR6 Pub C "hello"
4.内存变量的保存
将所定义的内存变量的各种信息全都保存到一个文件中,该文件称为内存变量文件。
其默认的扩展名为.MEM。
建立内存变量文件命令的格式为:
格式:
SAVETO<内存变量文件名>[ALLLIKE/EXCEPT<通配符>]
功能:
将所选择的内存变量存到内存变量文件中。
5.内存变量的恢复
内存变量的恢复是指将已存入内存变量文件中的内存变量从文件中读出,装入内存中。
格式:
RESTOREFROM<内存变量文件名>[ADDITIVE]
功能:
将所选择的内存变量文件中的内存变量恢复到内存中去。
说明:
可选项[ADDITIVE]表示不清除内存中现有的内存变量,再将内存变量文件追加到内存中去;否则,先清除内存中的内存变量,再将内存变量文件恢复到内存中去。
6.内存变量的清除
内存变量的清除就是把不需要的内存变量从计算机内存中清除,释放内存空间。
格式1:
CLEARMEMORY
格式2:
RELEASE<内存变量名表>|ALL[EXTENDED][LIKE<通配符>|EXCEPT<通配符>]
功能:
清除内存变量,释放内存空间。
说明:
(1)格式1清除所有内存变量。
格式2清除指定的内存变量。
(2)对于格式2,如果要在程序中清除包括公共内存变量在内的所有内存变量,需要加上EXTENDED子句。
(3)使用LIKE子句表示清除与通配符匹配的内存变量。
(4)使用EXCEPT子句表示清除与通配符不匹配的内存变量。
例2.4清除内存变量。
RELEASEVAR5
RELEASEALLLIKE?
?
?
6
DISPLAYMEMORYLIKEVAR?
*则显示结果如下:
VAR1PubC"世界杯"
VAR2PubN3.5(3.50000000)
VAR3PubD05/01/07
VAR4PubC"hello"
对比例2及例3的显示结果,变量VAR5,VAR6已被释放。
2.2.2.3数组
前面介绍的内存变量属于简单变量,如:
X、L、A1等,可以给简单内存变量赋一个值,也可以一次给多个变量赋一个相同的值。
但是在实际中存在这样的情况,如对学生成绩进行统计处理,要求求出平均成绩,例如:
有40个学生,我们把40个学生的成绩相加,然后再求出(总成绩/40)平均成绩,一般用N个变量存放成绩。
可以用简单变量解决此问题,但是若学生很多时,就太繁琐了,VFP为使问题变得简单和其它高级语言一样,可以使用数组。
数组也是一种内存变量,实际上是按一定顺序排列的一组内存变量,用一个名字代表。
如:
A1,A2,…A40表示从编号1顺序排列到40,用字母A表示数组变量的变量名。
则A8表示A数组中的第8个学生的成绩。
通过上面的讲解,可得出数组的定义。
1.数组的定义
数组是用一个统一的名字来代表按一定顺序排列的一组内存变量。
数组中的每一个变量被称为数组元素,并用下标进行标识。
数组必须先定义后使用。
定义数组包括定义数据名、维数和大小。
格式1:
DIMENSION<数组名1>(<数值表达式1>[,<数值表达式2>])[,<数组名2>(<数值表达式3>[,<数值表达式4>])……
格式2:
DECLARE<数组名1>(<数值表达式1>[,<数值表达式2>])[,<数组名2>(<数值表达式3>[,<数值表达式4>])……
功能:
格式1和格式2功能完全相同,用来定义一个或多个一维或二维数组。
说明: