1、四、多模块程序,每个在结构上相对独立的程序段就是一个模块,这种模块可以是子程序、过程或自定义函数。,例题:建立“学籍管理”应用程序,基本概念:子程序:能够完成一定功能的可供其它程序使用(调用)的独立程序主程序:调用子程序的程序,1)子程序的建立:格式:MODIFY COMMAND 2)子程序的返回语句 格式:RETURN TO MASTER,1、子程序,子程序与主程序的异同: 相同点:1)都是独立的程序;2)创建的方式一样: 3)扩展名一样.prg 不同点:子程序的结束命令是RETURN TO MASTER;而主程序的结束命令一般是CANCEL语句。,3)子程序的调用:DO WITH ,例:任
2、意输入三个数a、b、c,求这三个数的阶乘和即:S=a!+b!+c!,分析:1、解题步骤:先求出a!,b!,c!,再相加求和,2、a!,b!,c!的实现过程是一样,均可用如下程序实现,f=1 For i=1 to kf=f*i Endfor return,Clear s=0 F=0 input “a=“ to a input “b=“ to b input “c=“ to c k=a do ff s=s+f k=b do ff s=s+f k=c do ff s=s+f ?alltrim(str(a)+“!+“+alltrim(str(b)+“!+“+alltrim(str(c)+“!=“+al
3、ltrim(str(s) cancel,子程序ff.prg f=1 For i=1 to kf=f*i Endfor return,4)子程序的嵌套,SUB1,SUB2,SUB3,DO SUB1,DO SUB2RETURN,RETURN,DO SUB3RETURN,主程序,SUB1,SUB2,SUB3,DO SUB1,DO SUB2RETURN,RETURN,DO SUB3RETURN,主程序,SUB1,SUB2,SUB3,DO SUB1,DO SUB2RETURN,RETURN TO MASTER,DO SUB3RETURN,主程序,在多模块程序设计中,每一个内存变量都有自己的有效范围,通常
4、称为作用域。根据变量的作用域范围可将其变量分为全局变量和私有变量、局部变量。,2、内存变量作用域,1)全局变量,其值在整个程序及其各子程序中有效;即使程序执行完后,它们也不会被清除,而仍然存在于内存中。在命令窗口中定义的变量,都是全局变量。PUBLIC ,2)私有变量私有变量的值只在建立它的程序及其下级子程序中有效。隐式说明:程序中使用的变量未经说明均为私有变量 注意:某一级程序定义的私有变量,在本级程序结束时被清除,不能进入上一级程序。若主程序中定义了变量,它可以到下一级子程序中使用,当子程序在执行过程中改变了它,在返回主程序时被改变的值仍然保存,主程序可继续使用子程序改变后的值。,例:,*
5、 主程序 Clea I=1,? main I=,I, J=,J cancel,子程序ff2.prgI=I*2 J=i+1 ? sub : I= ,I, J=,J RETURN,do ff2,运算结果: sub I=2 J=3 main I=2 J= 找不到变量J,原因分析:由于子程序中变量J为私有变量,作用域仅为子程序中,主程序中找不到其定义!变量I在主程序中有定义,所以子程序可使用并返回值,主程序 Clea I=1,? main I=,I, J=,J cancel,子程序ff2.prgPublic j I=I*2 J=i+1 ? sub : I= ,I, J=,J RETURN,do ff2
6、,运算结果: sub I=2 J=3 main I=2 J=3,分析:在子程序中将变量J说明为全局变量后,作用域变为整个程序,主程序中就能找到了!,同名私有变量对全局变量的屏蔽显示说明:PRIVATE ,主程序public i,j Store 1 to i,j,k,DO ff3,? I=,I,J=,J,K= ,K cancel,* 子程序 ff3 Private j,k I=i*2 J=i+1 K=j+1 ? I=,I,J=,J,K= ,K return,运算结果:I=2 J=3 k=4 (子程序中输出),I=2 J=1 k=1 (主程序中输出),当私有变量与全局变量同名时,到底谁起作用呢?,
7、同名私有变量对全局变量的屏蔽,PRIVATE 结论:当私有变量与全局变量或上级私有变量同名时,在子程序中,私有变量将屏蔽同名的全局变量或上级私有变量,此时起作用的是私有变量。当离开私有变量作用范围(私有变量释放) 后,全局变量或上级私有变量又出现并起作用。,3)局部变量local 局部变量的作用于只包括本模块,不能在下层或上层模块中使用。离开本模块,存储单元就被释放。,课堂练习:请问下列程序执行的结果为多少?,*子程序sub3 PRIVATE A A=20 ?“SUB3”,A RETURN,*子程序SUB 4 A=30 ?“ SUB4”,A RETURN,3、程序调用中的参数传递,主程序调用时
8、必须用以下语法:DO WITH 子程序第一条可执行语句必须是:PARAMETERS 功能:通过向子程序的传递数据。若实参表中对应实参为内存变量,则子程序返回时向主程序返回对应形式参数的值。 说明: 1、实参必须与形参在个数和类型上一致。实参可为常量、变量和表达式。形参必须是内存变量; 2、实参与形参名字可以不同。,例:求 S=a!+b!+c!,CLEA S=0 INPUT “a=” TO a INPUT “b=” TO b INPUT “c=” TO c,DO ff WITH a,子程序ff.PRG:PARA k f=1 FOR I=1 TO kf=f*IENDFORs=s+fRETURN,D
9、O ff WITH b,DO ff WITH c,? “S= “+STR(S,5) CANCEL,4、过程,格式: PROCEDURE PARAMETERS RETURN ENDPROC1、过程名必须以字母或者下划线开头,可以包含字母、数字和下划线的任意组合,但最多不能超过254个字符。 2、过程作为一个独立的模块放在程序的下方。,CLEA S=0 INPUT 请输入A 值: TO A INPUT 请输入B 值: TO B INPUT 请输入C 值: TO C DO GCH WITH A DO FCH WITH B DO FCH WITH C ? S=+STR(S,5) CANCEL *过程G
10、CH PROC GCH PARA k f=1 FOR I=1 TO k,f=f*i ENDFOR s=s+f RETURN ENDPROC,用过程调用求S=A!+B!+C!,5、过程文件,将多个子程序放入一个PRG文件中,该文件称为过程文件。过程文件中的每一个子程序称一个内部过程。而单独作为一个程序文件存放在磁盘上的子程序称为外部过程。 1)建立方式:同程序文件的建立方式。 2)过程文件的使用:在调用程序中,必须用打开命令打开过程文件:set proc to 使用完毕后,应关闭过程文件:set proc to 或 close proc,3)过程文件的结构:由过程头、过程体和程序尾三部分构成。P
11、ROCEDURE 过程名1 RETURN TO MASTER PROCEDURE 过程名2RETURN TO MASTERPROCEDURE 过程名NRETURN TO MASTER,5、自定义函数,1)函数的类型 标准函数(内部函数) 自定义函数 UDF(外部函数) 2)自定义函数的建立与编辑:与子程序一样 MODI COMM 函数定义格式:FUNCTION PARAMETERS 函数体RETURN 与子程序的区别是:语句RETURN中含有表达式,表达式的值是返回的函数值。在函数体中可以含有多个RETURN语句。,例题 求 S=A!+B!+C!,CLEA INPUT “A=” TO A IN
12、PUT “B=” TO B INPUT “C=” TO C S=FAC(A)+FAC(B)+FAC(C) ?STR(A,3)+!+STR(B,3)+ ;!+STR(C,3)+! =,S CANCE,*函数 fac.PRG: func fac PARA n y=1 FOR I=1 TO ny=y*I ENDFOR RETURN y,自定义函数既可以出现在程序文件的底部,供本程序调用;也可以作为一个 独立的程序文件供所有程序调用。,第九章 面向对象程序设计,一、面向对象程序设计的特点,1、编程方式是可视化,2、程序运行没有一定的顺序,而是由事件驱动,二、基本概念,1、对象,对象是一种将数据和操作过
13、程结合在一起的数据结构,是现实世界中待处理的客观实体的抽象表达。凡是我们要处理的事物都可成为对象。包含多个子对象的对象称为容器对象。在VF中常见的对象有:标签、文本框、列表框。 常见的容器对象有表单等。,2、对象的属性、事件和方法,1)属性:是一组用于描述对象的物理特征的值,例如:VFP中一个文本框具有名字(caption)、字号(Fontsize)、可见性(visable)等属性,用户可以通过控制对象的这些属性值来操作修改对象。,2)事件:由对象识别的一个动作。,事件产生的途径:可以由一个用户动作产生,如单击鼠标或键盘击键; 可以由程序代码或者系统产生,例如计时器运行时激发的事件是由系统产生
14、的。,3)方法:是与对象相关联的过程,对象的事件可以具有与之相关联的方法。,3、类与子类,1、类是具有共同属性、共同操作性质的对象的集合。 类与对象的关系:类是对象的抽象描述,对象则是类的实例。 通过某个类为起点可以创建新的类,新创建的类称为子类,又叫派生类,起点类则称为父类。,2、基类(是VF预先定义好的类)容器类:可以容纳其他对象的类。控件类:可以被其他对象容纳,而不可以容纳其他对象的类3、类的特性继承性:子类具有父类的所有数据和操作,并允许用户根据需要修改封装性:指类的内部信息对用户是隐蔽的多态性:一个名字具有多种语义,具有多种实现,基类包括容器类和控件类,三、对象的操作,1、引用容器类对象,1)绝对引用:对象1.对象2,例:要作用于表单myform1中命令按钮command1的文字: mand1.caption,2)相对引用:相对引用关键字.对象|对象属性,2、设置对象的属性值:,对象名.属性名值,1)、设置对象的单个属性值:,例:设置表单myform1中命令按钮command1的文字为“显示”: mand1.caption=“显示”,2)、同时设置对象的多个属性值:,with 对象名 属性名1值1属性名2 =值2 endwith,3)、调用方法: 对象名.方法,