第 2章,VFP语言基础
1 数据类型
2
3
4
5
运算符和表达式数据存储函数命令单词准备:
本章所用到的单词:
Store release set skip declare
dimension MDY/DMY/YMD century
memory exact caption space type
bottom bof fields top
第 2.1节
1
数据类型概念常用数据类型 (1)
字符型 (Character):
例:,China”,“类型,,[VFP],?12345?
数值型 (Numeric):
例,12345,-0.65,3.1416…
常用数据类型 (2)
日期型 (Date):
例,{^2006/01/01},{^2006-01-01},
{^2006 01 01},{},{/}
日期时间型 (DateTime):
例,{^2006/10/29 09:30:56}
常用数据类型 (3)
逻辑型 (Logical):
例,.T.,.t.(Truth);,F.,.f.(False);
,Y.,.y.(Yes);,N.,.n.(No)
货币型 (Currency,简写为 Y):
通用型 (General)
备注型 (Memo)
常量与变量:
前面所举的例子都是常量 。
常量:固定不变的量 。
举例:字符型常量,数值型常量,日期型常量,
逻辑型常量 …… 注意定界符 。
变量,可赋值,可变 。
变量的类型由所赋值的数据类型决定 。
赋值语句
X=.T.
A1=?hello,world!?
李明 =100
等号:一次给一个变量赋值
Store 0 to x,y,z
Store?money? to m
Store,一次可以给多个变量赋值第 2.2节
2
运算符和表达式掌握数值运算符及数值表达式:
17*3^2/7
58%2,58%3
输出的时候,逗号处显示为空格 。
58%2可以用函数 mod(58,2)代替 。
思考:如何判断一个数是否能被 3整除?
如何判断一个数是否是 5的倍数?
字符串运算及字符表达式:
‘ 中国 ’ +’ China?
VFP?+?6.0?+”数据库,
‘ 下雨 ’ +’ 天留人 ’
‘下雨 ’ -’天留人’
屏幕输出结果是:
– 中国 China
– VFP6.0数据库
– 下雨 天留人
– 下雨天留人日期运算符及日期表达式:
D-D &&两个日期之间相差的天数
D+N &&从 D开始,N天以后的日期
D- N &&从 D开始,N天以前的日期日期表达式思考题
设小王的出生日期为 x,小李的出生日期为 y。 x,y为日期型变量,今天的日期
(date())。 思考:
如何求小王的年龄?
小李和小王相差几岁?
从今天到五一还有多少天? ( 列出各表达式 )
关系运算符 /关系表达式 (1)
4>5,4<=5 &&.F.,T.
4!=5,4#5,4<>5 &&.T.,T.,T.
‘ a?>?b? &&.F.
字符 (串 )比较大小按字典顺序从左至右进行 。
在运算的时候,必须保证数据类型之间的一致 。
例如:
‘ abc?+123 &&表达式错误,因为类型不匹配 。
关系表达式
abc?
53?
127
{^2006/01/01}? {^2007/01/01}
ad?
你知道它们之间有什么关系吗?
关系表达式
关系运算符,>,=,<,<=,>=,
==,!=(#,<>),$
关系表达式:由关系运算符组成的表达式,
用来比较两个数据或表达式之间的关系。
对于不同的数据类型,比较的意义不同。
例如:
两个数值比较:比较大小
两个日期比较:比较年月日
字符串比较:比较顺序或是否存在包含关系 ……
关系运算符,=,==
在非精确匹配模式 (set exact off,默认 )下,只要等于号 (=)
右边字符串是左边字符串的前缀,则结果为,T.;
在精确匹配模式 (set exact on)下,要对应字符完全相等,
结果才为,T.,此时等于号 (=)相当于 ==。 精确比较运算符
==的比较结果与设置无关,需要字符串完全相等 。
‘foxpro’=’fox’,’foxpro’== ’fox’,’foxpro’ =’Fox’
set exact on
‘foxpro’=’fox’,’foxpro’== ’fox’ 显示结果是,.T.,F.,F.
.F.,F.
关系运算符,$(包含 )
字符串包含运算符 $:左边的字符串是否包含在右边的字符串当中 。 如果是,结果为真,T.; 否则为假,F.。
‘ foxpro?$?fox?,?fox?$?foxpro?
Fox?$?foxpro?
输出,.F.,T.,F.
要点:类型一致
关系运算符左右两边的数据类型必须保持一致。不同类型的数据之间不能进行比较。
今天天气鸡蛋
>
<
=

‘abc’>12 &&表达式错误,因为类型不匹配根据类型确定意义
(1)数值型数据?比较大小关系如,5+4>6 7! =3……
(2)日期型数据?依次比较年月日,按照数值大小比较如,date()<date()+1 {^2007/01/01}>{^2006/01/01}
由于日期比较的特殊性,出生日期越小,年龄越大
(3)字符型数据?比较字符在计算机内的排列顺序。
一级汉字按拼音顺序,字母、数字按 ascII码顺序排列。
如,’中国’ >’日本’ ’ a’<’b’ ‘9’>’1’……
设置不同的区别
大小写字母比较要注意:在 VFP中,存在一种设置,设置不同,大小写字母的排列顺序不同。
(1)拼音 (PINYIN)?’A’>’a’
(2)机内码 (MACHINE)?‘a’>’A’
(? Asc(‘a’)?97?asc(‘A’)?65)
Set collate to ‘machine’|’pinyin’
菜单方式,工具?选项?数据?排序序列字符串比较方法
在进行字符串的比较时,由于是比较排列顺序,系统会按字符串从左到右的顺序逐个比较,直至分出先后为止。
比如,’abc’<’ad’
很容易误解为长度比较,从而’ abc’>’ad’
又如,’127’<’53’
很容易误解为数值大小比较关系运算的结果
关系运算的结果将产生一个逻辑型常量:逻辑真值,T.(或逻辑假值,F.)。
比如,7+2<5?.F.
‘abc’$’abc123’?.T.
‘123’>’23’?.F.
date()<date()+1?.T.
127>’27’?错误的表达式关系运算小结
>,>=
<,<=
=,==
!=,#,<>
$
数值型 N 数值大小 是否相等日期型 D 日期大小 是否相等字符型 C 排列顺序
(从左到右 )
是否相等
(精确匹配 )
是否包含类型运算符思考题:
有如下命令序列,请写出结果:
store?5? to x,y
x=?abc?
x=?5?,x=?abc?,x,y
y=x+x &&能否简写为 2x?
set exact off
x,y,y=x,x=y,y==x
逻辑运算符 (1):
用 and,or和 not(或 !)连接的表达式,表达式的值为,T.或,F.
And?逻辑与 。 只有左右两边都为真,结果才为真,T.,否则为假,F.
Or?逻辑或 。 只要左右两边有一个为真,结果为真,只有都为假,才为,F.
Not?逻辑非 。 取反 。 将真值变假,假值变真 。
逻辑运算符 (2):
逻辑运算符优先级:
Not > and >or
Not?单目运算符,即只有一个表达式参与运算。一般来说:单目运算符优先级高于双目运算符。
在没有括号的情况下,先计算 and,后计算 or。
例如
性别 =‘男 ’ or 性别 =‘女 ’ and 成绩 >=60
如果没有优先级,从左到右计算,意义为:所有及格的学生。
由于 and>or,则表示:
所有男学生和及格的女学生。
思考题:
有关系模式:职工 (姓名 (C),性别 (C),部门
(C),工资 (N),工作日期 (D)),写出下面的逻辑表达式 (求年份,year(D型变量 )):
1)工龄不低于 5年且工资不超过 2000;
2)在,人力资源,部门工作的女职工;
3)姓名中有,成,字或不在,财务,部门工作。
逻辑运算符 (3):
1)工龄不低于 5年且工资不超过 2000;
Date()-工作日期 >=5 and 工资 <=2000
2)在,人力资源,部门工作的女职工;
部门 =‘ 人力资源 ’ and性别 =‘ 女 ’
3)姓名中有,成,字或不在,财务,部门工作。
‘ 成 ’ $姓名 or 部门 !=‘ 财务 ’
写出下列表达式的值:
1)? ‘ 127’ >’ 53’
2)? ‘ abcde?>?abd?
3)? 5+4^2!=21
4)a?+?b?=?a?-?b?
5)? 2006/02/01
表达式的优先关系第 2.3节
3
数据存储概念常量与变量:
前面所举的例子都是常量 。
常量:固定不变的量 。
变量,可赋值,可变?字段变量 &内存变量
在 VFP程序中,数据存储在变量,数组和表里面的字段中 。
变量分类:字段变量,( 一般,数组,系统 )
内存变量字段变量
字段变量,表中任何一个字段名都是一个字段变量 。 回忆上一章学过的,关系,
字段,记录,
例如,关系模式 students(学号,姓名,
出生日期 )中的字段变量有几个,分别是什么?
内存变量
内存变量,(如 x,y,z,a)我们给它赋什么值,它就具有相应的值和类型 。
如,x=5
y={^2006/01/01}
a=date()
这样的变量是由我们自己定义的,叫做一般内存变量;由系统定义的变量叫系统内存变量 。
变量的命名规则
变量必须先定义再使用 。
字段变量在建表的时候完成;一般内存变量在赋值的时候完成 。
变量的命名规则 P21,由汉字,字母,数字和下划线组成,但不能以数字开头 。
变量的赋值:
字段变量的值就是当前记录的相应值;
内存变量的赋值:
x=9 &&有几个内存变量,就有几条赋值语句 (一对一 )
store 9 to x,y &&可以同时给多个内存变量赋值 (一对多 )
内存变量与字段变量
当内存变量与字段变量同名时,优先 (默认 )访问字段变量,访问内存变量需特别说明 。 若在命令窗口输入如下语句:
Use book0
学号 =’ 050017’ &&赋值,定义内存变量 。
学号,m.学号,m->学号
*变量类型分别是字段变量,内存变量,内存变量 。
M即是 memory内存意思 。
思考题:
有语句序列:
Use 学生
store 0 to x,编号,num
x,编号,num
问:这里的 x,编号,num都分别是什么变量?
当内存变量与字段变量同名时该怎么区分?
用问号显示的时候到底是显示哪一个?
定义数组:
例:定义一个含 2个元素的一维数组 aa的命令为:
dime aa(2)
注,dimension可写为 declare,aa(2)可写为 aa[2]
例:定义一个 3行 3列的二维数组 m的命令为:
dime m(3,3)
数组也是一般内存变量 。 缺省值为,F.。 如果要改变数组的值要用赋值语句 =或 store。 详见 P24
数组的元素
dimension m(2),n(2,4)
*数组内存变量,m,n为数组名。
上例中 m有 2个元素,m(1),m(2);
n有 2行 *4列共 8个元素,n(1,1),n(1,2),
n(1,3),n(1,4),n(2,1),n(2,2),n(2,3),
n(2,4)
数组的赋值:
缺省 (默认,在定义时系统自动赋的值 )值为,F.
给数组的全部元素赋值,store 0 to m,n
*将 m的 2个元素和 n的 8个元素全部赋值为 0。
单个元素赋值,m(2)=4
n(1,1)=2
store 9 to n(1,3),n(2,2)
表的两种显示命令,
use book0 &&打开名为 book0的表
list &&显示此表中所有记录
list 姓名 &&显示 book0表中的所有姓名
go 3 &&指向第三条记录
disp &&显示当前记录 ( 即第三条 )
姓名 &&字段变量,姓名,的值 。
use &&关闭当前打开的表显示内存变量:
命令,list memory或 display memory。 例:
store 0 to u1,u2,num,au,aucc
list memory &&结果是?
disp memo &&结果是?
list memory like?u* &&结果是?
通配符 ’?’,任意一个字符;
’ *’,任意 0个或多个字符 。 若加了通配符则只显示自定义内存变量 。
清除内存变量
清除所有内存变量:
clear memory
或 release all
清除单个内存变量,release <变量名 >
第 2.4节
4
常用函数熟悉常用函数
数学里函数的表示,z=f(x,y);
z函数值或返回值; x,y自变量或参数; f
函数名
格式:函数名( [参数 1][,参数 2][,…] )
运用函数的时候一定要注意写括号 ()!
数值相关的函数 (1)
int(N),取整,只取整数位 ( 符号不变 )
round(N1,N2),四舍五入,精确到小数点后 N2位 (N2>=0)或精确到十位,百位,
千位 … (N2=-1,-2,-3… )
abs(N),取绝对值数值相关的函数 (2)
max(N1,N2… ),返回各表达式中的最大值
min(N1,N2… ),返回各表达式中的最小值
sqrt(N),求平方根 。
mod(N1,N2),等价于 N1%N2。 求余数,余数的正负号与 N2一致数值相关函数练习
例:已知内存变量 x=3.745,y=-0.9,z=118。 计算下列表达式:
求 x,y,z的最大,最小值;
求 x精确到 2位小数的值;
求 y的整数部分和绝对值;
int(x),round(x)的 结果是多少?
字符处理函数 (1)
&,宏替换函数。 替换 &后面的 C型数据的值。
即,去掉 C型数据的 引号 并带入到表达式中。
例,a=?120?
type(?a?),type(?&a?)
a+a,&a+&a
*结果分别是 C N
120120 240
字符处理函数 (2)
len(C) 返回 字符表达式 C的长度 (字符个数 ),返回值为数值型
space(N) 返回 N个空格组成的字符串
lower(C),upper(C) 分别将字符表达式 C
转换成小写和大写字母字符处理函数 (3)
trim(C),rtrim(C) 返回字符表达式 C去掉右边空格形成的字符串
ltrim(C)返回字符表达式 C去掉左边空格形成的字符串
alltrim(C)返回字符表达式 C去掉全部空格形成的字符串字符处理函数 (4)
substr(C,N1[,N2]) 从 C的第 N1个字符开始取
N2长度的子串
left(C,N) 从 C的左端取长度为 N的子串
right(C,N) 从 C的右端取长度为 N的子串
at(C1,C2[,N]) 求字符串 C1在字符串 C2中第 N
次出现的位置,默认时 N=1; 若 C1不是 C2的子串,返回 0。 函数值为数值型
At()函数练习
at(?0?,?12030?,1) &&结果是 3
at(?0?,?12030?,2) &&结果是 5
atc(C1,C2[,N])在测试中不区分字母大小写
at(?a?,?12Aaa030?,1) &&结果是 4
atc(?a?,?12Aaa030?,1) &&结果是 3
日期和时间函数,
date() 返回当前系统日期,函数值为日期型
datetime() 返回当前系统日期时间,函数值为日期时间型
year(D|T),month(D|T),day(D|T) 分别从指定的日期 D或日期时间表达式 T中返回 4位年份,
月,日类型转换函数 str()(1)
str(N[,N1][,N2]),数值 N转换成长度为 N1,小数位数为 N2的字符串 。
N1,转换后字符的长度 。
小数点和负号都计做一位 。
指定长度 >所需长度,自动在前面加空格 。
指定长度 <所需长度,返回 N1个星号 (*),表示数值溢出 。
省略长度,则默认长度为 10。
类型转换函数 str()(2)
N2,指定返回字符串中的小数位数 。
指定位数小于实际位数,则返回值四舍五入 。
指定位数大于实际位数,则加 0补齐 。
省略小数位数,默认为 0。
str()函数练习
Len(str(123.51)),str(123.51)
len(str(123.51,6)),str(123.51,6)
len(str(123.51,2)),str(123.51,2)
结果是,10 124
6 124
2 **
‘ 季度 ’ +1 &&会出错,为什么?
‘ 季度 ’ +str(1,1) 或者? ‘ 季度 ’ +?1?
字符串转换成数值 val()
val(C):从左到右返回字符表达式中的数字,直到遇到非数值型字符时为止 。
若字符表达式的第一个字符不是数字,
也不是正,负号,则返回 0。
例,a='123'
Val(a)+3 &&结果是 126
字符与日期的转换
ctod(C) 字符转换成日期
读作 C to D
dtoc(D) 日期转换成字符
读作 D to C
测试函数 (1)
iif(L,U1,U2) 测试逻辑表达式 L的值,若为真,
函数返回 U1的值,否则返回 U2的值 。 U1,U2表示任意类型表达式
type(<字符表达式 C>) 测试表达式的类型
e.g.有分支函数 y= 2*x%3+5 x>=0
5-2*x x<0
则 y=iif(x>=0,2*x%3+5,5-2*x)
测试函数 (2)
found(),如果 locate,continue,seek等查找记录的命令成功 ( 即找到了记录 ),该函数返回,真,(.t.),否则返回,假,(.f.)。
例,locate for 姓名 =‘ 桌子 '
found(),eof()
&&如找到记录,显示结果为,T.,.F.否则为,F.,.T.
消息框函数:
messagebox('really?',2+64+256,'null')
messagebox('realy?'+chr(13)+'ok',;
2+64+256,'null')
注意选择与显示的结果
*不可以省略,与 message()冲突表相关函数 (1)
bof(),判断记录指针是否处于文件首 begin of
file,值为逻辑型 。 这里所说的文件首,并非是指第一个记录,而是第一个记录的前面 。
eof(),判断记录指针是否处于文件尾 end of file,
函数值为逻辑型 。 这里所说的文件尾,并非是指最后一个记录,而是最后一个记录的后面,
即没有记录 。
表相关函数 (2)
recno(),当前记录的记录号 。
recount(),表中所有记录总数 。 可以简写为 4
个字母 。
刚打开一个表的时候,bof(),eof(),recno()函数的值分别是,F.,.F.,1。
试一下:打开一个空表 (只有结构,没有记录 ),
4个函数的函数值分别是多少?
表相关函数练习
use 学生
go 3
recno()
go top
bof()
skip –1
bof()
go bottom
recno(),recount()
eof()
skip
eof()
假设学生表一共有 20
条记录。
第 2.5节常用命令的写法
5
掌握常用输出命令 (?/)
例如,在命令窗口输入以下命令,
,China”
,,I love u”
12+34
‘ 12’ +’ 34’
*屏幕显示结果如下:
China,I love u
46
1234
‘?’ 表示换行并输出; ‘’ 表示不换行输出 。
命令语句写法练习:
若在命令窗口输入如下语句是否正确?
1) x=5,y=7
2)? store 0 to x,y,z
3) {^2006-02-01}
4) x=.F.
store x+10 to y
表的常用操作命令:
use book0 &&打开名为 book0的表
list &&显示
list 姓名 &&显示 book0表的姓名
go 3 &&指向第三条纪录
disp &&显示当前纪录 ( 即第三条 )
姓名 &&显示当前纪录的姓名
use &&关闭表小结 (1)
命令 =命令动词 +子句
1)范围子句,next/all/rest
2)字段选择子句,fields
3)条件子句,for
小结 (2)
命令字必须以动词开头,且可以简写为前四个字母;
一行写不下时,可以用分号隔开并回车换行;
每行只能写一条命令;
每写完一条命令必须回车,每一个单词 (或命令字 )之间必须用空格隔开;
大小写等效