您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 5.4 子程序、过程与自定义函数
15.4子程序、过程与自定义函数(模块化程序设计)引入:一个复杂的问题的解决,需要从功能上划分成不同的模块。每个模块需要建立相应的程序段,之间用接口连接,就可以解决复杂的问题。这些模块是在结构上相对独立的程序段,可以是子程序,过程和自定义函数。它们可以被其他模块所调用,也可以调用其他模块。5.4.1子程序被其它程序调用的程序叫做子程序,调用其他程序而又没有被其它程序调用的程序叫主程序。1.子程序的构成[PARAMETERS参数表]语句序列RETURN[TOMASTER]例:写一子程序实现在屏幕上打印一行’*’号。(文件名:star.prg)fori=0ton??'*'endforreturn2返回语句的解释:作用:使子程序返回到调用语句下面的一条语句继续执行。TOMASTER:不管是谁调用它的,都直接返回主程序Return语句可以缺省,此时返回到主调程序。2.子程序的调用方法是:DO子程序名[WITH参数表]说明:WITH参数表可以在调用子程序时,把当前程序的一些参数传递到被调用的子程序中去。……DOA…………主程序……DOB1…………DOB2……RETURN子程序A……RETURN子程序B1……RETURNTOMASTER子程序B233.例1:编写一程序输出如下信息(要求在主程序中调用上面的子程序)例2:计算任意两个数的和(用子程序实现)settalkoffclearn=10dostar?Hello,world!?n=10dostarsettalkon**********Hello,world!**********&&子程序sub.prgPARAMETERSX,YS=x+y?X+Y=,Sreturn4有两种调用方法:1)在命令窗口中调用:dosubwith5,102)在另一个程序中调用例3,计算S=5!+6!+7!+8!(选讲)子程序:I=1DOWHILEI=JP=P*II=I+1ENDDORETURN主程序:SETTALKOFFCLEARS=0FORJ=5TO8P=1DOJCS=S+PENDFOR?’S=’,SSETTALKONY=J!&&main.prgDosubwith5,10或&&main.prgS=0Dosubwith5,10?s&&实现在主程序中显示讨论:试运行该主程序&&main.prgDosubwith5,10?s&&实现在主程序中显示54、内存变量的作用域内存变量的作用域可以分为三种:全局变量、私有变量、本地变量。(1)全局变量(公有变量)格式:PUBLIC内存变量表功能:说明内存变量表中的变量或数组为全局变量,并为它们赋初值.F.例:PUBLICX,Y,S(10)说明:①全局变量一旦建立就一直有效,即使程序运行结束也不会消失。只有执行清除内存变量的命令才会释放。②命令窗口中定义的变量和系统自动隐含建立的变量也是全局变量。③子程序中使用的内存变量要想提供给上一级或其它并列模块,必须将其定义为全局变量。&&子程序sub.prgPARAMETERSX,YPublicSS=x+y6(2)私有变量定义格式:PRIVATE内存变量表功能:声明私有变量,隐藏上层模块定义的同名变量。以使当前模块运行结束回到上层模块时,隐藏的变量自动恢复,并保持原值。例:SETTALKOFFSUB.PRGV1=10V2=15DOSUB?V1,V2说明:(1)变量一般要先定义PRIVATEV1V1={^2004/11/9}V2=100?’V1V2’?V1,V2RETURN7(2)它的作用域是在当前模块程序及其下级各层模块。(3)一旦程序返回到上级模块,则自动清除。(3)本地变量(局部变量)必须先建立后使用。格式:LOCAL内存变量表说明:(1)由于LOCAL和LOCATE前四个字母相同,所以不能缩写。(2)LOCAL建立局部变量的同时也具有隐藏与上层模块同名变量的作用。(3)只能在建立它的模块中使用,不能在上层或下层模块中使用。当建立它的模块程序运行结束时,会自动释放。&&main.prgPUBLICAA=50DOP1?A,B&&p1.prgPRIVCA作用范围8publicBB=60C=80LOCALDDOP2?A,B,C,D&&p2.prg?A,B,C,d.3.2过程文件1.过程和过程文件将一些功能相对独立的公用模块编写成一个个程序段,称之为过程。过程按其表现形式分有:内部过程、外部过程(子程序)和过程文件。(1)内部过程是作为程序中的一个独立单位出现的。(2)子程序:作为一个磁盘文件单独存储在磁盘上,又称外部过程。(3)过程文件:将多个子程序(功能模块)组成一个大的文件,称之为过程文件。过程文件就是包含若干个过程的命令文件。2.过程的格式:PROCEDURE过程名1C的作用范围D的作用范围B作用范围9[PARAMETERS形参表]语句序列[RETURN[表达式]]ENDPROC说明:①PROCEDURE:表示一个过程的开始,并命名过程名。②ENDPROC:表示一个过程的结束。③RETURN表示控制返回到调用程序(或命令窗口)例,编写一画线过程,在主程序中调用。*内部过程settalkoff&&仅在主程序中使用cleardolinesettalkoncancel&&======================procedurelineforj=1to35??-endforreturn10endproc讨论:将上例改为带参过程(即线长有参数决定)3.过程文件的构成建立方法同普通的程序文件相同:MODICOMM文件名扩展名也是.PRG过程文件里只包含过程,必须按如下格式写:PROCEDURE过程名1[PARA形参表]语句序列1[RETURN[表达式]]ENDPROCPROCEDURE过程名2[PARA形参表]语句序列2[RETURN[表达式]]ENDPROC……PROCEDURE过程名N[PARA形参表]语句序列N11[RETURN[表达式]]ENDPROC功能:将N个过程存储在一个过程文件中(.PRG)。4.过程文件的打开和关闭.在调用过程文件中的过程之前首先要打开过程文件.(1)过程文件的打开.SETPROCEDURETO[过程文件1[,过程文件2,…]][ADDITIVE]功能:打开一个或多个过程文件,一旦一个过程文件被打开,那么该过程文件中的所有过程都可以被调用。(2)过程文件的关闭格式1:SETPROCEDURETO格式2:CLOSEPROCEDURE功能:关闭所有打开的过程文件格式3:RELEASEPROCEDURE[过程文件1[,过程文件2,…]]功能:关闭指定的过程文件5.过程的调用格式1:DO过程名[WITH参数表]格式2:文件名|过程名()说明:12①如果模块是程序文件的正常代码,用文件名,否则用过程名②格式2既可以作为命令使用,也可以函数出现在表达式中。③过程可以嵌套调用。例,格式2的使用SETPROCTOGC…………DO过程1…………SETPROCTO过程1过程2过程3…………DO过程2…………RETURN…………DO过程3…………RETURNTOMASTER……RETURN过程文件GC.PRG主程序SETPROCTOGC…………DO过程1……DO过程2……SETPROCTO&&pp1.prga=3b=5returna+bsettalkoff&&setproceduretopp1?pp1()settalkonprocedurepp1a=3b=5returna+bendpro13例:将求阶乘,求圆面积,输出结果编制成3个过程。合成一个过程文件GC1.PRG6.参数传递采用格式1调用程序时,如果实参是常量或一般形式的表达式,系统会计算出实参的值,并把它们赋值给相应的形参。这种情形称为按值传递。如果实参是变量,那么传递的将不是变量的值,而是变量的地址。这时形参和实参实际上是同CLEARSETTALKOFFPUBLICS,TSETPROCEDURETOGC1INPUT输入圆的半径TORDOPROC1INPUTI=TOIDOPROC2CLOSEPROCEDURESETTALKONCANCELMAN4.PRG*GC1.PRGPROCEDUREPROC1&&求半径为R的圆的面积SS=3.14159*R*R?面积是:,SRETURN*******************PROCEDUREPROC2&&求I!=TN=1T=1DOWHILEN=IT=T*NN=N+1ENDDODOPROC3RETURN********************PROCEDUREPROC3&&显示阶乘结果?I,!=,TRETURNGC1.PRG14一个变量,在模块程序中对形参变量值得改变,同样是对实参变量值得改变。这种情形称为按引用传递。采用格式2调用程序时,默认情况下都是按值传递。如果实参是变量,可以通过setudfparms命令重新设置参数传递的方式。命令格式如下:setudfparmstovalue|reference例按值传递和按引用传递示例ClearStore100tox1,x2Setudfparmstovalue&&设置按值传递P4(x1,(x2))&&x1,(x2)都按值传递?space(8)+X1+space(8)+X2?x1,x2Setudfparmstoreference&&设置按引用传递P4(x1,(x2))&&x1按引用传递,(x2)按值传递?x1,x2Procedurep4Parametersx1,x2Storex1+1tox1Storex2+1tox2Endproc155.4.3自定义函数内部函数:如SUBSTR(C,N1,N2),EOF(),SQRT(N),MESSAGEBOX(信息内容,[,对话框类型[,对话框标题]])等。用户自定义函数:弥补有限的系统提供的内部函数。(1)编制函数格式:[FUNCTION函数名][PARAMETERS形式参数表]语句序列(函数体)RETURN表达式ENDFUNC说明:①PARAMETERS参数语句用来接受调用程序传来的参数,即自变量②函数体是由完成函数功能的一组语句组成。③RETURN后面的表达式为函数的返回值。(2)函数的调用调用方法与系统内部函数的调用方法相同,可以出现在任何一个合法的表达式中。函数名[实际参数表]当函数以独立的文件形式存在时,函数名就是过程名。当函数放在过程文件中时,函数名就是FUNCTION后面16的名字。此种情况调用前必须先打开过程文件。例:&&CF.PRGFUNCTIONCFPARANY=1FORI=1TONY=Y*IENDFORRETUYENDFUNC调用方法:直接在命令窗口调用?CF(5)在程序中调用计算:CLEARINPUTM=TOMINPUTN=TONMN=M-NMC=CF(M)/(CF(N)*CF(MN))?C(M,N)=,MCCANCEL17
本文标题:5.4 子程序、过程与自定义函数
链接地址:https://www.777doc.com/doc-4179476 .html