子程序和函数_第1页
子程序和函数_第2页
子程序和函数_第3页
子程序和函数_第4页
子程序和函数_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第八章子程序和函数 8 1子程序概述在VB5 0 6 0中 除了系统提供的内部函数过程和事件过程外 用户可自定义过程下列四种过程 Sub 保留字开始的为子过程 Function 保留字开始的为函数过程 Property 保留字开始的为属性过程 Event 保留字开始的事件过程 在VB中 的Sub子过程分为 事件过程和通用过程8 2 1事件过程 1 窗体事件的语法PrivateSubForm 事件名 参数列表 语句组 EndSub 2 控件事件的语法PrivateSub控件名 事件名 参数列表 语句组 EndSub 8 2Sub过程 子过程的定义形式如下 Public Private Static Sub子过程名 形参表 语句组 ExitSub 语句组 EndSub 8 2 2通用过程 Sub过程 的定义 说明 1 子过程名 命名规则与变量名规则相同 子过程名不返回值 而是通过形参与实参的传递得到结果 调用时可返回多个值 2 形式参数列表 形式参数通常简称 形参 仅表示形参的类型 个数 位置 定义时是无值的 只有在过程被调用时 虚实参结合后才获得相应的值 3 过程可以无形式参数 但括号不能省 4 参数的定义形式 ByVal ByRef 变量名 As类型 ByVal表示当该过程被调用时 参数是按值传递的 缺省或ByRef表示当该过程被调用时 参数是按地址传递的 例8 1编一个交换两个整型变量值的子过程 PrivateSubSwap XAsInteger YAsInteger DimtempAsIntegerTemp X X Y Y TempEndSub 8 2 3子过程的建立 通过 工具 菜单中的 添加过程 命令 出现 添加过程 对话框 见图6 1 选择过程类型 子过程 函数 属性 事件 及作用范围 公有的Public 私有的Private 单击确定后得到一个过程或函数定义的结构框架 模板 如 PublicSubSort EndSub 8 2 4过程的调用1子过程的调用子过程名 参数列表 或Call子过程名 参数列表 2函数过程的调用变量名 函数过程名 参数列表 说明 1 参数列表称为实参或实元 它必须与形参保持个数相同 位置与类型一一对应 2 调用时把实参值传递给对应的形参 其中值传递 形参前有ByVal说明 时实参的值不随形参的值变化而改变 而地址传递时实参的值随形参值的改变而改变 3 当参数是数组时 形参与实参在参数声明时应省略其维数 但括号不能省 4 调用子过程的形式有两种 用Call关键字时 实参必须加圆括号括起 反之则实参之间用 分隔 例 调用上面定义的Sawp子过程的形式 SCallS PrivateSubCmdOK CallS SEndSub PrivateSubS Dimtemp Temp XX YY TempEndSub 过程调用的执行过程 8 3Function过程 VisualBasic函数分为内部函数和外部函数 外部函数是用户根据需要用Function关键字定义的函数过程 与子过程不同的是函数过程将返回一个值 8 3 1函数过程 Function过程 的定义 Public Private Static Function函数名 As 函数体 函数名 返回值 ExitFunction 函数名 返回值 EndFunction 说明 1 函数名 命名规则与变量名规则相同 但不能与系统的内部函数或其它通用子过程同名 也不能与已定义的全局变量和本模块中模块级变量同名 2 在函数体内 函数名可以当变量使用 函数的返回值就是通过对函数名的赋值语句来实现的 在函数过程中至少要对函数名赋值一次 3 AS类型 是指函数返回值的类型 若省略 则函数返回变体类型值 Variant 4 ExitFunction 表示退出函数过程 常常是与选择结构 If或SelectCase语句 联用 即当满足一定条件时 退出函数过程 5 形参数列表 形参的定义与子过程完全相同 例6 2 8 3 2函数的调用 调用形式如下 函数名 实参列表 说明 在调用时实参和形参的数据类型 顺序 个数必须匹配 函数调用只能出现在表达式中 其功能是求得函数的返回值 8 4过程的作用域 Public Private Sub子过程名 形式参数列表 EndSub 概念 通用子过程和函数过程既可写在窗体模块中也可写在标准模块中 在定义时可选用关键字Private 局部 和Public 全局 来决定它们能被调用的范围 1 窗体 模块级过程 加Private关键字的过程 只能被定义的窗体或模块中的过程调用 2 全局级过程 加Public关键字 或缺省 的过程 可供该应用程序的所有窗体和所有标准模块中的过程调用 按过程的作用范围来划分 过程可分为 模块级过程全局级过程 用例7 1来说明过程的作用域 总结归纳过程的定义及作用域如下表 教材Pg 163 8 5过程之间参数的传递 VisualBasic中不同模块 过程 之间数据的传递有两种方式 通过过程调用实参与形参的结合实现 使用全局变量来实现各过程中共享数据 8 5 1形式参数与实际参数 1 形式参数是指在定义通用过程时 出现在Sub或Function语句中的变量名后面园括号内的数 是用来接收传送给子过程的数据 形参表中的各个变量之间用逗号分隔 2 实际参数实际参数是指在调用Sub或Function过程时 写入子过程名或函数名后括号内的参数 其作用是将它们的数据 数值或地址 传送给Sub或Function过程与其对应的形参变量 实参可由常量 表达式 有效的变量名 数组名 后加左 右括号 如A 组成 实参表中各参数用逗号分隔 8 5 2参数传递 虚实结合 参数传递指主调过程的实参 调用时已有确定值和内存地址的参数 传递给被调过程的形参 参数的传递有两种方式 按值传递 按地址传递 形参前加 ByVal 关键字的是按值传递 缺省或加 ByRef 关键字的为按地址传递 传址与传值传址 形参得到的是实参的地址 当形参值的改变同时也改变实参的值 传值 形参得到的是实参的值 形参值的改变不会影响实参的值 SubSwap2 x y DimTemp Temp x x y y TempEndSub SubSwap1 ByValx ByValy DimTemp Temp x x y y TempEndSub 例8 4 PrivateSubCmdOK Click a 10 b 20 Swap1a b 传值Print A1 a B1 ba 10 b 20 Swap2a b 传地址Print A2 a B2 bEndSub 程序调用执行过程 值传递的执行过程如下图 通过地址传递数据的执行过程 数据传递的几点说明 1 参数的数据类型2 按值传递参数形参是实参的一个副本3 按地址传递参数形参实参公用内存单元4 子过程执行一系列操作 函数过程返回一个值注意 如果实参是常量 系统常量 符号常量 或者表达式 则无论定义时使用值传递还是地址传递 都是按值传递将常量或者表达式的计算值传递给形参 8 6高级用法 数组做为参数 VisualBasic允许把数组作为实参传送到过程中 数组作参数是通过传地址方式传送 在传送数组时 除遵守参数传送的一般规则外 还应注意以下几点 1 把一个数组的全部元素传送给一个过程 应将数组名分别写入形参列表中 并略去数组的上下界 但括号不能省略 PrivateSubSort a Assingle EndSub其中形参 a 即为数组 2 被调过程可通过Lbound和Ubound函数确定实参数组的上 下界 3 当用数组作形参时 对应的实参必须也是数组 且类型一致 4 实参和形参结合是按地址传递 即形参数组和实参数组共用一段内存单元 例如 定义了实参数组b 1to8 给它们赋了值 调用Sort 函数过程的形式如下 Sortb 或CallSort b 实参数组后面的括号可以省略 但为便于阅读 建议一般不要省略为好 调用时形参数组a和实参数组b虚实结合 共用一段内存单元 如下所示 因此在Sort 过程中改变数组a的各元素值 也就相当于改变了实参数组b中对应的元素的值 当调用结束时 形参数组a成为无定义 b 1 b 2 b 3 b 4 b 5 b 6 b 7 b 8 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 参数为数组时虚实结合示意图 例6 7改写上章例5 3的排序程序 分别将排序用子过程Sort 产生N个随机整数用子过程GetData 输入N个数组元素用PrData 子过程来完成 补充例题 编写判断一个整数是不是素数写函数过程 如果给定的整数是素数 则返回逻辑值True 否则返回False PrivateFunctionPrime nAsInteger AsBooleanDimk YesAsBooleanYes TrueFork 2ton 2IFnmodk 0thenYes False ExitForNextkPrime Yes 给函数名赋值 作为函的返回值EndFunction 如何调用该函数呢 使用该函数 编一验证哥德巴赫猜想 PrivateSubForm Click Dimn n1 n2 n Val InputBox 输入大于6的正整数 Forn1 3ton 2step2 让n1从3开始分解n2 n n1 求得n2 如果n1和n2都是素数 则打印输出Ifprime n1 Andprime n2 thenPrintn n1 n2ExitFor 结束循环EndifNextn1EndSub Fori 1Ton 1p iForj i 1TonIfa p a j Thenp jNextjtemp a i a i a p a p tempNexti 选择法排序 升序 的VB程序 如何写一个排序的VB过程 补充例题2 排序子过程 PrivateSubSort a Assingle Dimi j p n temp n Ubound a Fori 1Ton 1p iForj i 1TonIfa p a j Thenp jNextjtemp a i a i a p a p tempNextIEndSub 8 7过程的嵌套和递归调用 8 7 1过程的嵌套 在程序中调用一子过程 而在子过程中又调用另外的子过程 这种程序结构称为过程的嵌套 过程的嵌套调用执行过程如下图 8 7 2过程的递归调用 用自身的结构来描述自身 称递归 例如 对阶乘的定义 VisualBasic允许在一个Sub子过程和Function过程的定义内部调用自己 即递归Sub子过程和递归Function函数 例8 8编求阶乘fac n n 的递归函数 PrivateFunctionfac nAsInteger AsIntegerIfn 1Thenfac 1Elsefac n fac n 1 EndIfEndFunctionPrivateSubForm Click Print fac 4 fac 4 EndSub 程序的递归过程 说明 递归处理一般用栈来实现 分递推和回归两个过程 如上图所示 递推过程 每调用一次自身 把当前参数 形参 局部变量 返回地址等 压入栈 直到递归结束条件成立 回归过程 然后从栈中弹出当前参数 直到栈空 递归算法设计简单 解决同一问题 使用递归算法消耗的机时和占据的内存空间要比使用非递归算法大 使用递归算法必须要满足以下的递归条件 1 存在递归结束条件及结束时的值 2 能用递归形式表示 且递归向终止条件发展 8 8应用举例 8 8 1查找问题 例8 11使用顺序查找法 在一组数中查找某给定的数x 算法设计 设一组数据存放在数组a 1 a n 中 待查找的数据放在x中 把x与a数组中的元素从头到尾一一进行比较查找 用变量p表示a数组元素下标 p初值为1 使x与a p 比较 如果x不等于a p 则使p p 1 不断重复这个过程 一旦x等于a p 则退出循环 另外 如果p大于数组长度 循环也应该停止 则可由以下语句来实现它 ForP 1tonIFa p xthenExitForNextP 下面编写一查找函数Find 若找到x则返回下标值 找不到返回0PrivateFunctionFind a AsSingle xAsSingle AsIntegerDimn p m m Lbound a n Ubound a ForP mtonIFa p xthenExitForNextPIfp nthenp 0Find pEndFunction 例8 12使用折半查找法 在一批有序数列中查找给定的数x 分析 设n个有序数 从小到大 存放在数组a 1 a n 中 要查找的数为x 用变量bot top mid分别表示查找数据范围的底部 数组下界 顶部 数组的上界 和中间 mid top bot 2 折半查找的算法如下 1 x a mid 则已找到退出循环 否则进行下面的判断 2 xa mid x必定落在mid 1和top的范围之内 即bot mid 1 4 在确定了新的查找范围后 重复进行以上比较 直到找到或者bot top 8 8 2插入问题 例8 13把一个给定数插到有序数列中 插入后数列仍然有序分析 设n个有序数 从小到大 存放在数组a 1 a n 中 要插入的数x 首先确定x插在数组中的位置p 可由以下语句实现 ReDimPreservea n 1 让数组长度增加1 以便存放插入的数p 1dowhilex a p andp np p 1loop a p a n 元素向后顺移一个位置以空出a p 元素放入x 可由以下语句实现 fori ntopstep 1a i 1 a i nextia p x 将其写成一插入函数 教材Pg 154 VB提供了上百种内部函数 库函数 要求掌握这些常用函数的功能及使用 调用方法 函数名 参数列表 有参函数函数名无参函数说明 1 使用库函数要注意参数的个数及其参数的数据类型 2 要注意函数的定义域 自变量或参数的取值范围 例如 sqr x 要求 x 0 3 要注意函数的值域 如 exp 23773 的值就超出实数在计算机中的表示范围 8 9常用内部函数 1 数学函数常用的数学函数见P121表8 1所示Abs N Cos N Sin N Exp N Log N Sqr N Rnd N Sgn N 说明 1 在三角函数中的自变量是以弧度为单位 如 sin300sin 3 14159 180 30 2 Rnd函数返回0 1 包括0和不包括1 之间的双精度随机数 若要产生1 100的随机整数 Int Rnd 100 1提问 怎样产生 N M 区间的随机数 2 转换函数常用的转换函数见p123表8 4所示说明 1 要区别两个取整函数int 和fix Fix N 为截断取整 即去掉小数后的数 Int N 不大于N的最大整数 N 0与int N 相同 当N 0时 int N 与fix N 1相等 例如 Fix 9 59 9 Int 9 59 9Fix 9 59 9 Int 9 5

温馨提示

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

评论

0/150

提交评论