第9章过程[沐风教学]_第1页
第9章过程[沐风教学]_第2页
第9章过程[沐风教学]_第3页
第9章过程[沐风教学]_第4页
第9章过程[沐风教学]_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

1、第9章 过程9.1 过程及其调用过程及其调用9.2 变量的作用域和过程的带参调用变量的作用域和过程的带参调用 第第 9 章过程章过程返回主目录返回主目录第9章 过程第第9章章 过程过程 9.1 过程及其调用过程及其调用 9.1.1 外部过程及其调用外部过程及其调用 1. 外部过程的概念外部过程的概念 当前正在运行的程序执行到过程调用语句时,如果被调用的过程是一个独立的磁盘文件,那么这个被调用的过程就叫做外部过程。 外部过程的.PRG文件和已经学过的.PRG文件设计方法几乎没有区别。 但是,当一个.PRG文件作为外部过程时,要求其程序中必须包含返回语句(RETURN), 返回语句一般是程序的最后

2、一条语句。 返回语句的一般格式为 第9章 过程 RETURN TO MASTER 如果选择TO MASTER,则从当前被调用的程序越过层层调用的一系列程序,直接返回到最上层的主程序。 2. 调用外部过程的动态执行过程调用外部过程的动态执行过程 当其它程序(主程序)使用过程调用语句调用外部过程时, 才把外部过程(外部子程序)从磁盘读入内存并被执行。 过程调用语句的一般格式为 DO 路径过程名 这里的过程名就是.PRG文件的主名。如果被调用的.PRG文件不在当前目录, 应当指出被调用文件的存取路径。 第9章 过程 当外部过程执行到RETURN语句时,返回到主程序, 继续执行过程调用语句后面的语句。

3、 一个外部过程还可以调用其它外部过程, 形成过程的嵌套调用。 其动态执行的逻辑流程见图9.1。 嵌套调用的最后一个被调过程执行完后,再从最后一个被调程序返回并执行它的上一级程序,如此逐级返回,直至返回到最前面的主程序。 如果某一个被调过程的返回语句选择了 TO MASTER, 则越过中间调用层次, 直接返回到第一个主程序。 显然,主程序、 程序的概念是相对的。作为子程序的程序, 如果调用其它程序,那么这个子程序又是其下层被调程序的主程序。所以,把被调程序的上级程序叫做主调程序更为恰当。 第9章 过程第9章 过程 3. 调用外部过程举例 例 9.1 设指定的目录下有 Prc1.prg、 Prc2

4、.prg、 Prc3.prg 三个程序文件。 这三个程序文件的内容分别是: Prc1.prg文件: DO PRC2 ? AAAAAA RETURN Prc2.prg文件: DO PRC3 ? BBBBBB RETURN第9章 过程 Prc3.prg文件: ? CCCCCC RETURN 则当执行了下面的程序后, 屏幕依次显示的字符串应当是()。 SET TALK OFF CLEAR DO PRC1 ? DDDDDD RETURN 第9章 过程 9.1.2 内部过程及其调用内部过程及其调用 调用外部过程时,要先把存储在磁盘上的被调用的文件装入内存才能执行。从磁盘把外部过程文件装入内存的速度, 比

5、直接启动内存中的程序速度要慢一些, 特别是频繁调用外部过程时,可能对程序运行速度影响更大。 另外, 由于每调用一个外部过程,都要打开一个文件, 而计算机对可以打开的文件数量是有限制的, 当超过这个限制时, 程序就不能运行了, 所以, 一个规模较大的计算机应用程序系统, 一般多采用内部过程。 所谓内部过程, 就是把一些属于一个功能模块的所有子程序都汇集到一个 .PRG文件中,由于可以把这种汇集了多个过程的 .PRG文件整体装入内存,调用其中的任一过程都是从内存中调用并执行的。 第9章 过程 如果是按先主程序后子程序的顺序汇集成的文件, 并且能通过DO命令启动该文件,则这样汇集的 .PRG文件叫做

6、程序文件;如果所汇集的各个过程没有主次之分(汇集顺序可以任意),则这样汇集的 .PRG文件叫做过程文件。 过程文件只能用专门的过程文件打开命令装入内存。 1. 过程文件的建立及打开过程文件的建立及打开 1) 过程文件的格式及其调用方法 过程文件的格式及其调用方法如下: PROCEDURE 过程名 过程 的程序段 RETURN第9章 过程PROCEDURE 过程名 过程 的程序段 RETURN PROCEDURE 过程名 过程的程序段 RETURN 一个过程文件是由以 PROCEDURE 过程名 语句开始, 以 RETURN语句结束的多个子程序构成的。第9章 过程 外部过程的调用是从磁盘搜索指定

7、的 .PRG文件; 而内部过程的调用是从内存中搜索PROCEDURE指定的过程名。当从内存搜索到用PROCEDURE指定的过程名之后,开始执行该过程,直到RETURN语句返回到主调程序。 2) 过程文件的建立 建立过程文件时,既可以直接用键盘输入一个个子程序, 也可以把原来已经存在的.PRG文件复制到过程文件中来。 3) 过程文件的打开和关闭 其它程序如果要调用过程文件中的某个过程, 必须首先使用过程文件的打开命令打开过程文件, 即把过程文件装入内存。 过程文件的打开命令的格式为 SET PROCEDURE TO 过程文件名第9章 过程 过程文件打开后, 因为过程文件中所包含的所有子程序都装入

8、了内存, 所以可以用 DO命令调用其中任何一个子程序, 也允许子程序之间互相进行逻辑上合理的调用。 调用过程文件中的子程序的命令格式是: DO 内部子程序名 。 注意:每次只能打开一个过程文件。 每当打开一个新的过程文件时, 原来打开的过程文件就会自动关闭。 也可以用SET PROC TO 命令关闭打开过的过程文件。 4) 举例 例 9.2把下列三个原来已经独立存在的.PRG 文件做成一个过程文件, 再用另外一个程序调用该过程文件。 其中: 第9章 过程 sub11.PRG一个能产生(10,100)区间中 个随机整数的程序; sub22.PRG一个能计算前 100 个自然数之和的程序; sub

9、33.PRG一个能输出乘法口诀的程序。 为此, 需要编写一个过程文件和一个打开调用此过程文件的主程序文件: 第一步, 编写过程文件。 把上列已经编写好的三个.PRG文件汇集到一个名为PROC1. PRG的文件中(如果磁盘上没有这些已经编写好的文件, 就不能用汇集的方法了, 需要用键盘依次输入每一个过程程序)。 PROC sub11&内部过程 的入口语句第9章 过程CLEAR ?STOR 0 TO x,y DO WHIL x10 ?m x=x+1 ENDIF ENDDO RETU第9章 过程* PROC sub22 &内部过程 的入口语句 CLEAR STOR 0 TO s,n

10、DO WHIL n100 n=n+1 s=s+n ENDDO ? 的自然数之和是: ? s RETU *第9章 过程PROC sub33 &内部过程的入口语句 CLEAR ? FOR m=1 TO 9 FOR n=1 TO m s=m*n ?STR(m,1)+*+STR(n,1)+=+STR(s,2)+ ENDFOR ? ENDFOR RETU 第9章 过程 可见, 把原来作为外部过程的三个.PRG文件,组合到一个内部过程文件中后,每个.PRG 文件前面都加了内部过程的入口语句(PROCDURE),在内部过程结束时,都有返回语句(RETURN)。 第二步, 编写调用内部过程文件Proc

11、1.prg的程序Procmain.prg: CLEAR SET PROC TO proc1&打开过程文件(Proc1.prg)的语句 DO WHIL .T. TEXT第9章 过程 1. 产生(10,100)区间中 个随机整数 2. 计算前 100 个自然数之和 3. 输出乘法口诀 4. 退出(返回FoxPro) ENDTEXT hd=0 ? WAIT 请选择执行一个程序(回答序号14) TO hd DO CASE第9章 过程CASE hd=1 CLEAR DO sub11&从打开的过程文件中可以搜索入口名sub11 CASE hd=2 CLEAR DO sub22&从打

12、开的过程文件中可以搜索入口名sub22 CASE hd=3 CLEAR DO sub33&从打开的过程文件中可以搜索入口名sub33第9章 过程 CASE hd=4 CLEAR EXIT ENDCASE ENDDO RETU 当编写了上面的过程文件(Proc1.prg)和调用过程文件(Procmain.prg)的程序之后,可在FoxPro的命令窗口打入命令: DO procmain 则在执行PROCMAIN程序时, 可打开过程文件PROC1, 并调用PROC1中的内部过程。 第9章 过程 2. 程序文件的建立及执行程序文件的建立及执行 1) 程序文件的建立 程序文件虽然和过程文件一样,

13、 也是由若干个子程序构成的, 但是程序文件的开头必须是一个主程序,其后可以汇集若干个子程序, 其格式为 主程序: 主程序语句 RETU 子程序 : PROC 内部过程名 1 内部过程 1 的语句 RETU 子程序 : PROC 内部过程名 2第9章 过程 内部过程 2 的语句 RETU 子程序: PROC 内部过程名n 内部过程n的语句 RETU 2) 程序文件的执行 程序文件无非是一个包含有主程序及其子程序的.PRG文件, 所以执行程序文件和执行以前的普通.PRG文件的方法完全相同, 即DO 程序文件名。 第9章 过程 程序文件执行的流程是, 执行位于程序文件开头的主程序, 而后面的子程序可

14、以被主程序调用, 也可以被其它内部子程序调用。 调用程序文件中的子程序的命令格式为 DO 内部子程序名 IN 程序文件名 当内存中存在多个程序文件时, 可以用 IN 程序文件名, 以加快指定的子程序的查找速度。 和调用过程文件不同的是, 程序文件不需要使用专门的打开或关闭命令,而且程序文件打开的数量也不限于一个。 3) 举例 例 9.3利用前面例题中的过程文件及其主调程序,可以方便地将其改写为一个程序文件。 注意, 因为位于程序文件开始的是主程序, 所以第一条语句不能是PROC语句。 第9章 过程 CLEAR DO WHIL .T. TEXT 1. 产生(10,100)区间中 个随机整数 2.

15、 计算前 100 个自然数之和 3. 输出乘法口诀 4. 退出(返回FoxPro) ENDTEXT hd=0 ?第9章 过程 INPUT 请选择执行一个程序(回答序号14) TO hd DO CASE CASE hd=1 DO sub11 &从打开的过程文件中可以搜索入口名sub11 CASE hd=2 DO sub22 &从打开的过程文件中可以搜索入口名sub22 CASE hd=3 DO sub33 &从打开的过程文件中可以搜索入口名sub33 第9章 过程CASE hd=4 EXIT ENDCASE ENDDO RETU *以下接续各个内部过程(略) PROC s

16、ub11&子程序 的入口 内部过程sub11的程序段 RETURN PROC sub22 &子程序 的入口 内部过程sub22 的程序段第9章 过程 RETURN PROC sub33 &子程序 的入口 内部过程sub33 的程序段 RETURNZK)HT5SS 其实, 不论调用外部过程还是调用内部过程的语句都是DO 过程名, 该语句本身并不能区分被调用的是外部过程还是内部过程。 但是, FoxPro系统执行过程调用语句时, 需从内存中搜索被调过程的入口名。 如果在内存中找到了, 就执行内部过程; 如果找不到,再从指定的磁盘目录中搜索。 如果在磁盘目录中找到了,就执行外

17、部过程; 如果找不到, 就出现“文件找不到”的出错信息。 第9章 过程9.2 变量的作用域和过程的带参调用变量的作用域和过程的带参调用9.2.1 内存变量的作用域内存变量的作用域 在程序设计中使用了过程及其调用之后, 可能涉及到内存变量的作用域问题。实际上, 内存变量除了具有类型、 宽度和精度的属性之外, 还有作用域属性。 按内存变量的作用域, 可以把内存变量分为局部变量和全局变量。 凡是仅限于定义变量的过程中和该过程被调用过程中存取的变量, 都叫做局部变量; 能够在所有过程中存取的变量, 叫做全局变量。视需要, 全局变量或局部变量在使用之前需要用变量作用域的说明语句进行说明。 1. 全局变量

18、的说明语句全局变量的说明语句 全局变量的说明语句为第9章 过程 PUBLIC 内存变量名表 (所说明的多个变量之间的分隔符用逗号) 例如, 语句 PUBLIC A,B,C, 将内存变量A、 B、 C说明为全局变量。 但是, PUBLIC语句并没有说明这些变量的类型(确切地说, 它们“暂时”为逻辑型)。 由此可知,说明了作用域的内存变量,还需要在初始化或者在以后使用时,通过所赋值的类型来确定其类型。例如,在A、 B、C已说明为全局变量的基础上,对其赋值。 若A=123.45, 则全局变量A的类型是数值型; 若A=abcd, 则全局变量A的类型是字符型; 若A=.t., 则全局变量A的类型是逻辑型

19、。 第9章 过程 由于说明了作用域的变量还没有确定其类型属性, 所以执行下面的程序段将出现同一表达式中的数据类型不一致的错误: PUBLIC A,B,C A=123.45&变量A是数值型全局变量 A=A+B &而变量B仅作了说明, “暂时”是逻辑型, 所以出错 例 9.4 编写一个程序文件, 要求: 每当从主调程序输入一个矩形的长、宽数据后,调用内部过程计算矩形的面积, 而矩形面积在主调程序输出;当输入的矩形长、宽数据为 时, 返回 FoxPro。 其程序如下: 第9章 过程CLEAR PUBLIC a1,a2&说明A1,A2为全局内存变量 DO WHIL .T. IN

20、PUT 请输入矩形的边长(如果输入 , 返回FoxPro): TO a1 IF a1=0 RETU ENDIF INPUT 请输入矩形的边宽(如果输入 , 返回FoxPro): TO a2第9章 过程IF a2=0 RETU ENDIF DO sub1 ? 矩形面积计算是: ,A1,*,A2,=,mj ENDDO RETU PROC sub1& 内部过程入口语句 mj=a1*a2 RETU 第9章 过程 主调程序所定义的内存变量, 虽然没有说明为全局变量, 仍然可以在其被调用的一系列子程序中使用。而子程序中定义的内存变量, 在其主调程序中不能引用。因为变量MJ是在子程序sub1中定义的

21、, 并没有说明它是全局变量,所以当返回到主调程序输出变量MJ时,出现了“变量找不到”的错误信息。 为了改正程序中出现的这个错误,有两个办法: (1) 在主调程序用PUBLIC语句说明的变量中, 说明变量MJ也是全局变量。 (2) 在主调程序中用赋值语句将变量MJ初始化为 (MJ=0)。因为在主调程序定义的变量, 虽然未说明为全局变量, 但是可以在被调程序中使用。 2. 局部变量的说明语句局部变量的说明语句 PRIVATE 局部内存变量名表 或第9章 过程 PRIVATE ALL LIKEEXCEPT 通配文件名 如果在一个过程中把一些变量定义为局部变量, 则被定义的局部变量只能在本过程内部有效

22、, 程序执行流程离开本过程, 则局部变量被清除。 由于未定义作用域的变量,也能在被调用的过程中引用, 有时为了避免这种共享变量造成的混乱,可以把只能在本过程中使用的变量说明为局部变量。 注意: (1) 凡是已定义为全局变量的变量,不能再定义为局部变量。 (2) 语句中使用 ALL LIKE 通配文件名是指:凡是用通配符配上的那些内存变量都被说明为局部变量;而 ALL EXCEPT 通配文件名 是指通配不上的那些内存变量都是局部变量。 第9章 过程 9.2.2 过程的带参数调用过程的带参数调用 如前所述, 在一个程序中,不论是外部过程还是内部过程, 都要使用过程调用语句调用。实际上,调用过程又分

23、为无参(数)调用和有参(数)调用两类,也可称为不带参数调用和带参数调用。 1. 无参调用过程无参调用过程 (1) 无参调用语句: DO 被调用过程名 (2) 说明: 主调程序是无参调用过程时,主调程序和被调过程之间,仅靠全局内存变量或在主调程序定义的内存变量中传递数据的。 第9章 过程 2. 有参调用过程有参调用过程 (1) 有参调用语句: DO 被调用过程名 WITH 实参表 (2) 说明: 主调程序是有参调用过程时,主调程序和被调程序之间, 使用 WITH 指定的实参进行数据传递的。与主调程序中的 WITH 实参相对应, 被调程序中的第一条可执行语句必须是形参说明语句: PARAMETER

24、S 形参表第9章 过程 如果被调程序是内部过程, 则PROEDUREC语句之后的语句必须是PARAMETERS语句;如果被调程序是外部过程, 则第一条语句必须是PARAMETERS语句。 过程调用语句中的参数是实参数,实参表可以由若干个常量、 变量或其它表达式组成, 实参中出现的变量必须是已经被说明或被定义过的。 而形参表中的各个形式参数必须是内存变量。当执行有参调用语句时,各个实参数据将依次传送给被调过程中用PARAMETERS指定的形式参数;当从被调过程返回时,形参的数据再依次传送给实参表中对应的变量。 由于任何主调程序都可以用一个实参表去调用同一个过程, 即被调过程中的形参表仅用于和主调

25、程序建立数据传递的对应关系。 第9章 过程 所以, 主调程序中的实参和被调过程中的形参,只要求两者的数量、 类型一致, 并不要求两者的名称相同。这就是把被调过程中的参数叫做形式参数的原因。 3. 有参调用过程举例有参调用过程举例 例 9.5编写一个程序文件, 要求: 每当从主调程序输入一个矩形的长、宽数据后,以矩形的长、宽作为实参调用计算矩形面积的内部过程,而矩形面积在主调程序输出; 当输入的矩形长、宽数据有一个为 时, 停止计算,返回FoxPro。其程序如下: 第9章 过程 CLEAR mj=0 DO WHIL .T. INPUT 请输入矩形的边长(如果输入, 返回FoxPro): TO a

26、1 IF a1=0 RETU ENDIF INPUT 请输入矩形的边宽(如果输入, 返回FoxPro): TO Aa第9章 过程 IF a2=0 RETU ENDIF DO sub2 WITH a1,a2,mj ? 矩形面积计算是: ,A1,*,A2,=, mj ENDDO RETU * PROC sub2& 内部过程入口语句 PARAM b1,b2,b3 & 第一条可执行语句是PARA语句 b3=b1*b2 RETU 第9章 过程 当主调程序调用sub2过程时, 实参a1、 a2、 mj中存储的数据依次分别传送给了过程sub2 的形参b1、 b2、 b3; 而当过程sub2

27、执行完返回主调程序时, 作为主调程序实参的变量a1、 a2、 mj接收了形参b1、 b2、 b3 中存储的数据, 所以变量mj获得了在sub2 中计算出来的矩形的面积。 例 9.6 把例 9.5 改为带参调用一个计算矩形面积的外部过程。 编 写 主 调 程 序 ( 设 主 调 程 序 的 磁 盘 文 件 名 为PROC5.PRG): CLEAR第9章 过程mj=0 DO WHIL .T. INPUT 请输入矩形的边长(如果输入, 返回FoxPro): TO Aa IF a1=0 RETU ENDIF INPUT 请输入矩形的边宽(如果输入, 返回FoxPro): TO a2 IF a2=0 R

28、ETU第9章 过程 ENDIF DO sub3 WITH a1,a2,mj ? 矩形面积计算是: ,A1,*,A2,=, mj ENDDO RETU 编写被调程序(设被调程序的磁盘文件名为SUB3.PRG): PARAM b1,b2,b3 &因为这是外部过程, 第一条语句再不是PROC语句了 b3=b1*b2 RETU第9章 过程 在FoxPro的命令窗口中, 打入命令DO PROC5 之后, 程序PROC5 将调用磁盘文件SUB3.PRG, 其执行结果和例 9.5 是一样的。 第9章 过程 9.2.3 自定义函数自定义函数 虽然FoxPro提供了丰富的系统函数,但是有时还需要定义一些

29、方便用户业务处理的自定义函数。自定义函数相当于一个带参调用过程, 在介绍了过程及其带参调用之后,很容易接受自定义函数的概念。 1. 定义函数的方法定义函数的方法 自定义函数是由用户编写的一个 .PRG文件, 它是一个带参调用的过程。因此,定义函数的方法, 就是编写一个供其它程序带参调用的 .PRG文件。 其程序格式为 PARAMETER 形参表 处理语句第9章 过程RETURN 函数返回值 注意: 由 RETURN 语句返回的函数值, 可以是表达式、 变量、 常量, 但是只能返回一个值。 2. 自定义函数的使用方法自定义函数的使用方法 自定义函数的使用方法和使用FoxPro的系统函数一样: 自

30、定义函数名(实参表) 这里的自定义函数名实际上是一个需要带参调用的过程名, 如果是外部过程, 它就是一个磁盘上的.PRG文件的主名。 3. 举例举例第9章 过程例 9.7定义一个正切函数。 编写定义函数的程序(设该函数的文件名为Zq.prg) PARA a RETU SIN(a)/COS(a) & RETU的返回值用了一个表达式 编写调用自定义函数Zq.prg的程序(设该程序的文件名为Dyzq.prg) CLEAR b=ZQ(12) *这实际上是用函数名(ZQ)去调用过程Zq.prg文件, 实参为常数 12。 ? b RETU 第9章 过程 在FoxPro的命令窗口中, 打入命令DO DYZQ 回车后, 显示出 12 弧度的正切值。 例 9.8定义一个计算矩形面积的函数。 编写定义函数的程序(设磁盘文件名为mjhs.prg): PARA a1,a2 mj=a1*a2 RETU mj 调用自定义函数的程序(设磁盘文件名

温馨提示

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

评论

0/150

提交评论