VFP6-子程序与函数1.ppt
《VFP6-子程序与函数1.ppt》由会员分享,可在线阅读,更多相关《VFP6-子程序与函数1.ppt(43页珍藏版)》请在冰点文库上搜索。
数据库应用(VFP6.0),J,CompanyLogo,第二节子程序与参数传递,什么叫子程序、过程和函数?
为什么需要建立?
如何建立?
参数是怎么样传递?
利用参数的内存变量属性在子程序、过程和函数之间传递,为什么建立子程序、过程、函数?
求M!
+N!
J,CompanyLogo,&求m!
+n!
S1=1FORI=1TOMS1=S1*IENDFORS2=1FORJ=1TONS2=S2*JENDFOR?
S1+S2,太多重复代码!
&求m!
+n!
S1=F(M)S2=F(N)?
S1+S2,S=1FORI=1TOXS=S*IENDFOR,子程序、过程、函数!
主要内容,子程序定义调用与返回过程定义建立、调用函数定义建立、调用参数传递及作用域,子程序的基本概念,定义子程序是相对于主程序而言的一个独立的程序文件,其建立方法与建立程序文件的方法相同,扩展名为.PRG。
调用与返回调用:
DOWITH返回:
RETURNTOMASTERNotice:
子程序执行时直到遇到以下情况时,自动结束返回:
RETURN、RETRY、CANCEL、QUIT和子程序的末尾,J,CompanyLogo,主、子程序的调用关系,递接调用关系,跨接调用关系,J,CompanyLogo,DEMO-书P163-图4.16-4.17,Returntomaster,4.2.1子程序,例题:
例1:
求三个数中的最大数。
(子程序例题1.PRG),分析:
本题由主程序子程序例题1.PRG与子程序SUB1.PRG组成。
(1)子程序SUB1.PRG功能:
求两个数中较大者。
入口条件:
变量N1与N2中存放待比较的两个数。
出口状态:
变量R中存放比较结果(较大者)。
(2)主程序(子程序例题1.PRG)从键盘输入任意三个数X1、X2、X3;调用SUB1.PRG求出X1、X2中较大者,第二次再调用SUB1.PRG将此结果与X3比较,即取得最大数。
4.2.1子程序,主程序代码:
*求三个数中的最大数SETTALKOFFINPUT请输入第一个数:
TOX1INPUT请输入第二个数:
TOX2INPUT请输入第三个数:
TOX3N1=X1N2=X2R=0DOSUB1N1=RN2=X3DOSUB1?
最大数为:
RSETTALKON,子程序SUB1.PRG:
*求两个数中的最大数IFN1N2R=N1ELSER=N2ENDIFRETURN,这里使用了自然属性变量实现,因此变量N1、N2、R必须在主程序里定义并置初始值。
4.2.1子程序,例2:
求3200间的素数。
(子程序例题2.PRG),分析:
此题通过主子程序来实现,主程序通过循环逐一取3200间的奇数存入变量M,然后调用子程序SUB2.PRG,子程序则判定主程序传送来的M值是否为素数,若是则将该素数显示出来,否则直接返回主程序。
4.2.1子程序,主程序代码:
*求3200间的素数SETTALKOFFCLEARM=3DOWHILEM200I=2DOSUB2M=M+2ENDDOSETTALKON,子程序SUB2.PRG:
*判M是否素数DOWHILEI=M-1IFINT(M/I)=M/IRETURNENDIFI=I+1ENDDO?
MRETURN,这里使用了使用自然属性变量实现,因此I必须在主程序里定义并置初始值。
过程-定义,1.过程与过程文件的定义过程是一个由PROCEDURE开头,ENDPROC结尾的子程序段。
过程可以将实现相对独立功能的常用代码集中在一起,供应用程序在需要时调用。
过程文件:
是由若干个过程构成的文件。
PROCEDUREENDPROC注意:
(1)过程必须存放在一个过程文件中。
(2)不能把可执行的主程序代码放在过程之后。
子程序存在的问题:
系统打开的文件个数太多;调用子程序读磁盘的查找速度慢。
过程的建立与调用,二、过程文件的建立过程文件建立方法有两种:
与程序文件的创建方法相同,将过程文件的内容一行一行地输入。
通过将分散的子程序加入项目管理器,再利用工具自动连编生成扩展名为APP或EXE的文件。
三、过程文件的调用打开:
SETPROCEDURETO关闭:
SETPROCEDURETO或CLOSEPROCEDURE调用:
DOWITH注意:
调用过程文件之前必须要打开过程文件。
调用结束后要关闭。
DEMO,P164例题4.20,settalkoffclea?
同学们!
dop2?
晚上好!
settalkon,procp2?
早上好!
dop3?
下午好!
endproc,procp3?
中午好!
endproc,J,CompanyLogo,参数传递与作用域,主程序与子程序之间或过程与过程之间通过互相传递参数来完成整体上的操作(两种方式)1利用内存变量的作用域属性2利用DOWITH,1.利用内存变量属性传递参数,利用内存变量属性传递参数,定义格式作用范围传递方向变量寿命,自然属性,含义是指在程序(.PRG)中出现的没有特别声明而只是通过赋值或数组定义的变量。
特点定义格式:
STORE/=、DIMENSION、DECLARE、INPUT、SUM等。
作用范围:
该程序及其调用的下属子程序。
传递方向:
单向。
变量寿命:
所在程序运行结束后,该变量被自动删除。
自然属性P165例题T4.21,自然属性变量变化说明,自然属性变量的特点,在一个程序段里不能显示(使用LIST命令)在子程序里定义的自然属性的变量,也就是说,在子程序里定义的自然属性变量对父程序是不可见的。
(这是因为自然属性变量当所在的程序运行完毕后,被自动删除了)在子程序里可以修改父程序里定义的自然属性变量的类型和数值。
公用属性,含义是指能在所有的程序中使用,并通过这种方式共享的内存变量。
公用属性的内存变量必须先特别声明和定义后方能使用。
公用属性的内存变量特点定义格式:
PUBLIC作用范围:
整个系统的所有程序。
传递方向:
双向(主程序子程序)变量寿命:
程序运行结束后,内存中仍然保存该变量。
公有属性PublicP167例题T4.22,公有属性Public变量变化DEMO,从程序的运行结果理解公用属性变量的特点:
在在一个程序段里可以显示(使用LIST命令)在子程序里定义的公用属性的变量,也就是说,在子程序里定义的公用属性变量对父程序是可见的。
在子程序里可以修改父程序里定义的公用属性变量的类型和数值,在父程序里也可以修改子程序里定义的公用属性变量的类型和数值。
私有属性Private,私有属性的内存变量含义:
是指具有既类似自然属性又能屏蔽上级同名内存变量属性的内存变量。
私有属性的内存变量也必须先特别声明后方能使用。
私有属性的内存变量特点定义格式:
PRIVATE/ALLLIKE/EXCEPT作用范围:
该程序及其调用的下属子程序。
类似自然属性传递方向:
单向(主程序子程序)。
类似自然属性变量寿命:
程序运行结束后,该变量被自动删除。
特殊作用:
可屏蔽(隐藏)上级(主)程序中与当前程序同名的变量,即对当前程序中变量的操作,不影响上级(主)程序中与当前程序同名的变量值。
私有属性PrivateP169例题T4.23,私有属性Private变量变化DEMO,本地属性Local,本地属性的内存变量含义:
是指具有既类似私有属性又不影响下属子程序中同名内存变量属性的内存变量。
本地属性的内存变量必须先特别定义后方能使用。
本地属性的内存变量特点定义格式:
LOCAL作用范围:
该程序本身。
传递方向:
无。
变量寿命:
程序运行结束后,该变量被自动删除。
特殊作用:
可屏蔽(隐藏)上级(主)程序中与当前程序同名的变量,即对当前程序中变量的操作,不影响上级(主)程序中与当前程序同名的变量值。
同时也不受下属子程序中同名内存变量值的影响。
本地属性Local例题P171T4.24,本地属性Local变量变化范围,内存变量四种作用域属性比较,2.利用DOWITH传递参数,优点:
在不受变量名限制的情况下能达到传递参数的目的。
传递参数:
DOWITH接收参数:
PARAMETERS注:
上述两个命令必须配对使用,不能单独使用。
PARAMETERS命令中的必须以内存变量的形式出现,其中的个数和位置与对应的DOWITH命令中中的参数个数和位置相一致,都用逗号分隔。
规则传递参数命令在调用子程序处;接受参数命令在子程序第一行传递方式:
引用:
传递参数被隐含起来,但其值随着被调用程序中接受参数的变化而变化()传值:
表达式列表或单个内存变量用圆括号,参数传递为传值方式。
即传递参数不被隐含,其值也不随着被调用程序中接受参数的变化而变化,利用DOWITH传递参数,例1:
引用方式传递参数。
利用DOWITH传递参数,例2传值方式传递参数。
利用DOWITH传递参数,参数引用方式与传值方式比较,eg_26:
用过程实现求N!
引用!
自定义函数,
(1)定义:
是一个子程序(.PRG),它可以返回一个值到调用程序。
(2)建立:
与一般的命令文件的建立方法相同。
自定义函数在过程文件中的存在形式为:
FUNCTION自定义函数名语句序列ENDFUNC(3)特点在自定义函数程序中首条命令一般为(如果没有参数传送可略):
PARAMETERS在自定义函数程序中尾条命令必须为:
RETURN,自定义函数的定义及调用,完整的定义格式自定义函数调用与参数传递调用:
参数传递:
默认为传值。
DEMO-例题,P175-例题4.27自定义函数判断是否是偶数?
P176-例题4.28-4.29自定义函数求三角形面积,settalkoffcleainputn=ton?
jos(n)settalkonfunctionjosparaxifx%2=0return.t.elsereturn.f.endifendfunc,functiontareaparaa,b,cif(a+b)cand(a+c)band(b+c)as=(a+b+c)/2mj=sqrt(s*(s-a)*(s-b)*(s-c)elsemj=0endifreturnmj,函数与过程的区别,自定义函数必须返回一个值,分别用函数和过程求n!
上机练习题,通过调用子程序编程从(A,B,C),(D,E,F),(G,H,I)三组数中分别挑出最大数,然后相乘。
分别用变量作用域、过程、函数求下列表达式求S=A!
+B!
+C!
。
其中A、B、C均由键盘输入。
(用函数方式实现)求S=K!
+(K+1)!
+M!
,其中K和M由键盘输入,且Km(用函数实现),ThankYou!