程设5子程序过程变量作用范围参数调用自定义函数精.docx
- 文档编号:11402780
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:19
- 大小:21.38KB
程设5子程序过程变量作用范围参数调用自定义函数精.docx
《程设5子程序过程变量作用范围参数调用自定义函数精.docx》由会员分享,可在线阅读,更多相关《程设5子程序过程变量作用范围参数调用自定义函数精.docx(19页珍藏版)》请在冰豆网上搜索。
程设5子程序过程变量作用范围参数调用自定义函数精
财管29-30学时(VFP程序设计5)
2009-12-
实验10问题:
实验教材P68:
通过口令检查,方可查阅学生信息库(学生.dbf)。
允许输入三次口令,如果三次都输错,则不能进入查询。
ifupper((alltrim(kl)))="ABC"
&&等号后面必须是大写字母,亦可是数字或汉字;不要attrim()函数亦可
settalkoff
n=1
dowhilen<=3
@15,10say"请输入口令!
"
setconsoleoff&&屏蔽向主窗口输入的口令,呈死状属于正常。
accepttokl
setconson
ifupper((alltrim(kl)))="ABC"
&&等号后面必须是大写字母,亦可是数字或汉字;不要attrim()函数亦可
wait"欢迎您查阅学生信息!
"windownowait
&&windownowait:
window使"欢迎"显示在提示窗口中;nowait使不需要再按回车键即执行下行命令。
clea
usexs
brow
&&use
return
else
ifn<3
wait"请再输入一次!
"window&&在提示窗口显示此信息。
else
wait"非法用户!
"windownowait
cancel&&终止程序
endif
endif
n=n+1
enddo
settalkon
主要内容:
子程序,过程,变量作用范围,参数调用,自定义函数
基本概念:
模块化程序设计
在程序设计中,通常使用模块化设计方法。
整个系统划分为主控模块下的若干模块,每个模块是相对独立的程序段。
主控模块又叫主程序,其它模块有子程序、过程和自定义函数。
其意义有两点:
主程序干净,效率高;子程序便于修改。
第一部分:
子程序调用(教材P182)
一、子程序:
是一个相对独立的程序,能够独立地完成一项任务
子程序的建立:
与普通程序相同。
子程序的最后一条语句必须是:
return。
表示返回上一级程序。
如果是returntomaster,则是返回到主程序。
上级程序对子程序的调用:
DO子程序文件名 with参数。
A主程序.prg
settalkoff
clear
doB
doC
doC
settalkon
return
程序无法执行,因为没有子程序。
以下同时打开几个程序文档窗口书写:
B.prg
note//子程序1,此可有清屏命令clear
settalkoff
clear
@1,1say"同学们,今天是星期五,大家辛苦了!
"
settalkon
return
C.prg
note//子程序2,此不可有清屏命令,否则,将子程序1的内容清除,看不到多个子程序的效果
settalkoff
&&clear
@2,1say"再辛苦,我们也要一块共同努力!
"
settalkon
return
程序流程是:
执行主程序/依次执行子程序,且每个子程序均有return
如果子程序2、3有清屏命令,则主窗口只有最后一个子程序的输出结果。
二、主程序、子程序写在一个程序中的写法
主程序调用子程序.prg
note//主程序调用子程序,教材P182
settalkoff
clear
doB
doC
settalkon
return
procedureB
@1,1say"同学们,今天是星期五,大家辛苦了!
"
return
procedureC
@2,1say"再辛苦,我们也要一块共同努力!
"
return
子程序的作用:
①节省语句。
如果子程序3块有3000句,而主程序调用只3句即可,调用越多,则主程序的语句量就越节省、简洁。
②容易修改:
哪个子程序需要修改,就修改哪个。
第二部分过程与过程文件(教材P190)
将一个功能相对独立的程序段取个名字,并进行标识,就是一个过程,将若干个过程集成在一个命令文件中,成为一个独立的文件,就是过程文件。
过程:
procedure过程名…….endprocedure
过程文件:
将许多个过程放在一个文件中,其本身是一个命令文件,有文件名。
过程的使用:
①在主程序中使用过程:
do过程名
②在主程序中要打开过程文件setprocedureto过程文件名
例题:
教材P191ex36.prg
求素数
求三角形面积:
公式=(底*高)/2
A主程序.PRG
note//教材P191主程序,调用过程文件的过程求素数和三角形面积
settalkoff
clear
setproceduretoB
&&打开过程文件名,其中有求素数的过程ss,和求三角形面积的过程mj
input"m="tom
doss&&素数过程名,因变量名相同,因此不需要参数传递
s=0&&面积
input"A边长为:
"toA1
input"B边长为:
"toA2
input"C边长为:
"toA3
domjwithA1,A2,A3,S
?
"三角形面积=",S
setprocedureto&&关闭过程文件
settalkon
return
过程文件B.PRG
note//教材P191过程文件,内有过程SS求素数,MJ求三角形面积
proceduress&&测验素数的过程
n=2
dowhilen ifmod(m,n)=0 exit else n=n+1 endif enddo ifn>=m ? m,"为素数。 " else ? m,"不是素数。 " endif return &&endpro proceduremj&&计算三角形面积的过程 parametersb1,b2,b3,s&&承接主程序的四个参数 ifb1+b2>b3andb1+b3>b2andb2+b3>b1 b=(b1+b2+b3)/2 s=sqrt(b*(b-b1)*(b-b2)*(b-b3)) endif endpro&&不能完整地写endprocedure 第三部分: 参数传递 注意: 子程序规范写法是首句就是parameter形参名。 不用parameter,且首句仍是settalkoff的情况是: 1、子程序未改变量名,是同名x;2、主程序do子程序名之后未用with实参的子句。 例如: P182变量及参数传递例6-29.prg 一、教材P182,例6-29 A.prg note//教材P182变量传递及参数传递主程序: 计算S=1! +3! +5! +9! 的和 settalkoff clear s=0 form=1to9step2 x=m&&将循环变量值M赋给X,以便传给子程序 doB&&或doCWITHX &&如果要使用参数传递方式,则需要建立C子程序, &&并将此句改为doCwithx s=s+x &&接受子程序的和值,即X值。 &&然后再将X给主程序循环头重新赋值,再传给子程序 endfor ? "s=",s&&368047 settalkon return 变量传递子程序B.prg: settalkoff clear t=1 forf=1tox t=t*f endfor x=t settalkon return 参数传递子程序C.prg: parametersq&&接受主程序的变量X,转为q t=1 forf=1toq&&q值由主程序的x传来 t=t*f&&1到x的阶乘 endfor q=t &&本子程序执行完毕后,将和值T赋给参数q,经return传给 &&主程序X,X的阶乘值在主程序的S和值中汇总 settalkon return 要点: ①主程序格式do子程序名with参数;子程序首句即parameters新参数名 ②子程序的结果要返给新参数名,再经return回给主程序的原参数名。 二、多个参数的传递(例圆面积,周长。 涉及到半径) 多参数传递圆面积周长.prg note//多参数列表传递教材P186: 求圆面积、周长 settalkoff clear input"请输入半径值: "tobj mj=0 zc=0 doymjwithbj,mj,zc&&三个实参,将传给子程序的三个形参 ? "圆面积是: ",mj ? "周长是: ",zc settalkon return procedureymj parametersr,s,c&&三个形参r,s,c依次分别接受主程序的三个实参bj,mj,zc, &&运行结束后,r,s,c再依次回传给bj,mj,zc s=pi()*r*r c=2*pi()*r return 第四部分变量的作用域(教材P183) 一、全局变量、私有变量和本地变量的定义与赋值 ◆全局变量: 用Public定义后能在各级程序段中始终有效的变量。 在命令窗口定义的变量都是全局变量,如a=5。 执行程序后显示“5” settalkoff clear ? a settalkon ◆私有变量: 直接使用的变量,或用private定义的变量。 私有变量只能在说明它的程序或过程中、或被它调用的下级模块中才有效。 ◆本地变量(局部变量): 用Local定义后只能在建立它的模块中使用,不能在上层或下层模块中使用,当模块程序运行结束,其自动释放。 Public、Local、Private只能声明变量的作用范围,并不能建立该变量,即不能给该变量赋值。 二、全局变量、私有变量和本地变量的作用域 注意1: 私有变量可以隐藏主程序的同名变量和全局变量,不会改变主程序同名变量的值,在私有变量模块运行结束后,返回上级程序,则上级程序的同名变量自动恢复。 本地变量local亦可以隐藏上级模块的同名全局变量和同名私有变量。 注意2: 三、程序运行结束后,尚存在的变量 各级程序模块运行结束后,只有被Public定义的变量值尚在内存中,私有变量、本地变量和主程序定义的普通变量均被释放。 例: 主程序定义的普通变量A在程序运行结束后即不存在。 settalkoff a=5 publicb b=4 settalkon 在命令窗口键入如下命令: listmemolike*&&只见到B ? a&&“找不到变量A” ? b&&“4” 例1说明如下问题: ①全局变量(或主程序变量)与私有变量、本地变量的传递、屏蔽; ②主程序普通变量、public变量和private变量可调用下一级程序未被屏蔽的变量(即普通变量)。 ③程序运行结束后仍存于内存中的变量只有全局变量。 主程序A note//主程序A和两个子程序B、C,说明变量的传递与屏蔽,主程序变量和private变量可传到下级,而local定义的变量不能传到子程序。 settalkoff clear publicx,y,z &&将此句隐藏亦可,x、y、z、w的值作为普通变量仍可向下传递, &&或被下级程序的私有、本地变量隐藏,但程序运行结束后, &&不再是内存变量。 而若用全局变量定义后,则在程序结束后仍在内存中。 x=10 &&主程序公有变量(或主程序变量)可以调用下级程序, &&结果为25+100+100=225 y=20&&被子程序private和孙程序local再定义,其值不变, &&程序结束后,仍是20 z=30 w=40&&程序结束后,如果w前被定义为public变量,则其值 &&为运行最终结果;如未被定义为公共变量,则"找不到w变量" doB ? x,y,z,w &&如果子程序的private未定义w而孙程序local定义了w, &&则w值为40;若孙程序local未定义w,则w值为60。 settalkon return B子程序 settalkoff clear privatey,w &&将主程序的y,w隐藏,不改变主程序的y,w值,否则, &&将改变主程序的y,w值,可取消w示例变化。 x=x+100&&因主程序调用本程序,且主程序对x已赋值,故此句成立 y=200 w=40 doC &&如果下级程序的local未定义w,则可调下级程序的w值, &&说明private定义的变量可以在本级和下级程序中有效。 ? x,y,z,w &&z是主程序先赋值的变量,照显示,如果子程序的local定义 &&了w,则w值为50;若子程序local未定义w,则w值为40。 settalkon return 子程序C settalkoff clear localy,w &&将上级程序的y,w隐藏,不改变上级程序的y,w值, &&否则,将改变上级程序的y,w值,可取消y,w示例变化。 y=50 x=x+100 w=60 &&doB &&用此句,并取消"B子程序"的"doC"句及private &&w,运行本程序,结果本w值仍为60,说明local不能调用下级程序。 ? x,y,z,w &&z是主程序先赋值的变量,照显示; &&local定义的w值只能是自己的值60。 settalkon return &&取消localy,则上级程序的y值将为本级的20,取消localw,上级程序的w值为本级程序的60。 结果是(注意: 以下结果是在运行A程序产生的): 210503060&&第一行是C程序的结果 2102003050&&第二行是B程序的结果 210203040&&第二行是A主程序的结果 程序运行结束后,在命令窗口键入: listmemolike* 只存在着A程序的X、Y、Z三个全局变量。 包括A程序的普通变量W和C程序与B程序的私有变量与本地变量均不存在。 第五部分自定义函数(教材P187) 系统函数: sqrt(85) 自定义函数两种: 独立函数和依附函数。 系统中没有阶乘函数。 定义: function函数名…..endfunction 使用: 在主程序中写入: 函数名(实在参数表) 1、独立函数例: 自定义阶乘函数 阶乘主程序.prg note//阶乘主程序,调用自定义函数: 阶乘自定义函数 settalkoff clear input"请输入阶乘的原数: "tom ? JC(m) settalkon return JC.prg&&独立函数: 是一个程序文件 note//阶乘自定义函数 parametersx p=1 fori=1tox p=p*i endfor returnp&&返回函数值 依附函数例: 亦可在一个程序中用function写为依附函数(亦可是独立文件) note//阶乘主程序,调用自定义函数: 阶乘自定义函数 settalkoff clear input"请输入阶乘的原数: "tom ? jc(m) settalkon return functionjc&&可将下段程序单独写为jc.prg parametersx p=1 fori=1tox p=p*i endfor returnp endfun 在命令窗口可以使用: ? 阶乘自定义函数(15)且重新开机,只要是默认路径,就可以使用. 补充内容: 例2变量域主程序.prg settalkoff clear publicx privatey localz x=100 y=200&&如果将y屏蔽,则亦“找不到变量y” z=300 do例2变量域子程序 settalkon return 例2变量域子程序.prg settalkoff clear ? x&&100 ? y&&200 ? z&&"找不到变量z" settalkon return 例2说明两个问题: ①Public、Private定义的变量可向下传递,而Local变量只能在本程序使用,不能向下级程序传递。 ②Public、Private、Local只能声明变量的作用范围,并不能建立该变量,即不能给该变量赋值。 例、参数传递求组合.prg note//求C下角m上角n的组合数,即总为M个数,n个数一组,共有多少组(不论顺序,而排列是Amn,讲究顺序),调用子程序,参数传递。 note//求组合的公式是: m! /(n! *(m-n)! ) settalkoff clear input"请输入总数: "tom input"请输入每一组数: "ton publicp dojcwithm s=p dojcwithn s=s/p dojcwithm-n s=s/p ? "在",m,"个数中,按",n,"为一组,共有",s,"种组合。 " &&5之3,有10种组合: 123,124,125,134,135,145,234,235,245,345 settalkon return procedurejc &&计算子程序,亦可另外再建jc子程序, 但首句就要是parameters,且以下照抄。 parametersq&&依次接受m、n、m-n,作为循环终值,计算阶乘。 p=1 fori=1toq p=p*i endfor settalkon return&&回到调用点,并将返回全局变量P值。 或另立子程序jc.prg &&settalkoff &&clear parameterq&&依次接受m、n、m-n,作为循环终值,计算阶乘。 p=1 fori=1toq p=p*i endfor settalkon return&&回到调用点,并将返回全局变量P值 形象比喻: A爷B爸C孙 私有变量: 在B、C中有效,在A中无效; 本地变量: 仅在B中有效,在A、C中均无效。 备注: 本教案的例证程序文字见“国贸程序设计5”,程序见国贸总程序库。 本教案为方便教学重新改写了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 子程序 过程 变量 作用 范围 参数 调用 自定义 函数
![提示](https://static.bdocx.com/images/bang_tan.gif)