《VFP程序命令文件的建立和执行.ppt》由会员分享,可在线阅读,更多相关《VFP程序命令文件的建立和执行.ppt(87页珍藏版)》请在三一办公上搜索。
1、5.1 VFP程序命令文件的建立和执行5.2 VFP常用编程命令及函数5.3 VFP流程图介绍5.4 顺序执行5.5 判断分支5.6 循环结构5.7 过程与用户自定义函数,第五章 Visual FoxPro程序设计入门,返回,5.1 VFP程序命令文件的建立和执行5.1.1 建立和编辑命令文件1用MODIFY COMMAND命令建立命令文件命令格式:MODIFY COMMAND 命令功能:打开命令文件编辑窗口创建/编辑指定命令文件。说明:文件名的默认扩展名为.PRG。指定文件存在时,首先在磁盘上复制一同名、同内容的.BAK文件。编辑结束时,可用End或W结束命令并存盘。也可用Esc键作废编辑并
2、结束命令。,2使用菜单操作建立命令文件 操作过程:文件新建选择“程序”单选按钮单击“新建文件”,将打开一编辑窗口,供用户输入程序。3使用项目管理器建立命令文件 有关项目管理器的详细内容参见第十三章。操作过程:首先打开项目管理器选择“代码”选项卡选择“程序”选项单击“新建”按钮,也将打开一编辑窗口供用户输入程序。,5.1.2 执行命令文件命令基本格式:DO 命令功能:首先打开指定的命令文件,然后从其第一条语句开始执行。执行完毕,自动关闭该命令文件。,5.2 VFP常用编程命令及函数,1SET TALK命令命令格式:SET TALK ON/OFF命令功能:使命令结果显示/不显示。,5.2 VFP常
3、用编程命令及函数1系统初始化命令CLEAR ALL命令格式:CLEAR ALL命令功能:关闭所有打开的库文件、表文件及其相关文件索引文件、备注文件等,清除所有内存变量,清除所有用户自定义下拉菜单、弹出式菜单和窗口,选择1号工作区为当前工作区。,2清屏命令CLEAR命令格式:CLEAR命令功能:清除VFP主窗口或当前用户自定义窗口。,3终止程序执行语句CANCEL命令格式:CANCEL命令功能:终止正在执行的程序,把控制权返回给COMMAND窗口。,4.程序注释语句NOTE/*命令格式1:NOTE命令格式2:*命令功能:标识一个非执行的注释行。,5.3 VFP流程图介绍,在编制程序尤其是编制复杂
4、程序时,常用流程图来进行程序设计和介绍程序的结构。流程图是形象的描述程序设计思想的好方法,它的特点是比较直观、清晰。,5.4 顺 序 执 行,5.4.1 顺序执行程序 顺序执行程序特点:命令的执行顺序就是命令在程序中的排列顺序,每条命令均被执行一次。例1 根据圆的半径计算圆的面积。程序清单:ClearInput请输入半径:to r?圆的面积为:,pi()*r*r,5.5 判 断 分 支,5.5.1 条件转向语句IFENDIF 这是一种简单的分支语句,语句格式如下:IF ENDIF 值为“真”时,顺序执行IF和ENDIF间的语句行序列,然后再执行ENDIF后的语句;若其值为“假”时,则直接跳到E
5、NDIF后面的语句继续执行。IF和ENDIF必须成对出现。,图54 条件转向语句流程图,例2 读程序清单,分析程序功能.ClearInput请输入一个随机正整数:to nIf mod(n,7)=0?Pass!Endif,5.5.2 条件选择转向语句IFELSEENDIF 语句格式:IF ELSE ENDIF 执行过程:计算条件表达式的值,若为真,则执行,然后跳过,从ENDIF后面的语句继续执行;否则,执行,然后再执行ENDIF后面的语句。,例3 读程序清单,分析程序功能.ClearInput请输入一个随机正整数:to nIf mod(n,7)=0?Pass!Else?Sorry!Endif,5
6、.5.3 IF语句的嵌套例4 为鼓励存款,对定期存款时间少于1年的,利率为3%;等于或大于1年而少于3年的,利率为5%;等于或大于3年而少于5年的,利率为7%;5年以上的,利率为9%。程序清单如下:,图58 例4的流程图,5.5.4 情况语句DO CASE ENDCASE情况语句格式:DO CASE CASE CASE CASE OTHERWISE ENDCASE,执行过程:依次计算每一个CASE语句对应的条件表达式,遇到第一个为真值者,则执行该语句下面对应的语句序列段,执行完后,直接跳转至ENDCASE后。如果所有的条件都不为真值,若无OTHERWISE子句,则不执行任何语句序列,跳转至EN
7、DCASE后;有可选项OTHEWISE时,执行OTHERWISE子句对应的语句序列,再跳转至ENDCASE后。如果有多个条件表达式为真值,也仅仅执行第一个条件表达式为真值者对应的语句序列。DO CASE和ENDCASE必须成对出现。DO CASE与第一个CASE之间的任何语句将不会被执行。,例5 用情况语句重新编制例4,比较情况语句与条件转向语句的用法。,5.6 循 环 结 构,5.6.1 三种循环语句1DO WHILE循环(1)语句格式:DO WHILE ENDDO,(2)执行过程:执行到DO WHILE语句时,首先计算的值,为真时,顺序执行循环体中的语句,即执行循环体;为假时,跳到ENDD
8、O的下面一句去执行,即跳出循环体,循环结束。执行到循环结束语句ENDDO时,系统返回循环起始语句,再一次执行DO WHILE语句。(3)说明:ENDDO和DO WHILE语句必须成对出现;在循环体内必须有使逐渐为假的语句,否则,将进入死循环。,图511 DO WHILE循环语句流程图,例:将一张厚度0.1mm并充分大的纸对折多少次后厚度超过珠峰的高度?,2SCAN循环语句格式:SCAN FOR ENDSCAN 其中,SCAN为循环起始语句,ENDSCAN为循环结束语句。语句功能:对当前表指定范围内满足条件的记录依次执行所规定的操作。范围省略值为ALL。例:使用循环在一行内显示女职工姓名。,3
9、FOR循环(1)语句格式:FOR=TO STEP ENDFOR/NEXT(2)执行过程,(3)说明:在执行循环体时,若对初值、终值和步长三个表达式中所含变量的值作了修改,不会影响循环初值、循环终值和步长。循环初值、循环终值和步长值必须合理,否则,不执行循环。执行循环体时,若修改了循环变量值,将会影响到循环执行次数。,例:计算N!=1*2*3*N例:计算I=1+2+3+N例:找出3位的水仙花数,若一个3位正整数的各位数字的立方和等于该数本身,则称这样的数为水仙花数。算法:枚举。把100-999之间的每一个数都检验一遍,输出满足定义的即可。,5.6.2 对表文件记录进行操作时的循环控制方式1对表文
10、件记录进行逐条操作的循环控制方式 格式1:SCAN ENDSCAN 格式2:DO WHILE.NOT.EOF()SKIP ENDDO,例11 用逐条记录循环操作的方法,打印输出表文件职工.DBF中每条记录的姓名和工资。依题意,本例的流程图如下。,图513 例11的流程图,CLEARSET PRINTER ON?姓名 工资OPEN DATABASE 雇员管理USE 职工SCAN?姓名+?工资ENDSCAN,USECLOSE DATABASESET PRINTER OFF,2选择表文件中符合条件的记录进行循环操作 格式1:SCANFOR ENDSCAN 格式2:LOCATEFOR DO WHILE
11、 FOUND()CONTINUE ENDDO,例12 修改表文件职工.DBF中职工的工资,对工资不超过600元且不低于500元者加10元。依题意,画流程图如图所示。,图514 例12的流程图,采用SCAN语句,程序如下:CLEAROPEN DATABASE 雇员管理USE 职工SCAN FOR 工资=500 REPLACE 工资 WITH 工资+10ENDSCANUSE CLOSE DATABASE,若采用DO WHILE语句,则程序其它部分不变,仅把循环部分改为:LOCA FOR工资=500DO WHILE FOUND()REPL 工资 WITH 工资+10 CONTENDDO,5.6.3
12、循环结构的两条专用语句1退出循环语句EXIT 前面介绍的循环语句格式中,一旦进入循环,循环次数实际上已经确定。但在实际应用中,常希望在某种情况下,强迫循环语句结束,去继续执行循环语句后的其它语句。EXIT语句可实现这一要求。语句格式:EXIT语句功能:立即退出循环,转去执行循环终端语句之后的语句。,EXIT语句通常包含在IF语句或DO CASE语句中,当某条件出现时,才被执行。通常用于无限次循环的控制,例如:DO WHILE.T.IF EXIT ENDIF ENDDO 类似地,EXIT可出现在DO CASE 的某语句序列中。,例13 打印某种报表,每打印完一张,便提示用户是否还要打印,由用户输
13、入的信息来进行控制,试编程序实现这种功能。依题意画流程图如图所示。程序如下:,图515 例13的流程图,CLEAR ALLDO WHILE.T.CLEAR ANSWER=MESSAGEBOX(继续打印吗?,36,打印提示)IF ANSWER=7 EXIT ENDIF ENDDO,2短路循环语句LOOP语句格式:LOOP语句功能:强迫结束本次循环体的执行,使流程返回循环开始语句。,例14 假设有一个表文件“工资.DBF”,其中包括有“姓名”、“实发工资”等字段,有20个记录。现在要求显示出此表中前10个记录的“姓名”和“实发工资”,但是,如果遇到“姓名”为“王林”的则不显示。编程序实现。依题意绘
14、制流程图如图所示。,图516 例14的流程图,采用SCAN循环语句,程序如下:CLEAR OPEN DATABASE 雇员管理USE 工资SCAN FOR RECNO()=10 IF 姓名=王林 LOOP ENDIF?姓名,实发工资 ENDSCAN USECLOSE DATABASE采用DO WHILE循环语句的程序见P.98,自学。,例15 令计算机从零开始计数,并将奇数累加求和。当奇数累加和大于300时,结束计数;否则,继续计数。依题意编程如下:,X=0JSH=0DO WHILE.T.X=X+1 DO CASE CASE INT(X/2)=X/2 LOOP,CASE INT(X/2)X/2
15、 JSH=JSH+X IF JSH300 EXIT ENDIF ENDCASEENDDO?奇数和=?JSH,5.6.4 循环结构应用举例1.循环语句与其它分支判断语句的嵌套 所谓嵌套,即为:在一个语句结构中,包含了另一个完整的语句结构。,例16 建立一个命令文件修改表文件职工.DBF中的工资,对于工资500元与600元之间的职工增加20元,而对于工资大于600元的职工增加100元。要求逐条记录进行操作。OPEN DATABASE 雇员管理 USE 职工 SCAN DO CASE CASE 工资=500 REPLACE 工资 WITH 工资+20 CASE 工资600 REPLACE 工资 WI
16、TH 工资+10 ENDCASE ENDSCAN USE CLOSE DATABASE,在嵌套使用时,注意不要互相交叉,下面给出两种错误的形式,如图518所示。,例17 假设某中学有一个管理记录本校学生成绩的表文件XSCJ.DBF,它的结构如下:,学号(N,5),姓名(C,8),性别(C,2),年级(N,2),语文(N,5,2),数学(N,5,2),物理(N,5,2),化学(N,5,2),英语(N,5,2),主平均(N,5,2),总平均(N,5,2),升留判定(C,6)编写程序:根据表中录入的各门课成绩,计算出每个学生的语文和数学两门主课的平均成绩与五门课的总平均成绩,然后根据学生的成绩来决定
17、学生是升级、留级,还是补考。如果主课平均成绩及格者,则升级;主课平均成绩不及格,但总平均成绩及格的,则同意补考;主课平均成绩不及格且总平均成绩也不及格者,则留级。最后分别打印出升级学生名单,留级学生名单和补考学生名单。依题意,本例的流程图如图519所示。,图519 例17的流程图,USE XSCJSCAN REPLACE 主平均 WITH(语文+数学)/2 REPLACE 总平均 WITH;(语文+数学+物理+化学+英语)/5 DO CASE CASE 主平均=60 REPLACE 升留判定 WITH 升级 CASE 主平均=60 REPLACE 升留判定 WITH 补考 ENDCASEEND
18、SCAN,LIST FOR 升留判定=升级 TO PRINTLIST FOR 升留判定=留级 TO PRINTLIST FOR 升留判定=补考 TO PRINTUSE,2多重循环 多重循环即循环的嵌套,在一个循环的循环体中,包含有另一个循环。我们称外层循环为外循环,被包含的循环称为内循环。以DO WHILE为例,多重循环的一般格式如图520所示。,例18 编制一张九九乘法表,要求格式如下:,*1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 6 6 12 18 24 30 367 7 14 21 28 35 42 4
19、9 8 8 16 24 32 40 48 56 64 9 9 18 27 36 45 54 63 72 81,CLEAR?“*FOR A=1 TO 9?AENDFOR?FOR A=1 TO 9?A B=1 DO WHILE B=A P=A*B?P B=B+1 ENDDO?ENDFOR,CLEAR?“*FOR A=1 TO 9?AENDFOR?FOR A=1 TO 9?A FOR B=1 TO A P=A*B?P ENDFOR?ENDFOR,例:找出100以内的素数-只能被1和自身整除的正整数。分析:枚举法。检查2-100之间的每一个数(外循环),对每一个数用2N-1去除(内循环),均不能被整除
20、的数就是要找的素数。,例:显示矩阵 1 2 3 4 5 6 7 8 9分析:外循环变量I用于表示行号 内循环变量J用于表示列号 任一数据可表示为:(I-1)*3+J又例:生成一个4行4列的数组存储两位的随机数整数并显示该数组值。,例:百元买百鸡问题。假设小鸡每只5角,公鸡每只2元,母鸡每只3元,若要用100元买到100只鸡,共有多少种方案。(枚举法解多解方程问题)设小鸡,公鸡,母鸡各为x,y,z只,则据题意可列出方程:x+y+z=100 0.5x+2y+3z=100算法:令x,y,z分别从0变化到100,检验每一种取值,输出满足上述条件的组合。进一步简化:z最大只能取33,y最大只能取50,当
21、y,z取定后x只能为100-y-z。,例:编写程序计算组合数=,其中n!=12n。CLEAR CLEAR INPUT 请输入N:TO N INPUT 请输入N:TO N INPUT 请输入M:TO M INPUT 请输入M:TO M C1=1 STORE 1 TO C1,C2,C3 FOR I=1 TO N DO FAC WITH N,C1 C1=C1*I DO FAC WITH M,C2 ENDFOR 计算N!DO FAC WITH N-M,C3 C2=1?组合数:,C1/C2/C3 FOR I=1 TO M SET TALK ON C2=C2*I ENDFOR 计算M!PROCEDURE
22、FAC C3=1 PARAMETERS X,Y FOR I=1 TO N-M FOR I=1 TO X C3=C3*I Y=Y*I ENDFOR 计算(N-M)!ENDFOR?组合数=,C1/C2/C3 RETURN,学生成绩管理系统,5.7 过程与用户自定义函数5.7.1 过程1创建过程 过程是为完成某个操作而编写的程序段。过程定义的语法格式如下:,PROCEDURE PARAMETERS RETURN TO MASTERENDPROC,RETURN称返回语句格式一:RETURN格式二:RETURN TO MASTER 格式二在过程嵌套调用时使用,表示返回到最高级调用者;格式一为返回上级调用
23、过程,即当程序执行该语句时,控制返回到其上级程序,按程序流程从调用该过程命令的下一条命令处继续执行。最多可使用254个字符。过程的存放位置:调用程序之后或过程文件中。,2.调用过程1)常用格式:DO WITH 这个语句出现在要调用某过程的主程序中。当主程序执行到该语句时,立即转去执行指定过程中的命令语句块;当在过程中遇到RETURN语句或遇到ENDPROC语句时,又转回主程序,按程序流程执行DO命令的下一条语句。,2)其它格式 VFP还提供了另外两种调用过程的方法:命令格式:=()命令格式:(),3.过程调用的嵌套 主程序调用一个过程,这个过程又可以调用第二个过程,第二个过程又可以调用第三个过
24、程,在系统允许的嵌套范围内这样一个一个地调用下去,这种调用就称为过程的嵌套。如图所示。,图523 过程的嵌套1,过程的嵌套,5.7.2 用户自定义函数 用户根据具体问题需要自己定义的函数,称为用户自定义函数。1.创建自定义函数语句格式:FUNCTION PARAMETERS&命令语句序列 RETURN ENDFUNC 说明:存放位置:调用程序段之后或过程文件中。用于向调用程序返回函数值。,2调用自定义函数调用格式:()执行过程和参数的传递过程与过程调用语句相同。,例 创建一自定义函数MYFUN用于计算N!,再编写主程序来调用该函数计算组合数。,自定义函数“Myfun”的内容如下:FUNCTIO
25、N Myfun PARAMETERS N S=1 I=1 FOR I=1 TO N S=S*I ENDFOR RETURN S ENDFUN,主程序的内容为:CLEAR INPUT 请输入N:TO N INPUT 请输入M:TO MA=Myfun(N)/Myfun(M)/Myfun(N-M)?组合数=,A,5.7.3 过程文件1建立过程文件 在设计过程时也可以把它们保存在单独的程序文件中,我们把这种程序文件称为过程文件。在一个过程文件中,可以包含某主程序所调用的全部过程。打开一个过程文件就打开了它所包含的所有过程。采用这种方式,既可以使主程序代码显得简练,也使程序结构更加紧凑。过程文件的建立方
26、法与命令文件一样,使用MODIFY COMMAND命令打开代码编辑窗口,在其中定义多个过程或函数。其默认的扩展名为.PRG。P.106例20。,2使用过程文件 调用过程文件中的过程,应首先打开该过程文件。命令格式:SET PROCEDURE TO,3关闭过程文件(1)用SET PROCEDURE TO 打开一个过程文件时,原已在内存中打开的过程文件即被关闭。即,内存中最多只能存在一个过程文件。(2)在主程序末尾应关闭过程文件。命令1:CLOSE PROCEDURE 命令2:SET PROCEDURE TO,5.7.4 设置内存变量属性内存变量可以具有两种属性:全局性和局部性(本地性)。内存变量
27、的属性表明了内存变量的作用范围。,1.内存变量的局部性 在程序中所定义的内存变量,如果未加说明将具有局部性,其特点为:(1)如果未加特别说明,则在定义它的程序执行完后,将被系统清除。(2)如果定义它的程序还要调用其它过程,那么它还可以在被调用的过程中使用。(3)在被调用的过程或函数执行当中,如果仍未做特别说明而改变了该内存变量的值,则在从过程或函数返回主程序时,该变量仍然保留它在过程或函数中被改变了的值,主程序在此基础上可继续使用。从内存变量的固有性质可知,在有过程嵌套的情况下,较高一级的程序中生成的变量可以供较低一级使用,而反之则不可,这就是内存变量的局部性。,例22 由键盘输入一个梯形的上
28、底、下底和高的值,在主程序中定义它们,然后在函数中求这个梯形的面积,分别看看这些变量在主程序与函数中的情况。P.108,自学。,2.设置全局性内存变量语句PUBLIC 在程序设置中,对有些函数中定义的内存变量,我们希望在主程序中仍能使用,或者希望它在整个的程序中均能使用,这时,应该使用全局性的内存变量。全局性内存变量定义格式如下:命令格式:PUBLIC 命令功能:定义指定的内存变量或数组具有全局性。,全局性内存变量的性质:(1)用PUBLIC语句声明过的内存变量可以在整个的程序以及各过程或函数中使用。在任何过程或函数中改变了该变量的值,当该变量进入到其它过程或函数时,仍然保留该改变了的变量值。
29、(2)当整个程序结束后,用PUBLIC语句声明过的内存变量依然存在,若要清除它们,必须借助于RELEASE命令。在VFP命令窗口下建立的内存变量都是全局性内存变量。无须用PUBLIC说明。在程序中,内存变量用PUBLIC命令说明为全局性变量之后,变量的初值为逻辑假(.F.)。例23见P.110。,3.隐藏内存变量语句PRIVATE命令格式:PRIVATE/命令功能:隐藏指定内存变量的已有定义。说明:后一选项可以有以下三种形式:(1)ALL:将所有的内存变量均隐藏。(2)ALL LIKE:内存中所有变量名与通配符相匹配的内存变量均隐蔽。(3)ALL EXCEPT:内存中除了变量名能与通配符相匹配
30、的内存变量,其余的均隐蔽。,PRIVATE并不产生新的变量。它只是把上级程序中定义的内存变量隐蔽起来,不再使用,而在当前过程中若要使用同名内存变量,需重新定义(不影响被隐蔽的内存变量值)。退出当前过程后,所有与被隐蔽内存变量同名的内存变量的定义被清除,复现原定义。PRIVATE语句的使用,使得过程中的变量与上层程序中的变量同名而不同值成为可能。例24 仍采用上一例,但在函数中把内存变量“面积”隐藏起来。见P.112。,从实例运行结果来看,对于没有做过任何说明的内存变量和做过隐藏说明又重新定义的内存变量,VFP将它们都标记为priv(局部的)。因此,在定义(或说明)它们的程序结束时,它们均被清除
31、。两者仅有一点不同,即:未做任何说明的内存变量在过程返回时保持被改变了的值;而在函数中做过隐蔽型说明的内存变量在返回主程序时则恢复被隐藏前的值。,5.7.5 过程调用中的参数传递1带参数调用过程命令命令格式:DO WITH 命令功能:调用指定过程,并以表达式的值提供该过程所需的参数。2过程中的参数语句语句格式:PARAMETERS 语句功能:说明本过程需传递的参数。,例25 阅读下列程序,体会参数传递规律。,主程序“L815.PRG”内容如下:SET TALK OFFCLEAR ALLMYA=5MYB=5MYC=5?主程序中变量定义情况:LIST MEMO LIKE MY*DO KK WITH
32、 10,MYA+MYB,MYC?返回主程序时变量情况:LIST MEMO LIKE MY*DO KK WITH 10,MYA+MYB,MYC?第二次返回主程序时变量情况:LIST MEMO LIKE MY*,过程“KK.PRG”内容如下:PROCEDURE KKPARAMETERS MYX,MYY,MYZMYX=MYX+3MYA=MYY+3MYZ=MYB+3?过程中变量定义情况:LIST MEMO LIKE MY*?RETURNENDPROC,通过对例25运行结果的分析,可以看到在参数的传递中有这样一些规律:(1)如果在DO语句中被传递的参数是一个常数,那么这个常数在接收数据的过程中将作为PA
33、RAMETERS给出的变量的值而被使用。(2)如果在DO语句中被传递的参数是一个表达式,那么该表达式先被求值,然后再将求出的值传递给PARAMETERS给出的变量。对(1)、(2)两种情况,通常又称为值传递方式。,(3)如果在DO语句中被传递的参数是一个内存变量,那么系统先用PARAMETERS给出的变量代换DO的变量,然后将DO语句的变量隐藏起来,被隐藏(hid)的内存变量在过程中不能使用。在过程中如改变了相应变量的值,被隐藏的内存变量的值也同时发生变化,在返回主程序时,系统将恢复做过隐藏标记的内存变量,并清除接收参数语句给出的所有内存变量。这种情况又称为引用传递方式。如果被传递的参数是一个内存变量,又不希望其值被过程改变,则可用一对圆括弧把它括起即可。当过程或函数所接收的参数多于所需要的个数时,VFP将产生一错误信息;反之,如果过程接收的参数个数少于所需要的个数,则VFP仅将余下不足的参数赋初值为“假”(.F),而不产生错误信息。参见P.117例26。,作业:P.125 4(10)(11)(28)P.134 5(5),作业:P.121 4(1)(2)(3)(16)P.134 5(1),