1、第3章 Visual FoxPro的基本语法,教学目标,掌握VFP中数据类型及变量的分类; 掌握变量的命名及表达式运算; 掌握内存变量的操作; 熟悉VFP函数的使用。,双语课堂 C,重点与难点:数据及变量的类型;使用逻辑表达式描述复合条件;类型转换函数及状态测试函数。,3.1 常量与变量,一. 常量,表示一个具体的、不变的值。不同类型的常量有不同的书写格式。,1.字符型常量 用定界符(单引号、双引号和方括号)括起来的字符串。可以是26个英文大小写字母、10个阿拉伯数字、各种汉字、专用符号和空格等,最大长度可达254个字符。 示例:“ade”, 568 ,“book的中文意思是书。” 注意:如果
2、将阿拉伯数字定义为字符串时,它不具备数学上的数值含义,不能参加数学运算,如电话号码,邮编等。 注意:字符定界符必须成对的出现。如果字符串中包含一种定界符,则必须用另一种定界符括起来。如:“计算机”,双引号为字符定界符,其中的方括号为字符串。,例如:在主窗口中显示几个字符常量,?“计算机”,123,数据,ABX “abc” ? “学习”,字符串,“ ”,表示方法注意,不包括任何字符的字符串(“”)叫空串.空串与包含空格的字符串(“ ”)不同.,2. 数值型常量 用来表示一个数量的大小,可以进行算术运算。包含09的阿拉伯数字、小数点与正负号,最大长度为20位。 示例:538, 10.5, 5.87
3、E12, 1.6E12,3. 逻辑型常量 只有逻辑真和逻辑假两个值, 逻辑真的表示形式有:.T.、.t.、.Y.和.y. 逻辑假的表示形式有:.F.、.f.、.N.和.n. 逻辑型数据长度固定为1位,占用1个字节。,4. 日期型常量 表示一个确切的日期,用大括号作为定界符。 1) 传统的日期格式:mm/dd/yy,受设置命令的影响。 2) 严格的日期格式:YYYY-MM-DD,不受设置命令的影响,能表达一个确切的日期。 示例:10/08/06,2006-08-06 严格的日期格式可以在任何情况下使用,而传统的日期格式只能在SET STRICTDATE TO 0 状态下使用。,3)影响日期格式的
4、设置命令 SET MARK TO 日期分隔符 SET DATE TO ymd mdy 等 SET CENTURY ON | OFF &设置年份位数 SET STRICTDATE TO 0 | 1 ,&是否进行严格的日期格式检查,0: 检查 严格日期格式,1: 不检查 传统日期格式,2: 检查,并且对CTOD( )和CTOT( )也有效,5. 日期时间型常量 包括日期和时间两部分内容,用来描述日期和时间。 示例:05/16/99 12:00:00,6.货币型常量 用来表示货币值,在数字前加一个符号($)。存储和计算时采用4位小数,多余小数位四舍五入。 示例:$123.4567,二. 变量,在使用
5、过程中其值可以改变的量。VFP的变量分为字段变量和内存变量两大类。内存变量又包括简单内存变量、系统内存变量和数组变量。,1. 字段变量字段变量对应于数据表中的字段,是在建立数据表文件时定义的,数据表中的每一个字段都是一个字段变量,以字段名标识。字段变量必须依附于数据表,存在于数据表文件中,随着数据表的打开而生效,随着数据表的关闭而撤消,,2. 简单内存变量内存中的一个存储区域,是一种临时工作单元,常被用来存储所需要的常数、中间结果或最终结果。变量名由汉字、字母、数字和下划线组成,必须由字母或汉字开头。,(1)内存变量的命名规则: 由字母、汉字、数字或下划线组成。 以字母、汉字或下划线开头。 长
6、度为1128个字符,每个汉字占两个字符。 不能使用VFP的保留字。 当内存变量名与字段变量名相同时,字段名优先于内存变量名,使用时可以在内存变量名前加上M .(或M)以示区别,但赋值时不能使用前缀。例: ? M . 姓名 & 表示内存变量,内存变量的赋值命令,STORE TO ,格式一,命令动词,去向子句,包含值的表达式,接收值的变量名表,STORE 0 TO AA,BB,CC &数值0赋给变量AA,BB,CC STORE “李磊” TO NAME &字符串“李磊”赋给NAME,例,格式二,=,接收值的变量名,赋值操作符,包含值的表达式,例,A=.T. 将逻辑真值赋给变量A,功能注释: (1)
7、等号一次只能给一个内存变量赋值。 (2)Store命令可以同时给若干个变量赋予相同的值,各内存变量名之间必须用逗号分开。 (3)在vfp中,变量使用之前并不需要特别的声明和定义。(4)内存变量在赋值时定义了它的值及类型,其类型与所赋值的类型相同。 (5)命令后的符号&,表示该符号后跟随的是本命令行的注释,与命令执行无关。,3. 内存变量的显示; 命令格式一 LIST MEMO TO PRINTDISPLAY MEMO TO PRINT 例 list memo 命令格式一 ?/?功能计算表达式的值,并将其显示在屏幕上。 ?表示从屏幕下一行的第一列显示结果 ?表示从当前行的当前列显示结果 例如:
8、S=“visiual” P=“ foxpro” ?s ? p,例如 在命令窗口键入的命令和主屏显示的内容如下:,s=“vfp” &用字符串vfp赋给变量S,结果S的值为vfp,并成为字符型变量 y=500 &用数值型常量500赋值内存变量 stor 24 to x1,x2 &对两个内存变量赋相同的值 stor .t. to q &用逻辑常量赋值内存变量q?s,y,x1,x2,q,2. 数组,数组 是按一定顺序排列的一组内存变量,数组中的各个变量称为数组元素。每个数组元素可通过数组名及相应的下标来访问。数组必须先定义后使用。说明:由若干单下标变量组成的数组称为一维数组,由若干双下标变量组成的数组
9、称为二维数组。在Visual FoxPro 中,只允许使用一维数组或二维数组。 一维数组:各个元素按线性排列; 二维数组:类似于一个数据表,第一维是行,第二维是列。,定义数组,在使用数组时一定要先定义 ,有两条命令可以定义数组。,DIMENSION (,), (,),DECLARE(,), (,),功能:定义一个或多个一维或二维的内存变量数组。 参数描述:DIMENSION和DECLARE为定义数组的命令动词。 :指定数组的名称,其规定与内存变量名相同。(,):定义数组的维数和大小 。 说明:1、数组的下标的起始值为 。2、同一数组中的数组元素可以有不同的数据类型 。3、二维数组中各元素按行的
10、顺序依次排列 。,4、每个数组占用一个内存变量 。 5、除了可以分别对数组元素赋值以外,也可对数组中的所有元素赋同一初值。 6、DIMENSION和DECLARE功能完全相同,常用DIMENSION。例如: DIMENSION (,), (,)DIMENSION A (2,3), B(4,8)也可以一次只定义一个数组: DIMENSION A(2,3) 也可以只定义一维数组: DIMENSION A(6),(2)示例:dimension x(5),y(2,3),一维数组x含5个元素:x(1),x(2),x(3), x(4) x(5). 二维数组Y含6个元素: y(1,1),y(1,2),y(1
11、,3),y(2,1),y(2,2),y(2,3) 可以用一维数组表示二维数组分别为:y(1),y(2),y(3),y(4),y(5),y(6),数组元素的赋值操作,STORE TO ,格式一,命令动词,去向子句,包含值的表达式,接收值的数组名或元素,STORE 0 TO A 将数值0赋给数组A的所有元素 STORE “李磊“ TO A(2,1) 将字符串“李磊”赋给数组A的第2行第1列的元素。,例,格式二,=,接收值的数组名或元素,赋值操作符,包含值的表达式,例,A=.T. 将逻辑真值赋给数组A的所有元素,【例2.3】定义数组,并给数组赋值。 DIMENSION Y(3), X(2,2) Y=
12、123 X(1,1)=345 X(1,2)=“abc“ X(2,1)=2003-03-25 X(4)=.T. ? Y(1),Y(2),Y(3),X(1),X(2),X(3),X(4),3.2 运算符与表达式,运算符:是对数据对象(操作数)进行操作运算的符号。运算符以其结果的类型分组有如下五类 :算术运算符 关系运算符 逻辑运算符 字符串运算符 日期运算符 1、算术运算符:操作数和运算的结果都是数值 (1) + 加号 (2) - 减号 (3) * 乘号 (4) / 除号 (5) 或* 乘方 (6) % 余数 %取模,取两数相除的余数 ?17%5 结果为2 和* 乘方 ?23 结果为8 运算的顺序
13、:是先乘方-乘除-加减,若有括号先内后外。,4.关系运算符:小于()、等于(=)、不等于(、#或!=)、小于等于(=)、字符串包含($)、字符串精确比较(= =)。,说明:(1)运算符= =和$仅适用于字符型数据。其他运算符适用于任何类型的数据,但前后两个运算对象的数据类型必须一致。 数值型和货币型数据比较: 按数值的大小比较,包括负号。 日期或日期时间型数据比较:越早的日期或时间越小,越晚的日期或时间越大。,注意:关系运算符两边操作数类型必须一致,比较的结果是逻辑植。数值数据按数值大小比较 ?56(f) 日期型数据按年月日的先后进行比较?12/31/9912/31/01(f) 字符型数据是按
14、相应位置上两个字符的ASCII码值进行比较 “ABC”AAAA”(T), “ABC”=“AB”(T)“ABC”= =“AB”(F),:包含,左串是右串的子串为真?BC$ABCD (T),3、 逻辑运算,运算结果是逻辑值 NOT(!):取反运算,即:NOT .T.=.F. NOT .F.=.T.AND. 逻辑与 .T.AND”ABC”AB” (T) .OR. 逻辑或 .T.OR34 (T)4、字符运算符 :用于连接两个字符串 :用于连接两个字符串,并将前面一个字符串尾部的空格移到结果字符串的尾部。 例如:a=hello b=everyone!?a+b, a-b,例:使用逻辑表达式描述复合条件 条
15、件一:“自动化专业的女团员”专业 “自动化” AND 性别=女 AND 团员 条件二:“未婚的女职工”NOT 婚否 AND 性别=女 条件三:“职称为工程师或部门为技术科的男职工” (职称=“工程师” OR 部门=“技术科”) AND 性别=男,例如: “ABCl23”+“666xyz”连接后结果为:“ABCl23666xyz“ “计算机”+“世界” 连接后结果为:“计算机世界”“ABC ”-“DEFG” 连接后结果为:“ABCDEFG “ “ABC ”“DEFG” 连接后结果为:“ABC DEFG “,“+”运算符与“”运算符的区别:,+,5 日期时间表达式的格式,2001-03-19+10
16、 2001-03-19-365 2001-03-19 12:10:10-2001-03-19 11:10:10 2001-03-19 10:10:10am+10 设置日期格式的几个命令: Set strictdate to 0 严格日期的格式 Set strictdate to 1 传统日期的格式 Set century on/off 年份前含有世纪/不含世纪,算术运算符,最高级,*或(乘方),*、/、和%(乘、除和余数), 和 (加和减), 和 (直接连接和去空连接), 和(加和减),日期运算符,关系运算符,、=、=、#、!=、$、=,各运算符优先级相同,次高级,逻辑运算符,NOT或!(逻辑
17、非),AND(逻辑与),OR(逻辑或),最低级,字符串运算符,例如:数值表达式,?(1/60-3/56)*18.54 ?(1+2(1+2)/(2+2) ?15%4 Stor 122 to x,y Z=73 ?x%z,mod(x,z),混合表达式中, 算术运算符优先于关系运算符,关系运算符优先于逻辑运算符。,例如:“ABC”$”AD”OR(1+2)366,3.3 Visual FoxPro的常用函数,函数名起标识作用;参数是自变量,写在括号内,当有多个参数时,各个参数之间用逗号分隔;括号中没有参数的函数称为无参函数。每个函数运算后都会返回一个值,称为函数值,无参函数也不例外,函数值会因参数值而异
18、。,函数的三个要素:,函数名 参数 函数值,函数名(参数1,参数2),函数的一般格式:,1.宏替换函数,格式:&. 示例:aa=“bb”bb= “北京”?aa, bb, &aa?“&bb.是中国的首都” &用“ .”作为内存变量的结束符n=“567.83”?356.08+&n 注意:如果&后不跟有效的内存变量名,则&只是一个字符,一. 字符处理函数,2.计算字符串长度函数LEN(),格式:LEN() 示例:? LEN(“x+y=?” ) & 结果为5?LEN(“Visual FoxPro程序设计“) & 结果为21,3 .生成空格函数SPACE(),格式:SPACE() 示例:?“湖北”+SP
19、ACE(3)+“武汉” & 湖北 武汉,取左子串:LEFT( , ) 取右子串:RIGHT( ,) 取任意子串:SUBSTR( , ,),“12345. 6789”,“789”,“1234”,“5. 6”,? RIGHT( C , 3 ),变量C,?LEFT( C , 4),?SUBSTR( C , 5 , 3 ),4.截取子串函数,格式:AT(,) 功能: AT(,)返回在中第一次出现的起始位置。 AT(, ) 返回 在中第n次出现的起始位置。,“This is a example.”,? AT( is , C),? AT(is , C , 2),3,6,变量C,5.求子串位置函数,7.重复
20、字符串函数REPLICATE(),格式:REPLICATE( ,) 示例:? REPLICATE(*, 3) & *,6. 计算子串出现次数函数 OCCURS( ),格式:OCCURS(,) 示例: ? OCCURS (“is“,“This is a example“) & 结果为3? OCCURS (“as“,“This is a example“) & 结果为0,8字符串替换函数STUFF( ),格式: STUFF(,,)示例: ? STUFF(“computer“,3,4,”abc”) & 结果为”coabcer” ? STUFF(“computer“,3,1,”abc”) & 结果为”
21、coabcputer”,9. 字符替换函数 CHRTRAN( ),格式:CHRTRAN (,) 示例: ? CHRTRAN (“ABACAD“,”ACD”,”X12”) & 结果为”XBX1X2”? CHRTRAN (“计算机ABC“,”计算机”,”电脑”) & 结果为”电脑ABC”,10. 字符串匹配函数 LIKE( ),格式:LIKE (,) 示例: ? LIKE (”AB*”,”ABCDEFG”) & 结果为.T.,11. 删除前后空格函数,格式:TRIM()LTRIM()ALLTRIM() 示例:SS=SPACE(1)+“TEST”+ SPACE(3) ?TRIM(SS)+ LTRIM
22、(SS)+ALLTRIM(SS) &TESTTEST TEST ?LEN(SS), LEN(TRIM(SS) & 8 5 ?LEN( LTRIM(SS), LEN(ALLTRIM(SS) & 7 4,12. 大小写字母转换函数,格式: LOWER()UPPER()示例: ? LOWER(“AaBbCc”) & 结果为aabbcc? UPPER(“Visual FoxPro“)& 结果为VISUAL FOXPRO,1.绝对值和符号函数,格式: ABS()SIGN()示例: ? ABS(3.456) & 结果为3.456? ABS(-12*5) & 结果为60,二. 数值处理函数,2. 求整数函数
23、 3. 平方根函数 4. 自然指数函数 5. 对数函数 6. 圆周率函数 7. 四舍五入函数 8. 求模(余数)函数 9. 正弦函数 10. 余弦函数 11. 求最大值和最小值函数 示例:,1.系统日期和时间函数,格式:DATE()TIME()DATETIME() 示例:?DATE(), TIME(), DATETIME()& 07/05/06 14:38:06 07/05/06 02:38:06 PM,三. 日期和时间函数,2.求年份、月份和天数函数,格式:YEAR( | )MONTH( | )DAY( | ) 示例:? YEAR(DATE( ) & 2006? MONTH(DATE( )
24、& 7? DAY(DATE( ) & 5假设当前日期为2006年7月5日,CMONTH(|) 功能: 以英文形式输出日期型表达式或日期时间型表达式中的月份。,3.字符月份函数,DOW() & 返回17的数值CDOW() & 返回英文形式的星期注意:一个星期的第1天为Sunday,4.星期函数,1.求ASCII函数:格式: ASC()返回中的第一个字符对应的ASCII码值。 2. 求字符函数:格式:CHR() 返回ASCII值为的字符。,字符(C),字符的ACSII码(N),ASC,CHR,四. 数据类型转换函数,格式:STR(,为转换后的字符串位数,该长度包括小数点、负号。如果缺省和,其输出结
25、果将取固定长度为10位,且只取其整数部分;(2):若的设定值大于实际数值的小数位,则转换后的字符串后补0,若的设定值小于实际数值的小数位,则对小数四舍五入;若缺省,则转换后为整数,原小数部分四舍五入;,3. 数值型向字符型转换函数,(3)如果值大于给出值的数字位数时,在返回的字符串左边添加空格; (4)如果值小于值的整数部分位数,将返回一串星号,表示数值溢出。,示例:n=1234.56789? STR(n, 8, 2) & 结果为 1234.57?STR(n, 8) & 结果为 1235?STR(n, 8, 4) & 结果为1234.568?STR(n, 12, 6) & 结果为 1234.5
26、67890?STR(n) & 结果为 1235? STR(n, 3) & 结果为* * *,4.字符串转换成数值函数VAL(),格式:VAL() 说明: (1)的值必须是数字形式的字符串,它只能含有数字、正负号和小数点; (2)转换时,如果遇到非数字字符则停止。如果字符表达式的第一个字符即非数字字符,则转换停止,其值为0.00 ; 示例: ? VAL(“-789.123”) & 结果为-789.12 ?VAL(“10A.56“) & 结果为10.00 ?VAL(“C346.05“) & 结果为0.00,格式:CTOD()CTOT() 说明:(1) 必须是一个有效的日期格式;(2) 中的日期部分
27、格式要与SET DATE TO命令设置的格式一致。,5.字符串转换成日期或日期时间函数,示例:SET DATE TO YMDSET CENTURY OND1=CTOD(“2006/03/08”)T1=CTOT(“2005/03/08” + “ ”+TIME()?D1, T1 & 2006/03/08 2006/03/08 10:12:25 AM,6.日期或日期时间转换成字符串函数,格式: DTOC(), 1)TTOC(), 1 ) 说明:(1) 字符串日期部分的格式与SET DATE TO命令的设置有关;时间部分的格式与SET HOURS TO 12|24命令的设置有关。(2)如果有,1选项,
28、对于DTOC,按照YYYYMMDD的格式输出;对于TTOC,则按照YYYYMMDDHHMMSS的格式输出,采用24小时制。,格式:TYPE()VARTYPE() 说明:函数返回值为字符型,各字符含义如下:,数据类型测试函数,示例:A=567? TYPE(“A”) & N? VARTYPE(A) & N,值域测试函数 格式: BETWEEN(,,) 功能:判断一个表达式的值是否介于另外两个表达式的值之间。当值大于等于且小于等于时,函数值为逻辑真 .T. ,否则函数值为逻辑假 .F.。如果或有一个是NULL值,那么函数值也是NULL值。 例 : x=76? BETWEEN(x,70,80) & 结
29、果为.T.,表达式测试函数 格式: INLIST (,) 功能:测试表达式1的值是否与后面表达式的值相匹配。若表达式1的值是其余表达式值之一,函数值为逻辑真“.T.”,否则函数值为逻辑假“.F.”。,3.4 VFP的命令结构与书写规则,命令动词+修饰子句,命令结构,示 例: USE XS &打开名为XS的表文件 COUNT ALL FOR 成绩60 &统计XS中分数在60分以下的人数 LIST ALL 姓名, 成绩 FOR 成绩60 TO PRINTER&在打印机上输出成绩为60分以下的学生的姓名和分数 USE &关闭表文件XS,将其保存在磁盘上,Visual FoxPro 命令的一般格式,
30、; ;FOR;WHILE;TO FILE TO PRINTERTO;ARRAY TO ;ALL LIKE EXCEPT ;IN ,各部分的意义,命令动词:VFP的命令名,指示计算机要完成的操作 。,表达式表:规定命令可处理的字段。,范围:指定命令所作用的记录范围。范围有下列五种选择:,ALL 当前表中的全部记录。 NEXT 从当前记录开始的连续N条记录。 RECORD 当前表中的第N号记录。 REST 从当前记录开始到最后一条记录为止的所有记录。 缺省: 在不同的命令中含义不同,等价于ALL或仅作用于当前记录。,NEXT 3,REST,ALL,当前记录指针,RECORD 3,范围示例:,各部分
31、的意义,FOR :规定只对满足条件的记录进行操作 。,WHILE :从当前记录开始,按记录顺序从上向下处理,一旦遇到不满足条件的记录,就停止搜索并结束该命令的执行。(WHILE 子句比FOR子句优先),TO子句:控制操作结果的输出去向。,学号 课程号 成绩 030101 01 76 030103 01 87 030102 01 67,学号 课程号 成绩 030101 01 76,List for 课程号 01,List while 课程号 01,FOR 与WHILE的区别,命令书写规则,1)必须以命令动词开头,其后子句的顺序可以任意。 2)命令动词、修饰和限制子句之间要用空格分开。 3)命令动
32、词可以缩写为前四个字符,并且命令动词中的英文字母不区分大小写。 4)变量名、字段名和文件名应避免使用保留字, 以免产生错误。 5)一行只能写一条命令, 若分多行书写,必须使用续行符“ ; ” 。 6)每条命令以回车健作为结束标志。,符号的约定 位于该符号中的内容是可选项。书写时符号本身不输入位于该符号中的内容是必选项。书写时符号本身不输入 表示如果 中的内容被选中,则中的内容为必选项 | 表示或者,即根据需要从该符号紧邻的前后两项中,只能选择其中的一项. 表示该符号前面的内容可重复多次,Visual FoxPro的文件类型 数据库文件 (1)数据库文件 扩展名为DBC,DCT和DCX。 (2)
33、表文件 扩展名为DBF和FPT。 (3)索引文件 复合索引文件:CDX,单一索引文件:IDX。 文档文件 (1)表单文件 扩展名为SCX和SCT (2)报表文件 扩展名为FRX和FRT (3)菜单文件 扩展名为MNX和MNT (4)项目文件 扩展名为PJX和PJT 程序文件 (1)源程序文件 (PRG 、MPR、QPR ) (2)编译后的程序文件 (FXP 、MPX 、QPX (3)应用程序文件。 (APP、EXE),本章小结,双语课堂 C,本章主要讲述了Visual FoxPro中的数据类型、常量、变量、函数和表达式,它们是构成命令和程序的基本元素。其中常量分为字符型常量、数值型常量、浮点型常量、逻辑型常量、日期型常量和日期时间型常量。变量分为内存变量和字段变量两种。使用算术运算符、字符运算符、关系运算符和逻辑运算符构成数值表达式、日期表达式、字符表达式、关系表达式和逻辑表达式等。函数包括数值型函数、字符型函数、日期与时间函数、数据类型转换函数和状态测试函数。书写Visual FoxPro命令时一定要遵循其语法规则。,Thank you very much !,本讲到此结束 谢谢您的光临!,