过程 教学课件PPT.ppt_第1页
过程 教学课件PPT.ppt_第2页
过程 教学课件PPT.ppt_第3页
过程 教学课件PPT.ppt_第4页
过程 教学课件PPT.ppt_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

第7章过 程,本章要点: function过程 sub过程 参数的传递* 过程的嵌套调用 过程的递归调用* vb的工程结构 变量的作用域与生存期*,过程的引入: 使同类的操作不重复 (操作方法相同、参数不同) 过程: 完成一段独立功能,可供其他过程使用(调用)。 过程又称为子程序 调用过程: 调用其他过程的过程,调用过程: 调用sprg1 调用sprg1 调用sprg2,子过程: sprg1,子过程: sprg2,过程分类:,sub过程,function过程,内部过程(方法) 事件过程 自定义过程,内部函数 自定义函数,其中,自定义函数和自定义过程统称为通用过程,7.1 function过程(函数过程),7.1.1 function过程的定义 1. function过程的格式 public|privatestatic function () as = exit function end function,2. 说明 (1) public: 缺省值。使用public时表示各模块的所 有其他过程都可以调用该function过程。 (2) private: 使用private时表示只有本模块中的其他过程才可以调用该function过程。 (3) static: 使用static时表示将过程中的所有局部变 量说明为静态变量。 (4) : function过程的名称,遵循变量 的命名规则。 (5) : 表示function过程的参数变量列表。多个变量之间用逗号隔开。 格式: byval|byref|optional|paramarray ( ) as ,byval: 表示该参数按值传递。 byref: 缺省值。表示该参数按地址传递。 optional:表示该参数为可选参数。 paramarray:表示该参数是一个variant类型的optional数组。 : 任何变量名或数组名。 ( ): 当参数为数组时使用。 (6) as : 声明函数值的类型。 (7) exit function语句: 从function过程中退出。 (8) function过程通过赋值语句: = 将函数的返回值赋给。 (9) function过程的定义不能嵌套。,3. function过程的建立: 建立位置 窗体模块 标准模块 类模块* 建立方法 直接在代码窗口中输入 应写在“通用”的位置。 使用菜单命令:工具添加过程 先切换到代码窗口,才可以使用该菜单命令。,【例7-1】编写一个计算n!的function过程。 分析:确定参数个数、类型、函数名、类型 function fact(n as integer) as long dim i as integer, f as long f = 1 f用于保存阶乘值 for i = 1 to n f = f * i next i fact = f 给函数过程名赋值 end function,【例7-2】编写一个function过程,计算下面表达式的值。,问:应设置几个参数? function f(x, y, z) f = sqr(abs(x 3 + y 3 + z 3) end function,这里的参数和函数名都没有定义类型,默认为variant类型。,7.1.2 function过程的调用,1. 调用位置: 直接在表达式中调用。 2. 调用格式: () 其中,: 常量、变量或表达式 各参数之间用逗号分隔 如果是数组,在数组名之后要跟一对空括号。,【例7-3】从键盘任意输入一个整数,然后调用计算 阶乘的函数求该整数的阶乘值。 设计界面和运行界面如下:,设计界面,运行界面,代码如下: option explicit 自定义求阶乘的函数过程fact function fact(n as integer) as long dim i as integer, f as long f = 1 for i = 1 to n f = f * i next i fact = f 给函数过程名赋值 end function, 在按钮的click事件过程中调用函数过程 private sub command1_click() dim x as integer x = val(text1.text) label2.caption=trim(str(x) & “的阶乘数为:“ 使用fact(x)调用函数过程 label3.caption = trim(str(fact(x) end sub,【例7-4】利用function过程计算阶乘,求组合数。设计界面如下图。,代码如下: 定义求阶乘的函数fact function fact(n as integer) as double dim f as double, i as integer f = 1 for i = 1 to n f = f * i next i fact = f end function, “=”按钮的click事件过程 private sub command1_click() dim m as integer, n as integer, c as double n = val(text1.text) m = val(text2.text) 调用fact函数求各阶乘值 c = fact(m) / (fact(n) * (fact(m - n) text3.text = trim(str(c) end sub,【例7-5】编写function过程求最大公约数,并通过命令按钮的单击事件过程调用该函数过程。,function hcf(m as integer, n as integer) as integer dim r as integer r = m mod n do while r 0 m = n n = r r = m mod n loop hcf = n end function private sub command1_click() dim m as integer, n as integer m = val(text1.text): n = val(text2.text) label3.caption = str(hcf(m, n) end sub,【例7-6】编写一个function过程,返回指定个数的字符串,字符串以a开始,例如,当指定个数5时,函数返回字符串“ a b c d e“。运行时单击按钮调用该函数过程,实现在窗体上按指定的行数输出如下图所示的图形。, createstr函数返回n个字符 private function createstr(n as integer) dim tmpstr as string, i as integer tmpstr = “ strasc用于保存字符的ascii码 strasc = asc(“a“) 1 for i = 1 to n strasc = strasc + 1 生成下一字符的ascii码 tmpstr = tmpstr & space(1) & chr(strasc) next i createstr = tmpstr end function, “输出图形”按钮的click事件过程 private sub command1_click() dim n as integer, i as integer 指定图形的行数 n = val(inputbox(“图形的行数“, “请输入“, “5“) cls print for i = 1 to n print tab(2 * i); 输出左半部分 print createstr(2 * n - 2 * i + 1); print spc(4); 左右两部分的间隔 print createstr(2 * i - 1); 输出右半部分 print next i end sub,7.2 sub过程,当需要自定义过程返回一个值时,使用function过程很容易实现。 但在实际应用中,可能希望过程不需要返回值,例如,使用过程打印一个图形;或需要过程返回多个值,例如,利用过程对一批数据进行排序,在这些情况下就需要使用sub过程。,7.2.1 sub过程的定义,1. sub过程的格式 private|publicstatic sub () exit sub end sub 2. 说明 (1) exit sub用于退出sub过程。 (2) 不具有值的意义,在sub过程中不能给赋值,也不能给定义类型。 (3) sub过程通过中的参数返回值。 (4) sub过程的建立方法与function过程的建立方法相同。,【例7-7】编写计算n!的sub过程。 分析: 参数表中应有一个参数n,还应有另一个参数f用来返回阶乘值。 sub fact(n as integer, f as long) dim i as integer f = 1 for i = 1 to n f = f * i next i end sub,【例7-8】编写sub过程,打印以下图形。 分析: 打印该图形不需要返回值,因此无需引入参数。,* * * * *,sub a() for i = 1 to 6 print tab(7 - i); for j = 1 to 2 * i - 1 print “*“; next j print next i end sub,【例7-9】编写sub过程,求三个数中的最大数和最小数。 分析: 首先要设置三个参数,如x、y、z,用于接收三个原始数据,另外引入两个参数max和min,用于返回最大和最小数。 sub s(x, y, z, max, min) max = x min = x if y max then max = y if y max then max = z if z min then min = z end sub,7.2.2 sub过程的调用,说明: (1) : 要调用的sub过程名。 (2) : 可以是常量、变量或表达式,各参数之间用逗号分隔。如果是数组参数,则要在数组名之后跟一对空括号。 (3) 用call语句调用一个sub过程时,如果过程本身没有参数,则省略和括号。 (4) 格式二省略了call关键字,同时两边也不能带括号。,格式一: call () 格式二: ,【例7-10】将求组合数一题改成用sub过程实现 sub fact(n as integer, f as long) dim i as integer f = 1 for i = 1 to n f = f * i next i end sub private sub command1_click() dim m as integer, n as integer dim f1 as long, f2 as long, f3 as long m = val(text1.text) : n = val(text2.text) call fact(m, f1):call fact(n, f2):call fact(m - n, f3) text3.text = trim(str(f1 / (f2 * f3) end sub,【例7-11】编写一个sub过程,计算k个数的和,即1+2+k,并通过命令按钮的单击事件调用该过程计算s=1+(1+2)+(1+2+3)+ +(1+2+n)。 分析: 编写一个sub过程计算1+2+k, 设参数k、s,参数s用于返回该和值。 sub a1(k as integer, s as integer) s = 0 for j = 1 to k s = s + j next j end sub,private sub command1_click() dim n as integer, s1 as integer, i as integer n = val(text1.text) for i = 1 to n 调用过程a1求1+2+i,和值返回到s1中 call a1(i, s1) sum = sum + s1 next i text2.text = sum end sub,7.3 参数的传递,参数传递是指调用过程与被调用过程之间的一种数据通讯方法。 数据的传递方式可以是单向的,也可以是双向的。分别称为按值传递和按地址传递。 数据传递是通过形参和实参进行传递的。,7.3.1 形参和实参,形参: 出现在sub或function语句中。 实参: 出现在调用程序中。 例如,定义如下一个过程: sub subtest(n as integer,sum as single) end sub 调用语句: call subtest( a , s ),形参,实参,说明: 一般情况下,形参表与实参表中对应参数个数、类型、位置顺序必须一一对应(除非使用关键字optional或paramarray对形参进行了约束) 形参表中的参数可以是: 除固定长度字符串之外的合法 变量名、数组名() 实参表中的参数可以是: 常量、变量、表达式、数组名() 形参与实参的结合有两种方式: 按值传递和按地址传递。,1. 按值传递 实参把其值传递给形参而不传递实参的地址。 数据的传递是单向的。 (1) 当实参为常量或表达式时,数据传递总是单向的。 例如: call subtest(10, 1+2) sub subtest( n as integer,sum as single),7.3.2 按值传递和按地址传递,(2) 实参是变量时,要实现按值传递需要在形参之前通过关键字byval来实现。 例如: sub ss(byval x, byval y, byval z) x = x + 1: y = y + 1: z = z + 1 end sub private sub command1_click() a = 1: b = 2: c = 3 call ss(a, b, c) print a, b, c end sub 运行时,单击命令按钮在窗体上打印: 1 2 3,2. 按地址传递 指将实参的地址传给形参,使形参和实参具有相同的地址,即形参与实参共享同一存储单元。 (1) 当实参为变量或数组时,形参使用关键字 byref定义(或省略)表示要按地址传递。 (2) 当参数是数组时,数组名之后必须使用一对空的圆括号。 按地址传递可以实现调用过程与子过程之间数据的双向传递。,例: sub ss(byref x, byref y, byref z) x = x + 1: y = y + 1: z = z + 1 end sub private sub command1_click() a = 1: b = 2: c = 3 call ss(a, b, c) print a, b, c end sub,运行时,单击命令按钮在窗体上打印: 2 3 4,【例7-14】编写一个计算乘幂的function过程,用来计算x的y次幂,其中y0。单击窗体时调用该过程打印51、52、53、54、55的值。 function power(x as single, byval y as integer) dim result as single result = 1 do while y 0 result = result * x y = y - 1 loop power = result end function,private sub form_click() dim i as integer for i = 1 to 5 print power(5, i) next i end sub,思考: 如果取消过程power中参数y前的关键字byval,则会出现什么情况?,【例7-15】编写三个sub过程 letarray过程: 产生0,99之间的随机整数,并赋值给一维数组。 sortarray过程:实现数组从大到小排序。 printarray过程:实现数组的输出。 (1) letarray过程 sub letarray(value() as integer) dim i as integer, n as integer randomize n = ubound(value) for i = 1 to n value(i) = int(100 * rnd) next i end sub,(2) sortarray过程: 实现数组从大到小排序 sub sortarray(value() as integer) dim i as integer, j as integer, n as integer, _ t as integer n = ubound(value) for i = 1 to n - 1 for j = i + 1 to n if value(i) value(j) then t = value(i) value(i) = value(j) value(j) = t end if next j next i end sub,(3) sortarray过程: 实现数组的输出 sub printarray(value() as integer) dim i as integer, n as integer n = ubound(value) for i = 1 to n print value(i); if i mod 4 = 0 then print 每行显示4个数 next i end sub,在时间过程中调用以上sub过程: private sub command1_click() dim value(20) as integer call letarray(value() print “排序前:“ call printarray(value() call sortarray(value() print “排序后:“ call printarray(value() end sub,7.4 过程的嵌套调用,在一个过程执行期间又调用另一个过程,称为过程的嵌套调用。,调用过程 子过程s1 子过程s2, 调用s1 , 调用s2 ,【例7-16】求 :,即求1!+2!+3!+20!,用function过程实现。 设计以下函数: (1) 设计一个过程fact求n! (2) 设计另一个过程sigma求n个数的和,代码如下: private sub command1_click() dim n as integer n = val(inputbox(“n=“) print sigma(n) 调用sigma过程 end sub function sigma(n as integer) as double dim i as integer, sum as double sum = 0 for i = 1 to n sum = sum + fact(i) 调用fact过程 next i sigma = sum end function,function fact(n as integer) as double dim i as integer, f as double f = 1 for i = 1 to n f = f * i next i fact = f end function,*7.5 过程的递归调用,递归调用:在过程中直接或间接调用自身。 数学上常用于处理阶乘运算、级数运算、幂指数运算等问题。,例:求n!,function f(n) f1 = 1 for i = 1 to n f1 = f1 * i next i f=f1 end function,function f(n) if n = 1 then f = 1 else f = n * f(n - 1) end if end function,【例7-17】: 求n! private sub command1_click() dim n as integer n = val(text1.text) text2.text = f(n) end sub public function f(n) if n = 1 then f = 1 else f = n * f(n - 1) end if end function,7.6 vb工程结构,vb应用程序由三种模块组成: 窗体模块(form) (文件扩展名.frm) 标准模块(module) (文件扩展名.bas) 类模块(class) (文件扩展名.cls),1. 窗体模块包含: 事件过程 通用过程 通用声明(常量、变量、数组、外部过程) 2. 可以用文本编辑器查看窗体模块 查看方法: 右击.frm文件,选择打开方式为记事本 显示: 描述信息及程序代码,7.6.1 窗体模块,当一个应用程序含有多个窗体时,可能其中的几个窗体都需要调用某一段公共代码,如果在每个窗体内都包含这些代码,就会造成大量的代码冗余,这时就可以在标准模块内建立一个包含此公共代码的通用过程,实现代码的共享。 标准模块不对应于某个窗体、是纯代码模块。 标准模块可以包含: 全局常量、变量、全局过程 标准模块级常量、变量、通用过程 注: 不能包含事件过程 添加: 工程添加模块选“新建”标签打开“添加模块”对话框。 默认名字:modulex,7.6.2 标准模块,类是具有相同或相似特征的事物的集合,类封装了对象的属性(数据成员)和方法(处理数据的函数或过程)。程序员一般不对类进行操作,而只能对类的实例对象进行操作。 visual baisc所使用的每种控件都对应着一个类,如button按钮控件对应着button类,它们支持封装和多态性,但它们不支持继承,即不能从现有的类(控件)来创建新的类(控件)。 有时用户需要创建自己的类以实现特定的功能,则可以通过类模块创建自己的类。类模块文件的的扩展名为.cls。,*7.6.3 类模块,缺省情况下,应用程序中的第一个窗体为启动窗体,如果想在应用程序启动时首先显示其它窗体,那么就得在“工程属性”对话框中改变启动窗体的名称。 有时,有些应用程序启动时需要先做一些初始化工作,如装入数据文件,然后再根据数据文件的内容决定显示哪个窗体;有时应用程序根本就不需要加载窗体(比如一些监控程序)。为此,可以在标准模块中编写一个main过程,作为应用程序的入口。 定义sub main过程为启动程序的步骤: “工程” “工程属性” 选择“通用”选项卡在“启动对象”下拉列表框中选择“sub main”。,7.6.4 sub main过程,过程的建立位置不同,允许被访问的范围也不同。 作用域: 模块级、全局级 1. 模块级过程: 在过程前如果加private关键字,则这种过程只能被其所在的模块中的其他过程所调用。 2. 全局过程: 在过程前如果加public关键字(或省略),则这种过程可以被其他模块中的过程所调用。 调用格式: 模块名.过程名(参数表) 注意:标准模块中的全局过程名如果唯一,则调用时可以省略模块名,7.6.5 过程的作用域,例:设窗体form1中有按钮: command1、 command2 public sub aa() aa为全局过程 msgbox (“这是窗体form1中的过程“) end sub private sub command1_click() call aa end sub private sub command2_click() form2.show end sub,添加标准模块module1 ,编写以下过程: public sub bb() bb为全局过程 msgbox (“这是标准模块中的过程bb“) end sub,设窗体form2中有按钮: command1 、 command2 private sub command1_click() call form1.aa end sub private sub command2_click() call module1.bb end sub,7.7 变量的作用域与生存期,变量的作用域: 指变量的有效范围。 变量的生存期: 指变量的作用时间。 7.7.1 变量的作用域 将变量分为: 局部变量 模块级变量 全局变量,1. 局部变量 声明 不声明 dim a as integer a每次执行过程时被初始化 static c as single c在应用程序执行期间保持不变 作用范围 仅在声明的过程中起作用 其他过程中即使有同名变量,也不是指同一变量。,例: sub s() x = 1 y = 2 z = x + y print x, y, z end sub private sub c1_click() x = 2 y = 3 z = x + y call s print x, y, z end sub,单击c1后运行结果: 1 2 3 2 3 5,2. 模块级变量 声明 在模块的通用声明段中用以下方法声明的变量。 private 在模块运行时被初始化 dim 在模块运行时被初始化 作用范围 在该模块的所有过程中都起作用 其他模块不能访问这些变量 3. 全局变量 声明 在模块的通用声明段中用以下方法声明的变量 public 应用程序运行时被初始化 作用范围: 应用程序的所有过程,例: dim z as integer sub s() z = z + 2 pr

温馨提示

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

评论

0/150

提交评论