版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
7.5
程序的模块化模块化程序设计思想子程序、函数、过程内存变量的作用域调用子程序时的数据传递7.5.1
子程序、过程和函数
应用程序一般都是多模块程序,包含多个程序模块。模块是相对独立的一个程序段,他可以被其它模块调用,也可以去调用其他的模块。被其它程序调用的模块称为子程序。调用其它模块而没被其它模块调用的模块称为主程序。子程序、过程、函数。一、子程序定义形式:[PROCEDURE|FUNCTION<子程序名>][PARAMETERS<形参>]<命令序列>
[RETURN[<表达式>]][ENDPROC|ENDFUNC]说明:1、PROCEDURE或FUNCTION命令表示一个子程序的开始,并命名子程序名。通常称PROCEDURE为过程,FUNCTION为自定义函数。如果缺省该命令表明子程序是一个独立的程序文件;若写上该命令,表明子程序通常要放在某程序文件代码后面。独立的子程序文件同样用MODIFYCOMMAND命令来建立、修改和保存,扩展名默认为.PRG。一、子程序定义形式:[PROCEDURE|FUNCTION<子程序名>][PARAMETERS<形参>]<命令序列>
[RETURN[<表达式>]][ENDPROC|ENDFUNC]说明:2、ENDPROC或ENDFUNC表示一个子程序的结束。如果缺省,子程序自动结束于文件结尾或下一条PROCEDURE或FUNCTION命令。3、如果调用子程序时需引用参数,则在子程序的第一行使用PARAMETERS<形参>命令,否则可省略。一、子程序定义形式:[PROCEDURE|FUNCTION<子程序名>][PARAMETERS<形参>]<命令序列>
[RETURN[<表达式>]][ENDPROC|ENDFUNC]说明:4、子程序执行到RETURN命令,控制权转回到上级调用程序。需要返回一个值,则选用RETURN<表达式>命令;使用RETURNTOMASTER转回到最上级主程序;缺省RETURN命令,子程序结束处自动执行一条隐含的RETURN命令;若RETURN命令不带表达式,则返回逻辑真.T.。*main.prgsettalkoffinput"输入x:"toxinput"输入y:"toyz=fun1(x,y)?x,y,zsettalkonreturnfunctionfun1parametersa,bc=a*a-b*breturncendfuncmodifycommandmain*fun2.prgparametersa,bc=a*a-b*breturnc*main.prgsettalkoffinput"输入x:"toxinput"输入y:"toyz=fun2(x,y)?x,y,zsettalkonreturnmodifycommandmainmodifycommandfun2*main.prgsettalkoffinput"输入n:"tons=0dosumwithn?ssettalkonreturnproceduresumparameterssnfork=1tosns=s+kendforendproc*main.prgsettalkoffinput“输入圆半径"tordoareawithrreturn*area.prgparacrs=pi()*cr*cr?cr,sreturnmodifycommandmainmodifycommandareamodifycommandmain二、子程序的调用DO<子程序名>[WITH<实参表>]DO<子程序名>
<子程序名>(实参表)<子程序名>()说明:1、执行子程序,子程序结束后返回到上级调用该子程序命令的下一条命令处。子程序可嵌套调用。2、实参表:指定传递到子程序的参数,实参可以是表达式、内存变量、常量、字段名或用户定义函数等。各参数之间用逗号分隔。传递给一个子程序的参数最多为24个。实参与形参的个数、类型、顺序要匹配。…DOA…主程序…DOB…RETURN子程序A…RETURN子程序B…DOA…主程序…DOB…RETURN子程序A…RETURNTOMASTER子程序B…DOA…主程序…DOB…RETURN子程序A…RETURN……子程序B主程序:z.prgsettalkoffstore2tox1,x2,x3x1=x1+1doz1?x1+x2+x3return子程序:z1.prgx2=x2+1doz2x1=x1+1return子程序:z2.prgx3=x3+1return10主程序:z.prgsettalkoffstore2tox1,x2,x3x1=x1+1doz1?x1+x2+x3return子程序:z1.prgx2=x2+1doz2x1=x1+1return子程序:z2.prgx3=x3+1returntomaster9例建立函数,计算N!functionjc&&自定义jc函数
parametersjcn&&将n的值传给参数jcnf=1&&阶乘初值
fork=1tojcnf=f*k&&计算阶乘,结果存入fendforreturnf&&将f的值返回调用函数
m
例求组合:Cnmodifycommandcmnsettalkoffinput“输入m”tominput“输入n”tonc=jc(m)/(jc(n)*jc(n-m))?csettalkonreturnfunctionjcparametersjcnf=1fork=1tojcnf=f*kendfor
returnf
例创建过程文件,计算1+2+3+….+nproceduresumparameterssn&&将n的值传递给参数snfork=1tosns=s+k&&计算连加和,结果存入sendforreturn&&返回调用程序
*main.prgsettalkoffinput"输入n:"tons=0dosumwithn?ssettalkonreturnproceduresumparameterssnfork=1tosns=s+kendfor
return
SETTALKOFFarea=0CLEARINPUT"请输入第一边大小:"TOxINPUT"请输入第二边大小:"TOyINPUT"请输入第三边大小:"TOz
area=sub(x,y,z)?"Area="+STR(area,6,2)RETURNFUNCTIONsubPARAMETERa,b,cp=(a+b+c)/2s=SQRT(p*(p-a)*(p-b)*(p-c))RETURNs例计算三角形面积SETTALKOFFarea=0CLEARINPUT"请输入第一边大小:"TOxINPUT"请输入第二边大小:"TOyINPUT"请输入第三边大小:"TOz
DOsubWITHx,y,z?"Area="+STR(area,6,2)RETURNPROCEDUREsubPARAMETERa,b,cp=(a+b+c)/2area=SQRT(p*(p-a)*(p-b)*(p-c))
RETURN
7.5.2内存变量的作用域变量的作用域指的是变量在什么范围内是有效或能够被访问的。VisualFoxPro中,分为公共变量、私有变量和局部变量3类。公共变量在任何程序模块中都可使用的变量称为公共变量。公共变量必须先定义后使用。
PUBLIC<内存变量名表>该命令是建立公共的内存变量,并赋以初值逻辑假.F.。建立好的公共变量一直有效,即使程序结束返回命令窗口也不会消失,只有执行CLEARMEMORY,RELEASE或QUIT等命令后,才能被释放。私有变量在程序中直接使用(没有预先声明),而由系统自动隐含建立的变量都是私有变量。私有变量的作用域是建立它的模块及其下属的各层模块。*主程序main.prgr=100DOsub?pRETURN*子程序sub.prgp=2*3.14*rRETURN*主程序main.prgr=100DOsub?pRETURN*子程序sub.prgPUBLICpp=2*3.14*rRETURN628.00当子程序中定义的变量名与主程序中同名时,为避免子程序中的变量值改变主程序中的变量值,可在子程序中使用PRIVATE命令隐藏主程序中可能存在的变量,使这些变量在子程序中暂时无效。
PRIVATE<内存变量表>该命令并不建立内存变量,它只是隐藏指定的在上层模块中可能已经存在的内存变量,但是当模块程序返回到上层模块时,被隐藏的变量就自动恢复有效性,保持原值。隐藏变量*exa.prgr=100p=10dosub?preturnproceduresubp=2*3.14*rreturn*exb.prgr=100p=10dosub?preturnproceduresubprivatepp=2*3.14*rreturn628.0010局部变量局部变量只能在建立它的模块中使用,不能在上层或下层模块中使用。程序结束时,自动释放局部变量。
LOCAL<内存变量表>该变量同样给建立的内存变量赋以初值逻辑假.F.,也必须先定义后使用。7.5.3调用子程序时的数据传递1.利用变量的作用域实现数据传递例计算矩形面积的程序。*main.prg主程序
gao=8kuan=6c=0DOsub?cCANCEL*sub.prg子程序
c=gao*kuanRETURN2.利用参数实现数据传递形参为子程序中的局部变量,这些局部变量可以接收上级程序中实参传递来的参数,也可以回送子程序运行的结果。实参可以是常量、变量或一般表达式,调用模块程序时,形参的数目不能少于实参的数目,当形参数目多于实参数目时,多余的形参取初值逻辑假.F.。*main.prgsettalkoffinput"输入x:"toxinput"输入y:"toyz=fun1(x,y)?x,y,zsettalkonreturnfunctionfun1
parametersa,bc=a*a-b*breturncendfunc
值传递和地址传递(实参与形参之间的数据传递)值传递方式:则子程序中参数变化后的值不回传给上级调用程序。地址传递方式:则子程序中参数变化后的值要回传给上级调用程序如果不允许子程序改变传递参数变量的值,应该使用值传递方式。如果允许子程序改变传递参数变量的值,则要使用地址传递方式。
值传递和地址传递(实参与形参之间的数据传递)常量和表达式只能使用值传递方式内存变量既可以使用值传递方式,又可以使用地址传递方式。使用值传递方式的变量要用括号括起来,使用地址传递方式的变量不加括号。采用子程序名(实参)方式调用时,默认按值传递方式传递参数。例写出下列程序的输出
settalkoffx=1y=3dosubwithx,(y),5?x,yreturnproceduresubparametera,b,ca=a+b+cb=a+b-creturnclear
store3tox
store5toy
dopluswithx,y
?x,y
procedureplus
parametersa1,a2
a1=a1+a2
a2=a1+a2
endproc例写出下列程序的输出dopluswith(x),(y)
plus(x,y)
dopluswith(x,y)错
plusx,y错*主程序:MAIN.PRG
SET
TALK
OFF
CLEAR
S=0
DO
SUB
WITH
10,S
?S
RETU
*子程序SUB.PRG
PARAMETERS
D1,D2
D1=D1+D1
D2=D1*2
RETURN作业与实验1、利用子程序实现
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论