1、模块化程序设计p利用子程序p利用过程过程p利用函数过程过程do adddo subPROCEDURE add c=1+2?cENDPROCPROCEDURE subc=1-2?cENDPROC程序1.prg。add( )sub( )过程过程do add with 1,2do sub with 1,2PROCEDURE add Parameters x,yc=x+y?cENDPROCPROCEDURE sub Parameters x,yc=x-y?cENDPROC程序1.prg。add(1,2)sub(1,2)过程传参过程传参do sub1do sub2PROCEDURE sub1 d=2*3
2、.14*3?dENDPROCPROCEDURE sub2s=3.14*3*3?sENDPROC程序1.prg。sub1( )sub2( )do sub1 或sub1( )Procedure sub1 d=2*3.14*3 ?dEndproc带参数的过程及其调用带参数的过程及其调用Procedure sub1 d=2*3.14*r ?dEndproc缺点:固定数据缺点:固定数据Parameters rdo sub1 with 5 或sub1(5)a=6do sub1 with a 或sub1(a)do sub1 with a+2 或sub1(a+2)实参实参形参形参优点:可变数据优点:可变数据P
3、rocedure subParameters x,y,z EndprocDo sub with a,b,cDo sub with a,bDo sub with a,b,c,d传参注意事项1(参数个数问题)实参个数要小于等于形参个数。x=a y=b z=cX=a y=b z=.F.出错Procedure subParameters x s=3.14*x*2 ? sEndprocDo sub with 5Do sub with 5Do sub with .T.Do sub with 2007-05-06传参注意事项2(参数类型问题)实参与形参类型要一致*传参注意事项3(传递方式问题,非常重要)两种
4、传递方式:按值和按引用(地址)a=1Do sub with (a)Procedure sub Parameters x x=2Endpro按值传递:a=1Do sub with aProcedure sub Parameters x x=2Endpro按值引用传递:说明:也可以理解为,按说明:也可以理解为,按“引用引用”传递时,实参跟着对应的形参变化。传递时,实参跟着对应的形参变化。什么时候按值传?什么时候按引用传?什么时候按值传?什么时候按引用传?(需要考察实参类型和调用方式)(需要考察实参类型和调用方式) DODO 过程名过程名 WITH WITH 内存变量内存变量, ,常量常量, ,表达
5、式表达式内存变量: a x abc x2 和 面积 常量:2 “abc” 2005-6-12 .t. 表达式:(a)(a) a+3 val(“8”) 2+6 引用引用值值例如: do mysub with a,2,5,a+2,xyz,trim(a)过程名过程名( (内存变量内存变量, ,常量常量, ,表达式表达式) )SET UDFPARMS TO REFERENCESET UDFPARMS TO REFERENCESET UDFPARMS TO VALUE SET UDFPARMS TO VALUE 或默认或默认引用引用值值例: mysub(5,a,a+2)set udfparms to r
6、eferencea 强制按引用传递按引用传递的2种情况: “DODO 过程名过程名 WITH WITH 内存变量内存变量” 执行过“SET UDFPARMS TO REFERENCESET UDFPARMS TO REFERENCE”的“过程名过程名( (内存变量内存变量) )” Do sub1 with 2Do sub1 with aDo sub1 with b+1,(b)DO sub1 WITH 2,x*2,c Do sub1 with asc(a)test(a,2,c+1)SET UDFPARMS TO REFERENCEtest(a,(b),c+1)SET UDFPARMS TO VA
7、LUEtest(a,b,c+1) a=2b=3c=5DO test WITH a,b,c+1 ?a,b,cSET UDFPARMS TO VALUEtest(a,b,c+1) ?a,b,cSET UDFPARMS TO REFERENCEtest(a,(b),c+1) ?a,b,cPROCEDURE testPARAMETERS x,y,zx=x+1y=y+1z=z+1RETURN传参例题传参例题 “DODO 过程名过程名 WITH WITH 内存变量内存变量” 执行过“SET UDFPARMS TO SET UDFPARMS TO REFERENCEREFERENCE”的“过程名过程名( (
8、内存变量内存变量) )” store 1 to a,b,cDO sub1 WITH 2,a,(b),c*2?a,b,csub2(b,2)?a,b,cset udfparms to referencesub2(b),c)?a,b,cPROCEDURE sub1PARAMETERS x,y,z,kx=x+2y=y+3z=z+4k=k+5RETURNPROCEDURE sub2PARAMETERS x,yx=x*2y=y*3RETURN传参练习传参练习系统函数与自定义函数系统函数与自定义函数v系统函数为VF系统已经定义好的函数例如:Max(2,3,5)Str(23)Ltrim( ab c)Year(
9、date()v系统函数有限,当需要特殊的函数时,需要自己定义。即自定义函数。例如: 求阶层的函数, jc(10) = 10! 自定义函数自定义函数v定义自定义函数v调用自定义函数【格式格式】FUNCTIONFUNCTION PARAMETERS PARAMETERS RETURN RETURN 【说明】pRETURN使自定义函数返回到上一层程序(或命令窗口)pRETURN命令返回表达式的值,表达式的值即为函数的返回值p如果RETURN命令后不带,则返回逻辑真.T.【格式】函数名() FUNCTIONFUNCTION abc abc PARAMETERS x,y PARAMETERS x,y z=x+y z=x+yRETURN zRETURN z例如:p =abc(2,3)?p