收藏 分享(赏)

vfp第12.13章.ppt

上传人:dreamzhangning 文档编号:3314380 上传时间:2018-10-12 格式:PPT 页数:25 大小:190.50KB
下载 相关 举报
vfp第12.13章.ppt_第1页
第1页 / 共25页
vfp第12.13章.ppt_第2页
第2页 / 共25页
vfp第12.13章.ppt_第3页
第3页 / 共25页
vfp第12.13章.ppt_第4页
第4页 / 共25页
vfp第12.13章.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、第7章 程序设计,7.3 多模块程序 应用程序一般都是多模块程序,可包含多个程序模块。模块是可以命名的一个程序段,可指主程序、子程序、函数、过程。,7.3.1 子程序能够完成一定功能的可供其它程序使用(调用)的独立程序段称为子程序。它独立存在,但可以被多次调用,调用子程序的程序称为主程序。在应用系统开发中,把程序完成的主要功能都分配给各子程序去完成,这样主程序可以写得比较简捷,整个应用系统的维护方便,应用系统运行的效率也很高。,1、子程序的调用 格式:DO with IN 说明: a. 程序文件名1:指定要执行程序的名字。DO 直接执行或调用指定的程序。 b. WITH :指定传递到子程序的参

2、数,在中列出的参数可以是表达式、内存变量、常量、字段或用户自定义函数。 c. 当是子句IN 中的一个过程时,DO命令调用该过程,请参阅例7-26。,第7章 程序设计,7.3 多模块程序,7.3.1 子程序 2、子程序的返回RETURN TO MASTER |TO 说明: a. 该语句放在一个程序的末尾。 b. 不带参数的RETURN语句的功能是将程序控制权返回到调用该子程序的主程序的下一条命令语句。 c. RETURN TO MASTER:如果有多级程序调用,某一子程序的该语句将使程序控制权返回到最高一级调用程序。 d. RETURN TO :表示将控制权交给指定的程序。,3、子程序的建立建立

3、子程序的方法与以前我们建立程序的方法类似。但要注意两个问题,一是每个子程序必须单独使用一个文件名保存起来,二是主程序和子程序之间有关变量值的传递关系。子程序文件名的扩展名也是.PRG。,Return to master,Return,sub1,Return to sub1,第7章 程序设计,7.3 多模块程序,7.3.1 子程序 例7-21 利用主程序调用子程序的方法计算任意3个自然数的阶乘和,即求s=a!+b!+c!建立步骤:先建立好求任一自然数阶乘的程序,如例7-17。由于这里是通过主程序调用子程序的方法求三个自然数阶乘之和,因此在子程序中所求出的每个自然数的阶乘就不用输出了;另外子程序计

4、算所需的自然数是主程序通过变量传递到子程序的,因此,在子程序中输入自然数的语句也可以不要。所以,在本例中,作为求阶乘的子程序可以是如下的程序代码:,factor=1 FOR x=n TO 1 STEP -1factor=factor*x ENDFOR RETURN注意,该子程序中的变量n的值需要由主程序传递。将该子程序保存文件名为:jc调用该子程序的主程序为: CLEAR INPUT “a=“ to a INPUT “b=“ to b INPUT “c=“ to c,s=0 &定义存放阶乘的累加和的变量 factor=1 &定义与子程序传递阶乘计算结果的变量 n=a &定义计算阶乘需要自然数的

5、传递变量 DO jc s=factor n=b DO jc s=s+factor n=c DO jc s=s+factor ?ALLTRIM(STR(a,3)+“!+”+ALLTRIM(STR(b,3)+“!+”+;ALLTRIM(STR(c,3)+“!=“,s RETURN,第7章 程序设计,7.3 多模块程序,7.3.2 自定义函数Visual FoxPro提供了许多系统函数,用户也可以自己定义函数(User Defined Function),简称UDF。UDF与内部函数一样,可以在程序、命令窗口或函数嵌套中使用。在Visual FoxPro中有两种形式的UDF:独立UDF和依附UDF。

6、,1、独立用户定义函数 实际上独立用户定义函数就是带参数传递的子程序,差别仅仅是用户定义函数的最后一条RETURN语句后有表达式、以及调用的方式不同。用户定义函数用如下格式定义。 格式:PARAMETERS 命令序列RETURN 说明:a. PARAMETERS :接受函数运行时传递过来的数据,如果函数不需要传递数据,该语句可省略。 b. 命令序列:用于进行各种处理的命令组合。简单的函数也可以为空。 c. RETURN 语句中的值作为返回函数值,它决定了函数的类型。如缺省该语句,则返回函数值为.T.。 d. 函数名称就是保存时用的程序文件名。如果UDF的名称与已有的函数名相同,系统只承认已有函

7、数,因此不能用已有的函数名来命名UDF。 e. UDF的调用形式是()。,第7章 程序设计,7.3 多模块程序,7.3.2 自定义函数 1、独立用户定义函数 例7-23:定义一个计算求立方数的函数。,(1)创建函数 求立方数函数。函数名为cube(即以cube.prg为文件名存盘)。PARAMETERS vRETURN v*v*v下面程序中调用求立方函数cube.prg,求1到10的立方数。,(2)在程序中调用函数 *求1到10的立方数。程序名为CX23 CLEAR FOR i=1 TO 10?i,cube(i) ENDFOR RETURN自定义函数cube不仅可以在程序中调用,也可以命令窗口

8、里调用。,第7章 程序设计,7.3 多模块程序,7.3.2 自定义函数 2、依附用户定义函数依附用户定义函数不能作为一个独立的程序文件,它以FUNCTION开头,依附在某程序的后面、某过程文件中。依附用户定义函数用如下格式定义。 格式:FUNCTION PARAMETERS 命令序列RETURN 说明: FUNCTION 在程序里标识UDF的开始并定义函数名。其他与独立函数规定相同,例7-24 用依附定义函数编写求1-10的立方数。 *求1到10的立方数。 CLEAR FOR i=1 TO 10?i,cube1(i) ENDFOR RETURNFUNCTION cube1 PARAMETERS

9、 v RETURN v*v*v,例题7-25自学,第7章 程序设计,7.3 多模块程序,7.3.3过程把多个子程序合并成一个大的文件,在该文件中,每个子程序仍然是独立的,这个大的公用程序文件被称作过程文件,其中的每个子程序模块成为过程。由于过程文件是集中起来以一个文件的形式存储在磁盘上的,调用时作为一个文件一次打开,每个子过程可随时调用,从而大大减少了访问磁盘的次数,可提高程序运行效率。 过程用如下命令格式建立。 格式:PROCEDURE PARAMETERS RETURN 说明: a. 过程是以PROCEDURE开头,并标识出的程序或程序段,指定生成过程的名称,是过程体,用DO 命令调用。

10、b. 过程可以放在主程序的后面,由主程序调用。 c. 可以将一个或多个过程组织在一个程序文件中,需要时分别调用。,第7章 程序设计,7.3 多模块程序,7.3.3 过程 例7-26 过程跟在主程序后面举例。用主程序调用过程的方式编程求圆面积、圆周长、球体积。,*主程序 CLEAR INPUT “请输入半径:“ TO radius mj=0 zc=0 tj=0 DO ymj WITH mj,radius DO yzc WITH zc,radius DO qtj WITH tj,radius ?“半径为“+alltrim(str(radius,10)+“的圆面积是:“,mj ?“半径为“+allt

11、rim(str(radius,10)+“的圆周长是:“,zc ?“半径为“+alltrim(str(radius,10)+“的球体积是:“,tj RETURN,*过程 PROCEDURE ymj PARAMETERS s,r s=pi()*r2 RETURNPROCEDURE yzc PARAMETERS s,r s=2*pi()*r RETURNPROCEDURE qtj PARAMETERS s,r s=4/3*pi()*r3 RETURN,第7章 程序设计,7.3 多模块程序,7.3.3 过程 例7-27 过程文件调用举例。在主程序中调用过程文件中过程的方式编程求圆面积、圆周长、球体积。

12、 可以将例7-26中三个子过程组合成一个过程文件,假设文件名为:circle 。它包括如下内容:,*过程文件,文件名为 CIRCLE PROCEDURE ymj PARAMETERS s,r s=pi()*r2 RETURN PROCEDURE yzc PARAMETERS s,r s=2*pi()*r RETURN PROCEDURE qtj PARAMETERS s,r s=4/3*pi()*r3 RETURN,*主程序 CLEAR INPUT “请输入半径:“ TO radius mj=0 zc=0 tj=0 DO ymj WITH mj,radius IN circle &表明过程ym

13、j在过程文件circle中 DO yzc WITH zc,radius IN circle &表明过程yzc在过程文件circle中 DO qtj WITH tj,radius IN circle &表明过程qtj在过程文件circle中 ?“半径为“+alltrim(str(radius,10)+“的圆面积是:“,mj ?“半径为“+alltrim(str(radius,10)+“的圆周长是:“,zc ?“半径为“+alltrim(str(radius,10)+“的球体积是:“,tj RETURN,例题7-27方法二自学,第7章 程序设计,7.3 多模块程序,7.3.4 变量的作用域在多模块

14、程序中,根据变量的发生作用的范围,可将变量分为公共变量、私有变量和本地变量3类。,1、公共变量在任何模块中都能使用的变量称为公共变量,也称为全局变量。当某些变量需要在各个模块中都可能发挥作用的时候,要定义成公共变量。用下列格式定义变量为公共变量。 格式:PUBLIC 说明: a. 将指定的所有变量定义为公共变量。 b. 在命令窗口里定义的变量都是公共变量。 c. 程序终止时,公共变量不会自动清除,需要用CLEAR ALL或者RELEASE ALL命令清除。 d. 可以用类似的格式将数组建立并声明为全局数组,如下列命令。 PUBLIC ARRAY(,),(),第7章 程序设计,7.3 多模块程序

15、,7.3.4 变量的作用域,2、私有变量程序中使用的内存变量,凡未经特殊说明的均属于私有变量,这些内存变量可以在本级程序及以下各级子程序中使用,其值可以在子程序中改变,返回主程序时保留改变后的值。如果在某一级模块中使用的变量名称可能与上级模块使用的变量名称一样,而这些变量返回到上级模块时,又不想让子程序中变量值影响上级模块中同名变量的值,Visual FoxPro提供了屏蔽上级模块变量的方法,被屏蔽的变量名,当子程序结束返回到主程序时,不会影响主程序中同名变量的值。下述声明私有变量的命令就能起到屏蔽上级同名变量的作用。 格式: PRIVATE |ALL LIKE|EXCEPT 说明: a. 声

16、明的私有变量,只能在当前以及下级程序中有效,当本级程序结束返回上级程序时,私有变量自动清除,主程序中同名变量恢复其原来的值。 b. 在程序模块调用时,PARAMETERS 语句中指定的变量自动声明为私有变量。,第7章 程序设计,7.3 多模块程序,7.3.4 变量的作用域,3、本地变量本地变量既不能在上级模块中发挥作用,也不能在下级模块中发挥作用,只能在建立它的模块中发挥作用,本级模块结束,本地变量自动清除。下列命令将变量声明为本地变量。 格式:LOCAL LOCAL将指定的变量声明为本地变量,并赋初值为.F. 。注意,LOCAL不能简写为LOCA(Visual FoxPro认为LOCA与LO

17、CATE具有同样的含义)。,第7章 程序设计,7.3 多模块程序,7.3.4 变量的作用域 例7-27 变量作用域举例。认真分析如下程序中变量发生作用的范围。 *主程序cx28.prg CLEAR CLEAR ALL a1=10 a2=10 a3=10 LIST MEMO LIKE a? do cx27zcx1 LIST MEMO LIKE a? CLEAR ALL RETURN,*子程序cx27zcx1.prg PRIVATE a1 LOCAL a2 a1=5 a2=5 LIST MEMO LIKE a? DO cx27zcx2 LIST MEMO LIKE a? RETURN*子程序cx2

18、7zcx2.prg PUBLIC a4 a4=20 LIST MEMO LIKE a? RETURN,第7章 程序设计,7.3 多模块程序,7.3.5 结构化模块程序设计一个应用系统通常有多个模块系统组成,通常用菜单系统来管理它们。下面介绍一个用结构化程序设计方法编写应用系统的例子。,例 编写一个应用程序,能够实现对人事数据表rsb进行修改、查询、打印数据表数据并具有选择退出功能。 问题分析:我们采用主程序调用子程序的方法解决该问题,因此先建立好各个子程序,这里我们采用例7-15设计的程序作为对数据表进行修改的子程序,采用例7-20作为对数据表进行查询的子程序,用LIST命令实现数据表数据列表

19、送到打印机打印输出;按题目功能要求,建立一个选择菜单显示在屏幕上,每一菜单项目代表一种功能选择,选择相应的菜单项目就执行相应的子程序或命令,按“退出”菜单项,退出应用系统。下面程序可实现上面的功能要求。,第7章 程序设计,7.3 多模块程序,CLEAR TEXT&TEXTENDTEXT 之间的内容可以在屏幕上原样显示,作为本程序的菜单提示。 * * * * * * * * * * * * * * * * * * * * * * 1. 数据修改 2. 数据查询 * * 3. 打印数据 4. 系统退出 * * * * * * * * * * * * * * * * * * * * * * ENDT

20、EXT DO WHILE .t.5,8 SAY “请选择1-4:“ GET number DEFAULT SPACE(1)READDO CASECASE number=“1“DO cx15 &例-15程序CASE number=“2“DO cx20 &例-20程序CASE number=“3“USE rsbLIST TO PRINTER USECASE number=“4“WAIT “系统将在8秒内自动关闭!“ WINDOWS AT 20,18 TIMEOUT 8EXITENDCASE ENDDO CLEAR RETURN,第7章 程序设计,7.3 多模块程序,7.3.6 程序的调试在开发应用

21、程序时,为了保证程序的正确性和合理性,需要对应用程序进行调试,以发现其中的错误并进行修改,直至达到设计要求,才能投入使用。,1、程序中常见的错误程序中常见的错误包括语法错误、溢出错误、逻辑错误。语法错误包括命令字拼写错误、命令格式错误、使用了中文标点符号作为分界符、使用了没有定义的变量、数据类型不匹配、操作的文件不存在等;溢出错误包括计算结果超过Visual FoxPro所允许的最大值、文件太大、嵌套层数超过允许范围等;逻辑错误指程序设计的差错,如要计算圆的面积,在程序中却用了计算圆周长的公式等。对于语法错误和溢出错误可以通过运行程序,系统给出相应提示信息予以纠正;对于逻辑错误,只有通过运用典

22、型数据进行测试,分析计算结果是否合理和正确,才能予以纠正。,2、程序查错查错技术可分为两类:一类是静态检查,例如通过阅读程序寻找错误;另一类是动态检查,即通过运行程序来检查运行结果是否正确、是否符合要求。动态检查有如下方法。 (1)使用出错信息 (2)调试器 (3)错误处理程序,第7章 程序设计,7.3 多模块程序,7.3.6 程序的调试,2、程序查错 (3)错误处理程序ON ERROR命令用来当程序出现错误时指定执行的程序,可以帮助我们定位错误和提供相关信息。格式:ON ERROR 这里,COMMAND是指定程序出错时应执行的Visual FoxPro命令。执行此命令后,程序将从引起错误的程

23、序行的下一行重新开始执行。但如果错误处理过程中包含RETRY,则重新执行引起错误的程序行。,例7-29 编写一个能将任意数据表文件复制到A盘的程序,在进行复制之前用信息对话框给出提示信息“请将磁盘插入驱动器A中,按确定按钮复制,按取消按钮退出”;若驱动器未准备好可以允许重试3次,同时在一个信息对话框中显示错误代码、错误消息、错误程序名称、错误行号并提示解决措施。该程序代码如下:,第7章 程序设计,7.3 多模块程序,CLEAR ON ERROR DO errorhandling WITH ERROR(),MESSAGE(),LINENO(),PROGRAM() i=1 +256,“ 复制文件“

24、) &当按确定按钮时,函数返回1给x,按取消按钮时函数返回2给x。DO CASECASE x=1WAIT “正在复制.“ WINDOWS AT 18,50 NOWAITCOPY TO a:&tablename &如果A驱动器没有准备好,该语句会出错CASE x=2WAIT “不复制退出!“ WINDOWS AT 18,50ENDCASE ELSEWAIT “该文件不存在!“ WINDOWS AT 18,50 ENDIF CLEAR RETURN,第7章 程序设计,7.3 多模块程序,CLEAR ON ERROR DO errorhandling WITH ERROR(),MESSAGE(),L

25、INENO(),PROGRAM() i=1 +256,“ 复制文件“) &当按确定按钮时,函数返回1给x,按取消按钮时函数返回2给x。DO CASECASE x=1WAIT “正在复制.“ WINDOWS AT 18,50 NOWAITCOPY TO a:&tablename &如果A驱动器没有准备好,该语句会出错CASE x=2WAIT “不复制退出!“ WINDOWS AT 18,50ENDCASE ELSEWAIT “该文件不存在!“ WINDOWS AT 18,50 ENDIF CLEAR RETURN,第7章 程序设计,7.3 多模块程序,PROCEDURE errorhandlin

26、g PARAMETERS errorcode,messagename,errorline,programname tem=“错误代码:“+STR(errorcode)+CHR(13) &CHR(13)相当于按回车健,表示换行 tem=tem+“错误消息:“+messagename+CHR(13) tem=tem+“错误程序:“+programname+CHR(13) tem=tem+“错误行号:“+STR(errorline)+CHR(13) =MESSAGEBOX(tem+“驱动器没有准备好,请将磁盘插入到A驱动器中。“,0+48+0,“复制文件“) i=i+1 IF i=3RETRY EN

27、DIF CLEAR RETURN,第7章 程序设计,7.4 数组应用,7.4.1 常用数组函数介绍,1、ALEN函数 格式: ALEN(ArrayName,nArrayAttribute) 功能:返回数组元素的个数,行或列。 说明:a. ArrayName为数组的名称。如果数组是一维数组,则该函数返回数组元素的个数,假设有数组x(10),则函数ALEN(x)的返回值是10。 b. nArrayAttribute参数是指二维数组的行或者列,它的取值为1、2或者0。取值为1时,返回该数组的行数;为2时,返回该数组的列数;为0或省略该参数时,返回二维数组的元素的数量。假设有二维数组x(6,8),那么

28、ALEN(x,1)返回值为6,ALEN(x,2)返回值为8,ALEN(x,0)或ALEN(x)返回值为48。,2、ASORT函数 格式: ASORT(ArrayName,nStartElement,nNumberSorted,nSortOrder) 功能:将数组元素的值按要求排序,将排序好的值写回数组。 说明:a. ArrayName指要排序的数组名;nStartElement指数组元素要参与排序的起始元素,该数值不能超过数组元素的最大值,否则将出现下标超界错误,该参数缺省指从数组元素的第一个开始排序;nNumberSorted指要参与排序的数组元素的数量;nSortOrder指排序的规则,该

29、值大于等于1时按降序排,小于1时按升序排,缺省时按升序排。如ASORT(x)按升序重新排列x数组中各个元素并写回数组;ASORT(x,2,8,1)函数将数组x的元素从第2个元素开始排序,参与排序的数组元素的数量是8个,降序排,其他没有包括在此范围的数组元素保持原来的顺序。 b. 该函数正确执行后将返回数值1。,数组与数据表之间的数据传递,复制数据表记录数据到内存变量或数组 格式: SCATTER FIELDS MEMO TO 功能:把当前记录指定字段名的数据复制并传送到指定数组的各个元素中。 将数组元素内容传送给当前记录 格式: GATHER FROM FIELDS MEMO 功能:将指定数组

30、变量中各元素的数据,复制并传送给当前数据表的当前记录。,算法举例,例7-34 排序问题。在程序运行时,从键盘输入任意10个自然数给数组,将这10个数从小到大重新排序后输出。X(1),X(2),X(3),,X(9),X(10) I J1 2102 310 9 1010,第7章 程序设计,7.4 数组应用,CLEAR DIMENSION x(10) *数据输入部分 FOR i=1 TO 10x(i)=03,8 SAY “请输入第“+ALLTRIM(STR(i,2)+“个数据:“ GET x(i)READ ENDFOR CLEAR 5,8 SAY “排序之前数组各元素的值是:“ FOR i=1 TO 105+i,8 SAY x(i) ENDFOR *数据处理部分 FOR i=1 TO 9FOR j=i+1 TO 10IF x(j)x(i)a=x(i)x(i)=x(j)x(j)=aENDIFENDFOR ENDFOR,*排序后数据输出部分 16,8 SAY “排序之后数组各元素的值是:“ FOR i=1 TO 10 16+i,8 SAY x(i) ENDFOR RETURN,请大家思考如何用函数ASORT(x,1,10,0)或ASORT(x)来代替本程序中的数据处理部分。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报