[计算机]63子程序过程自定义函数.doc_第1页
[计算机]63子程序过程自定义函数.doc_第2页
[计算机]63子程序过程自定义函数.doc_第3页
[计算机]63子程序过程自定义函数.doc_第4页
[计算机]63子程序过程自定义函数.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

6.3 子程序、过程和自定义函数引入:一个复杂的问题的解决,需要从功能上划分成不同的模块。每个模块需要建立相应的程序段,之间用接口连接,就可以解决复杂的问题。这些模块是在结构上相对独立的程序段,可以是子程序,过程和自定义函数。它们可以被其他模块所调用,也可以调用其他模块。6.3.1 子程序被其它程序调用的程序叫做子程序,调用其他程序而又没有被其它程序调用的程序叫主程序。1 子程序的构成子程序或者是过程与一般程序的编写和建立方法都是相同的,运行操作也都是相同的。只是在其最后,即子程序的末尾,设置了程序的返回语句,返回到被调用的地方。返回语句的写法: RETURN | TO MASTER 使子程序返回到调用语句下面的一条语句继续执行。 :将其值返回给调用程序 :不管是谁调用它的,都直接返回主程序 TO :强制返回到指定程序 2 子程序的调用子程序和程序一样,也是一个程序文件(扩展名.PRG),调用语句即是运行程序的语句。方法是:在调用程序需要调用的地方使用 DO WITH 说明:WITH 可以在调用子程序时,把当前程序的一些参数传递到被调用的子程序中去。 子程序可以嵌套调用,但不得超过128层。DO A主程序DO B1DO B2RETURN子程序ARETURN子程序B1RETURN TO MASTER子程序B2 3例1:计算 S=5!+6!+7!+8!算法:在求和的过程中,多次需要计算一个数的阶乘,即N!,所以可以把N!编写成子程序JC.PRG需要求某数的阶乘的时候调用JC.PRG就可以了。方法:同以前编写程序一样,建立一个供主程序调用的子程序JC.PRG,功能是实现求一个数的阶乘,编写完之后保存下来。再编写一个主程序(S.PRG),主程序中如果需要计算某个数的阶乘时,直接调用JC.PRG即可。子程序:I=1DO WHILE I=J Y=Y*I I=I+1ENDDO RETURN主程序: SET TALK OFF CLEAR S=0 FOR J=5 TO 8 Y=1 DO JC S=S+Y ENDFOR ?S=,SSET TALK ONCANCELY=J! 例2 根据表XSDA.DBF编写一个简单的菜单程序MAIN.PRG,完成对表文件查询程序SUB1.PRG和删除程序SUB2.PRG的调用。功能介绍:CLEAACCEPT 输入待查询姓名 TO XMSCAN FOR 姓名=XMDISPENDSCANRETURN查询子程序SUB1.PRG算法:SET TALK OFFUSE XSDADO WHILE .T.CLEARTEXT 1. 查询2. 删除3. 退出ENDTEXTACCEPT 输入选择号(13) TO gnIF gn=3 EXITELSE DO SUB&gnENDIFENDDO USE CANCEL主程序MAIN.PRGCLEAACCEPT 输入待删除记录的学号: TO XHSCAN FOR 学号=XHDELETEENDSCANPACKRETURN删除子程序SUB2.PRG4.参数传递 子程序、过程或自定义函数在被调用时常常需要进行参数传递。比如: 内存变量起着存储和传递的作用。 内存变量的数据传递属性:1 内存变量的作用域程序分主程序和子程序,程序中的变量也有不同的级别和作用范围。即内存变量的作用域。内存变量的作用域可以分为三种:全局变量、私有变量、本地变量。(1) 全局变量(公有变量)定义后能在各级程序段中使用的变量,其值可以随意调用和修改。使用前必须说明其是公有变量。说明方法: PUBLIC 功能:说明内存变量表中的变量或数组为全局变量,并为它们赋初值 .F.例: PUBLIC X,Y,S(10)说明:全局变量一旦建立就一直有效,即使程序运行结束也不会消失。只有执行清除内存变量的命令才会释放。命令窗口中定义的变量和系统自动隐含建立的变量也是全局变量。子程序中使用的内存变量要想提供给上一级或其它并列模块,必须将其定义为全局变量。(2) 私有变量在程序中直接使用而由系统自动隐含建立的变量都是私有变量。它的作用域是在当前模块程序及其下级各层模块。一旦程序返回到上级模块,则自动清除。一般也要先定义,在子程序中出现的没有定义的变量,默认为是私有变量。默认是私有变量,为什么还要定义?因为子程序用到的变量可能是主程序已经建立并使用过的,再次的使用会影响主程序中此变量的值。这时用PRIVATE定义其为私有的,不仅可以说明其性质,还可以隐藏主程序中可能存在的变量,使这些变量在子程序中暂时无效。举例:定义格式: PRIVATE 功能:声明私有变量,隐藏上层模块定义的同名变量。以使当前模块运行结束回到上层模块时,隐藏的变量自动恢复,并保持原值。 PRIVATE V1V1=2004/11/9V2=100?V1 V2?V1,V2RETURN例: SET TALK OFF SUB.PRG V1=10 V2=15 DO SUB ?V1,V2 (3) 本地变量(局部变量) 只能在建立它的模块中使用,不能在上层或下层模块中使用。 当建立它的模块程序运行结束时,会自动释放。 必须先建立后使用。 格式: LOCAL 由于LOCAL 和LOCATE前四个字母相同,所以不能缩写。P1.PRGP2.PRGLOCAL建立局部变量的同时也具有隐藏与上层模块同名变量的作用。它只能在它所在的本地模块内隐藏,一旦到了下层模块,这些同名变量就会重新出现。 PRIV A &隐藏同名变量,建立私有变量AA=80LOCAL B &隐藏同名变量,建立局部变量BDO P2?A,BRETUA=ATCMB=(0551)5169268RETUPUBLIC A,BA=50B=100DO P1?A,B例: 子程序P1.PRG主程序PLP.PRG三种变量作用域示例:CLEARPUBLIC X1,X2,X4DIMENSION X4(3,2)STORE 0 TO X4LOCAL X3STORE 5*8 TO X5?执行子程序之前结果:LIST MEMO LIKE X*DO P1?执行子程序之后结果:?X1=,X1, X2=,X2, X3=,X3, X5=,X5PRIVATE X2X2=2004-08-15X3=X2+5X5=3*X5/4?子程序结果:?X1=,X1, X2=,X2, X3=,X3, X5=,X5RETURN 2.参数传递(1) 调用程序把参数传递给子程序DO WITH (2) 被调用程序接收参数子程序接收调用程序传递过来的参数,对参数进行处理。接收参数的命令:格式:PARAMETERS 实际参数:简称实参。可以是常量,变量或表达式形式参数:简称形参。只能是变量。用DO 语句调用程序时,系统会自动把实参传递给形参,接收参数的语句PARAMETERS就可以接收实参了。实参个数形参个数 运行错误!说明: 接收参数的命令应该是模块程序的第一条可执行的命令。参数个数不能超过27个 PARAMETERS 中的形参被看作私有变量。(3) 参数传递方式:采用 DO WITH 调用程序时,如果实参是常量或表达式,系统会把实参的值计算出来并且赋给相应的形参,称为按值传递。如果实参是变量,那么传递给形参的不是值,而是变量的地址。即形参和实参其实是一个存储区域,只是叫了两个名字。子程序中如果改变了形参变量的值,主程序中实参值也会改变。这种情况称为按引用传递。 如果实参是变量,又想按值传递,可以把变量放在圆括号内,使之成为表达式 。 CLEAR STORE 50 TO X1,X2 DO SUB1 WITH X1 , (X2) &X1按引用传递,(X2)按值传递 ?X1,X2 X1=50 X2=50 SUB(X1,(X2) &X1,(X2)都按值传递 ?X1,X2 SET UDFPARMS TO REFERENCE &设置按引用传递 DO SUB1 WITH X1,(X2) &X1按引用传递,(X2)按值传递 ?X1,X2 X1=50 X2=50 SUB1(X1,(X2) &X1按引用传递,(X2)按值传递 ?X1,X2 RETURN例: *SUB1.PRG PARAMETERS A,B A=A+5 B=B+2 RETURN 说明: (1) (X2)用圆括号括起来使其成为一般形式的表达式,不管什么情况总是按值传送。(2) 用前面一种格式调用时,传递方式不受SET UDFPARMS的影响还可以在调用程序和被调用程序之间传递数组。当实参是数组元素时,总是采用按值传递方式传递元素值。当实参是数组名时,若采用格式1调用一定是按引用传递,格式2可以用命令SET UDFPARMS设置传递方式。如果是按值传递,传递第一个元素给形参。如果是按引用传递,传递的将是整个数组。*SUB2.PRGPARA AFOR I=1 TO 5TMP=A(X)A(X)=A(11-X)A(11-X)=TMPENDFORRETUDIME A(10)X=1DO WHILE X=10A(X)=2*X-1?A(X)X=X+1ENDDO DO SUB2 WITH A &实参是数组名,格式一调用,按引用传递。FOR X=1 TO 10?A(X)ENDFORRETU例: 6.3.2过程文件1.过程和过程文件将一些功能相对独立的公用模块编写成一个个程序段,称之为过程。子程序:作为一个磁盘文件单独存储在磁盘上,又称外部过程。子程序局限:每调用一次子程序,系统就要打开一次磁盘文件,消耗内存,影响效率。如果一个程序调用很多子程序的话,还要受系统允许打开文件数的限制。过程文件:将多个子程序(功能模块)组成一个大的文件,只要对该文件读取一次,就可以调用它所包含的所有的功能模块,就能提高系统运行速度,称之为过程文件。过程文件就是包含若干个过程的命令文件。2.过程的格式: PROCEDURE PARAMETERSRETURN ENDPROC 功能:定义一个过程。 说明:PROCEDURE: 表示一个过程的开始,并命名过程名。过程名的命名规则。ENDPROC:表示一个过程的结束。RETURN表示控制返回到调用程序(或命令窗口),并返回表达式的值。“有参过程”,“无参过程”3.过程文件的构成 过程放置的位置:可以放在主程序的后面,也可以单独作为一个程序(命令)文件保存下来。 建立方法同普通的程序文件相同:MODI COMM 扩展名也是.PRG 过程文件里只包含过程,必须按如下格式写: PROCEDURE PARARETURN ENDPROCPROCEDURE PARARETURN ENDPROCPROCEDURE PARARETURN ENDPROC功能:将N个过程存储在一个过程文件中(.PRG)。 4.过程文件的打开和关闭. 在调用过程文件中的过程之前首先要打开过程文件.(1) 过程文件的打开.SET PROCEDURE TO 过程文件1,过程文件2,ADDITIVE 功能:打开一个或多个过程文件,一旦一个过程文件被打开,那么该过程文件中的所有过程都可以被调用。 (2)过程文件的关闭 格式1:SET PROCEDURE TO 格式2:CLOSE PROCEDURE 功能:关闭所有打开的过程文件 格式3:RELEASE PROCEDURE 过程文件1 ,过程文件2,功能:关闭指定的过程文件 5.过程的调用 格式1:DO WITH 格式2:| () 说明:如果模块是程序文件的正常代码,用,否则用格式2既可以作为命令使用,也可以函数出现在表达式中。DO 命令执行的文件可以是过程可以嵌套调用,但最多不能超过128层。SET PROC TO GCDO 过程1SET PROC TO 过程1 过程2 过程3DO 过程2RETURNDO 过程3RETURN TO MASTERRETURN过程文件GC.PRG主程序 MAN4.PRG例:将求阶乘,求圆面积,输出结果编制成3个过程。合成一个过程文件GC1.PRG* GC1.PRGPROCEDURE PROC1 &求半径为R的圆的面积SS=3.14159*R*R ? 面积是:,SRETURN* PROCEDURE PROC2 &求I!=TN=1T=1DO WHILE N=IT=T*NN=N+1ENDDODO PROC3RETURN*PROCEDURE PROC3 &显示阶乘结果? I,!=,TRETURNCLEARSET TALK OFFPUBLIC S,TSET PROCEDURE TO GC1 INPUT 输入圆的半径 TO R DO PROC1INPUT I= TO IDO PROC2CLOSE PROCEDURE SET TALK ONCANCELGC1.PRG 在过程中,还可以自己调用自己,这叫做递归调用。 6.3.3 自定义函数 内部函数:如SUBSTR(C,N1,N2),EOF(),SQRT(N),MESSAGEBOX (,对话框标题)等。 用户自定义函数:弥补有限的系统提供的内部函数。(1) 编制函数格式: FUNCTION PARAMETERS RETURNENDFUNC 说明: PARAMETERS参数语句用来接受调用程序传来的参数,即自变量函数体是由完成函数功能的一组语句组成。RETURN 后面的表达式为函数的返回值。 (2)

温馨提示

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

评论

0/150

提交评论