VFP程序设计简明教程鲁俊生第2章 常量、变量、表达式及函数ppt课件.ppt
第2章 常量、变量、表达式及函数,2.1 数据类 型 2.2 常量与变量2.3 表达式2.4 常用函数,2.1 数据类型,人们用数据来描述实体的对象及其属性。数据类型是数据的基本属性,是一个重要的概念。在Visual FoxPro中,只有相同类型的数据之间才能直接运算,否则就会发生数据类型不匹配的错误。Visual FoxPro是一种关系数据库管理软件。在关系数据库中把描述每一实体集合的数据表示成一张二维表。例如,表示学生档案的一张二维表如下所示:,其中,第一列“Record#”是记录号,在这个学生档案中共有6名学生的记录数据,即6个记录。二维表中的第一行描述了每个记录的结构,由第一行的描述可以看出每个记录由5个部分组成,记录的这些组成部分称为字段。表中学生记录5个字段的字段名分别为学号、姓名、性别、出生年月日、籍贯。由于在记录的字段中存放的是数据,因此,字段和数据一样也具有数据类型属性,称为字段类型。在Visual FoxPro中共定义了13种字段类型和7种数据类型。,13种字段类型分别是:字符型、数值型、浮动型、双精度型、整型、货币型、日期型、日期时间型、逻辑型、备注型、通用型、二进制字符型和二进制备注型;7种数据类型分别是:字符型、数值型、货币型、日期型、日期时间型、逻辑型和通用型。字段是表文件所特有的,而数据则既可作为表文件中字段的内容,也可以作为内存变量的内容,还可以作为常量使用。1.字符型字段和字符型数据字符型字段用于存放字符型数据。字符型数据是指一切可印刷的字符,其中包括英文字母、阿拉伯数字、各种符号、汉字及空格。一个字符型字段可以存储1254个字符。上述学生档案中的“学号”和“姓名”字段就是字符型字段,其中存储的学号和姓名数据是字符型数据。,2.数值型、浮动型、双精度型和整型字段与数值型数据数值型字段中存储的是数值数据。数值数据的每一位占一个字节;浮动型字段中存放浮点数值数据。这两个字段中可以存储最长达20位的数据。整型字段中存放整数,可以存放的最大和最小整数分别为+2147483647和-2147483647,用该类型字段存放较大整数时可节省存储容量,因为它只占用4个字节。双精度字段用于存放双精度数,可得到15位精度常用于科学计算,但双精度字段要占用8个字节的存储容量。上述这些字段中存放数据都是数值型数据。,3.货币型字段和货币型数据货币型字段用于存放货币型数据,其中可存放的最大数为+922337203685477.8087,只占用8个字节。4.日期型字段和日期型数据日期型字段用于存放日期型数据,常用日期格式为“年.月.日”和“年/月/日”。学生档案中的“出生年月日”字段就是日期型字段,其中的数据就是日期型数据。日期型字段有固定宽度,占用8个字节,其中年、月、日各占两个字节。,5.日期时间型字段和日期时间型数据日期时间型字段用于存放日期时间数据,它占用8个字节。其格式为:年.月.日.时:分:秒AM或PM。6.逻辑型字段和逻辑型数据逻辑型字段用于存放逻辑型数据。逻辑数据只有两个值,即“真”和“假”,常用于逻辑判断。逻辑型字段的宽度固定,为1个字节。在输入逻辑型数据时可用英文字母T、t、Y、y中任何一个字符代表“真”,而用F、f、N、n中的任何一个字符代表“假”。学生档案中的“性别”字段就是逻辑型字段,可用“真”表示男性,而用“假”表示女性。,7.备注型字段备注型字段可存放字符文本、源程序代码等多种信息,因而得到广泛的应用。通常使用备注型字段来记录那些可有可无、可长可短的信息,如学生档案中的奖惩记录(有些人可能获奖或受到处分,而多数人可能没有此项数据)。此外,备注型字段也常用于存放运行程序时的帮助信息。备注型字段中的信息实际上并不是存放在表文件中,而是存放在与表文件同名,但扩展名为“.FPT”的备注文件中。创建表文件时,如果定义了备注型字段,相应的备注文件就会自动生成;备注文件生成后会随表文件打开而自动打开。,8.通用型字段和通用型数据通用型字段可存放图片、电子表格、声音、设计分析图及字符等数据。通用型字段使得Visual FoxPro成为全方位数据库。和备注字段一样,通用字段中的数据也存入与表文件同名而扩展名为.FPT的文件中。,2.2 常量与变量,2.2.1 常量FoxPro定义了4种类型常量:数值常量、字符常量、逻辑型常量和日期型常量。1.数值型常量数值型常量可以是整数或实数,例如,89,34.56等在程序中都是数值型常量。,2.字符型常量字符型常量是用定界符括起来的由字符、空格和数字所组成的字串。定界符可以是单引号、双引号或方括号。当某一种定界符本身就是字符常量的组成部分时,就应选用另一种定界符。例如:abcd、高级工程师、胡天云、pict999.9等在程序中都是正确的字符型常量,而MSD、abcdefghi都不是正确的字符常量。3.逻辑型常量逻辑型常量只有两个值:“真”与“假”。用.T.、.t.、.Y.、.y.表示“真”,用.F.、.f.、.N.、.n.表示“假”,注意两边的小圆点不能丢掉但可以用空格代替。,4.日期型常量日期型常量必须用花括号括起来,例如,2000.03.15、2000/03/15都是日期型常量的正确写法。2.2.2 变量FoxPro定义了3种类型变量:字段变量、用户内存变量和系统内存变量。用户内存变量又简称为内存变量。前两种变量的名称可用110个字母、下划线和数字表示,但必须以字母打头,而后一种变量名称由系统规定。,1.字段变量字段变量是表文件结构中的数据项。FoxPro定义了13种类型字段变量,这在2.1节已经全面介绍过,这里再补充一点,就是字段变量是一种“多值”变量,如学生档案这个表文件有多条记录,则表的各个字段就有多个值。移动记录指针位置到所需记录,就可以找出字段变量的当前值。2.内存变量内存变量是在数据库结构之外独立存在于内存中的变量,一般随程序运行结束或退出FoxPro而释放。内存变量常用于存储程序运行的中间结果或用于存储控制程序执行的各种参数。,FoxPro定义了5种类型内存变量,即字符型、数值型、逻辑型、日期型和屏幕型内存变量。在FoxPro最多可以定义65000个内存变量。另外,FoxPro还提供一维和二维内存变量数组。3.系统内存变量系统内存变量是FoxPro自动生成和维护的变量,用于控制FoxPro的输出和显示信息的格式。为与一般内存变量相区别,在系统内存变量名前加一下划线“_”。例如,系统变量_PEJECT用于设置打印输出时的走纸方式,该系统变量的缺省值是“BEFORE”,即打印前走纸换页,用户可将其设置为“NON”,即打印前后都不换页走纸。,2.2.3 内存变量赋值命令FoxPro中有多种命令可以定义内存变量和给内存变量赋值,常用的赋值命令格式如下:STORE TO|和|=这两条命令都用于定义内存变量并给变量赋值,不同之处是前一个命令可定义多个内存变量并给这些变量赋以同一数据,后一个命令只能定义单个内存变量或变量数组。,例2-1 定义常用类型的内存变量并将其赋值。在FoxPro命令窗口中键入如下命令:store 12.34 to astore 吕小青 to bstore.t.to c store 2000.03.15 to d dimension e(2,3)e(1)=12.34,e(2)=吕小青e(3)=.t.e(4)=2000.03.15list memory like?屏幕显示的执行结果如下:A N 12.34(12.34000000)B C 吕小青C L.T.D D 2000.03.15,E A(1,1)N 12.34(12.34000000)(1,2)C 吕小青(1,3)L.T.(2,1)D2000.03.15(2,2)L.F.(2,3)L.F.,在例2-1中有关FoxPro命令的功能简介如下:store 12.34 to a定义内存变量a,数值型,其值为12.34。store 吕小青 to b定义内存变量b,字符型,其值为“吕小青”。store.t.to c定义内存变量c,逻辑型,其值为“真”。store 2000.03.15 to d定义内存变量d,日期型,其值为2000年3月15日。,dimension e(2,3)定义二维变量数组e,该数级有二行三列,共6个元素:e(1,1)、e(1,2)、e(1,3)、e(2,1)、e(2,2)、e(2,3)。这些元素被定义作逻辑型并赋以初值“假”。二维数组元素还可以用单下标相应表示作e(1)、e(2)、e(3)、e(4)、e(5)、e(6)。e(1)=12.34数组元素e(1),即e(1,1),赋值12.34,其类型已转换为数值型。e(2)=吕小青数组元素e(2),即e(1,2),赋值吕小青,其类型已转换为字符型。e(3)=.t.数组元素e(3),即e(1,3),赋“真”值,其类型不变仍为逻辑型。e(4)=2000.03.15 数组元素e(4),即e(2,1),赋一日期值,其类型已转换为日期型。,List memory like?内存变量显示命令。其中子句“like?”中的问号为通配符,代表任一字符。此命令意义为只显示以一个字符为名的所有内存变量的属性。若不加子句“like?”,则List memory命令还要显示系统内存变量的有关属性。在FoxPro系统中规定如果内存变量与打开的当前表文件的字段同名时,字段名优先。此时如若要使用同名内存变量,则必须加写“M-”或“M.”进行限定,即M-内存变量名或M.内存变量。其中,限定由M、减号和大于号或由M和圆点组成。,2.3 表达式,2.3.1 运算符1.算术运算符算术运算符包括:(1)()分组优先运算符;(2)*、乘幂运算符;(3)*、/乘除运算符;(4)%求余运算符;(5)+、-加减或单目运算符。,算术运算符主要用于数值数据间的算术运算。数值数据运算的结果也是数值型数据。如果在一个表达式中同时出现多个运算符时,运算的顺序由运算符的优先级确定,优先级高的先运算,优先级低的后运算。运算符的优先级依次为括号、单目、乘幂、乘除、求余、加减,其中括号优先级最高,加减运算符优先级最低。所谓单目运算符,即只在运算符后面有运算数据的运算符。例如,用户在命令窗口中键入两条显示运算结果的命令:?-2*2+5?-23+5显示在屏幕上的结果值分别为:9.0和-3.0。“?”命令的功能是命令计算机计算和显示表达式的值。,2.关系运算符关系运算符包括:(1)大于;(3)=等于;(4)=相等比较;(5)=大于等于;(7)、#、!=不等于;(8)$包含运算。,关系运算符用于比较运算,即比较同类型表达式的值,如果其值使关系成立,则比较运算的结果取逻辑值“真”,否则取逻辑值“假”。各关系运算符的优先级相同。例2-2 将变量赋值并进行比较运算。命令及执行结果 说明a=12.34定义数值型变量b=23.45定义数值型变量?ab显示数值比较结果,.F.关系不成立取“假”值x=a定义字符型变量y=b定义字符型变量?xy比较a和b字符的ASCII码.F.a的ASCII码小于b,关系不成立,取逻辑值“假”?bc$abcd 比较$左边字串是否是右边字串的子串.T.是其子串,取逻辑值“真”?ac$abcd 比较$左边字串是否是其右边字串的子串,.F.不是其子串,取逻辑值“假”?abcd=abc 比较等号右边字串是否是其左边字串的子串.T.是其子串,取逻辑值“真”?abc=abcd 比较等号右边字串是否是其左边字串的子串.F.不是其子串,取逻辑值“假”?abcd=abc 字串等长并完全相同比较.F.不等长取逻辑值“假”,3.逻辑运算符逻辑运算符常用作表达式之间的逻辑运算,参加运算的表达式应有逻辑值,其运算结果也是逻辑量。逻辑运算符有如下3种:(1).NOT.、!逻辑非;(2).AND.逻辑与;(3).OR.逻辑或。逻辑运算符的意义是:A.AND.B只当A和B都为“真”时,逻辑运算的结果才取“真”值,否则取“假”值。,A.OR.B当A和B至少有一个取“真”值时,逻辑运算结果取“真”值。.NOT.A当A取“真”值时,结果取“假”值,反之结果取“真”值。3种逻辑运算的真假值如表2.1所示。,表2.1 逻辑运算真值表,逻辑运算符的优先级由高到低的次序为:逻辑非、逻辑与、逻辑或。例如:xb=.f.a=0b=5?a=b.and.not.xb.T.其逻辑运算结果取“真”值。,4.字符串连接运算符字符串连接运算符用于字符串连接操作,有如下两种:(1)+加号连接运算符;(2)-减号连接运算符。其中,“+”运算符将其前后的字符串连接起来组成一个新字符串,这种连接又称作完全连接;而“-”运算符将减号前面字符串中的尾空格移到减号后面字符串的尾部,然后相连接组成一个新的字符串。,例2-3 字符串连接。a=abcb=defc=ghi?a+b+cabc def ghi&完全连接x=a-b-c?xabcdefghi&空格移到连接后生成串的尾部?len(x)&测字符串长度,13,例中,LEN(X)为字符串长度函数,其返回值为所测字符变量中存储的字符所占的字节数。以上各类运算符之间的优先级是:算术运算符和字符串连接运算符的优先级最高,关系运算符次之,逻辑运算符最低,同级运算符从左至右顺序执行。2.3.2 表达式FoxPro命令和函数对表达式的类型有明确要求,一定要严格遵守相应的规定,否则将出现语法错误以至计算机拒绝执行该函数。,1.数值型表达式数字型表达式由数值型常量、数值型变量、数值型函数及算术运算符组成,表达式的值也为数值型数据。如:78*23+(56-120)/62.字符型表达式字符型表达式由字符型常量、字符型变量、字符型函数及字符串连接运算符构成,其运算结果也为字符型数据。如:姓名=林亮+.and.+出生年月日=81.12.23其运算结果的字符串如下:姓名=林亮.and.出生年月日=81.12.23,3.逻辑型表达式逻辑型表达式由逻辑型常量、逻辑型变量、逻辑型函数、关系式经逻辑运算符连接而成。通过运算,逻辑表达式取值逻辑量“真”或“假”。如下列表达式:工龄=10.and.(基本工资+浮动工资)=620.T.NOT.eof()都是正确写法的逻辑表达式。其中,eof()为文件记录指针测试函数,当指针指向文件尾时返回“真”值,否则返回“假”值。所以当指针停在非文件尾时表达式.not.eof()取“真”值,常作为控制循环结束的条件。,有一点需要说明的是在逻辑表达式定义中所提到的关系式,在有些书中称为关系表达式。关系表达式由数值型、字符型或日期型的常量、变量、函数及其表达式,通过关系运算符连接而成。其运算结果取逻辑值,即当关系成立时取“真”值,否则取“假”值。如:姓名=刘喜旺工资=630都是正确的关系表达式。其实,关系表达式是一种没有逻辑运算符的逻辑表达式特例。,4.日期表达式日期表达式由日期型常量、日期型变量和日期型函数通过“+”,“-”等算术运算符构成,如:2000.2.11+302000.2.11-30都是正确的日期表达式,其结果分别为:2000.03.13和2000.01.12。注意,下面的表达式是数值型表达式:2000.2.11-2000.2.8结果为3。其实,这并不难理解,因为表达式的值为日期间隔天数,这并不是一个日期量。,2.4 常用函数,2.4.1 字符及字符串处理函数1.取子串函数格式:SUBSTR(表达式,n,m)说明:表达式指定字符表达式或备注字段;n指定取子串的起始时位置;m指定要取子串的字符数,缺省该参数指从起始位置取串尾。取子串函数用于选取字符表达式或备注型字段中的部分字符,返回值是字符型。,例2-4 从字符串中取的3个子串。stor01,03,07to hh?subs(hh,1,2),subs(hh,4,2),subs(hh,7)结果为:01 03 072.删除空格函数删除字符数据中多余空格的函数共有3个,其格式分别如下:TRIM(表达式)ALLTRIM(表达式)LTRIM(表达式),这3个函数都可用于删除字符串中的多余空格,不同的是,第一个函数的功能是删除字符串尾部的空格;第二个函数的功能是删除字符串前后空格;最后一个函数的功能则是删除字符串前面的空格。其中,表达式指定了拟删除多余空格的字符表达式。显然,函数的返回值是字符型。例2-5 去掉第一个字串的尾部空格,然后与第二个字串连接。storabcdeto xStor fghto y?trim(x)+yabcdefgh,3.空格函数格式:SPACE(n)说明:该函数产生指定长度字符串,返回值得类型为字符型。其中,n指定产生空格的数目。例2-6 定义姓名及文件名(汉语拼音)变量,其初值赋予8个空格。Stor spac(8)to xm,wjm,2.4.2 数学运算函数FoxPro提供了20余种数学运算函数,极大地增强了数学运算功能。数学函数的返回值皆为数字型。下面介绍几种常用的数学函数。1.取整函数格式:INT(表达式)说明:函数取指定数值表达式计算结果的整数部分。,例2-7 取整并显示其结果。?int(-12.34)-122.四舍五入函数格式:ROUND(表达式,n)说明:依据给出的四舍五入小数位数,对数值表达式的计算结果做四舍五入处理。其中,n指定了四舍五入的小数位数。例2-8 对下面给出的数做四舍五入处理并显示其结果。?round(3.14159,2),round(1024.9962,0),round(1024.9962,-3)3.14 1025 1000,3.金融函数金融函数用于计算到期的本息和投资现值及每次应偿还的贷款数。1)计算每次偿还贷款数函数格式:PAYMENT(表达式,n,m)说明:表达式指定贷款本金;n指定年利率;m指定贷款总期数。该函数用于计算固定利率贷款每期需交纳的金额数。,2)计算投资值函数格式:PV(表达式,n,m)说明:表达式指定每期付款金额;n指定年利率;m指定总期数。该函数用于计算投资金额的现值。3)计算本息和函数格式:FV(表达式,n,m)说明:表达式指定固定期的付款金额;n指定年利率;m指定固定期数值。该函数用于计算投资金额的未来利和。,例2-9 年利率为12%,借期一年,总贷款数是15000元,每月应付款是多少?payment(15000,0.12/12,12)1332.72.4.3 转换函数转换函数可对某些数据的类型或某种属性进行转换。1.数值转字串函数格式:STR(表达式,n,m)说明:该函数用于将数值转换为数字字串。函数的返回值为字符型数据。其中:表达式指定拟转换的数值表达式;n指定转换后的宽度,包括小数位和小数点;m指定小数位数。,例2-10 将数值型数据转换为字符数据并显示其转换结果。?str(123.456)123&隐含取整数部分转换为字符型数据?str(123.456,7,2)123.462.字符转数值函数格式:VAL(表达式)说明:该函数用于将指定的字符数据转换为数值型数据。其中,表达式指定了拟转换的字符串。函数的返回值为数值型数据。注意:要转换的字符表达式中必须包含有数字字符,否则将返回值0。,例2-11 将数字字串转换为数值型数据。a=12B=13.45?val(a)+val(b)25.5 3.字符转日期函数格式:CTOD(表达式)说明:该函数用于将字符表达式中的字符型日期转换为日期型数据,函数的返回值为日期型数据。,例2-12 将字符型日期数据转换为日期型数据。Set date ansi&设置美国标准化协会日期格式?ctod(2000.1.12)2000.01.124.日期转字符函数格式:DTOC(表达式,1)说明:该函数用于将日期表达式中的日期转换为字符型日期数据,函数的返回值为字符型数据。,例2-13 将日期型数据转换为字符型日期并显示汉字日期。rq=99.1.12rq=dtoc(rq)?subs(rq,1,2)+年+subs(rq,4,2)+月+subs(rq,7,2)+日99年01月12日,2.4.4 日期函数日期函数用于处理日期型数据,但日期函数的返回值不一定是日期型数据。1.系统日期函数格式:DATE()说明:该函数取系统的当前日期,其返回值为日期型数据。例2-14 显示系统当前日期和汉字日期。?date()2000/03/06set century on&置显示日期的世纪前缀命令?date()2000/03/06,2.年、月、日函数YEAR(日期表达式)该函数从日期表达中返回一个由四位数字表达的年份。MONTH(日期表达式)该函数从日期表达式中返回一个用数字表达的月份。DAY(日期表达式)该函数从日期表达式返回一个用数字表达的日数。值得注意的是:以上3个函数的返回值都是数值型数据,而非日期型数据。例2-15 测试系统日期(年月日)。rq=date()?year(rq),month(rq),day(rq)2000.3.20,2.4.5 测试函数1.测试文件尾函数格式:EOF(表达式1|表达式2)说明:表达式1 指定被测工作区号,其范围为1225;表达式2 指定被测表的别名。EOF函数用于测试由区号或表别名所指定文件中的记录指针是否指向文件尾,如是则返回“真”值,否则返回“假”值。函数返回值为逻辑型数据。缺省可选项则测试当前工作区中的文件。,例2-16 测试文件记录指针是否指向文件尾。Use学生档案Go bottom?eof().F.skip?eof().T.,2.测试文件头函数格式:BOF(表达式1|表达式2)格式:表达式1指定被测工作区号,其范围为1225;表达式2 指定被测表的别名。BOF函数用于测试由区号或表别名所指定文件中的记录指针是否指向文件头,如是则返回“真”值,否则返回“假”值。函数返回值为逻辑型数据。缺省可选项则测试当前工作区中的文件。,例2-17 测试文件记录指针是否指向文件头。use 学生档案?bof().F.skip-1?bof().T.值得注意的是当打开无记录的空文件时,测试文件尾及文件头函数皆返回“真”值。如若被测试的文件不存在,以上两种测试都返回“假”值。,3.测试当前记录号函数格式:RECNO(表达式1|表达式2)说明:表达式1指定被测工作区号,其范围为1225;表达式2指定被测表的别名。RECNO函数测试由区号或表别名指定文件中的记录指针指向的记录号。缺省可选项则测试当前工作区中的文件。函数的返回值为数值型。若指定的工作区无打开的表文件,函数返回值为0;若指定的库文件无记录或记录指针位于文件头,函数返回值为1;若记录指针指向文件尾,函数返回值为末记录号加1。,例2-18 测试记录指针当前位置。Use 学生档案Go bottom&指针移向末记录?recno()6skip&指针指向文件尾?recno()7go top&指针指向首记录?recno()1skip 1&指针指向文件头?recno()1,4.测试表文件记录数函数格式:RECCOUNT(表达式1|表达式2)说明:表达式1指定被测工作区号,其范围为1225;表达式2 指定被测表的别名。RECCOUNT函数测试由区号或表别名指定文件中的记录数。缺省可选项时测试当前工作区中的文件。函数返回值为数值型数据。若指定的工作区无打开的文件或打开的是只有结构而无记录的空文件,则返回值为0。,例2-18 测试学生档案.DBF文件中记录数。Use 学生档案?recount()65.测试字段名函数格式:FIELD(n,表达式1|表达式2)说明:n指定被测字段序号;表达式1|表达式2指定工作区号或表别名。FIELD函数测试由区号或表别名指定文件中指定序号的字段名。若指定的工作区无打开的表文件或指定字段号超界,函数返回空串(ASCII码为0)。,例2-20 测试学生档案.DBF表文件结构中第6号字段的字段名。Use 学生档案?field(6)籍贯6.测试字段数函数格式:FCOUNT(表达式1|表达式2)说明:表达式1指定被测工作区号,其范围为1225;表达式2指定被测表的别名。FCOUNT函数测试由区号或表别名指定文件中的文件记录数。缺省可选项时测试当前工作区中的文件。函数返回值为数值型数据。若指定的工作区无打开的表文件,则返回值为0。,例2-21 测试学生档案.DBF库文件结构中的字段数。Use 学生档案?fcount()87.测试查找记录是否成功函数格式:FOUND(表达式1|表达式2)说明:表达式1指定被测工作区号,其范围为1225;表达式2指定被测表的别名。FOUND函数测试检索命令对区号或表别名指定文件的检索操作是否成功,成功则返回值为真,否则返回值为假。缺省可选项时,测试检索命令对当前工作区中文件的检索操作是否成功。常用的检索操作命令有:FIND、SEEK、LOCATE。,例2-22 在学生档案.DBF文件中查询学生钱向冬的籍贯。Use 学生档案Locate for 姓名=钱向冬?found(),籍贯.T.宁波市8.测试屏幕光坐标函数格式:ROW()及COL()说明:前者测试光标所在行坐标,后者测试光标所在列坐标,返回值为数值型。例2-23 在指定的屏幕坐标位置(10行,30列)显示“浙江万里学院”并测试显示后的光标位置。,10,30 say 浙江万里学院row=row()col=col()?row,col 10.000 42.0009.测试打印机字头所在位置格式:PROW()及PCOL()说明:前者测试打印机字头所在行坐标,后者为列坐标,返回值为数值型。例2-24 在打印机字头当前坐标位置的下一行,列坐标加15的位置上打印“浙江万里学院”。prow()+1,pcol()+15 say 浙江万里学院,2.4.6 键值函数键值函数的功能是根据按下的键返回相应的键值,下面介绍一个常用的键值函数。格式:INKEY(表达式1,表达式2)说明:表达式1指定等待按键的秒数,0值为无限等待。表达式2取值S、H、M,分别指定显示光标、隐藏光标及检查鼠标按键。INKEY函数返回所按键盘键或鼠标键的对应的键码值,常用键码值如表2.2所示。,表2.2 常用键码值,如果键入命令:?请按任意键:?inkey(10,H)则显示提示信息后面无光标显示,用户若在10秒内按键,则显示所按键的码值,否则到达10秒后函数返回0值。例2-25 显示按键的码值。?请敲(、Esc、Enter、或其他键),inkey(10),2.4.7 数组函数 数组函数可完成对数组的操作,如数组间元素的复制、删除、查找和排序,本节仅介绍最常用数组函数AFIELDS。格式:AFIELDS(表达式表达式1|表达式2)说明:表达式数组名;表达式1工作区号;表达式2表别名。AFIELDS函数的功能是:将由工作区号或表别名指定的表文件结构信息存入指定数组中,并返回字段个数。若指定数组不存在,系统会自动生成该数组。数组中的行对应于字段,列对应于字段名、字段类型、字段宽度和小数位数。,例2-26 将学生档案.DBF的结构信息存入一数组中。use学生档案?afields(arrxsda)&将打开的表文件结构信息存入自动定义的数组中5&函数返回值为库文件的字段数list memo like arrxsda&显示内存变量数组表文件结构主要信息显示如下:ARRHXSDA Pud A(1,1)C 学号(1,2)C C,(1,3)N 4(4.00000000)(1,4)N O(0.00000000)(2,1)C 姓名(2,2)C C(2,3)N 8(8.00000000)(2,4)N 0(0.00000000)(3,1)C 性别(3,2)C C(3,3)N 2(2.00000000)(3,4)N 0(0.00000000),(4,1)C 出生日期(4,2)C D(4,3)N 8(8.00000000)(4,4)N 0(0.00000000)(5,1)C 籍贯(5,2)C C(5,3)N 10(10.00000000)(5,4)N 0(0.00000000),2.4.8 其他函数1.宏函数格式:&表达式 表达式1说明:表达式指定字符型内存变量;表达式1指定字符型表达式。宏函数返回指定字符型内存变量中存放的字串或返回该字串与字符表达式字串连接后的字串。显然,宏函数的返回值为字符型。宏函数可以嵌套使用。,例2-27 打开和删除临时指定的文件。28accept 请输入文件名:to wjm&字符型内存变量接收语句use&wjm&打开临时指定的表use&关闭打开的表erase&wjm.dbf&删除指定的表,2.条件函数格式:IIF(表达式,表达式1,表达式2)说明:表达式指定逻辑表达式;表达式1指定第一个表达式;表达式2指定第二个表达式。IIF函数的功能是逻辑表达式取“真”值,则返回表达式1的值,否则返回表达式2的值。IIF函数可以嵌套。IIF函数返回值类型与表达式1或表达式2类型一致。,例2-28 根据查询成功与否,用IIF()函数显示的不同结果。Use 学生档案locate for 姓名=钱向冬&查找定位Record=4&已找到,指针指向4号记录?iff(found(),籍贯,查无此人)&已找到,FOUND()取真值,返回此人的籍贯宁波市&籍贯为宁波市locate for 姓名=何晓月&查找定位,End of Locate scope&未找到,指针指向文件尾?iff(found(),籍贯,“查无此人”)&未找到,FOUND()取假值,返回查无此人查无此人&函数返回值3.用户自定义函数FoxPro提供了功能丰富的系统函数,但系统函数的数量毕竟有限。为满足用户特殊需要和简化程序设计,系统还提供了用户自定义函数功能。,定义用户自义函数的格式如下:FUNCTION FunictionNamePARAMETERS ParamemeterListCommandsRETURN Expression说明:FunctionName指定用户自定义函数名;PRAMETERS ParamemeterList声明自定义函数中使用的变量名(即形参表);Commands完成自定义函数功能的命令序列。RETURN eExpression指定函数返回值表达式。,调用用户自定义函数格式如下:FunctionName(ParameterList)说明:FunctionName指定用户自定义函数名;ParameterList指定调用函数的参数表(即实参表)。用户自定义函数也可作为过程被调用,此时将忽略函数的返回值。例2-29 设计一个汉字日期处理函数(HZRQCL)和一个调用程序(EXA2-29.PRG)。程序中安排采用两种不同的函数调用方式:函数调用方式和过程调用方式。,EXA2-29.PRG 程序如下:ClearSet date ansiAccept请输入日期:to rq?hzrqcl(rq)&函数方式调用accept请输入日期:to rq1hzrq=space(14)do hzrqcl with rq1&过程方式调用,?hzrq用户自定义函数HZRQCL如下:Function hzrqclQarameters xHzrq=subs(x,1,2)+年+subs(x,4,2)+月+subs(x,7,2)+日Return hzrq,程序执行结果如下:Do exa2_44请输入日期:2000.03.14 2000年03月14日请输入日期:2000.03.14 2000年03月14日因为用户自定义函数及其调用涉及知识较宽,读者在此不必深究,待以后逐步掌握。,