版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第二章 vfp程序设计基础 根据计算机系统处理数据的形式来划分,vfp有常量、变量、表达式和函数四种形式的数据。21常量与变量 每一个数据都有一定的类型,数据类型决定了数据的存储方式和运算方式。向表中输入数据时,每个字段的数据类型是在表结构中定义的。常量、内存变量、函数以及表达式的类型包括字符型、数值型、货币型、逻辑型、日期型和日期时间型等6种。211常量 常量用以表示一个具体的、不变的值。不同类型的常量有不同的书写格式。 1数值型常量 数值型常量也就是常数,用来表示一个数量的大小,由数字09、小数点和正负号构成。 例如:12、3.45、-6.78 为了表示很大或很小的数值型常量,也可以使用科
2、学记数法形式书写. 例如:用5.878e12表示5.8781012,用1.6e-12表示1.610-12。 数值型数据在内存中用8个字节表示,其取值范围是-0.9999999999e+190.9999999999e+20。2货币型常量 货币型常量用来表示货币值,其书写格式与数值型常量类似,但要加上一个前置的符号()。货币数据在存储和计算时,采用4位小数。如果一个货币型常量多于4位小数,那么系统会自动将多余的小数位四舍五入。例如: 常量123.456789将存储为123.4568。 货币型常量没有科学记数法形式,在内存中占用8个字节.取值范围是:-922337203685477.58079223
3、37203685477.5807。3字符型常量 字符型常量也称为字符串,其表示方法是用半角半角单引号、双引号或方括号把字符串扩起来。这里的单引号、双引号或方括号称为定界符。许多常量都有定界符。定界符虽然不作为常量本身的内容,但它规定了常量的类型以及常量的起始和终止界限。 字符型常量的定界符必须成对匹配,不能一边用单引号而另一边用双引号。如果某种定界符本身也是字符串的内容,则需要用另一种定界符为该字符串定界。 注意,不包含任何字符的字符串(“”)叫空串。空串与包含空格的字符串(” ”)不同。 例: 显示几个字符型常量。 在命令窗口键入以下两条命令:? 计算机,123,abcabc? 计算机,12
4、3,abcabc ? 命令的功能是另起一行,在新的一行的开始处显示若干个表达式的值; ? 命令是在同一行显示表达式的值。显示结果:计算机 123 abcabc计算机 123 abcabc4日期型常量 日期型常量的定界符是一对花括号。花括号内包括年、月、日三部分内容,各部分内容之间用分隔符分隔。系统默认斜杠()分隔符。常用的其他日期分隔符有连字号()、句点()和空格。 日期型常量的格式有两种: 传统的日期格式 系统默认为美国日期格式mm/dd/yy(月/日年),传统日期格式中的月、日各为月、日各为2位数字,而年位数字,而年份可以是份可以是2位数字,也可以是位数字,也可以是4位数字位数字。严格的日
5、期格式 yyyy-mm-dd用这种格式书写的日期常量能表达一个确切的日期,它不受set date等语句设置的影响。这种格式的日期常量在书写时要注意:花括号内第一个字符必须是脱字符();年份必须用4位(如2001、1999等);年月日的次序不能颠倒、不能缺省。日期型数据用日期型数据用8个字节表示个字节表示.影响日期格式的设置命令 命令格式:set mark to 日期分割符命令功能:用于指定日期分隔符,“-”,“.” 命令格式:set date to american|ansi|british| use:mm/dd/yy british: dd/mm/yy 命令格式:set century on
6、/off 命令功能:用于设置年份的位数; on设置年份用4位数字表示 off设置年份用2位数字表示 命令格式:set strictdate to 0|1|2 命令功能:用于设置是否对日期格式进行检查。 0 表示不进行严格的日期格式检查,目的是与早期vfp兼容。 1 表示进行严格的日期格式检查,它是系统默认的设置。 2 表示进行严格的日期格式检查,并且对ctod()和ctot()函数的格式也有效。例22 设置不同的日期格式。 在命令窗口键入输入以下几条命令,并分别回车执行:set century on 设置4位数字年份set date to ymd 设置年月日格式?2000.08.08set c
7、entury offset mark to “.”set date to mdy?2000-08-105日期时间型常量 日期时间型常量包括日期和时间两部分内容:(日期,时间)。日期部分与日期型常量相似,也有传统的和严格的两种格式。时间部分的格式为: hh:mm:ss ap。其中hh、mm和ss分别代表时、分和秒,默认值分别为12、0和0。a和p分别代表上午和下午,默认值为a。如果指定的时间大于等于12,则自然为下午的时间。日期时间型数据用日期时间型数据用8个字节存储个字节存储6逻辑型常量 逻辑型数据只有逻辑真和逻辑假两个值。逻辑真的常量表示形式有:.t.(.t.) 、 .y.(.y.)。逻辑假
8、的常量表示形式有: .f. 、.f.、.n. 、.n.。前后两个句点作为逻辑型常量的定界符是必不可少的,否则会被误认为变量名。逻辑型数据只占用一个字节逻辑型数据只占用一个字节212变量 变量值是能够随时更改的。vfp的变量分为字段变量和内存变量两大类。由于表中的各条记录对应一个个字段名,因此,表中的字段名就称字段变量。 内存变量是内存中的一个存储区域,变量值就是存放在这个存储区域里的数据,变量的类型取决于变量值的类型。例如,当把一个常量赋给一个变量时,这个常量就被存放到该变量对应的存储位置中而成为该变量新的取值。在vfp中,变量的类型可以改变,也就是说,可以把不同类型的数据赋给同一个变量。 内
9、存变量的数据类型包括字符型(c)、数值型(n)、货币型(y)、逻辑型(l)、日期 型(d)和日期时间型(t)。1简单内存变量 每一个变量都有一个名字,可以通过变量名访问变量。如果当前表中存在一个同名的字段变量,则在访问内存变量时,必须在变量名前加上前缀m(或m-),否则系统将访问同名的字段变量。 向简单内存变量赋值不必事先定义,变量的赋值命令有以下两种格式:内存变量名表达式 store表达式to内存变量名表功能注释: 等号一次只能给一个内存变量赋值。 store可同时给若干个变量赋相同的值,各内存变量名之间必须用逗号分开。 在vfp中,一个变量在使用之前并不需要特别的声明或定义。当用store
10、 命令给变量赋值时,如果该变量并不存在,那么系统会自动建立它。 可以通过对内存变量重新赋值来改变其内容和类型。例2.4 内存变量和字段变量的访问。 在一个表文件“student.dbf”,其结构如下: student(学号c(8),姓名c(6),性别c(2),出生日期d(8) 在命令窗口键入以下命令:use studentlist? 姓名,性别,学号 显示字段变量store “王三” to 姓名 用字符串向内存变量姓名赋值y=500 xm=姓名 &用字段变量赋值内存变量xmstore 8.88 to x1,x2store .t. to q? xm,m.姓名,x1,x2,q? 姓名,m.
11、姓名,x1,x2,q2数组 数组是内存中连续的一片存储区域,它由一系列元素组成,每个数组元素可通过数组名及相应的下标来访问。每个数组元素相当于一个简单变量,可以给各元素分别赋值。在vfp中,一个数组中各元素的数据类型可以不同。 与简单内存变量不同,数组在使用之前一般要用dimension或declare命令显式创建,规定数组是一维数组还是二维数组,数组名和数组大小。数组大小由下标值的上、下限决定,下限规定为1。 创建数组的命令格式为: dimension数组名(下标上限1),下标上限2) declare数组名(下标上限1,下标上限2)” 以上两种格式的功能完全相同。数组创建后,系统自动给每个数
12、组元素赋以逻辑假.f.。例如,dime 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,3)、y(2,1)、y(2,2)、y(2,3)。 整个数组的数据类型为a(array),而各个数组元素可以分别存放不同类型的数据。 在使用数组和数组元素时,应注意注意如下问题: 在一切使用简单内存变量的地方,均可以使用数组元素。 在赋值和输入语句中使用数组名时,表示将同一个值同时赋给该数组的全部数组元素。 在同一个运行环境下,数组名不能与简单变量名重复。 在赋值语句中的表达式位置不
13、能出现数组名。 可以用一维数组的形式访问二维数组。213内存变量常用命令1内存变量的赋值 格式1:stor表达式to变量名表 格式2:内存变量名表达式 功能:计算表达式并将表达式值赋给一个或多个内存变量,格式2只能给一个变量赋值。2表达式值的显示 格式1:?表达式表 格式2:?表达式表 功能:计算表达式表中的各表达式并输出各表达式值。 不管有没有指定表达式表,格式1都会输出一个回车换行符。 括起来的内容表示是可选的;用括起来的内容表示是可选的;用括起来表示在实际编括起来表示在实际编写语句时,用相应的内容替代;用写语句时,用相应的内容替代;用 括起来表示是必选的;括起来表示是必选的;类似类似a|
14、b的格式,表示的格式,表示a和和b只能选择一个,不能同时都选。只能选择一个,不能同时都选。3,内存变量的显示格式1:list memory like通配符 to printer| to file文件名格式2:display memory like通配符 to printer |to file文件名 功能:显示内存变量的当前信息,包括变量名、作用域、类型、取值。 选用like短语只显示与通配符相匹配的内存变量。通配符包括*和?,*表示任意多个字符,?表示任意一个字符。 可选子句to printer或to file文件名用于在显示的同时送往打印机,或者存入给定文件名的文本文件中,文件的扩展名为.t
15、xt。 4,内存变量的清除 格式1:clear memory 格式2:release内存变量名表 格式3:release allextended 格式4:release alllike通配符 except通配符功能: 格式1清除所有内存变量。 格式2清除指定的内存变量。 格式3清除所有的内存变量。在人机会话状态其作用与格式l相同。 格式4选用like短语清除与通配符相匹配的内存变量,except短语清除与通配符不相匹配的内存变量。例25在命令窗口中依次输入下列命令,命令格式及屏幕显示如下:clear memodime y(2,2)stor xxx to x1,y(1,1)y(3)=2000-0
16、3-23x2=$123.23list memo like y*rele all like y*5表中数据与数组数据之间的交换 表文件的数据内容是以记录的方式存储和使用的,而数组是把一批数据组织在一起的数据处理方法,为了使它们之间方便地进行数据交换,以利于程序的使用,vfp提供了相互之间数据传递的功能,可以方便地完成表记录与内存变量之间的数据交换。 将表的当前记录复制到数组 格式1:scatterfieids memoto数组名blank 格式2:scatterfields like通配符fields except通配符memo to数组名blankl 格式1的功能是将表的当前记录从指定字段表中
17、的第一个字段内容开始,依次复制到数组名中的从第一个数组元素开始的内存变量中。如果不使用fields短语指定字段,则复制除备注型m和通用型g之外的全部字段。 如果事先没有创建数组,系统将自动创建;如果己创建的数组元素个数少于字段数,系统自动建立其余数组元素;如果已创建的数组元素个数多于字段数,其余数组元素的值保持不变。 若选用memo短语,则同时复制备注型字段。 若选用blank短语,则产生一个空数组,各数组元素的类型和大小与表中当前记录的对应字段相同。 格式2的功能是用通配符指定包括或排除的字段。fields like通配符和fields except通配符可以同时使用。例:打开表文件“stu
18、dent.dbf”,包括9个字段: 学号(c,4)、姓名(c,6)、性别(l)、出生日期(d,8)等。当前记录为第一记录,把它复制到数组zg中。use studentscat to zg? zg(1),zg(2),zg(3)scat to zg memo &要求包括备注型字段scatter to bb fields like 姓*,总* &只选两字段list memo like bb 将数组数据复制到表的当前记录 格式1:gather fromfields字段名表memo 格式2:gather from数组名fields like通配符 fieids except memo 格
19、式1的功能是将数组中的数据作为一个记录复制到表的当前记录中。从第一个数组元素开始,依次向字段名表指定的字段填写数据。如果缺省fields选项,则依次向各个字段复制,如果数组元素个数多于记录中字段的个数,则多余部分被忽略。若选用memo短语,则在复制时包括备注型字段;否则备注型字段不予考虑。格式2功能是用通配符指定包括或排除的字段。fields like和 fields except可以同时使用。 例:打开表文件“student.dbf”,追加一条空记录,将数组rr中的内容复制到空记录中。注意数组中各个数组元素的数据类型必须与字段的数据类型对应一致。dime rr(1,3)rr(1,1)=952
20、201rr(1,2)=1995220217rr(1,3)=张三use studentappe blankgather from rrbrow22 表达式 表达式是由常量、变量和函数通过特定的运算符连接起来的式子。在用vfp编写的程序里,表达式几乎无所不在。表达式的形式包括:单一的运算对象(如常量、变量或函数)。由运算符将运算对象连接起来形成的式子。 无论是简单的还是复杂的合法表达式,按照规定的运算规则最终均能计算出一个结果,即表达式的值。 根据表达式值的类型,表达式可分为数值表达式、字符表达式、日期时间表达式和逻辑表达式。大多数逻辑表达式是带比较运算符的关系表达式。221数值、字符与日期时间表
21、达式1数值表达式 数值表达式由算术运算符将数值型数据连接起来形成,其运算结果仍然是数值型数据。 数值型数据可以是数值型常量或者变量。 算术运算优先级(p56) 数值表达式中的算术运算符有些与日常使用的运算符稍有区别. *是乘, / 是除, %是求余, *或是乘方.求余运算 求余运算和取余函数mod()的作用相同。余数的正负号与除数一致。当表达式中出现乘*、除和求余运算时,它们具有相同的优先级。例:求余运算 ? 10%3, 10%-3 1 -210339110-391被除数与除数同号被除数与除数异号,求得余数后再加上除数值.1(-3)-2+=-32字符表达式 字符表达式由字符串运算符将字符型数据
22、连接起来形成,其运算结果仍然是字符型数据。字符串运算符有以下两个,它们的优先级相同: +: 前后两个字符串首尾连接形成一个新的字符串。 -: 连接前后两个字符串,并将前字符串的尾部空格移到合并后的新字符串尾部。 例:字符串运算示例。a=hello b=everyone? a+b,a-ba+b-hell everyonea-b-helleveryone对于表中字符型字段也可用“+”,“-”运算use student? 姓名-“是个男同学”? 姓名-学号-班级3日期时间表达式 日期时间表达式中可以使用的运算符也有+和-两个。 日期时间表达式的格式有一定限制,不能任意组合,例如,不能用运算符+将两个
23、连接起来。合法的日期时间表达式格式(p57),其中的天数和秒数都是数值表达式。 222 关系表达式1关系表达式 关系表达式通常也称为简单逻辑表达式,它由关系运算符将两个运算对象连接起来形成,即: 关系运算符表达式2 关系运算符的作用是比较两个表达式的大小或前后。其运算结果是逻辑型数据。关系运算符及其含义如(p58)表24所示,它们的优先级相同。 运算符和仅适用于字符型数据。 其他运算符适用于任何类型的数据,但前后两个运算对象的数据类型要一致。 数值型和货币型数据比较 按数值的大小比较,包括负号。 日期或日期时间型数据比较 越早的日期或时间越小,越晚的日期或时间越大。 逻辑型数据比较 t大于f子
24、串包含测试前字符型表达式$后字符型表达式为子串包含测试,如果前者是后者的一个子字符串,结果为逻辑真(t),否则为逻辑假(f)。例如:store 计算机 to s1store 微型计算机 to s2? s1$s2, s2$s1, (s1$s2)(s2$s1) t f t2设置字符的排序次序 当比较两个字符串时,系统对两个字符串的字符自左向右逐个进行比较,一旦发现两个对应字符不同,就根据这两个字符的排序序列决定两个字符串的大小。对字符序列的排序设置有人机会话和命令两种方式。 在人机会话方式下设置 在“工具”菜单下选择“选项”,打开“选项”对话框。 单击“数据”选项卡。 从右上方的“排序序列”下拉框
25、中选择 “machine(机器)”、“pinyin(拼音)”或“stroke(笔画)”。单击“选项”对话框上的“确定”按钮。命令方式设置: 设置字符比较次序的命令是:set collate to “排序次序名” 排序次序名必须放在引号当中。次序名可以是“machine”、“pinyin”或“stroke”。 machine(机器)次序:指定的字符排序次序与xbase兼容,按照机内码顺序排序,在微机中,西文字符是按照ascii码值排列的:空格在最前面,大写abcd字母序列在小写abcd字母前,所以,大写字母小于小写字母。3字符串精确比较与exact设置 在用双等号运算符比较两个字符串时,只有当两
26、个字符串完全相同(包括空格以及各字符的位置)时,运算结果才会是逻辑真.t.,否则为逻辑假f。 在用单等号运算符比较两个字符串时,运算结果与set exact on|off设置有关,该命令是设置精确匹配与否的开关。该命令可以在命令窗口或在程序中执行,也可以通过“数据”选项卡设置。 系统默认off状态。当处于off状态时,只要右边的字符串与左边字符串的前面部分内容相匹配,即可得到逻辑真t的结果。也就是说,字符串的比较以右面的字符串为目标,右字符串结束即终止比较。当处于on状态时,比较到两个字符串全部结束,先在较短字符串的尾部加上若干个空格,使两个字符串的长度相等,然后再进行比较。 223逻辑表达式
27、1逻辑表达式 逻辑表达式由逻辑运算符将逻辑型数据连接起来而形成,其运算结果仍然是逻辑型数据。逻辑运算符有三个: not或!(逻辑非)、and(逻辑与)、or(逻辑或)。 其优先级顺序依次为not、and、or。 逻辑运算符的运算规则如(p60)表25所示,其中和分别代表两个逻辑型数据。 在许多命令和语句的格式中都有条件语法成分,这里的条件就是逻辑表达式或关系表达式。例如,查询基本工资高于1800元 的讲师和副教授,条件表达式应当写成:基本工资1800 and 职称“讲师” or 基本工资=1800 and 职称“副教授” 或者写成:基本工资1800 and (职称”讲师”or职称=“副教授”)
28、 23常用函数 函数是用程序来实现的一种数据运算或转换。每一个函数都有特定的数据运算或转换功能,它往往需要若干个自变量,即运算对象,但只能有一个运算结果,称为函数值或返回值。 函数可以用函数名加一对圆括号加以调用,自变量放在圆括号里,如len(x)。 函数调用可以出现在表达式里,表达式将函数的返回值作为自己运算的对象。函数调用也可作为一条命令使用,但此时系统忽略函数的返回值。 231数值函数 数值函数是指函数值为数值的一类函数,它们的自变量和返回值往往都是数值型数据。 1绝对值和符号函数 格式:abs(数值表达式) sign(数值表达式) 功能:abs()返回指定的数值表达式的绝对值。 sig
29、n()返回指定数值表达式的符号。当表达式的运算结果为正、负和零时,函数值分别为1、-1和0。2求平方根函数 格式:sqrt(数值表达式) 功能:返回指定表达式的平方根。自变量表达式的值不能为负。3圆周率函数 格式:pi() 功能:返回圆周率n(数值型)。该函数没有自变量。4.求整数函数 格式:int() celling() floor() 功能:int()返回指定数值表达式的整数部分 celling()返回大于或等于指定数值表达式的最小整数 floor()返回小于或等于指定数值表达式的最大整数5. 四舍五入函数格式: round(,x=345.345? round(x,2),round(x,1
30、),round(x,0),round(x,-1)显示结果:345.35 345.3 345 3506. 求余数格式: mod(数值表达式1,数值表达式2)数值表达式1为被除数,数值表达式2为除数.mod(10,3) 1mod(10,-3) -210339110-391被除数与除数同号被除数与除数异号,求得余数后再加上除数值.1(-3)-2+=-3 2.3.2 字符函数 1.求字符串长度 格式: len(字符表达式) 求“字符表达式”中的所有字符个数包括空格. 一个汉字占2个字符. 2.大小写转换函数 格式:lower(字符表达式) upper(字符表达式) 3.空格字符串生成函数 space(
31、数值表达式)4.删除前后空格函数格式:trim(字符表达式)ltrim(字符表达式)alltrim(字符表达式)5.取子串函数格式: left(字符表达式,长度) right(字符表达式,长度) substr(字符表达式,起始位置 ,长度)6.计算子串出现次数函数格式:occurs(字符表达式1,字符表达式2)7.求子串位置函数格式: at(字符表达式1,字符表达式2,数值表达式)功能:求 在 的起始位置数值。说明: 中不包含 ,函数值为零;若 的值含有两个以上的 的值,则函数给出第一个值的位置。大小写字母在检索中视为不同。atc(字符表达式,字符表达式,数值表达式)8.子串替换函数格式:st
32、uff(字符表达式1,起始位置,长度,字符表达式2)功能:从指定位置开始,用指定的字符串替换 中指定的字符串。说明:中的字符个数与中的字符个数可以不等;如果为0,则插入;如果为空字符串,则删除中指定字符。举例:例 store good bye! to s1 store morning to s2 ?stuff(s1,6,3,s2),stuff(s1,1,4,s2)9.字符替换函数格式: chrtran(字符表达式1,字符表达式2,字符表达式3)功能:当第一个字符串中的一个或多个相同字符与第二个字符串中的某个字符相匹配时,就用第三个字符串中的对应字符(与第二个字符串中的那个字符具有相同位置)替换
33、这些字符。例 x1=chrtran(“abcdad”,”acd”,”x12”) y1=chrtran(“计算机abc”,”计算机”,”电脑”) z1=chrtran(“大家好”,”大家”,”您”)?x1,y1,z110.字符串匹配函数格式:like(字符表达式1,字符表达式2)功能:比较两个字符串对应位置上的字符,若所有对应字符都相匹配,函数返回逻辑真,否则返回逻辑假。字符表达式1中可以包含通配符*和?例 store “abc” to xstore “abcd” to y ?like(“ab*”,x),like(“ab*”,y),like(x,y),like(“?b?”,x),like(“ab
34、c”,x)2.3.3 日期和日期时间函数1. 系统日期和时间格式: date() time() datetime() 07/29/02 19:10:10 07/29/02 19:10:102. 求年份、月份和天数函数格式:year(日期表达式|日期时间表达式) month (日期表达式|日期时间表达式) day (日期表达式|日期时间表达式) 这三个函数的返回值为数值型。?year(date()-year(出生日期)2.3.4 数据类型转换函数1.数值转换成字符串 格式:str(数值表达式,长度,小数位数)如:stor -123.456 to n? str(n,9,2), str(n,6,2)
35、, str(n,3), str(n,6), str(n)显结果: -123.46 -123.5 * -123 -1232. 字符串转换成数值格式: val()如字符串第一个字符不是数字字符,则返回0.00val(“123year567”)-123.00val(“year567”)-0.003. 字符串转换成日期或日期时间格式: ctod() 转换为日期 ctot() 转换为日期时间如:“2001/03/35”4. 日期或日期时间转换成字符串格式: dtoc(| ,1 ) ttoc(,1 )如日期时间t为08/18/01 11:54:38 pm ?dtoc(t) “08/18/01”?dtoc(
36、t,1) “20010818”?ttoc(t) “08/18/01 11:54:38 pm”?ttoc(t,1) “200108182354385. 宏替换函数格式: &字符型变量.作用:替换出字符型变量的内容,既&的值是变量中的字符串.例如: a=257 m=“a+1” ?m ?&m2.3.5 测试函数1. 值域测试函数格式:between(表达式t,表达式l,表达式h)功能: 表达式l=表达式表达式t4,200,300)-20010. 记录删除测试格式:dele()功能:记录指针所指的当前记录是否有删除标记“*”,若有为真,否则为假.历年考题1 有如下赋值语句a=“
37、计算机”,b=“微型”,结果为微型机的表达式是()a b+left(a,3) b b+right(a,1) c b+left(a,5,2) d b+right(a,2)2命令?len(space(3)-space(2)的结果是a)1 b)2 c)3 d)5 3想要将日期型或日期时间型数据中的年份用4位数字显示,应当使用设置命令a)set century on b)set century offc)set century to 4 d)set century of 44在visual foxpro中,宏替换可以从变量中替换出a)字符串 b)数值c)命令 d)以上三种都可能5在下面的visual
38、foxpro表达式中,运算结果不为逻辑真的是a)empty(space(0) b)like(xy*,xyz)c)at(xy,abcxyz) d)isnull(.nuill.) 24程序与程序文件2.4.1程序的概念 学习vfp的目的就是要使用它的命令来组织和处理数据、完成一些具体任务。 许多任务单靠一条命令是无法完成的,而是要执行一组命令来完成。如果采用在命令窗口逐条输入命令的方式进行,不仅非常麻烦,而且容易出错,这时应该采用程序的方式。 程序是能够完成一定任务的命令的有序集合。这组命令被存放在称为程序文件或命令文件的文本文件中。当运行程序时,系统会按照一定的次序自动执行包含在程序文件中的命令
39、。 与在命令窗口逐条输入命令相比,采用程序方式有如下好处: 可以利用编辑器,方便地输入、修改和保存程序。 可以用多种方式、多次运行程序。 可以在一个程序中调用另一个程序。 例 假定学号的前两位为入学年份(如01代表2001年),第3、4位为专业代码。编写命令文件testl.prg,分别统计所有学生和2001年入学,专业代码为03的学生选修课程号为101课程的平均成绩。 *分别统计所有学生和指定学生的平均成绩 *分别统计所有学生和指定学生的平均成绩 set talk off &决定 vfp 是否显示命令执行状态信息。 open data xsxk 打开数据库xsxk use 选课 in
40、0 在最小号空闲工作区打开选课表 select avg(成绩) from 选课 where 课程号=“101” ; into array ml select avg(成绩) from 选课 where 课程号=“101” ; and left(学号,2)=“01”; and subs(学号,3,2)=“03” into array m2 clear 清除vfp主窗口中显示的全部内容 ?”所有学生的平均分:”,m1(1,1) ?”指定学生的平均分:”,m2(1,1) close database 关闭当前数据库 set talk on return在命令窗口输入:do test1下面是对此程序的
41、几点说明: 命令注释:(不会影响程序的功能) 以note或*开头的代码行为注释行。命令行后也可添加注释,这种注释以符号开头。 set talk on|off命令 许多数据处理命令(如averagesum、sql等)在执行时都会返回一些有关执行状态的信息,这些信息通常会显示在vfp主窗口、状态栏或用户自定义窗口里。set talk命令用以设置是(on)、否(off)显示这些信息。默认值为on。 命令分行 程序中每条命令都以回车键结尾,一行只能写一条命令。若命令需要分行书写,应在一行终了时键入续行符“;”,再按回车键。 在vfp中,程序代码除了可以保存在程序文件中,还可以出现在报表设计器和菜单设计
42、器的过程代码窗口中、表单设计器和类设计器的事件或方法代码窗口中。 另外,还可以在命令窗口中像执行程序一样一次执行多条命令。方法是: 在命令窗口中选择需要执行的多条命令。 按enter键,或单击鼠标右键并在弹出的快捷菜单中选择“运行所选区域”。242程序文件的建立与执行1程序文件的建立与修改 程序文件的建立与修改一般是通过调用系统内置的文本编辑器来进行的。 要建立程序文件,可按以下步骤操作: 从“文件”菜单中选择“新建”命令,然后在“新建”对话框中选择“程序”单选按钮,并单击“新建文件”命令按钮。 在文本编辑窗口中输入程序内容。这里的编辑操作与普通文本文件的编辑操作没有什么不同。当然,这里输入的
43、是程序内容,是一条条命令。与在命令窗口输入命令不同,这里输入的命令是不会被马上执行的。 保存程序文件。从“文件”菜单中选择“保存”命令或按ctr+w键,然后在“另存为”对话框中指定程序文件的存放位置和文件名,并单击“保存”命令按钮。 程序文件的默认扩展名是程序文件的默认扩展名是prg要打开、修改程序文件,可按下列方法操作: 从“文件”菜单中选择“打开”命令。 在“文件类型”列表框中选择“程序”。 选定要修改的文件,并单击“确定”按钮。 编辑修改后,保存或按ctrl十w键保存。 也可用命令方式建立和修改程序文件。命令格式为: modify command 文件名 这里,文件名前可以指定保存文件的
44、路径。如果没有给定扩展名,系统自动加上默认扩展名prg。 执行该命令时,系统首先检索磁盘文件。如果指定文件存在,则打开修改;否则,系统认为是要建立一个指定了名字的文件。2执行程序文件 建立好程序文件,就可以用多种方式、多次执行它。下面是两种常用的方式。 菜单方式: 从“程序”菜单中选择“运行”命令,打开“运行”对话框。 从文件列表框中选择要运行的程序文件,并单击“运行”命令按钮。 命令方式: do 文件名 (文件名可不带扩展名) 该命令既可以在命令窗口发出,也可以出现在某个程序文件中,这样就使得一个程序在执行的过程中还可以调用执行另一个程序。 当程序文件被执行时,文件中包含的命令将被依次执行,
45、直到所有的命令被执行完毕,或者执行到以下命令: cancal:终止程序运行,清除所有的私有变量,返回命令窗口。 do:转去执行另一个程序。 return:结束当前程序的执行,返回到调用它的上级程序,若无上级程序则返回到命令窗口。 quit:退出vfp系统,返回到操作系统。 vfp程序文件通过编译、连编,可以产生不同的目标代码文件,这些文件具有不同的扩展名。 当用do执行程序文件时,如果没有指定扩展名则按.exe-.fxp-.prg顺序找相应的文件名。 如果用do命令执行查询文件、菜单文件,那么文件名中必须要包括扩展名。243简单的输入输出命令 一个程序一般都包含数据输入、数据处理和数据输出三个
46、部分。数据的输入和输出代码设计是编写许多程序都要面临的工作。1input命令 命令格式: input 字符表达式 to 内存变量 该命令等待用户从键盘输入数据,用户可以输入任意合法的表达式。当用户以回车键结束输入时,系统将表达式的值存入指定的内存变量,程序继续运行。功能注释: 如果选用字符表达式,那么系统会首先显示该表达式的值,作为提示信息。 输入的数据可以是常量、变量,也可以是更为一般的表达式。但不能不输入任何内容直接按回车键。 输入字符串时必须加定界符,输入逻辑型常量时要用圆点定界(如.t.,.f.),输入日期时间型常量时要用大括号 2001-03-01。 例 编写命令文件test2.pr
47、g,查找指定日期以后出生的学生。 open data xsxk use student clear input 请输入日期 to mrq select 学号,姓名,出生日期 from student; where 出生日期mrq; nowait &结果显示在查询窗口里,并继续往下执行 return在命令窗口输入命令:do test2 按回车会显示“请输入日期:”等待用户输入日期 2accept命令命令格式: accept to 该命令等待用户从键盘输入字符串。当用户以回车键结束输入时,系统将该字符串存入指定的内存变量,程序继续运行。 功能注释: 如果选用,那么系统会首先显示该表达式的值
48、,作为提示信息。 该命令只能接收字符串。用户在输入字符串时不需要加定界符;否则,系统会把定界符作为字符串本身的一部分。 如果不输入任何内容而直接按回车键,系统会把空串赋给指定的内存变量。 3wait命令命令格式: wait字符表达式to内存变量 windowat行,列 nowaitclear|nocleartimeout数值表达式 该命令显示字符表达式的值作为提示信息,暂停程序的执行,直到用户按任意键或单击鼠标时继续程序的执行。 wait ”输入无效,请重新输;入” window timeout 5功能注释: 如果字符表达式值为空串,那么不显示提示信息。如果无字符表达式,则显示默认的提示信息“
49、按任意键继续”。 内存变量用来保存用户键入的字符,其类型为字符型。若用户按的是enter键或单击了鼠标,那么内存变量中保存的将是空串。 一般情况下,提示信息被显示在vfp主窗口或当前用户自定义窗口里。如果指定了window子句,则会出现一个wait提示窗口,用以显示提示信息。提示窗口一般定位于主窗口的右上角,也可用at短语指定其在主窗口中的位置。 若选用nowait短语,系统将不等待用户按键,直接往下执行。 timeout子句用来设定等待时间(秒数)。一旦超时就不再等待用户按键,自动往下执行。25程序的基本结构 程序结构是指程序中命令或语句执行的流程结构。程序的三种基本结构: 顺序结构、选择结
50、构和循环结构。 顺序结构是最简单的程序结构,它按命令在程序中出现的先后次序依次执行。但是,绝大多数问题仅用顺序结构是无法解决的,还要用到选择结构和循环结构。251选择结构支持选择结构的语句包括条件语句和分支语句。 1条件语句 语句格式: if条件语句序列1 else语句序列2 endif 该语句根据条件是否成立从两组代码中选择一组执行。 有else子句时,两组可供选择的语句是语句序列1和语句序列2。如果条件成立,则执行语句序列1;否则,执行语句序列2。然后转向endif的下一条语句。 无else子句时,可看作第二组代码不包含任何命令。如果条件成立,则执行语句序列l,然后转向endif的下一条语
51、句;否则直接转向endif的下一条语句去执行。 if和endif必须成对出现,if是本结构的入口,endif是本结构的出口。 条件语句可以嵌套,但不能出现交叉。例 某地至北京的邮路里程为1043km,通过邮政局向北京城区寄交“特快专递”邮件,应在24小时内到达,计费标准每克为0.05元,但超过100克后,超出每克为0.02元。试编写程序计算邮费。 w*0.05 (w100)方法1:根据邮件重量是小于等于100克还是大于100克,用不同的公式计算邮费。 input ”请输入邮件重量:” to w if w100 fw*005 else f100*0.05十(w-100)* 0.02 endif
52、?”邮费为:”,f方法2:先按第一个公式计算邮费,若发现邮件重量大于100克,再按第二个公式计算邮费。 input ”请输入邮件重量:” to w fw*005 if w100 f100* 0.05十(w100)* 0.02 endif ?”邮费为:”,f例 编写命令文件test3.prg,请用户输入待查询学生的姓名,显示该学生基本情况。 open data 学生管理 use student in 1 select student clear accept ”请输入待查学生姓名:“ to name locate for 姓名name if .not. eof() ?”姓名:“十姓名 ?”性别:
53、“十iif(性别,”男”,”女”) ?”出生日期:”十dtoc(出生日期,1) else ?”查无此人!” endif close data return例:编写程序,实现如下功能: 程序运行时首先等待用户输入一个分数,然后判断该分数的所对应级别,若大于等于90,则输出”优”;若大于等于80小于90,则输出”良”;若大于等于60小于80,则输入出”中等”;若小于60,则输出”差”。2分支语句 分支语句实现一种扩展的选择结构,它可以根据条件从多组代码中选择一组执行。 语句格式: docase case条件1 语句序列1 case条件2 case条件n 语句序列n otherwise 语句序列 e
54、ndcase 语句执行时,依次判断case后面的条件是否成立。当发现某个case后面的条件成立时,就执行该case和下一个case之间的命令序列,然后执行endcase后面的命令。如果所有的条件都不成立,则执行otherwise与endcase之间的命令序列,然后转向endcase后面的语句。 功能注释: 不管有几个case条件成立,只有最先成立的那个case条件的对应命令序列被执行。 如果所有case条件都不成立,且没有otherwis子句,则直接跳出本结构。 do case和endcase必须成对出现,do case是本结构的入口,endcase是本结构的出口。252循环结构 循环结构也称
55、为重复结构,是指程序在执行的过程中,其中的某段代码被重复执行若干次。被重复执行的代码段,通常称之为循环体。vfp支持循环结构的语句包括: do whileenddo、 forendfor scan endscan语句。 1do while-enddo语句语句格式: do while条件 loop 语句序列2 exit 语句序列3 enddo 执行该语句时,先判断dowhile处的循环条件是否成立,如果条件为真,则执行do while与enddo之间的命令序列(循环体)。当执行到enddo时,返回到do while,再次判断循环条件是否为真,以确定是否再次执行循环体。若条件为假,则结束该循环语句
56、,执行enddo后面的语句。条件循环体enddo后面语句真假条件循环体loopexitenddo后面语句假真功能注释: 如果第一次判断条件时,条件即为假,则循环体一次都不执行。 如果循环体包含loop命令,那么当遇到loop时,就结束循环体的本次执行,不再执行其后面的语句,而是转回dowhile处重新判断条件。 如果循环体包含exit命令,那么当遇到exit时,就结束该语句的执行,转去执行enddo后面的语句。 通常loop或exit出现在循环体内嵌套的选择语句中,根据条件来决定是loop回去,还是exit出去。例 计算s1+2+3+100。 解题的思路归纳为两点: 引进变量s和i。s用来保存
57、累加的结果,初值为0;i既作为被累加的数据,也作为控制循环条件是否成立的变量,初值为1。 重复执行命令ss+i和i=i+1,直至i的值超过100。每一次执行,s的值增加i,i的增加l。 s=0 i=1 do while i=100 s=s+i i=i+1 enddo ?s,s例 逐条输出1982年出生的学生记录。 方法1:先用locate命令将记录指针定位于满足条件的第一条记录上,然后进入循环语句。每次执行循环体,先显示当前记录的内容,然后用continue命令将记录指针定位于满足条件的下一条记录上。 clear open data xsxk use student in 0 select s
58、tudent locate for year(出生日期)=1977 do while .not. eof() display &显示当前表当前记录的内容 wait continue enddo close database use方法2:先使用索引,再用seek命令将记录指针定位于满足条件的第一条记录上,然后进入循环语句。每次执行循环体,先显示当前记录的内容,然后用skip命令将记录指针移动到下一条记录上.注意,在索引表达式上相同的记录(1982年出生的记录)一定是排在一起的。 clear use student index on year(出生日期) tag csnf seek l9
59、82 do while year(出生日期)1977 display wait skip enddo use2forendfor语句 该语句通常用于实现循环次数已知情况下的循环结构。 语句格式: for=tostep步长 循环体 endfor|next 执行该语句时,首先将初值赋给循环变量,然后判断循环条件是否成立(与 的比较) 。若循环条件成立,则执行循环体,然后循环变量增加一个步长值,并再次判断循环条件是否成立,以确定是否再次执行循环体。若循环条件不成立,则结束该循环语句,执行endfor后面的语句。例 计算s1+2+3+100。 重复执行命令ss+i,并且i的值从1100。s=0。程序:
60、s=0for i=1 to 100s=s+iendfor?s=,s功能注释: 步长的默认值为1。 初值、终值和步长都可以是数值表达式。但这些表达式仅在循环语句执行开始时被计算一次。在循环语句的执行过程中,初值、终值和步长是不会改变的。 可以在循环体内改变循环变量的值,但这会影响循环体的执行次数。 exit和loop命令同样可以出现在该循环语句的循环体内。当执行到loop命令时,结束循环体的本次执行,然后循环变量增加一个步长值,并再次判断循环条件是否成立。例 找出100999之间的所有“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身(如153=13+53+33)。 解此题的关键是要知道如何分离出一个三位数中的各位数字。这里给出两种方法,其中i代表三位数,a、b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025安徽马鞍山市含山百方云科技有限公司招聘笔试历年常考点试题专练附带答案详解试卷3套
- 甘肃陇南公务员考试试题及答案
- 2025云南红河州红产林业发展有限公司社会招聘2人笔试历年常考点试题专练附带答案详解试卷3套
- 2025年及未来5年中国现代装备制造行业发展监测及投资战略研究报告
- 大专武汉公务员考试试题及答案
- 大学公务员考试机构试题及答案
- 达州公务员考试真题试题及答案
- 新型雨水管网材料与施工技术应用方案
- 生活垃圾焚烧发电项目建设工程方案
- 垃圾填埋场环境恢复与绿化方案
- 宋夹城体育公园市场化运营模式可行性分析报告
- 森林消防装备维护保养课件
- 南网培训课件
- 收费站业务培训课件
- 医院感染暴发与处理流程规范
- 反脑控的最佳解决方法
- 医学影像技术职业生涯规划书
- 招标评委管理办法
- 妇科超声新进展
- 《家政服务业职业技能大赛-家政服务赛项技术文件》
- 高校思政说课课件
评论
0/150
提交评论