1、Visual FoxPro,Cao Jing,Visual FoxPro 6.0 程序设计,1. 数据库设计基础,2. VFP操作基础,3. VFP的数据及其运算,4. 数据表基本操作,5. 数据库基本操作,6. VFP程序设计,7. SQL关系数据库查询语言,8. 查询与视图,9. 表单设计与应用,10. 菜单设计与应用,11. 报表设计与应用,12. 数据结构与算法,13. 数据设计基础与软件工程,VFP程序设计,6.1程序设计基础 6.2程序文件中的常用命令 6.3顺序结构程序设计 6.4选择结构程序设计 6.5循环结构程序设计 6.6多模块程序设计 6.7自定义函数,VFP程序设计,V
2、FP程序设计的基本方法,Visual FoxPro的基本工作方式有两种:交互方式和程序方式。交互方式仅适用于简单问题的解决。程序方式是根据要解决的问题事先编写好一序列命令集合,并将其保存在程序文件中,通过运行程序,让系统自动执行程序代码。,6.1 程序设计基础,调试程序,程序编码,画流程图,算法设计,分析问题,程序是为了完成某一具体任务而编写的一系列指令程序设计是利用系统所提供的设计工具,按照程序语言的规范,编写程序代码的过程程序自动执行多条命令程序可被修改并重新运行,且可多次运行VFP程序文件是扩展名为.PRG的文本文件,流程图,下面分别是用流程图和N-S图表示的计算S=1+2+3+n的算法
3、。,程序文件的创建与编辑,程序文件也称为命令文件,其扩展名为“.prg”。 1命令方式 【格式】MODIFY COMMAND |? 【说明】 是由用户指定要建立的程序名,缺省的扩展名为.prg。 若已存在,则打开此程序文件,进入修改编辑状态。 输入程序命令行后,保存可使用【Ctrl+W】组合键,或单击“退出”按钮退出;放弃保存按【Esc】键。 若使用“MODIFY COMMAND ?”格式,则系统将弹出“打开”对话框。 若不选择“|?”选项,系统默认文件名为“程序1.prg”。,程序文件的创建与编辑,2菜单方式 选择“文件”菜单中的【新建】命令或单击常用工具栏上的“新建”按钮,在弹出的“新建”
4、对话框中选中【程序】单选按钮,然后单击【新建文件】按钮,打开【程序】窗口。 其余操作与命令方式操作相同。 3项目管理器方式 打开项目管理器,在“代码”选项卡中选择“程序”选项。 单击“新建”按钮,打开“程序”窗口。 其他步骤与用命令方式建立程序文件的步骤相同。,程序文件的执行,1命令方式运行程序文件 【格式】DO 该命令可在“命令”窗口中输入使用,也可在程序中调用该程序文件。 DO命令默认运行后缀名为.prg的程序文件。2菜单方式运行程序文件 3利用工具栏中的命令按钮运行程序文件 4利用“项目管理器”运行程序文件,程序文件中的常用命令,程序中的辅助命令 1设置会话状态命令 【格式】SET TA
5、LK ON|OFF 【功能】设置该命令之后的每一个命令的运行结果是否显示。系统的默认状态是SET TALK ON。 2清除屏幕显示命令 【格式】CLEAR 【功能】清除屏幕输出窗口的显示内容。 3返回命令 【格式】RETURN 4终止命令 【格式】CANCEL 5退出命令 【格式】QUIT,非格式输入和输出命令,1输入命令 (1)INPUT命令 【格式】INPUT “提示信息“ TO 【功能】暂停程序,输数据后按【Enter】键,则将数据赋给TO后指定的中。 【说明】可以输入的数据类型有:数值型、字符型、逻辑型和日期型。 (2)ACCEPT命令 【格式】ACCEPT “提示信息“ TO 【功能
6、】同input。 【说明】该命令输入的数据其类型只能是字符型,不需要定界符。,非格式输入和输出命令,(3)WAIT命令 【格式】WAIT “提示信息“ TO WINDOWTIMEOUT 【功能】暂停程序,等待用户按任意键或单击鼠标时继续运行程序。 【说明】 如果选择“提示信息“选项,则先显示“提示信息“,然后等待用户从键盘输入任意一个字符;如果省略“提示信息“,则系统在屏幕上自动显示“按任意键继续”的提示信息,等待用户从键盘输入任意一个字符或单击鼠标。 若选择WINDOW子句,则在屏幕右上角出现一个窗口,显示“提示信息“的内容;否则“提示信息“显示在屏幕的输出窗口中。 若选择TO子句,则所输入
7、的字符赋给指定的内存变量;否则不保存输入的字符。 TIMEOUT子句用来设定等待时间(秒数)。一旦超时就不再等待用户按键,自动往下运行。 输入数据类型都被认为是字符型。,非格式输入和输出命令,2输出命令 (1)?显示命令 【格式】? 【功能】先计算的值,然后显示在屏幕上,即它具有“先计算,再显示”的双重功能。 【说明】 该命令从屏幕当前行的下一行的第一列开始显示表达式表的结果。 若有多个表达式,则表达式之间用逗号“,”分隔。 (2)?显示命令 【功能】从屏幕上当前行、当前列的位置开始显示的值。 ?命令是续行显示,而?命令是换行显示。,格式输入和输出命令,1格式输出命令 【格式】 SAY 【功能
8、】在屏幕上按指定位置上显示SAY子句的值。 【说明】 为屏幕上指定位置的坐标。显示结果的位置受屏幕分辨率的影响。 在所指定的位置开始显示的值。例如:20,10 SAY “同学们好!”,格式输入和输出命令,2格式输入命令 【格式】 SAY GET DEFAULT READ 【功能】在指定位置上显示的值,并修改GET子句的变量值。 【说明】 DEFAULT子句用来为赋初值。其初值决定了该变量的类型和宽度。如果省略,则在前面必须事先为变量赋初值。 GET子句的变量必须用READ命令来激活。使用时,将光标移到GET子句的变量值处,直接输入新值,然后按【Enter】键,该变量原值将被新值所替代。 3TE
9、XTENDTEXT文本输出命令 【格式】TEXTENDTEXT 【功能】用于原样输出。,6.1 程序设计基础,根据不同的情况和条件,控制程序去执行相应操 作的语句序列。,循环结构表示 程序反复执行 某个或某些操作, 重复执行的部分 称为循环体,选择结构也称为 分支结构, 有单分支选择、 双分支选择 和多分支选择 3种形式,顺序结构是指 按顺序逐条执行 程序中的一系列 命令,顺序结构 是程序的最基本 结构,顺序结构程序设计,【例6.1】建立程序文件LT6_1.prg,实现在“学生”表中只要输入任意学生的姓名,就可以对该学生的信息进行修改,并显示修改后的记录。 在“命令”窗口中输入命令:MODI
10、COMM LT6_1 打开程序文件编辑窗口,如图所示。在编辑窗口中编写程序,编辑结束后保存并关闭窗口。,顺序结构程序设计, 在“命令”窗口中输入命令: DO LT6_1 在“输入要修改信息的学生姓名:”处输入要修改信息的学生姓名,如王小军,按【Enter】键结束,如图所示。 在屏幕上修改姓名为“王晓军”,修改完成后按【Enter】键结束,显示结果如图所示。,6.3 顺序结构程序设计,顺序语句由语句序列组成,程序执行时,按照语句的顺序,从上而下,一条一条地顺序执行。 例如: store “Mary“ to name Age = 18 ?“His name is “+name+“,he is “;
11、 +str(Age,2)+“ years old.“,6.3 顺序结构程序设计,例如:编写程序,计算圆的面积#Define PI 3.1415926 &创建常量r=2 &给半径赋值s=PI*r*r &计算圆面积?s &输出圆面积值#undefine PI &释放常量cancel &程序运行结束,6.4 选择结构程序设计,选择(分支)语句根据一定的条件决定执行哪一部分的语句序列。有两种分支语句: If 语句 有一个或两个分支,由条件表达式选择执行 case 语句有一个或多个分支,执行第一个符合条件的分支,【格式】IF ENDIF 【功能】先计算的值,如果值为.T.,则先执行,再执行ENDIF后面
12、的语句;如果值为.F.,则不执行,直接执行ENDIF后面的语句。单分支结构流程如图所示。 【说明】 能在程序中使用,不能在“命令”窗口中使用。 可以由一条命令或多条语句组成的语句序列。 可以是逻辑表达式,也可以是关系表达式或其他逻辑量。 IF和ENDIF命令必须成对使用。,单分支选择语句,单分支选择语句,【例6.2】编写程序LT6_2.prg,查找“学生”表中的“王小军”,如果“汉族否”字段值为.T.,则将该字段值替换为.F.。SET TALK OFF CLEAR USE 学生 LIST LOCATE FOR 姓名=“王小军“ IF 汉族否!=.F. REPLACE 汉族否 WITH .F.
13、ENDIF BROWSE USE RETURN,双分支选择语句,【格式】 IF ELSEENDIF,条件表达式,IF,语句序列1,语句序列2,ENDIF,【功能】当的值为逻辑真时,执行,然后执行ENDIF以后的命令语句;当的值为逻辑假时,执行,然后执行ENDIF以后的命令语句。双分支流程如图所示。,双分支选择语句,【例6.3】输入一个整数,判断其奇偶性,并显示结果。 SET TALK OFF CLEAR INPUT “输入一个整数: “ TO X IF INT(X/2)=X/2 &还可写成:MOD(X,2)=0 或 X%2=0?”这是一个偶数” ELSE?“这是一个奇数” ENDIF SET
14、TALK ON RETURN,双分支选择语句,【例6.4】求解一元二次方程AX2+BX+C=0的程序。 SET TALK OFF CLEAR INPUT “请输入二次项系数:“ TO A INPUT “请输入一次项系数:“ TO B INPUT “请输入常数项:“ TO C D=B2-4*A*C IF D0?“方程无实数根!“ ELSEIF D=0X=-B/(2*A)?“方程有两个相等的实数根:X1=X2=“+ALLT(STR(X)ELSEX1=(-B+SQRT(D)/(2*A)X2=(-B-SQRT(D)/(2*A)?“方程第一个根为:“,X1?“方程第二个根为:“,X2 ENDIF END
15、IF RETURN,多分支选择语句,在实际应用中,往往会遇到多分支的问题。这时可以使用嵌套的IF语句来解决,在处理这类问题时,需要使IF和ENDIF命令相对应,不能出现交叉。如果使用DO CASE语句就可以方便地解决多分支的问题。 【格式】 DO CASE CASE CASE CASE OTHERWISE ENDCASE,多分支选择语句,【例6.5】从键盘上输入一个学生的成绩,按表所示的规定输出。 SET TALK OFF CLEAR INPUT “输入一个成绩(0100):“ TO X DO CASE CASE X100 ? “输入数据错误!“ CASE X=90 ? “成绩为:优秀“ CA
16、SE X=80 ? “成绩为:良好“ CASE X=70 ? “成绩为:中等“ CASE X=60 ? “成绩为:及格“ OTHERWISE ? “成绩为:不及格“ ENDCASE SET TALK ON RETURN,多分支选择语句条件选择结构(case语句),条件1,多分支选择语句条件选择结构(case语句),注意事项,从第一个CASE开始,计算条件表达式的值,若某个表达式结果为.T.,则执行相应的语句组,然后跳过以后的语句,直到ENDCASE后继续执行。 如果所有的条件表达式值都为.F.,则执行OtherWise部分的语句组,然后执行ENDCASE后的语句。 CASE语句只执行第一个符合
17、条件的语句组。,多分支选择语句条件选择结构(case语句),例1: 判断系统当前日期是星期几,today= DOW(DATE( ) DO CASE CASE today=1weekday = “星期天“ CASE today=2weekday = “星期一“ CASE today=3weekday = “星期二“ CASE today=4weekday = “星期三“ CASE today=5 weekday = “星期四“ CASE today=6 weekday = “星期五“ CASE today=7weekday = “星期六“ ENDCASE ?“今天是“+weekday,多分支选择
18、语句条件选择结构(case语句),IFENDIF与DO CASEENDCASE必须配对使用 条件表达式-其值必须是逻辑值 语句行序列-可以是一个或多个命令组成,也可以是条件控制语句组成的嵌套结构 DO CASEENDCASE每次只能执行一个对应的语句序列,若多个条件为真,则执行第一个后,执行ENDCASE后的语句,注意:,6.5 循环结构程序设计,(1)DO WHILE循环语句(2)FOR循环语句,DO WHILE循环语句,【格式】 DO WHILE (循环体)LOOPEXIT ENDDO【功能】判断DO WHILE后的值,如果条件为真,执行DO WHILE和ENDDO之间的“(循环体)”,执
19、行到END DO时,返回到DO WHILE,再次判断是否为真,以确定是否再次执行循环体;如果条件为假,则结束循环,执行ENDDO以后的命令语句。,条件表达式,执行循环体,DO WHILE,END DO,DO WHILE 循环语句,【说明】 DO WHILE语句和ENDDO语句必须成对使用,DO WHILE语句是循环的开始语句,ENDDO语句是循环的终点语句。 句序列中至少有一个语句对产生影响,这样程序才不会出现死循环。 遇到LOOP语句时就结束当次循环,直接转回到DO WHILE处重新判断条件。 EXIT语句的功能是强行退出本次循环,直接执行ENDDO语句以后的命令语句。,循环语句常用的条件表
20、达式,DO WHILE X5 DO WHILE .NOT. BOF():记录指针不在文件头时为.T. DO WHILE BOF():记录指针在文件头时为.T. DO WHILE .NOT. EOF():记录指针未到文件尾部 DO WHILE EOF():记录指针已到文件尾部 DO WHILE .T.: 永真循环,死循环,需强制退出,DO WHILE 循环语句,【例6.6】统计“学生”表中少数民族学生的人数。 SET TALK OFF USE 学生 N=0 DO WHILE .NOT.EOF() IF 汉族否=.f. N=N+1ENDIFSKIP ENDDO ?“学生中少数民族人数为:“,N U
21、SE RETURN,DO WHILE循环语句,例1:计算 S=1+2+100 I=1 S=0 DO WHILE I=100 S=S+II=I+1 ENDDO ?S,100以内的奇数和、偶数和?,DO WHILE 循环语句,【例6.7】求0100之间偶数的和。 X=0 Y=0 DO WHILE .T.X=X+1IF INT(X/2)X/2LOOPELSEY=Y+XENDIFIF X=100EXITENDIF ENDDO ?“0100之间偶数的和为“,Y RETURN,FOR 循环语句,【格式】 FOR = TO STEP(循环体)LOOPEXIT ENDFOR|NEXT执行过程: 将初值表达式的
22、值赋给循环变量(第一次)。 若循环变量的值在和之间,则执行内容,若超过,则结束循环,执行ENDFOR语句后面的命令。 遇到ENDFOR(或NEXT)语句时,循环变量的值自动增加步长值,省略“STEP”选项,则步长的默认值为1。 重复前面的过程 ,决定是重复执行循环体还是结束循环。,循环变量在初值与终值之间?,FOR,初值赋给循环变量,执行循环体,循环变量循环变量步长,ENDFOR,执行过程:, 将初值表达式的值 赋给循环变量(第一次)。, 若循环变量的值在 和 之间, 则执行内容, 若超过,则结束循环, 执行ENDFOR语句 后面的命令。, 遇到ENDFOR(或NEXT)语句时,循环变量的值自
23、动增加步长值,省略“STEP”选项,则步长的默认值为1。 重复前面的过程 ,决定是重复执行循环体还是结束循环。,FOR 循环语句,【例6.8】编写程序求 SET TALK OFF CLEAR S=0 FOR N=1 TO 100 STEP 1S=S+N ENDFOR ? “S=1+2+3+100=“,S RETURN,FOR 循环语句,【例6.9】求10!(阶乘)。 SET TALK OFF CLEAR T=1 FOR N=1 TO 10 T=T*N ENDFOR ?“10!= “,T RETURN,多模块程序设计,6.6.1 子程序 1建立子程序的方法与建立程序的方法基本相同,其扩展名也是.
24、prg。唯一不同之处在于子程序的结束处必须设置程序返回语句,返回语句的格式和功能如下: 【格式】RETURN TO MASTER|TO | 【功能】返回上一级程序、主程序、另外一个程序或者“命令”窗口。,子程序,2子程序的调用 【格式】DO WITH 【说明】 是指要调用执行的程序文件名。 中列出的参数可以是常量、内存变量,也可以是表达式。 若子程序中含中的变量,则选用“WITH”选项,其含义是调用子程序时,系统会自动把实在参数传递给子程序中所对应的形式参数。一个程序最多可以传递24个参数。 若要建立含有参数的子程序,则子程序的第一个语句必须是参数接收语句PARAMETERS,其格式和功能如下
25、: 【格式】PARAMETERS 【功能】调用子程序时,中指定的变量接收DO命令传递的中所指定的相应值。,调用过程,主程序,子程序,DO 子程序,RETURN,子程序,【例6.16】利用调用子程序的方法,求任意半径圆的周长。 *主程序LT6_16.prg,求任意半径圆的周长 SET TALK OFF CLEAR L=0 INPUT “请输入圆半径R的值:“ TO R DO ZC.prg ?“该圆的周长是:“,L SET TALK ON RETURN *子程序ZC.prg,求圆的周长 L=2*PI()*R RETURN,子程序,【例6.17】任意输入一个数X,计算X!的值。 *主程序LT6_17
26、.prg SET TALK OFF CLEAR S=0 INPUT “请输入X的值:“ TO X DO JC.prg WITH S,X ?STR(X)+“!=“,S SET TALK ON RETURN *子程序JC.prg PARAMETERS M,N T=1 FOR I=1 TO NT=T*I ENDFOR M=T RETURN,过程和过程文件,过程函数,【格式】PROCEDURE PARAMETERS RETURN 【说明】 必须以“PROCEDURE ”开头。 如果主程序需要传递参数,过程中必须有“PARAMETERS ”语句。 过程的调用用“DO WITH ”命令。 一个程序文件中可
27、以有多个过程。,过程函数,【例】求长方形面积 (主程序与过程在一个文件中) X=0 Y=0 S=0 INPUT“输入X: ” TO X INPUT“输入Y: ” TO Y DO P1 WITH X,Y,S ? “S=”,S RETURNPROCEDURE P1 PARAMETERS A,B,C C=A*B RETURN,【例】求长方形面积 调用格式 X=0 Y=0 S=0 S=P1() ? “S=”,S RETURN PROCEDURE P1 INPUT“输入X: ” TO X INPUT“输入Y: ” TO Y S=X*Y RETUREN S,自定义函数,自定义函数是用户编写的一个具有一定功
28、能的程序段,它与一般的模块程序的区别在于自定义函数需要返回一个表达式的值作为该函数的返回值。 【格式】 FUNCTION PARAMETERS RETURN 【说明】 “FUNCTION ”中为自定义函数名。 程序文件名就是函数名。 RETURN语句返回的值,此表达式的值即为自定义函数的值。,自定义函数,【例6.19】任意输入3个数X、Y、Z,利用自定义函数求X!+Y!+Z!的值。 *程序LT6_19.prg,利用自定义函数求阶乘。 SET TALK OFF CLEAR S=0 INPUT “请输入X的值:“ TO X INPUT “请输入Y的值:“ TO Y INPUT “请输入Z的值:“
29、TO Z S=JCHS(X)+JCHS(Y)+JCHS(Z) ?“结果为:“,S SET TALK ON RETURN *自定义函数JCHS.prg FUNCTION JCHS PARAMETERS K T=1 FOR I=1 TO K T=T*I ENDFOR RETURN T,参数的传递,1形参的声明 【格式】PARAMETERS,LPARAMETERS, 【说明】 PARAMETERS命令声明的形参变量被看做是模块程序中建立的私有变量。 LPARAMETERS命令声明的形参变量被看做是在模块程序中建立的局部变量。,模块程序的调用,2模块程序的调用 【格式1】 DO | WITH , 【格
30、式2】 |(,) 【说明】 实参可以实常量、变量,也可以是一般形式的表达式。系统会自动把实参传递给对应的形参,但形参数目不能少于实参数目。如果形参数目多于实参,则多于的形参赋值为.F.。 在使用【格式1】调用模块程序时,如果对应实的参是常量或表达式,系统会计算出实参的值并赋值给相应的形参,这就是按值传递。如果实参是变量,传递的就不是值了,而是实参的变量地址,称为按址传递。对按址传递的形参变量值的改变,也就是对实参变量值的改变,因为两个变量公用一个存储地址,这种情形也称为引用传递。 在使用【格式2】调用模块程序时,默认情况下都是按值传递。如果实参是变量,可以用命令重新设置参数的传递方式。,习题,
31、1、求y=3x+1 x0|x|+2 x=02、编程显示*,练习,1、Visual FoxPro中程序文件的扩展名为() A .SPR B .QRP C .FXP D .PRG,2、结构化程序设计中的3种基本逻辑结构是() A 选择结构、循环结构和嵌套结构 B 顺序结构、选择结构和循环结构 C 选择结构、循环结构和模块结构 D 顺序结构、递归结构和循环结构,3、设内存变量M为数值型,从键盘上赋值给M,应使用()命令 A WAIT B ACCEPT C EDIT D INPUT,4、以下关于ACCEPT命令的说明,正确的是() A 将输入作为字符接收 B 将输入作为数值接收 C 将输入作为逻辑型数
32、据接收 D 将输入作为变量名接收,练习,5、在Visual FoxPro中,可以终止程序并将控制返回到操作系统状态的命令是() A RETURN B QUIT C EXIT D CANCEL,6、Visual FoxPro中建立程序文件ABC.PRG() A MODIFY FORM ABC B MODIFY COMMAND ABC C MODIFY STRUCTURE ABC D MODIFY VIEW ABC,7、在DO WHILEENDDO循环结构中,LOOP命令的作用是() A 退出过程,反悔程序开始处 B 转移到DO WHILE语句行,开始下一个判断和循环 C 终止循环,将控制转移到本循环结构ENDDO后面的第一条语句继续执行 D 终止程序执行,