




文档简介
1、1,第八章VFP程序设计,2,Visual FoxPro的工作方式,Visual FoxPro系统提供有三种工作方式: 单命令方式、 菜单方式、 程序文件方式。,3,1.单命令方式,单命令方式:即输入一条命令,完成一个操作的工作方式。 Visual FoxPro单命令方式是利用Command 窗口来实现的。 用户通过Command 窗口输入命令,回车执行操作。,4,2.菜单方式,所谓菜单方式,即通过打开不同的菜单选项并完成不同的操作。,5,3.程序文件方式,程序文件(简称程序)也叫做命令文件。 通过程序文件编辑工具,把相应的命令,集中在一个以(.PRG)为扩展名的程序文件中,然后再通过菜单方式
2、或命令方式运行该程序文件。,6,第一节 程序文件的建立,一、Visual FoxPro程序的几点说明 P206 1、注释语句 【格式1】NOTE 【格式2】* 【格式3】 利用工具栏; 按Ctrl+W组合键。 程序文件的默认扩展名是.PRG。,2保存程序文件,14,3执行程序文件 程序文件建立后,可以用多种方式、多次执行它。 下面是两种常用的方式。 1)菜单方式 单击【程序】|【运行】菜单项,打开“运行”对话框; 从文件列表框中选择要运行的程序文件,并单击“运行”命令按钮,启动运行该程序文件,15,2)命令方式 【格式】DO 【功能】 执行指定、下的程序文件 。 【说明】 当程序文件被执行时,
3、文件中包含的命令将被依次执行,直到所有命令被执行完毕,或者执行到以下命令:,16,1) CANCAL:终止程序运行,清除所有的私有变量,返回命令窗口; (2) RETURN:结束程序执行,返回调用它的上级程序,若无上级程序则返回命令窗口; (3) QUIT:结束程序执行并退出Visual FoxPro系统,返回操作系统 (4) DO : 转去执行另一个程序。,17,3)项目管理器 若程序包含在一个项目中,则在项目管理器中选定它并选择“运行”命令。,18,三、 交互式命令,1字符串接受命令 (ACCEPT) 【格式】ACCEPT TO 【功能】在程序执行过程中,将用户交互式输入的内容作为字符串赋
4、给指定内存变量。 【说明】 1)该命令只接受字符型数据; 2)输入的字符串不需要加定界符 。,19,【例】 编程从键盘输入某数据库的文件名,要求打开该数据库的表并显示表的内容。 程序文件名为*PROG1.PRG。 命令窗口输入:MODI COMMAND PROG1.PRG,20,SET TALK OFF CLEAR ACCEPT “请输入数据库名:” TO AAA OPEN DATABASE TO ; WINDOW AT, ; TIMEOUT 【功能】 显示提示信息,暂停程序执行,直到用户按任意键或单击鼠标时继续执行程序。,提示信息将在 指定位置的窗口中出现,设置等待的时间,27,【说明】,1
5、)若选择可选项TO ,将输入的单个字符作为字符型数据赋给指定的; 2)若用户是按Enter键或单击鼠标,的值为空串。 3)若省略所有可选项,屏幕主窗口显示“键入任意键继续”默认提示信息。,28,【例】 在”学生档案”数据库的”学生情况表”中显示任意一个系学生的情况。 程序文件名为PROG4.PRG (系的代号为“01”、“02”、“03”),29,SET TALK OFF CLEAR OPEN DATABASE 学生档案 USE 学生情况表 WAIT “请输入待查学生的系号(13):” TO N IF VAL(N)3 WAIT “输入无效,结束程序运行!” WINDOW TIMEOUT 5 R
6、ETURN ELSE STORE “0”+N TO AAA LIST FOR 系别号=AAA ENDIF CLOSE DATABASE SET TALK ON RETURN,30,4三条输入命令的异同 ACCEPT命令只能接受字符型数据,不需定界符,输入完毕按回车键结束。 WAIT命令只能输入单个字符,且不需定界符,输入完毕不需按回车键。 INPUT命令可接受数值型、字符型、逻辑型、日期型和日期时间型数据,数据形式可以是常量、变量、函数和表达式,如果是字符串,需用定界符,输入完毕按回车键结束。,31,5编辑修改变量语句 【格式】 SAY “提示信息” GET READ 【功能】 在屏幕上或窗口
7、中指定的坐标位置对内存变量(它已预先赋值)或表中当前记录的字段名变量进行编辑修改。,32,【说明】 1)VFP系统把屏幕横向分成80格,用0-79表示,每格能输出一个英文字符(一个汉字占两格) 纵向分成25行,用0-24表示,每行能输出一行字符。,33,2)GET语句必须与编辑修改语句READ一起使用才有意义。 3)当执行READ语句时,系统将光标移到GET的变量位置,这时如果从键盘上键入新的数据,则变量中原来的数据被新数据取代。,34,【例】建立程序文件,要求通过程序方式在“读者”表中添加一条新记录,程序文件名为PROG5.PRG。 CLEAR USE 读者 APPEND BLANK 2,
8、8 SAY 读者基本情况输入界面: 4,10 SAY 读者编号: GET 读者编号 6,10 SAY 读者姓名: GET 姓名 8,10 SAY 读者性别: GET 性别 10,10 SAY 出生日期: GET 出生日期 12,10 SAY 少数民族否: GET 少数民族否 14,10 SAY 籍贯 GET 籍贯 READ USE,35,【例】编写程序文件*PROG6.PRG ,修改读者表中第二条记录的姓名和籍贯两个字段。 SET TALK OFF USE 读者 GO 2 2,20 SAY “姓名”GET 姓名 4,20 SAY 籍贯 GET 籍贯 READ DISPLAY USE RETUR
9、N,36,第二节程序的基本结构,一、结构化程序设计基础 1基本结构 结构化程序由若干基本结构组成,每一个基本结构可以包含一个或多个命令。 它们有以下三种基本结构:,37,(1)顺序结构,如图1所示,该结构先执行A操作,再执行B操作。,图1 顺序结构流程图,38,例:打开指定数据库表,显示表的结构和记录。 * PROG7.PRG set talk off clear accept “请输入数据库表名 : to name use &name list structure wait “ 按任一键后显示数据库表的内容 list use set talk on return,39,例:从键盘输入一个大写
10、字母,要求改用小写字母输出。*PROG8.PRG set talk off clear wait 请输入一个大写字母: to a x=asc(a) y=chr(x+32) ?y set talk on return,40,set talk off clear wait 请输入一个大写字母: to a y=LOWE(a) ?y set talk on return,41,(2)分支结构:如图2所示,该结构中P代表一个条件,当条件P成立时执行A操作,否则执行B操作。,图2 分支结构流程图,42,(3)循环结构:能够使某些语句或程序段重复执行若干次。如果某些语句或程序段需要在一个固定的位置上重复操作
11、,使用循环是最好的选择。该结构有以下两种形式: 当型循环结构,如图3所示。 直到型循环结构,如图4所示 。,图3 当型循环结构流程图形 图4 直到型循环结构流程图,43,分支结构形式有如下三种: 1单向分支 单向分支语句,即根据用户设置的条件表达式的值,决定某一操作是否执行。,二、分支结构,44,【语句格式】 IF条件表达式 语句序列 ENDIF,45,【语句功能】 该语句首先计算条件表达式的值, 当条件表达式的值为真时,执行语句序列; 否则,执行ENDIF后面的命令。,46,【例】输入两个实数,按其值由大到小输出这两个数。*PROG9.PRG CLEAR INPUT “A=” TO A IN
12、PUT “B=” TO B IF AB T=A A=B B=T ENDIF ?A,B RETURN,47,2双向分支 双向分支语句,即根据用户设置的条件表达式的值,选择两个操作中的一个来执行。,48,【语句格式】 IF条件表达式 语句序列1 ELSE 语句序列2 ENDIF,49,【语句功能】 当条件表达式的值为真时,执行语句序列1中的命令; 否则,执行语句序列2中的命令; 执行完语句序列1或语句序列2后都将执行ENDIF后面的命令。,50,【例】从键盘上接受一个数,判断是否为奇数*PROG10.PRG。 SET TALK OFF CLEAR ACCEPT “请输入数:” TO A IF MO
13、D(A,2)=1 ? ”该数为奇数!” ELSE ?”该数为偶数!” ENDIF ?s SET TALK ON,51,【例】从键盘上接受一个两位数,判断该数是否为回文数 *PROGlx11.PRG。,52,【例】从键盘上接受一个三位数,判断该数的十位与个位之和除以3后是否刚好等于百位。 *PROGlx2.PRG。,53,从键盘上接受一个两位数,判断该数是否为水仙花数。 *PROGlx3.PRG,54,从键盘上接受一个数,判断该数是否为正数。 *PROGlx4.PRG,55,3多向分支 多向分支语句,即根据多个条件表达式的值,选择执行多个操作中的一个对应执行 。,56,【语句格式】 DO CAS
14、E CASE条件表达式1 语句序列1 CASE条件表达式2 语句序列2 CASE条件表达式N 语句序列N OTHERWISE 语句序列N+1 ENDCASE,57,【语句功能】 该语句根据给出的N个条件表达式的值,选择N+1个语句序列中的一个执行。 当所有CASE中条件表达式的值都是假时,如果有OTHERWISE项,则执行命令行序列N+1,再执行ENDCASE后面的第一条命令; 否则,直接执行ENDCASE后面的第一条命令。,58,【例】假设收入(P)与税率(R)的关系如下表,编程求税金。程序文件名为PROG11.PRG。 0 P800 R= 0.05 800 P2000 0.08 2000P
15、5000 0.1 P5000,59,SET TALK OFF CLEAR INPUT “请输入收入:” TO P DO CASE CASE P800 R=0 CASE P2000 R=0.05 CASE P5000 R=0.08 OTHERWISE R=0.1 ENDCASE TAX=P*R ? ”税金为:”,TAX SET TALK ON RETURN,60,4使用分支语句应注意的几点 (1)IF ENDIF和DO CASE ENDCASE 必须配对使用。 (2)DO CASE与第一个CASE之间不应有任何命令。 (3)(条件表达式)可以是各种表达式或函数的组合,其值必须是逻辑值。 (4)D
16、O CASE ENDCASE 命令,每次最多只能执行一个(语句序列)。 (5)在多个CASE的(条件表达式)值为真时,只执行第一个(条件表达式)值为真的(语句序列),然后执行ENDCASE的后面的第一条命令。,61,四、循环结构,P211 1条件循环语句 【格式1】DO WHILE ENDDO,初值,62,【说明】一个循环结构一般应具备如下的条件: (1)循环的初始条件: 一般给循环控制变量赋初值; (2)循环头: 循环语句的起始,设置、判断循环条件; (3)循环尾: 循环语句的结尾; (4)循环体: 位于循环头和循环尾之间、循环控制重复 执行的语句序列。,63,【格式2】 DO WHILE
17、LOOP EXIT ENDDO,64,LOOP语句: 强行返回到循环开始语句。 EXIT语句: 强行跳出循环,执行ENDDO后的语句,65,【例】编程求123100之和。 程序文件名为PROG12.PRG。 SET TALK OFF CLEAR S=0 X=1 DO WHILE X=100 S=S+X X=X+1 ENDDO ? ”123100”,S SET TALK ON RETURN,循环体,66,求100到4000内能被4 和6整除的整数的个数。,67,求1到1000中能被5 和7整除的奇数之和。,68,求被3整除且有一位是5 的三位数的个数。,69,求三位数中,个位数字与十位数字之和除
18、以10所得的余数是百位数字的偶数的个数。,70,【例】逐条显示在STUDENT数据库的STUD表中性别为“男”的所有记录。程序文件名为PROG13.PRG。 SET TALK OFF CLEAR OPEN DATABASE STUDENT USE STUD DO WHILE .NOT. EOF() IF 性别=”男” DISPLAY ENDIF SKIP ENDDO CLOSE DATABASE SET TALK ON RETURN,71,【例】编程显示STUDENT数据库的STUD表中除“李宁”以外的所有记录。程序文件名为PROG14.PRG。 SET TALK OFF CLEAR OPEN
19、 DATABASE STUDENT USE STUD DO WHILE .NOT. EOF() IF 姓名=”李宁” SKIP LOOP ENDIF DISPLAY SKIP ENDDO CLOSE DATABASE SET TALK ON RETURN,72,2FOR循环语句 【格式】 FOR = TO STEP LOOP EXIT ENDFOR/NEXT FOR语句的执行流程如右图所示。,73,使用FOR循环语句的有关说明: 省略STEP ,则步长为默认值1; 初值、终值和步长都可以是数值表达式,但这些表达式仅在循环语句开始执行时计算一次。循环语句执行过程中,初值、终值和步长是不会改变的,
20、并由此确定循环的次数; 可以在循环体内改变循环变量的值,但会改变循环执行次数; EXIT和LOOP命令可以出现在循环体内。执行LOOP命令时,结束本次循环,循环变量增加一个步长值,返回FOR循环头判断循环条件是否成立。执行EXIT命令时,程序跳出循环,执行循环尾后面的语句 。,74,【例6-15】从键盘输入10个数,编程找出其中的最大值和最小值。程序文件名为PROG15.PRG。 SET TALK OFF CLEAR INPUT “请从键盘输入一个数:” TO A STORE A TO MAX, MIN FOR I=2 TO 10 INPUT “请从键盘输入一个数:” TO A IF MAXA
21、 MIN=A ENDIF ENDFOR ? “最大值为:” , MAX ? “最小值为:” , MIN SET TALK ON RETURN,75,【例6-16】编程判断一个数是否素数,程序文件名为PROG16.PRG。 SET TALK OFF CLEAR INPUT 请输入一个数: TO x FOR i=2 TO x-1 IF Mod(x,i)=0 EXIT ENDIF ENDF IF i=x ?STR(X)+“是素数” ELSE ?STR(X)+不是素数 ENDIF 程序N-S流程图,76,【例6-17】从键盘输入任意的10个数,按从大到小的顺序依次输出 ,程序文件名为PROG17.PR
22、G。 DIME A(10) FOR i=1 TO 10 INPUT 请输入一个数 TO a(i) ?a(i) ENDFOR FOR i=1 TO 9 FOR j=1 TO 10-i IF a(j)a(j+1) t=a(j) a(j)=a(j+1) a(j+1)=t ENDIF ENDFOR ENDFOR FOR i=1 TO 10 ? a(i)程序N-S流程图 ENDFOR,77,3“指针”型循环控制语句 “指针”型循环控制语句,即根据用户设置的表中的当前记录指针,决定循环体内语句的执行次数据。 【语句格式】 SCAN范围FOR条件表达式1 WHILE 条件表达式2 命令行序列 ENDSCAN
23、 【语句功能】 该语句在指定的范围内,用数据记录指针来控制循环次数。执行语句时,首先判断函数EOF()的值,若其值为“真”,则结束循环,否则,结合(条件表达式1)或(条件表达式2),执行(命令行序列),记录指针移到指定的范围和条件内的下一条记录,重新判断函数EOF( )的值,直到函数EOF( )的值为真时结束循环。,78,【例6-18】输出STUDENT数据库的STUD表中所有团员的姓名和地址。程序文件名为PROG18.PRG。 SET TALK OFF CLEAR OPEN DATABASE STUDENT USE STUD SCAN FOR 是否团员 ? 姓名,地址 ENDSCAN CLO
24、SE DATABASE SET TALK ON RETURN,79,4使用循环语句时应注意的几点 (1)DO WHILE和ENDDO、FOR和ENDFOR、SCAN和ENDSCAN必须配对使用。 (2)命令行序列可以是任何FoxPro命令或语句,也可以是循环语句,即可以为多重循环。 (3)循环变量应是数值型的内存变量或数组元素。 (4)EXIT和LOOP命令嵌入在循环体内,可以改变循环次数,但是不能单独使用。EXIT的功能是跳出循环,转去执行ENDDO、ENDFOR、ENDSCAN后面的第一条命令;LOOP的功能是转回到循环的开始处,重新对“条件”进行判断,相当于执行了一次ENDDO、ENDF
25、OR、ENDSCAN命令,它可以改变命令行序列中部分命令的执行次数。EXIT、LOOP可以出现在命令行序列的任意位置。,80,5多重循环 多重循环即循环的嵌套,是在一个循环结构的循环体中又包含另一个循环。我们称外层循环为外循环,被包含的循环为内循环。嵌套层数一般没有限制,但内循环的循环体必须完全包含在外循环的循环体中,不能相互交叉。正确的嵌套关系如: DO WHILE DO WHILE DO WHILE ENDDO ENDDO ENDDO,81,【例6-19】编程输出下三角形乘法口诀表。程序文件名为PROG19.PRG。 SET TALK OFF CLEAR X=1 DO WHILE X=9
26、Y=1 DO WHILE Y=X S=X*Y ? STR(Y,1)+”*”+STR(X,1)+”=”+STR(S,2)+” “ Y=Y+1 ENDDO ? X=X+1 ENDDO SET TALK ON RETURN,82,第三节 过程的模块化,结构化程序设计方法要求将一个大的系统分解成若干个子系统,每个子系统就构成一个程序模块。模块是一个相对独立的程序段,它可以为其他模块所调用,也可以去调用其他模块。将一个应用程序划分成一个个功能相对简单、单一的模块程序,不仅有利于程序的开发,也有利于程序的阅读和维护。VFP模块化在具体实现上提供三种形式,它们是子程序、过程和函数。,主程序与子程序调用关系示
27、意图,83,一、子程序,子程序也叫外部过程,是以程序文件(.PRG)的形式单独存储在磁盘上。子程序只需录入一次,就可反复被调用执行 。 1子程序的结构 在VFP中,子程序的结构与一般的程序文件一样,可以用MODIFY COMMAND命令来建立、修改、和存盘,扩展名也默认为.PRG。 子程序与其他程序文件的唯一区别是其末尾或返回处必须有返回语句RETURN。 【语句格式】 RETURN TO MASTER|TO 程序文件名|表达式 【语句功能】该命令中止一个程序、过程、或用户自定义函数的执行,返回上一级调用程序、最高级调用程序、另外一个程序或命令窗口。,84,【语句说明】 (1)通常程序执行到R
28、ETURN时,会自动返回到上级调 用程序调用语句的下一条语句继续执行。如果是在最高一级主程序中,则返回命令窗口。 (2)选用TO MASTER 子句时,则返回最高一级调用程序,即在命令窗口下,调用的第一个主程序。 (3)TO 程序文件名表示程序将转向到指定的程序。 (4)如选用表达式,表示将表达式的值返回调用程序,通常用于自定义函数。 (5) 在程序最后,如果没有RETURN命令,则程序运 行完毕后,将自动默认执行一个RETURN命令,但 过程文件除外。,85,2子程序的调用: 【语句格式】 DO |WITH 参数表 【语句功能】执行以或为名的过程。 【语句说明】 WITH参数表子句用来指定传
29、递到程序或过程的参数,在参数表中列出的参数可以是表达式、内存变量、常量、字段名或用户自定义函数,各参数间用逗号分隔。 【例6-20】分别建立如下程序文件。 * MAIN.PRG SET TALK OFF ? ”正在执行主程序” DO SUB1 SET TALK ON *SUB1.PRG ? ”正在执行SUB1” RETURN,86,【例6-21】利用子程序方法求M!/(N!*(M-N)!)(MN) *main.prg *子程序sub1.prg INPUT 请输入M: TO m s=1 INPUT 请输入N: TO n FOR i=1 TO x s=0 s=s*i x=m ENDFOR DO s
30、ub1 RETURN s s2=s x=n DO sub1 s3=s x=m-n DO sub1 s4=s s1=s2/(s3*s4) ?s1,87,二、过程(内部),内部过程:把多个过程组织在一个文件中(这个文件称之为过程文件),或者把过程放在调用它的程序文件的末尾。 Visual FoxPro为了识别过程文件或者程序文件中的不同过程,规定过程文件或者程序文件中的过程必需用PROCEDURE语句说明。其格式为: PROCEDURE PARAMETER RETURN 过程有两种存放方式: (1)把所有的过程集中写入一个被称为过程文件(.prg文件)的磁盘文件中 (2)直接把过程写在调用它的主程
31、序文件中,主程序被打开时,过程同时被调入内存。,88,1过程写在过程文件里 主程序与过程的相互关系如下图所示。 调用过程之前,首先要打开存放该过程的过程文件,任何时候只能打开一个过程文件。 打开过程文件的命令: SET PROCEDURE TO 关闭过程文件的命令: SET PROCEDURE TO或用: CLOSE PROCEDURE,89,2过程与主程序写在同一个程序文件里 主程序与过程的相互关系如下图所示。 过程和子程序都是用DO来调用,当出现了同名的过程和子程序时,调用的顺序首先从过程与主程序在同一文件中调用,其次从过程文件中调用,最后从子程序中调用。,90,【例6-22】建立如下程序
32、文件,过程放在程序文件中。 * MAIN.PRG SET TALK OFF ? ”正在执行主程序” DO SUB1 SET TALK ON Procedure SUB1 ? ”正在执行SUB1” RETURN,91,【例6-22】请考察下述程序运行流向,求出正确运行结果。 *prog22.prg CLEAR STORE 2 TO I,C,T DO WHILE I=4 DO PR ? F(+STR(I,1)+ )=+STR(C,2) I=I+1 ENDDO ? T=+STR(T,2) RETURN PROCEDURE PR C=C+2 T=T+C RETURN,92,三、过程文件的建立,过程文件
33、的建立方法与程序文件相同。可用MODIFY COMMAND 命令或调用其他文字编辑软件来建立。 过程文件的结构一般为: PROCEDURE RETURN PROCEDURE RETURN PROCEDURE RETURN,93,1过程文件的调用 调用某过程文件中的过程时,必须先打开该过程文件,打开过程文件命令为: 【格式】SET PROCEDURE TO 任何时候系统只能打开一个过程文件,当打开一个新的过程文件时,原已打开的过程文件自动关闭。 2过程文件的关闭 关闭过程文件可用下列命令: 【格式一】SET PROCEDURE TO 【格式二】CLOSE PROCEDURE,94,【例6-23】
34、用过程文件实现对STUDENT数据库的STUD表进行查询、删除和插入操作。 主程序如下: * PROG23 & 主程序文件名 SET TALK OFF CLEAR OPEN DATABASE STUDENT SET PROCEDURE TO PROCE & 打开过程文 USE STUD INDEX ON 姓名 TO XM DO WHILE .T. & 显示菜单 CLEAR 2,20 SAY “学籍管理系统” 4,20 SAY “A:按姓名查询” 6,20 SAY “B:按记录号删除”,95, 8,20 SAY “C:插入新的记录” 10,20 SAY “D:退出” CHOISE=” ” 12,
35、20 SAY ”请选择A、B、C、D:” GET CHOISE READ DO CASE CASE CHOISE=”A” DO PROCE1 CASE CHOISE=”B” DO PROCE2 CASE CHOISE=”C” DO PROCE3 CASE CHOISE=”D” EXIT ENDCASE ENDDO SET PROCEDURE TO & 关闭过程文件 CLOSE DATABASE SET TALK ON,96,过程文件如下: *PROCE.PRG & 过程文件名 PROCEDURE PROCE1 & 查询过程 CLEAR ACCEPT ”请输入姓名:” TO NAME SEEK
36、NAME IF FOUND() DISPLAY ELSE ? ”查无此人” ENDIF WAIT RETURN,97,PROCEDURE PROCE2 & 删除记录过程 CLEAR INPUT ”请输入要删除的记录号:” TO N GO N DELETE WAIT ”物理删除吗Y/N:” TO FLAG IF FLAG=”Y” .OR. ”y” PACK ENDIF RETURN PROCEDURE PROCE3 & 插入新的记录过程 CLEAR APPEND RETURN,98,四、自定义函数,自定义函数和过程一样,可以以独立的程序文件形式单独存储在磁盘上,也可以放在过程文件或直接放在程序文
37、件中。 自定义函数具有如下语法结构: FUNCTION PARAMETER RETURN 自定义函数的调用语法与系统函数的调用相同。和过程一样,自定义函数可以是常规程序文件的一部分,也可以是独立的程序文件。不同的是调用过程或子程序使用DO命令,调用函数名称后面加上括号。注意:函数不是命令,函数调用只能出现在表达式中。,99,【例6-24】计算圆面积 *PROG24.PRG SET TALK OFF CLEAR INPUT ”请输入圆的半径:” TO R ? ”圆的面积为:”,AREA(R) SET TALK ON FUNCTION AREA & 计算面积的函数 PARAMETER X & 形参
38、说明 RETURN (3.1416*X*2),100,【例6-25】利用自定义函数编程求一元二次方程的实根。 *prog25.prg FUNCTION root INPUT a= TO a PARAMETERS a,b,c INPUT b= TO b d=b*b-4*a*c INPUT c= TO c IF d=0 k=root(a,b,c) d=sqrt(d) IF k=0 ENDIF ? x1=,(-b+k)/(2*a) RETURN d ? x2=,(-b+k)/(2*a) ELSE ?方程无实根 ENDIF,101,五、过程调用中的参数传递,1有参过程中的形式参数定义 有参过程中的形式
39、参数定义语句为: 【格式】PARAMETERS 该语句必需是过程中第一条语句。中的参数可以是任意合法的内存变量名 。 2程序与被调用过程间的参数传递 程序与被调用过程间的参数传递是通过过程调用语句DO WITH 中WITH 子句来实现的。,102,【说明】 (1)DO命令中参数称为实际参数,PARAMATERS命令中的参数称为形式参数。两个中的参数必须相容,即个数相同,类型和位置一一对应; (2)实际参数可以是任意合法表达式,形式参数是过程中的局部变量,用来接收对应实际参数的值; (3)Visual FoxPro的参数传递规则为:如果实际参数是常数或表达式则传值,如果实际参数是变量则传址,即传
40、递的不是实参变量的值而是实参变量的地址,这样,过程中对形参变量值的改变也将使实参变量值改变。如果实参是内存变量而又希望进行值传递,可以用圆括号将该内存变量括起来,强制该变量以值方式传递数据,103,【例6-26】用参数传递编程,计算圆的面积。 * 主程序名PROG26.PRG SET TALK OFF CLEAR S=0 INPUT ”请输入圆的半径:” TO R DO AREA WITH R,S ? ”圆的面积为:”,S SET TALK ON PROCEDURE AREA & 计算面积的过程 PARAMETER X,Y & 形参说明 Y=3.1416*X*2 RETURN,104,六、过程
41、的嵌套调用,Visual FoxPro中允许一个过程调用第二个过程,第二个过程又可调用第三个过程,这种调用关系称为过程的嵌套调用 。,105,七、过程的递归调用,Visual FoxPro 允许递归调用,所谓递归调用,即某一过程直接或间接调用自己。过程直接调用自己称为直接递归(见图),间接调用自己称为间接递归 。,106,【例6-27】编程用递归方法求N的阶乘。程序文件名为PROG27.PRG。 SET TALK OFF CLEAR INPUT ”请输入N:” TO N Y=1 DO PROCE1 WITH N, Y ? STR(N,2)+”!=”,Y SET TALK ON PROCEDUR
42、E PROCE1 & 求阶乘的过程 PARAMETER X, Y IF X1 DO PROCE1 WITH X-1,Y & 递归调用 Y=X*Y ENDIF RETURN,107,八、变量的作用域,1公共(全局)变量 公共变量是指在所有程序模块中都有效的内存变量。 在程序或过程中定义公共变量的语句为: 【格式】PUBLIC 该命令的功能是建立公共变量,并为它们赋初值为逻辑假.F. 例如,PUBLIC a,b,c(5)建立了三个公共内存变量,它们的初值都是.F. 在命令窗口直接使用的内存变量(不必用PUBLIC定义)都是全局变量。,108,【说明】 (1)当定义多个变量时,各变量名之间用逗号隔开
43、; (2)用PUBLIC语句定义过的内存变量,在程序执行期间可以在任何层次的程序模块中使用; (3)变量定义语句要放在使用此变量的语句之前,否则会出错; (4)任何已经定义为全局变量的变量,可以用PUBLIC语句再定义,但不允许重新定义为局部变量; (5)使用全局变量可以增强模块间的通信,但会降低模块间的独立性。,109,2私有变量 在程序中直接使用(没有通过PUBLIC和LOCAL命令事先声明)而由系统自动隐含建立的变量都是私有变量。私有变量的作用域是建立它的模块及其下属各层模块,一旦建立它的模块运行结束,这些私有变量将自动清除。 3局部变量 局部变量只能在定义它的模块中使用,不能在上层或下
44、层模块中使用。当定义它的模块运行结束时,局部变量自动释放。局部变量用LOCAL命令建立: 【格式】LOCAL 【功能】该命令建立指定的局部内存变量,并为它们赋初值为逻辑假.F.。,110,【例6-28】分析下面程序中变量的作用域 *prog28.prg PUBLIC x1 &建立公共变量X1 LOCAL x2 &建立局部变量X2 STORE f TO x3 &建立私有变量X3 DO proc1 ? 主程序中- &三个变量在主程序中都可使用 ?x1=,x1 ?x2=,x2 ?x3=,x3 RETURN PROCEDURE proc1 ? “子程序中-” &公共变量和私有变量在子程序中可以使用 ?
45、x1=,x1 ?x3=,x3 RETURN,111,4变量的隐藏 根据结构化程序设计方法,将应用程序分成若干层不同的模块,有可能在各层模块中有变量同名的情况。为了解决此问题,可以在子程序中使用PRIVATE命令隐藏主程序中可能存在的变量,使得这些变量在子程序中暂时无效。其语法格式为: PRIVATE 内存变量表| ALL LIKE 通配符EXCEPT 通配符 该命令并不建立内存变量,它的作用是:隐藏指定的上层模块中可能已经存在的内存变量,使得这些变量在当前模块程序中暂时无效。于是这些变量名就可以用来命名在当前模块或其下属模块中需要的私有变量或局部变量,并且不会改变上层模块中同名变量的取值。,1
46、12,【例6-29】变量的隐藏示例。 *prog29.prg *过程P SET TALK OFF PROCEDURE p x=10 PRIVATE x y=15 x=50 DO p y=100 ? x,y ? x,y RETURN 运行结果: 50 100 10 100,113,【例6-30】 LOCAL 和PRIVATE 命令的比较示例 *prog30.prg PUBLIC x,y X=10 Y=100 DO p1 ? x,y &显示10 bbb *过程P1 PROCEDURE p1 PRIVATE x & 隐藏上层模块中的变量x x=5 & 建立私有变量x,并赋值5 LOCAL y & 建
47、立局部变量y,并隐藏同名变量 DO p2 ?x,y & 显示 aaa .F. *过程P2 PROCEDURE P2 x=aaa & x是在P1中建立的内存变量 y=bbb & y是在主程序中建立的公共变量 RETURN,114,第四节程序调试,程序调试是指在发现程序有错误的情况下,确定出错的位置并加以改正,直至满足设计要求。程序调试往往是先分模块调试,当各模块都调试通过以后,再将各模块联合起来进行调试,通过联调后,便可试运行,试运行无误后即可投入正常使用。 程序的错误通常有两类:语法错误和逻辑错误。语法错误相对容易发现和修改,当程序运行到这类错误时,VFP会自动中断程序的执行,并弹出编辑窗口,
48、显示出错的命令行,给出出错信息,这时可以方便地修改错误。逻辑错误系统是无法确定,只能用户自已来查错。往往需要跟踪程序的执行,在动态执行过程中监视并找出程序中的错误。,115,一、建立测试环境 1硬件和软件问题 为了获得最大的可移植性,应当在预期运行的最底层平台上开发应用程序。要保证应用程序能在满足最低要求的平台上正常工作,应该做到以下几点: (1)使用最低层常用的视频方式开发应用程序。 (2)确定最低所需的以及存储介质的空间大小,其中应包括必需的驱动程序以及同时运行的软件所占用的空间。 (3)对于应用程序的网络版,还应考虑内存、文件和记录锁定特殊要求。,116,2系统路径和文件属性 为了在运行应用程序的每台机器上都能够快速访问所有必需程序文件,可能需要确定一个基本文件配置。在定义基本配置时,应考虑下列问题: (1)应用程序是否需要公用系统路径。 (2)设置的文件存取属性是否合适。 (3)为每个用户设置的网络权限是否正确。,117,3目录结构和文件位置 如果源代码引用的是绝对路径或文件名,那么当应用程序安装到任何其他机器上时必须存在相同的路径和文件。若要避免这一情况,可采用以下方法: (1)使用Visual FoxPro配置文件。 (2)另建一个目录或目录
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 股权托管与转让专业中介服务协议
- 教育机构股权投资与管理服务合同
- 节能建筑改造项目股权出让与节能减排合同
- 知识产权密集型公司股权转让及代持股协议
- 股权债权转让与文化产业合作框架协议
- 股权收购与转让中的交易结构设计与安排协议
- 2025-2030中国专项债券市场运营风险及未来发展格局分析报告
- 水磨煤矿事故处理方案
- 煤气泄漏纠纷调解方案
- 厂房隆重招商方案
- 天航题库理论SOP复习试题及答案
- 2024年质量工程师备考常见问答试题及答案
- 检验检测机构质量手册程序文件质量记录合集(依据2023年版评审准则)
- 2025-2030全球及中国管道运输服务行业市场现状供需分析及投资评估规划分析研究报告
- 安庆市桐城经开区建设投资集团有限公司招聘笔试题库2025
- JJF 2244-2025公共机构重点用能单位能源资源计量审查规范
- 2025-2030中国海上风电装备产业发展调查及经营状况深度解析研究报告
- 警犬基地人员管理制度
- 2025年甘肃省建筑安全员B证(项目经理)考试题库
- ICU感控管理分析报告
- 垃圾分类创新创业项目
评论
0/150
提交评论