ch4(函数与过程).ppt_第1页
ch4(函数与过程).ppt_第2页
ch4(函数与过程).ppt_第3页
ch4(函数与过程).ppt_第4页
ch4(函数与过程).ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章回顾,结构化程序设计: 选择语句:if.then语句、selectcase语句 循环语句:for.next 语句 while.wend 语句 do.loop 语句 多重嵌套语句 数组的定义与引用: 一维数组及二维数据的声明、数据输入输出,主要介绍: 函数过程(Function) 子过程(SUB过程) 参数传递规则 多模块程序设计(变量作用域),第4章: 函数与过程,简单例题,编程:计算飞机的高度AB 已知:飞机在B点,雷达以3108米/秒的速度发射; 1/3000秒的时间收到来自飞机的回波; 雷达发射电波的仰角为300。 思路:先求电波运行的距离OB,根据AB=OB*sin30 得到飞机的高度AB;而OB的距离就是速度乘 时间,由于电波来回时间为1/3000秒,因此 单趟时间为1/3000/2,即: OB31081/3000/2 AB=OBsin300,程序如下:,Option Explicit Private Sub Command1_Click() Const vg = 300000000 Const pi = 3.1415 Dim OB as single, AB as single OB = vg / 3000 / 2 AB = OB * Sin(30 * pi / 180) Print “飞机的高度是“; AB; “米“ End Sub,OB31081/3000/2 AB=OBsin300,VB系统函数(标准函数或内部函数): 三角函数(sin/cos/tan)、指数函数(exp)、对数函数(log) 平方根函数(sqr)、绝对值函数(ABS)、符号函数(sgn) 字串函数(left,mid,right,trim,Ltrim,Rtrim,Len,space等) 日期函数(date,time,now,minute,second,hour,year等) 随机函数(Rnd/Randomize)、print函数、tab函数等等,VB用户自定义函数,Function函数(返回函数值) Sub函数(不返回函数值),例题4.7木工与油漆工的区别,例题4.1,编程:从键盘输入一个数,输出该数的平方根 要求:输入负数时,不停止程序,只是提示为虚数 思路:这时不能使用VB自带的内部函数sqr 因为输入负数将会出错,只有自己编写一 个求平方根的自定义函数squareroot(N) 知识点: 掌握自定义函数的方法及函数值的返回,4.1 过程的编写与调用,Public|PrivateStaticFunction 函数名()As 函数体函数名=返回值 End Function,特点:若要返回函数值,必须在函数体中给函数名赋值,函数过程编写的标准格式:,例如4.1中求平方根的自定义函数过程:,Function squareroot (X As Double) As Double Select Case Sgn(X) Case 1 squareroot = Sqr(X) Case 0 squareroot = 0 Case -1 squareroot = -1 End Select End Function,给函数名赋值,(1)函数名:命名规则与变量名规则相同。但不能与系统的内部函数或其它通用子过程同名,也不能与已定义的全局变量和本模块中模块级变量同名。 (2)在函数体内,函数名可以当变量使用,函数的返回值就是通过对函数名的赋值语句来实现的,在函数过程中至少要对函数名赋值一次也即是一定要有返回值,否则出错。 (3)AS类型:是指函数返回值的类型,若省略,则函数返回变体类型值(Variant)。 (4) 定义为Private的任何过程,只能被其所在窗体的过程调用, 调用格式为 函数名(实参列表);定义为Public(缺省属性)的任何过程,可以被当前工程中其它窗体中的过程调用, 调用格式为 窗体名.函数名(实参列表),说明:,例题4.1的form2,(5)形式参数声明列表:形式参数通常简称“形参”,仅表示形参的类型、个数、位置,定义时是无值的,只有在过程被调用时,虚实参结合后才获得相应的值。 (6)过程可以无形式参数,但括号不能省。 (7)形参的声明形式: ByValByRef变量名( )As 类型,, ByVal表示当该过程被调用时,参数是按值传递的;缺省或ByRef表示当该过程被调用时,参数是按地址传递的。 (8)Exit Function:表示退出函数过程,常常是与选择结构(If或Select Case语句)联用,即当满足一定条件时,退出函数过程。,函数过程调用的标准格式:,函数名(实参列表)(在主程序中调用) 说明: 在调用时应以实际的参数(即实参)替换函数括号内的形参;实参和形参的数据类型、顺序、个数必须匹配。函数调用只能出现在表达式中,其功能是求得函数的返回值。 要注意函数声明的时候,函数名后的括号内接的是形参声明列表,且函数声明有且只能一次,如同变量的声明一样;而调用函数时应在函数名后的括号内代入实参,可以多次调用,功能仅是获得函数的返回值。,例题43(P86),编程:显示11000中的所有素数 要求:调用函数过程判断一个数是否素数 知识点: 1、学习自定义函数过程的编写与引用 2、了解VB编程方法不同对计算速度的影响 3、学习一些固有的输出格式,如固定一行输 出多少素数,第四章回顾,Function函数(返回函数值) Sub函数(不返回函数值),Public|PrivateFunction 函数名()As 函数体函数名=返回值 End Function,Private form_click() 调用function过程(实参) End Function,ByVal ByRef,例题41(P84),编程:输出序列1,1,1,1,2,1,1等前55项,输出数列: 1, 1,1, 1,2,1, 1,3,3,1, 1,4,6,4 1, 1,5,10,10,5,1, , 的前55项。,确定:自定义函数过程为求阶乘,Private Function fact(ByVal k As integer) As Long fact=1 For i% = 2 To k fact = fact * i% Next i% End Function,Private Sub Form_click() Dim zh As Long,i as integer,j as integer For i= 0 To 9 For j = 0 To i zh = fact(i)/fact(j)/fact(i-j) Print Space(5 - Len(Str(zh); Print Str(zh); Next j Print Next i End Sub,函数:写在通用对象声明部分,程序如下:,Private Sub Form_click() Dim zh As Long ,i as integer,j as integer For i = 0 To 9 For j = 0 To i zh = fact(i)/fact(j)/fact(i-j) Print Space(5 - Len(Str(zh); Print Str(zh); Next j Print Next i End Sub,程序如下:,Private Function zh(m As integer, n As integer) As Long zh = fact(m) / fact(n) / fact(m - n) End Function,知识点:,1、学习函数过程的编写与调用 2、学习形参与实参的概念 3、了解直接调用与间接调用的方法 4、了解形参是可以多个的,不仅如此,后面 的例题可以看到,形参还可以是数组,数组作为参数传递: 调用(实参): 函数名(数组名,数组大小) 编写(形参): 函数名(数组名加括号,数组大小),例题4.2,编程:编写一个函数,求数组中全体元素的和 思路:主程序中必须产生数组,子函数要返回数 值(这里的数值是数组中全体元素的和) 知识点: 1、如何将数组传递给子函数(数组名及数组个数) 2、参数传递过程中的类型必须一致,例题4-5(P88),编程:编写函数求二维数组全体元素的和 思路:二维数组在主程序中定义及输入, 调用求和过程 知识点: 1、掌握二维数组形参和实参传递的方法 2、二维数组的元素和的计算需要二重循环,3、确定形参(自变量)的个数、类型和传递方式。,2、确定函数的返回值的类型。,1、确定函数名。,4、编写函数体。,编写function函数过程总结:,SUB 过程的编写,Public|PrivateStaticSub() SUB过程体 End Sub,说明: (1)子过程名:命名规则与变量名规则相同。子过程名不返回值,而是通过形参与实参的传递得到结果。 (2)Exit Sub:表示退出子过程。 (3) SUB过程用于完成某个操作,过程名不能被赋值,不能用于返回一个值。 (3)形参数列表:形参的定义与函数过程完全相同。 (4)过程声明可以无形式参数,但括号不能省。,1 子过程的调用 (SUB) 子过程名 实参列表 (调用事件可以不用call) 或 Call 子过程名(实参列表) 2 函数过程的调用 (FUNCTION) 变量名 = 函数过程名(实参列表) 说明: (1)参数列表称为实参或实元,它必须与形参保持个数相同,位置与类型一一对应。 (2)调用时把实参值传递给对应的形参。其中值传递(形参前有ByVal说明)时实参的值不随形参的值变化而改变。而地址传递时实参的值随形参值的改变而改变。,Sub过程的调用,例题47(P89),编程:数组元素排序(降序) 思路:数组的输入与降序输出由主程序完成 排序过程由sub过程完成 知识点: 1、数组的参数传递不仅要有数组名,还要有数组大小 2、为了在主程序中输出排序结果,必须用按地址传递 3、形参中缺省传递方式就是按地址传递,例题46(P89),编程:显示小房子图案 知识点: 1、任何Sub过程都可以被调用(直接调用或call) 2、学习string(n,s)函数(n个字符为s的字串) (P50 填空题3),例题44(P87),编程:计算两个数组中最大值之差 思路:自定义函数求任一数组中的最大值; 主程序中声明并输入数组,调用函数后求差 知识点: 见书上P87 函数fmax的声明中多了一个byval, 这是实参向形参传递数据时的一种方式:按值传递,4.2 参数传递,实参 形参 (主程序调用) (子程序接收) 传递数据的方式: 按值传递(Byval) 按地址传递(Byref),例题4.0,编程:比较按值传递和按地址传递的区别 知识点: 1、了解byval与byref的区别 2、缺省传递形式时为byref(按地址传递),按值传递的参数类型要求:形参是实参的一个副本,1、形参为数值类型时: 小范围到大范围:保持不变。即: 实参 形参 结果 整型 浮点型 形参实参 大范围到小范围:四舍五入。即: 实参 形参 结果 浮点型 整型 形参四舍五入的实参,实参也是数值类型,数值(实参),数值(形参),按地址传递的参数类型要求:形参和实参必须一致,2、实参为字符类型,形参为数值类型 以实参字符的数字赋值给形参,即: 实参 形参 结果 字符“28” 数值 A A28 字符“28abc” 数值 A 出错 3、实参为数值,形参为字符 数值直接转换成字符串,按地址传递的特点(形参实参公用内存单元):,只有当实参为变量时,按地址传递才能实现双向传递 例如: 主程序 子函数 call swap(10,50) sub swap(x%,y%) 这样的调用没有任何意义,除非输出在子过程中实现 call swap(a,b) sub swap(x%,y%) 当x及y在子过程中改变时,主程序中的a和b跟着变化,例题48(P91),编程:计算一元二次方程的实根 要求:主程序输入一元二次方程的系数 调用子函数计算实根并将值返回主程序 知识点: 1、两个实根不能用一个函数名返回值,必须按地址传递 2、一元二次方程的系数只需要单向传递 3、函数名可以返回有无实根这个信息(boolean),例题4.3,编程:输入一组数据,排序输出 要求:子过程实现两数交换; 主程序实现数据输入及排序输出 知识点(三个重要概念): 1、每个形参的传递方式都必须单独定义,缺省就是 按地址传递 2、数组参数只有按地址传递1种方式 3、形参中的数组类型与实参相同,略去数组的上下界,但 括号不能省略,而此题传递的不是数组,是数值。,重要概念!,例题4.8,编程:编写函数过程求最大公约数 思路:设定两个数m、n,并且mn,则最大公约数p一定满足: 1=p=n,且: m mod p=0 and n mod p=0 方法:将n赋值给p,验证是否满足上式,不满足就将p减1继续验证上式,直至满足为止。 知识点: 1、掌握一组数的最大公约数的求解方法 2、学习两数交换的另一种方法(自学),例题410(偏难),编程:将输入在文本框中的文本删除其中空格, 在标签框中输出无空格的文本 知识点: 1、了解如何将字串一个一个存入数组 2、深入了解按地址传递参数的特点(实参中的数组 及长度均发生变化) 3、如何在标签框中显示数组,4.3 多模块程序设计,VB中的三种类型模块 窗体模块(.frm) 标准模块(.bas) 类模块(.cls),一. 窗体模块,问题:在应用程序中出现多个窗体时,如何实现在 窗体1中调用窗体2中的某个过程 方法: (1)窗体2的被调用过程必须用public定义,如: public function tongyong() end function (2)窗体1中调用tongyong()这个函数时必须 写明窗体名称,如: X form2.tongyong(),特点: 标准模块中用public定义的过程可以在任何窗体中都被调用而不需要标注窗体名的前缀 方法: 在下拉菜单“工程”中选择“添加模块”,二. 标准模块,例题4.5,比较标准模块与窗体模块的过程定义及调用 知识点: 掌握不同模块中public与private定义的过程的调用方法,三. 变量作用域,在VB中,由于可以在过程中和模块中声明变量,根据定义变量的位置和定义变量的语句不同,变量可以分为: 局部变量(过程级变量) 窗体/模块级变量(私有的模块级变量,能被本模块的所有过程和函数使用) 全局级变量(公有的模块级变量)。,定义:变量的作用范围是指变量被某一过程识别的范围或者指该变量能够使用的程序代码范围,局部量: 在过程内声明的变量或符号常量是局部量,其只能在本过程中使用。,在过程内部使用 Dim| Static 关键字来声明的变量,或者使用Const语句声明的符号常量,其只在声明它们的过程中才能被访问,别的过程不可访问。所以可以在不同的过程中声明相同名字的局部量而互不影响。,1、过程级变量局部变量,例: Private Sub Form_Load() Dim n% n= 10 End Sub Private Sub From_Click() Dim n% Print “n=“;n End Sub,程序运行后单击窗体,其输出结果是什么?,在“通用声明”段中用Dim|Private语句声明的变量,或者用Const|Private Const声明的符号常量,其可被本窗体/模块的任何过程访问。但其他模块却不能访问该量。 例如:在“通用声明”段声明如下变量 Private s As String Dim a As Integer,b As Single Const x%,2、 窗体/模块级量,判断下面两段程序的输出结果:,Private s As String, sr As String Dim a As Integer, b As Integer Private Sub Form_click() Dim s As String, a As Integer s = “abc“: sr = “aaa“ a = 123: b = 456 Print s, sr Print a, b End Sub Private Sub command1_click() Print s, sr Print a, b End Sub,通用声明模块级量,这个过程中的s、a被定义为局部量,sr、b为模块级量,这个过程中的所有变量均为模块级量,特点:过程内若定义了局部量就不能引用同名的模块级量,全局量也称公有的模块级变量,在窗体模块或标准模块的顶部的“通用”声明段用Public关键字声明的变量或用Public Const语句声明的符号常量,它的作用范围是整个应用程序,即可被本应用程序的任何过程或函数访问。 例如: Public a As Integer,b As single Public Const PI As Double,全局量可以在整个工程中被引用。,3、 全局量,全局量定义及调用注意点:,1、如果在窗体2中声明public m as integer,那么要在窗体1中引用时,必须在变量m前指出窗体名,即:aform2.m 2、如果要定义全局量的数组或定长字符串,必须在标准模块的通用声明部分声明,不可以在其他窗体模块中声明。,3种变量声明及使用规则如下表:,3种符号常量的声明及使用规则与其对应的变量一致,只是常量只能读取而不能更改,观察同名但不同定义的变量的输出值 Public Temp As Integer 定义全局变量 Private Sub Form_Load() Temp = 1 将全局变量Temp 的值设置成 1 End Sub Private Sub Command1_Click() Dim Temp As Integer 定义局部变量 Temp = 2 将局部变量Temp 的值设置成 2 Print “temp=“; Temp Print “temp=“; Form1.Temp End Sub Private Sub Command2_Click() Print “temp=“; Temp End Sub,除作用域之外,变量还有存活期,在这一期间变量能够保持它们的值。 在应用程序的存活期内一直保持模块级变量和全局变量的值。但是,对于Dim声明的局部变量仅当过程执行期间存在,当一个过程执行完毕,它的局部变量的值就已经不存在,而且变量所占据的内存也被释放。当下一次执行该过程时,它的所有局部变量将重新初始化。,概念,局部变量按存活期分为动态变量和静态变量; 局部变量的存活期由其定义的关键词(Static 或Dim)来决定。,四、 变量的生存期,动态变量是指程序运行进入变量所在的过程时,才分配给该变量内存空间,退出该过程时,变量所占的内存空间自动释放,其值消失。 使用Dim语句在过程中声明的局部变量就属于动态变量,在过程执行结束后,变量的值不被保留,在每一次重新执行过程时,变量重新声明。 程序中使用的绝大部分变量都属于动态变量。,动态变量,静态变量是指程序运行期间虽然退出变量所在的过程,其值仍被保留的变量,即变量所占的内存空间没有释放。当以后再次进入该过程时,原来变量的值可以继续使用。 使用Static语句在过程中声明的局部变量就属于静态变量。静态变量只能在过程中声明,而不能在通用对象声明部分声明。 函数过程、自定义过程均可以在过程头部加上关键字Static,表示该过程内的局部变量都是静态变量。 声明形式: Static 变量名 AS 类型 Static Function 函数过程名(参数列表) As 类型 Static Sub 子过程名(参数列表),静态变量,例12:阅读下列程序,写出当点击两次命令按钮后的运行结果。 Function sum(Byval n as integer) as integer static s as integer for I%=0 to n-1 s=s+I% next I% sum=s End function Private Sub Command1_Click() Print sum(2)+sum(3) End Sub,静态变量举例,例11:动态变量和静态变量使用示例。 Dim a As Integer Private Sub Command1_Click() Static b As Integer Dim c As Integer a = a + 1 b = b + 1 c = c + 1 Print “a=“; a, “b=“; b, “c=“; c End Sub 当程序运行时,连续单击Command1按钮四次,窗体上的输出结果是什么?,静态变量举例,例 有一个人编了下面一段程序,想用变量n记录单击窗体的次数。 Private Sub Form_Click() Dim n As Integer n = n + 1 Print “已单击次数:“; n & “次“ End Sub,分析程序运行后多次单击窗体的输出结果:,要记录单击窗体次数,如何实现?并比较使用模块变量和静态变量的差别。,Private Sub Form_Click() Dim i% ,isum% For i = 1 To 5 isum = sum(i) Print isum, Next i End Sub,Private Function sum(n As Integer) Dim j As Integer j = j + n sum = j End Function,1 2 3 4 5,Static j As Integer 结果如何?,补充例题:,例题4.6,知识点 掌握dim和static定义的变量作用域,作业:(前三题要抄题目),1、P83 题5 2、P101 题1 3、Label框内显示10个随机数, 循环右移n位后显示在另一label框内 4、第三及第四章的程序阅读及程序填空题,第七次实验内容:,实验一:输出字符菱形,要求奇数行 图案为: A BB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论