计算机教研室数据库应用(VFP6.0)jmxy.zjgsu.edu.cnJmxy.zjgsu.edu.cnCompanyLogo第四章程序设计控制结构程序设计基本结构1子程序与参数传递2综合程序设计3第二节子程序与参数传递第四章程序设计控制结构Jmxy.zjgsu.edu.cnCompanyLogoJmxy.zjgsu.edu.cnCompanyLogo关键问题什么叫子程序、过程和函数?为什么需要建立?如何建立?参数是怎么样传递?利用参数的内存变量属性在子程序、过程和函数之间传递为什么建立子程序、过程、函数?求M!+N!Jmxy.zjgsu.edu.cnCompanyLogo&&求m!+n!INPUT'M='TOMINPUT'N='TONS1=1FORI=1TOMS1=S1*IENDFORS2=1FORJ=1TONS2=S2*JENDFOR?S1+S2太多重复代码!!&&求m!+n!S1=F(M)S2=F(N)?S1+S2S=1FORI=1TOXS=S*IENDFORRETURNS子程序、过程、函数!主要内容子程序定义调用与返回过程定义建立、调用函数定义建立、调用参数传递及作用域子程序的基本概念定义子程序是相对于主程序而言的一个独立的程序文件,其建立方法与建立程序文件的方法相同,扩展名为.PRG。调用与返回调用:DO文件名[WITH参数列表]返回:RETURN[TOMASTER][表达式]Notice:子程序执行时直到遇到以下情况时,自动结束返回:RETURN、RETRY、CANCEL、QUIT和子程序的末尾Jmxy.zjgsu.edu.cnCompanyLogo主、子程序的调用关系递接调用关系跨接调用关系Jmxy.zjgsu.edu.cnCompanyLogo***P1.PRG……DOP2……RETURN***P2.PRG……DOP3……RETURN***P3.PRG……………RETURN***P1.PRG……DOP2……RETURN***P2.PRG……DOP3……RETURN***P3.PRG……………RETURNDEMO-书P163-图4.16-4.17Returntomaster向子程序传递信息----参数在实际的编写软件的过程中我们经常会遇到这样的事情,子程序的某些地方要随着不同的情况要灵活的改变。“参数”简单的说就是我们要向子程序传递的信息。它即可以是一个字符串,也可以是一个整数,也可以是其他类型的数据。利用DO…WITH…传递参数优点:在不受变量名限制的情况下能达到传递参数的目的。传递参数:DO文件名WITH传递参数列表接收参数:PARAMETERS接收参数列表规则传递参数命令在调用子程序处;接受参数命令在子程序第一行传递方式:传递参数接收参数对应位置小心!要强调的是传递参数和接收的个数必须一致。(就好比有两个小孩,而只分配给他们一个苹果,不打架才怪);其次是二者的顺序必须一致,最后二者对应参数的类型必须一致。否则的话。。。。。。。程序出错啦。子程序方法求M!+N!求M!+N!Jmxy.zjgsu.edu.cnCompanyLogo&&求m!+n!INPUT'M='TOMINPUT'N='TONS1=1FORI=1TOMS1=S1*IENDFORS2=1FORJ=1TONS2=S2*JENDFOR?S1+S2&&求m!+n!INPUT'M='TOMINPUT'N='TONDOFWITHMDOFWITHN?M+N&&F.PRGPARAXS=1FORI=1TOXS=S*IENDFORX=S子程序Jmxy.zjgsu.edu.cnCompanyLogo参数传递与作用域(P165)内存变量作用域参数传递DO…WITH…主程序与子程序之间或过程与过程之间:信息怎样由子程序传递到主程序?----参数子程序、过程利用参数。自定义函数利用返回值或参数。例:m!+n!+(m-n)!过程-定义1.过程与过程文件的定义过程是一个由PROCEDURE过程名开头,ENDPROC结尾的子程序段。过程可以将实现相对独立功能的常用代码集中在一起,供应用程序在需要时调用。过程文件:是由若干个过程构成的文件。PROCEDURE过程名[语句序列]ENDPROC注意:(1)过程必须存放在一个过程文件中。(2)不能把可执行的主程序代码放在过程之后。过程的建立与调用二、过程文件的建立•过程文件建立方法有两种:•与程序文件的创建方法相同,将过程文件的内容一行一行地输入。•通过将分散的子程序加入项目管理器,再利用工具自动连编生成扩展名为APP或EXE的文件。三、过程文件的调用调用:DO过程文件名[WITH参数表达式列表]注意:调用过程文件之前必须要打开过程文件。调用结束后要关闭。DEMOP164例题4.20settalkoffclea?同学们!dop2?晚上好!settalkonprocp2?早上好!dop3?下午好!endprocprocp3?中午好!endproc过程方法求M!+N!求M!+N!Jmxy.zjgsu.edu.cnCompanyLogo&&求m!+n!INPUT'M='TOMINPUT'N='TONS1=1FORI=1TOMS1=S1*IENDFORS2=1FORJ=1TONS2=S2*JENDFOR?S1+S2&&求m!+n!INPUT'M='TOMINPUT'N='TONDOFWITHMDOFWITHN?M+NPROCFPARAXS=1FORI=1TOXS=S*IENDFORX=S过程过程方法求M!+N!(另一种方法)求M!+N!Jmxy.zjgsu.edu.cnCompanyLogo&&求m!+n!INPUT'M='TOMINPUT'N='TONS1=1FORI=1TOMS1=S1*IENDFORS2=1FORJ=1TONS2=S2*JENDFOR?S1+S2&&求m!+n!INPUT'M='TOMINPUT'N='TONY=0X=MDOFM=YX=NDOFN=Y?M+NPROCFS=1FORI=1TOXS=S*IENDFORY=S过程Jmxy.zjgsu.edu.cnCompanyLogo参数传递与作用域内存变量作用域参数传递DO…WITH…主程序与子程序之间或过程与过程之间:1.利用内存变量属性传递参数利用内存变量属性传递参数变量寿命传递方向作用范围定义格式本地属性私有属性自然属性公共属性自然属性含义是指在程序(.PRG)中出现的没有特别声明而只是通过赋值或数组定义的变量。特点定义格式:STORE/=、DIMENSION、DECLARE、INPUT、SUM等。作用范围:该程序及其调用的下属子程序。传递方向:单向。变量寿命:所在程序运行结束后,该变量被自动删除。自然属性P165例题T4.21自然属性变量变化说明公用属性含义是指能在所有的程序中使用,并通过这种方式共享的内存变量。公用属性的内存变量必须先特别声明和定义后方能使用。公用属性的内存变量特点定义格式:PUBLIC内存变量列表作用范围:整个系统的所有程序。传递方向:双向(主程序<——>子程序)变量寿命:程序运行结束后,内存中仍然保存该变量。公有属性PublicP167例题T4.22公有属性Public变量变化DEMO私有属性Private私有属性的内存变量含义:是指具有既类似自然属性又能屏蔽上级同名内存变量属性的内存变量。私有属性的内存变量也必须先特别声明后方能使用。私有属性的内存变量特点定义格式:PRIVATE内存变量列表/ALL[LIKE/EXCEPT通配符]作用范围:该程序及其调用的下属子程序。类似自然属性传递方向:单向(主程序——〉子程序)。类似自然属性变量寿命:程序运行结束后,该变量被自动删除。特殊作用:可屏蔽(隐藏)上级(主)程序中与当前程序同名的变量,即对当前程序中变量的操作,不影响上级(主)程序中与当前程序同名的变量值。私有属性PrivateP169例题T4.23私有属性Private变量变化DEMO本地属性Local本地属性的内存变量含义:是指具有既类似私有属性又不影响下属子程序中同名内存变量属性的内存变量。本地属性的内存变量必须先特别定义后方能使用。本地属性的内存变量特点定义格式:LOCAL内存变量列表]作用范围:该程序本身。传递方向:无。变量寿命:程序运行结束后,该变量被自动删除。特殊作用:可屏蔽(隐藏)上级(主)程序中与当前程序同名的变量,即对当前程序中变量的操作,不影响上级(主)程序中与当前程序同名的变量值。同时也不受下属子程序中同名内存变量值的影响。本地属性Local例题P171T4.24本地属性Local变量变化范围A={^03/12/04}内存变量四种作用域属性比较2.利用DO…WITH…传递参数优点:在不受变量名限制的情况下能达到传递参数的目的。传递参数:DO文件名WITH传递参数接收参数:PARAMETERS接受参数规则传递参数命令在调用子程序处;接受参数命令在子程序第一行传递方式:•引用:传递参数被隐含起来,但其值随着被调用程序中接受参数的变化而变化()•传值:表达式列表或单个内存变量用圆括号,参数传递为传值方式。即传递参数不被隐含,其值也不随着被调用程序中接受参数的变化而变化传递参数接受参数对应位置DEMO-引用与传值的比较P172-173例题4.25-4.26引用传值X=A,Y=BA=X,B=Y主程序中的A、B隐藏,此为新的内存变量X=A,Y=B变量A、B没隐藏,且为自然属性变量,故:A=100,B=‘OK’eg_26:用过程实现求N!引用!!!思考:求(m-n)!可否用Dofactorialwith(m-n)?自定义函数(1)定义:是一个子程序(.PRG),它可以返回一个值到调用程序。(2)建立:与一般的命令文件的建立方法相同。自定义函数在过程文件中的存在形式为:FUNCTION自定义函数名[语句序列]ENDFUNC(3)特点在自定义函数程序中首条命令一般为(如果没有参数传送可略):PARAMETERS变量表达式在自定义函数程序中尾条命令必须为:RETURN表达式自定义函数的定义及调用完整的定义格式自定义函数调用与参数传递调用:参数传递:默认为传值。自定义函数方法求M!+N!求M!+N!Jmxy.zjgsu.edu.cnCompanyLogo&&求m!+n!INPUT'M='TOMINPUT'N='TONS1=1FORI=1TOMS1=S1*IENDFORS2=1FORJ=1TONS2=S2*JENDFOR?S1+S2&&求m!+n!INPUT'M='TOMINPUT'N='TONS1=F(M)S2=F(N)?S1+S2FUNCFPARAXS=1FORI=1TOXS=S*IENDFORRETURNS自定义函数DEMO-例题P175-例题4.27自定义函数判断是否是偶数?P176-例题4.28-4.29自定义函数求三角形面积settalkoffcleainputn=ton?jos(n)settalkonfunctionjosparaxifx%2=0return.t.elsereturn.f.endifendfuncfunctiontareaparaa,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函数与过程的区别过程函数调用DO过程名WITH参数列表函数名(参数列表)参数传递默认方式引用传值返回值无必须返回一个值自定义函数必须返回一个值分别用函数和过程求n!统计2~M(M由键盘输入)中有多少个素数(只能被1和自身整除的整数成为素数),要求素数的判断用自定义函数实现。SETTALKOF