VFP程序命令文件的建立与执行_第1页
VFP程序命令文件的建立与执行_第2页
VFP程序命令文件的建立与执行_第3页
VFP程序命令文件的建立与执行_第4页
VFP程序命令文件的建立与执行_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VFP程序命令文件的建立与执行

5.1VFP——命令文件的建立和执行5.1.1建立和编辑命令文件1.用MODIFYCOMMAND命令建立命令文件命令格式:MODIFYCOMMAND[<文件名>]命令功能:打开命令文件编辑窗口创建/编辑指定命令文件。说明:文件名的默认扩展名为.PRG。指定文件存在时,首先在磁盘上复制一同名、同内容的.BAK编辑结束时,可用^End或^W结束命令并存盘。也可用Esc键作废编辑并结束命令。

2.使用菜单操作建立命令文件操作过程:文件→新建→选择“程序”单选按钮→单击“新建文件”,将打开一编辑窗口,供用户输入程序。

3.使用项目管理器建立命令文件有关项目管理器的详细内容参见第十三章。操作过程:首先打开项目管理器→选择“代码”选项卡→选择“程序”选项→单击“新建”按钮,也将打开一编辑窗口供用户输入程序。

5.1.2执行命令文件命令基本格式:DO<命令文件名>命令功能:首先打开指定的命令文件,然后从其第一条语句开始执行。执行完毕,自动关闭该命令文件。5.2VFP常用编程命令及函数1.SETTALK命令命令格式:SETTALKON/OFF命令功能:使命令结果显示/不显示。5.2VFP常用编程命令及函数1.系统初始化命令——CLEARALL命令格式:CLEARALL命令功能:关闭所有打开的库文件、表文件及其相关文件——索引文件、备注文件等,清除所有内存变量,清除所有用户自定义下拉菜单、弹出式菜单和窗口,选择1号工作区为当前工作区。2.清屏命令——CLEAR命令格式:CLEAR命令功能:清除VFP主窗口或当前用户自定义窗口。

3.终止程序执行语句——CANCEL命令格式:CANCEL命令功能:终止正在执行的程序,把控制权返回给COMMAND窗口。4.程序注释语句——NOTE/*命令格式1:NOTE<注释字符>命令格式2:*<注释字符>命令功能:标识一个非执行的注释行。5.3VFP流程图介绍

在编制程序尤其是编制复杂程序时,常用流程图来进行程序设计和介绍程序的结构。流程图是形象的描述程序设计思想的好方法,它的特点是比较直观、清晰。

5.4顺序执行

5.4.1顺序执行程序顺序执行程序特点:命令的执行顺序就是命令在程序中的排列顺序,每条命令均被执行一次。例1根据圆的半径计算圆的面积。程序清单:ClearInput’请输入半径:’tor?‘圆的面积为:’,pi()*r*r5.5判断分支

5.5.1条件转向语句——IF…ENDIF

这是一种简单的分支语句,语句格式如下:

IF<条件表达式><命令序列>

ENDIF<条件表达式>值为“真”时,顺序执行IF和ENDIF间的语句行序列,然后再执行ENDIF后的语句;若其值为“假”时,则直接跳到ENDIF后面的语句继续执行。

IF和ENDIF必须成对出现。图5 – 4条件转向语句流程图

例2读程序清单,分析程序功能.ClearInput’请输入一个随机正整数:’tonIfmod(n,7)=0?‘Pass!’Endif5.5.2条件选择转向语句——IF…ELSE…ENDIF

语句格式:IF <条件表达式><命令序列1>

ELSE<命令序列2>

ENDIF执行过程:计算条件表达式的值,若为真,则执行<命令序列1>,然后跳过<命令序列2>,从ENDIF后面的语句继续执行;否则,执行<命令序列2>,然后再执行ENDIF后面的语句。

例3读程序清单,分析程序功能.ClearInput’请输入一个随机正整数:’tonIfmod(n,7)=0?‘Pass!’Else?‘Sorry!’Endif

5.5.3IF语句的嵌套例4为鼓励存款,对定期存款时间少于1年的,利率为3%;等于或大于1年而少于3年的,利率为5%;等于或大于3年而少于5年的,利率为7%;5年以上的,利率为9%。程序清单如下:图5 – 8例4的流程图5.5.4情况语句——DOCASE…ENDCASE情况语句格式:

DOCASECASE <条件表达式1><语句行序列1>

CASE <条件表达式2><语句行序列2>…CASE <条件表达式n><语句行序列n>[OTHERWISE<语句行序列>]

ENDCASE执行过程:依次计算每一个CASE语句对应的条件表达式,遇到第一个为真值者,则执行该语句下面对应的语句序列段,执行完后,直接跳转至ENDCASE后。如果所有的条件都不为真值,若无OTHERWISE子句,则不执行任何语句序列,跳转至ENDCASE后;有可选项OTHEWISE时,执行OTHERWISE子句对应的语句序列,再跳转至ENDCASE后。如果有多个条件表达式为真值,也仅仅执行第一个条件表达式为真值者对应的语句序列。

DOCASE和ENDCASE必须成对出现。

DOCASE与第一个CASE之间的任何语句将不会被执行。例5用情况语句重新编制例4,比较情况语句与条件转向语句的用法。

5.6循环结构

5.6.1三种循环语句1.DOWHILE循环(1)语句格式:

DOWHILE<条件表达式><循环体语句序列>

ENDDO

(2)执行过程:①执行到DOWHILE语句时,首先计算<条件表达式>的值,为真时,顺序执行循环体中的语句,即执行循环体;为假时,跳到ENDDO的下面一句去执行,即跳出循环体,循环结束。②执行到循环结束语句ENDDO时,系统返回循环起始语句,再一次执行DOWHILE语句。(3)说明:ENDDO和DOWHILE语句必须成对出现;在循环体内必须有使<条件表达式>逐渐为假的语句,否则,将进入死循环。图5–11DOWHILE循环语句流程图例:将一张厚度0.1mm并充分大的纸对折多少次后厚度超过珠峰的高度?2.SCAN循环语句格式:

SCAN[<范围>][FOR<条件>]

<循环体语句序列>

ENDSCAN

其中,SCAN为循环起始语句,ENDSCAN为循环结束语句。

语句功能:对当前表指定范围内满足条件的记录依次执行<循环体语句序列>所规定的操作。范围省略值为ALL。例:使用循环在一行内显示女职工姓名。3.FOR循环(1)语句格式:FOR<循环变量名>=<数值表达式1>TO<数值表达式2>

[STEP<数值表达式3>]<循环体语句序列>ENDFOR/NEXT(2)执行过程(3)说明:①在执行循环体时,若对初值、终值和步长三个表达式中所含变量的值作了修改,不会影响循环初值、循环终值和步长。②循环初值、循环终值和步长值必须合理,否则,不执行循环。③执行循环体时,若修改了循环变量值,将会影响到循环执行次数。例:计算N!=1*2*3*……*N例:计算∑I=1+2+3+……+N例:找出3位的水仙花数,若一个3位正整数的各位数字的立方和等于该数本身,则称这样的数为水仙花数。算法:枚举。把100-999之间的每一个数都检验一遍,输出满足定义的即可。5.6.2对表文件记录进行操作时的循环控制方式1.对表文件记录进行逐条操作的循环控制方式格式1:SCAN <语句行序列>

ENDSCAN格式2:DOWHILE.NOT.EOF( ) <语句行序列>

SKIP ENDDO例11用逐条记录循环操作的方法,打印输出表文件职工.DBF中每条记录的姓名和工资。依题意,本例的流程图如下。图5–13例11的流程图

CLEARSETPRINTERON?"姓名工资"OPENDATABASE雇员管理USE职工SCAN?姓名+""??工资ENDSCANUSECLOSEDATABASESETPRINTEROFF2.选择表文件中符合条件的记录进行循环操作格式1:SCAN[<范围>][FOR<条件>] <语句行序列>

ENDSCAN

格式2:LOCATE[<范围>][FOR<条件>]

DOWHILEFOUND( )<语句行序列>

CONTINUE ENDDO例12修改表文件职工.DBF中职工的工资,对工资不超过600元且不低于500元者加10元。依题意,画流程图如图所示。

图5–14例12的流程图

采用SCAN语句,程序如下:CLEAROPENDATABASE雇员管理USE职工SCANFOR工资<=600AND工资>=500

REPLACE工资WITH工资+10ENDSCANUSECLOSEDATABASE若采用DOWHILE语句,则程序其它部分不变,仅把循环部分改为:LOCAFOR工资<=600AND工资>=500DOWHILEFOUND( )REPL工资WITH工资+10

CONTENDDO5.6.3循环结构的两条专用语句1.退出循环语句——EXIT

前面介绍的循环语句格式中,一旦进入循环,循环次数实际上已经确定。但在实际应用中,常希望在某种情况下,强迫循环语句结束,去继续执行循环语句后的其它语句。EXIT语句可实现这一要求。语句格式:EXIT语句功能:立即退出循环,转去执行循环终端语句之后的语句。

EXIT语句通常包含在IF语句或DOCASE语句中,当某条件出现时,才被执行。通常用于无限次循环的控制,例如:

DOWHILE.T.<语句行序列>

IF<条件表达式>

EXITENDIFENDDO

类似地,EXIT可出现在DOCASE的某语句序列中。例13打印某种报表,每打印完一张,便提示用户是否还要打印,由用户输入的信息来进行控制,试编程序实现这种功能。依题意画流程图如图所示。程序如下:图5–15例13的流程图CLEARALLDOWHILE.T.<打印报表程序段>

CLEARANSWER=MESSAGEBOX("继续打印吗?",36,"打印提示")

IFANSWER=7EXITENDIFENDDO

2.短路循环语句——LOOP语句格式:LOOP语句功能:强迫结束本次循环体的执行,使流程返回循环开始语句。例14假设有一个表文件“工资.DBF”,其中包括有“姓名”、“实发工资”等字段,有20个记录。现在要求显示出此表中前10个记录的“姓名”和“实发工资”,但是,如果遇到“姓名”为“王林”的则不显示。编程序实现。依题意绘制流程图如图所示。

图5–16例14的流程图采用SCAN循环语句,程序如下:CLEAROPENDATABASE雇员管理USE工资SCANFORRECNO()<=10IF姓名="王林"

LOOPENDIF?姓名,实发工资ENDSCANUSECLOSEDATABASE采用DOWHILE循环语句的程序见P.98,自学。例15令计算机从零开始计数,并将奇数累加求和。当奇数累加和大于300时,结束计数;否则,继续计数。依题意编程如下:

X=0JSH=0DOWHILE.T.X=X+1DOCASECASEINT(X/2)=X/2LOOPCASEINT(X/2)<>X/2JSH=JSH+XIFJSH>300EXITENDIFENDCASEENDDO?"奇数和="??JSH5.6.4循环结构应用举例1.循环语句与其它分支判断语句的嵌套所谓嵌套,即为:在一个语句结构中,包含了另一个完整的语句结构。例16建立一个命令文件修改表文件职工.DBF中的工资,对于工资500元与600元之间的职工增加20元,而对于工资大于600元的职工增加100元。要求逐条记录进行操作。

OPENDATABASE雇员管理

USE职工

SCANDOCASECASE工资<600.AND.工资>=500

REPLACE工资WITH工资+20

CASE工资>600

REPLACE工资WITH工资+10

ENDCASEENDSCANUSECLOSEDATABASE在嵌套使用时,注意不要互相交叉,下面给出两种错误的形式,如图5–18所示。例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)编写程序:根据表中录入的各门课成绩,计算出每个学生的语文和数学两门主课的平均成绩与五门课的总平均成绩,然后根据学生的成绩来决定学生是升级、留级,还是补考。如果主课平均成绩及格者,则升级;主课平均成绩不及格,但总平均成绩及格的,则同意补考;主课平均成绩不及格且总平均成绩也不及格者,则留级。最后分别打印出升级学生名单,留级学生名单和补考学生名单。依题意,本例的流程图如图5–19所示。图5–19例17的流程图

打开相关表文件

对每一条记录,均执行

主平均=(语文+数学)/2总平均=(语文+数学+物理+化学+英语)/5

主平均<60主平均<60主平均>=60且总平均<60且总平均>=60升留判定=“升级”升留判定=“留级”升留判定=“补考”

打印升级记录

打印留级记录

打印补考记录

USEXSCJSCANREPLACE主平均WITH(语文+数学)/2

REPLACE总平均WITH;(语文+数学+物理+化学+英语)/5

DOCASECASE主平均>=60

REPLACE升留判定WITH"升级"CASE主平均<60.AND.总平均<60

REPLACE升留判定WITH"留级"

CASE主平均<60.AND.总平均>=60

REPLACE升留判定WITH"补考"ENDCASEENDSCAN

LISTFOR升留判定="升级"TOPRINTLISTFOR升留判定="留级"TOPRINTLISTFOR升留判定="补考"TOPRINTUSE2.多重循环多重循环即循环的嵌套,在一个循环的循环体中,包含有另一个循环。我们称外层循环为外循环,被包含的循环称为内循环。以DOWHILE为例,多重循环的一般格式如图5–20所示。例18编制一张九九乘法表,要求格式如下:*1234567891

12243

3694

4812165

5101520256

612182430367

71421283542498

8162432404856649

91827364554637281

CLEAR?“*"FORA=1TO9??AENDFOR?FORA=1TO9?AB=1DOWHILEB<=AP=A*B??PB=B+1ENDDO?ENDFORCLEAR?“*"FORA=1TO9??AENDFOR?FORA=1TO9?AFORB=1TOAP=A*B??PENDFOR?ENDFOR例:找出100以内的素数-只能被1和自身整除的正整数。分析:枚举法。检查2-100之间的每一个数(外循环),对每一个数用2~N-1去除(内循环),均不能被整除的数就是要找的素数。

例:显示矩阵123456789分析:外循环变量I用于表示行号内循环变量J用于表示列号任一数据可表示为:(I-1)*3+J又例:生成一个4行4列的数组存储两位的随机数整数并显示该数组值。

例:百元买百鸡问题。假设小鸡每只5角,公鸡每只2元,母鸡每只3元,若要用100元买到100只鸡,共有多少种方案。(枚举法解多解方程问题)设小鸡,公鸡,母鸡各为x,y,z只,则据题意可列出方程:x+y+z=1000.5x+2y+3z=100算法:令x,y,z分别从0变化到100,检验每一种取值,输出满足上述条件的组合。进一步简化:z最大只能取33,y最大只能取50,当y,z取定后x只能为100-y-z。

例:编写程序计算组合数=,其中n!=1×2×……×n。CLEARCLEARINPUT"

请输入N:"TONINPUT"

请输入N:"TONINPUT"

请输入M:"TOMINPUT"

请输入M:"TOMC1=1STORE1TOC1,C2,C3FORI=1TONDOFACWITHN,C1C1=C1*IDOFACWITHM,C2ENDFOR计算N!

DOFACWITHN-M,C3C2=1?"组合数:",C1/C2/C3FORI=1TOMSETTALKONC2=C2*IENDFOR计算M!PROCEDUREFACC3=1PARAMETERSX,YFORI=1TON-MFORI=1TOXC3=C3*IY=Y*IENDFOR计算(N-M)!ENDFOR?"组合数=",C1/C2/C3RETURN学生成绩管理系统5.7过程与用户自定义函数5.7.1过程1.创建过程过程是为完成某个操作而编写的程序段。过程定义的语法格式如下:

PROCEDURE<过程名>[PARAMETERS<虚参数表>]<命令语句序列>[RETURN[TOMASTER]][ENDPROC]RETURN称返回语句格式一:RETURN格式二:RETURNTOMASTER格式二在过程嵌套调用时使用,表示返回到最高级调用者;格式一为返回上级调用过程,即当程序执行该语句时,控制返回到其上级程序,按程序流程从调用该过程命令的下一条命令处继续执行。<过程名>最多可使用254个字符。过程的存放位置:调用程序之后或过程文件中。2.调用过程1)常用格式:DO<过程名>[WITH<实参数表>]这个语句出现在要调用某过程的主程序中。当主程序执行到该语句时,立即转去执行指定过程中的命令语句块;当在过程中遇到RETURN语句或遇到ENDPROC语句时,又转回主程序,按程序流程执行DO命令的下一条语句。2)其它格式

VFP还提供了另外两种调用过程的方法:①

命令格式:=<过程名>()②

命令格式:<过程名>()

3.过程调用的嵌套主程序调用一个过程,这个过程又可以调用第二个过程,第二个过程又可以调用第三个过程,在系统允许的嵌套范围内这样一个一个地调用下去,这种调用就称为过程的嵌套。如图所示。————DO<过程名1>————————DO<过程名2>——RETURN

————DO<过程名3>——RETURN————————RETURN图5–23过程的嵌套1————DO<过程名1>————————DO<过程名2>——RETURN

————DO<过程名3>——RETURN————————RETURN过程的嵌套————DO<过程名1>————————DO<过程名2>——RETURN

————DO<过程名3>——RETURN

——————RETURNTOMASTER

5.7.2用户自定义函数用户根据具体问题需要自己定义的函数,称为用户自定义函数。1.创建自定义函数语句格式:

FUNCTION<用户自定义函数名>[PARAMETERS<变量名表>]…&&命令语句序列[RETURN[<表达式>]]

ENDFUNC说明:存放位置:调用程序段之后或过程文件中。<表达式>用于向调用程序返回函数值。

2.调用自定义函数调用格式:<自定义函数名>([<表达式表>])执行过程和参数的传递过程与过程调用语句相同。例创建一自定义函数MYFUN用于计算N!,再编写主程序来调用该函数计算组合数。自定义函数“Myfun”的内容如下:

FUNCTIONMyfunPARAMETERSNS=1I=1FORI=1TONS=S*IENDFORRETURNSENDFUN主程序的内容为:CLEARINPUT"

请输入N:"TONINPUT"

请输入M:"TOMA=Myfun(N)/Myfun(M)/Myfun(N-M)?"组合数=",A5.7.3过程文件1.建立过程文件在设计过程时也可以把它们保存在单独的程序文件中,我们把这种程序文件称为过程文件。在一个过程文件中,可以包含某主程序所调用的全部过程。打开一个过程文件就打开了它所包含的所有过程。采用这种方式,既可以使主程序代码显得简练,也使程序结构更加紧凑。过程文件的建立方法与命令文件一样,使用MODIFYCOMMAND命令打开代码编辑窗口,在其中定义多个过程或函数。其默认的扩展名为.PRG。P.106例20。2.使用过程文件调用过程文件中的过程,应首先打开该过程文件。命令格式:SETPROCEDURETO<过程文件名>3.关闭过程文件(1)用SETPROCEDURETO<过程文件名>打开一个过程文件时,原已在内存中打开的过程文件即被关闭。即,内存中最多只能存在一个过程文件。(2)在主程序末尾应关闭过程文件。

命令1:CLOSEPROCEDURE

命令2:SETPROCEDURETO5.7.4设置内存变量属性内存变量可以具有两种属性:全局性和局部性(本地性)。内存变量的属性表明了内存变量的作用范围。1.内存变量的局部性在程序中所定义的内存变量,如果未加说明将具有局部性,其特点为:(1)如果未加特别说明,则在定义它的程序执行完后,将被系统清除。(2)如果定义它的程序还要调用其它过程,那么它还可以在被调用的过程中使用。(3)在被调用的过程或函数执行当中,如果仍未做特别说明而改变了该内存变量的值,则在从过程或函数返回主程序时,该变量仍然保留它在过程或函数中被改变了的值,主程序在此基础上可继续使用。从内存变量的固有性质可知,在有过程嵌套的情况下,较高一级的程序中生成的变量可以供较低一级使用,而反之则不可,这就是内存变量的局部性。例22由键盘输入一个梯形的上底、下底和高的值,在主程序中定义它们,然后在函数中求这个梯形的面积,分别看看这些变量在主程序与函数中的情况。P.108,自学。

2.设置全局性内存变量语句——PUBLIC

在程序设置中,对有些函数中定义的内存变量,我们希望在主程序中仍能使用,或者希望它在整个的程序中均能使用,这时,应该使用全局性的内存变量。全局性内存变量定义格式如下:命令格式:PUBLIC<内存变量名/数组说明符清单>命令功能:定义指定的内存变量或数组具有全局性。全局性内存变量的性质:(1)用PUBLIC语句声明过的内存变量可以在整个的程序以及各过程或函数中使用。在任何过程或函数中改变了该变量的值,当该变量进入到其它过程或函数时,仍然保留该改变了的变量值。(2)当整个程序结束后,用PUBLIC语句声明过的内存变量依然存在,若要清除它们,必须借助于RELEASE命令。在VFP命令窗口下建立的内存变量都是全局性内存变量。无须用PUBLIC说明。在程序中,内存变量用PUBLIC命令说明为全局性变量之后,变量的初值为逻辑假(.F.)。

例23见P.110。3.隐藏内存变量语句——PRIVATE命令格式:PRIVATE<内存变量名清单>/<ALL[LIKE/EXCEPT<通配符>]>命令功能:隐藏指定内存变量的已有定义。说明:后一选项可以有以下三种形式:(1)ALL:将所有的内存变量均隐藏。(2)ALLLIKE<通配符>:内存中所有变量名与通配符相匹配的内存变量均隐蔽。(3)ALLEXCEPT<通配符>:内存中除了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论