已阅读5页,还剩64页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章过程 本章要点 function过程 sub过程 参数的传递 过程的嵌套调用过程的递归调用 vb的工程结构变量的作用域与生存期 过程的引入 使同类的操作不重复 操作方法相同 参数不同 过程 完成一段独立功能 可供其他过程使用 调用 过程又称为子程序调用过程 调用其他过程的过程 调用过程 调用sprg1调用sprg1调用sprg2 子过程 sprg1 子过程 sprg2 过程分类 sub过程 function过程 内部过程 方法 事件过程自定义过程 内部函数自定义函数 其中 自定义函数和自定义过程统称为通用过程 7 1function过程 函数过程 7 1 1function过程的定义1 function过程的格式 public private static function as exitfunction endfunction 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 exitfunction语句 从function过程中退出 8 function过程通过赋值语句 将函数的返回值赋给 9 function过程的定义不能嵌套 3 function过程的建立 建立位置窗体模块标准模块类模块 建立方法直接在代码窗口中输入应写在 通用 的位置 使用菜单命令 工具 添加过程先切换到代码窗口 才可以使用该菜单命令 例7 1 编写一个计算n 的function过程 分析 确定参数个数 类型 函数名 类型functionfact nasinteger aslongdimiasinteger faslongf 1 f用于保存阶乘值fori 1tonf f inextifact f 给函数过程名赋值endfunction 例7 2 编写一个function过程 计算下面表达式的值 问 应设置几个参数 functionf x y z f sqr abs x 3 y 3 z 3 endfunction 这里的参数和函数名都没有定义类型 默认为variant类型 7 1 2function过程的调用 1 调用位置 直接在表达式中调用 2 调用格式 其中 常量 变量或表达式各参数之间用逗号分隔如果是数组 在数组名之后要跟一对空括号 例7 3 从键盘任意输入一个整数 然后调用计算阶乘的函数求该整数的阶乘值 设计界面和运行界面如下 设计界面 运行界面 代码如下 optionexplicit 自定义求阶乘的函数过程factfunctionfact nasinteger aslongdimiasinteger faslongf 1fori 1tonf f inextifact f 给函数过程名赋值endfunction 在按钮的click事件过程中调用函数过程privatesubcommand1 click dimxasintegerx val text1 text label2 caption trim str x 的阶乘数为 使用fact x 调用函数过程label3 caption trim str fact x endsub 例7 4 利用function过程计算阶乘 求组合数 设计界面如下图 代码如下 定义求阶乘的函数factfunctionfact nasinteger asdoubledimfasdouble iasintegerf 1fori 1tonf f inextifact fendfunction 按钮的click事件过程privatesubcommand1 click dimmasinteger nasinteger casdoublen val text1 text m val text2 text 调用fact函数求各阶乘值c fact m fact n fact m n text3 text trim str c endsub 例7 5 编写function过程求最大公约数 并通过命令按钮的单击事件过程调用该函数过程 functionhcf masinteger nasinteger asintegerdimrasintegerr mmodndowhiler0m nn rr mmodnloophcf nendfunctionprivatesubcommand1 click dimmasinteger nasintegerm val text1 text n val text2 text label3 caption str hcf m n endsub 例7 6 编写一个function过程 返回指定个数的字符串 字符串以a开始 例如 当指定个数5时 函数返回字符串 abcde 运行时单击按钮调用该函数过程 实现在窗体上按指定的行数输出如下图所示的图形 createstr函数返回n个字符privatefunctioncreatestr nasinteger dimtmpstrasstring iasintegertmpstr strasc用于保存字符的ascii码strasc asc a 1fori 1tonstrasc strasc 1 生成下一字符的ascii码tmpstr tmpstr space 1 chr strasc nexticreatestr tmpstrendfunction 输出图形 按钮的click事件过程privatesubcommand1 click dimnasinteger iasinteger 指定图形的行数n val inputbox 图形的行数 请输入 5 clsprintfori 1tonprinttab 2 i 输出左半部分printcreatestr 2 n 2 i 1 printspc 4 左右两部分的间隔printcreatestr 2 i 1 输出右半部分printnextiendsub 7 2sub过程 当需要自定义过程返回一个值时 使用function过程很容易实现 但在实际应用中 可能希望过程不需要返回值 例如 使用过程打印一个图形 或需要过程返回多个值 例如 利用过程对一批数据进行排序 在这些情况下就需要使用sub过程 7 2 1sub过程的定义 1 sub过程的格式 private public static sub exitsub endsub2 说明 1 exitsub用于退出sub过程 2 不具有值的意义 在sub过程中不能给赋值 也不能给定义类型 3 sub过程通过中的参数返回值 4 sub过程的建立方法与function过程的建立方法相同 例7 7 编写计算n 的sub过程 分析 参数表中应有一个参数n 还应有另一个参数f用来返回阶乘值 subfact nasinteger faslong dimiasintegerf 1fori 1tonf f inextiendsub 例7 8 编写sub过程 打印以下图形 分析 打印该图形不需要返回值 因此无需引入参数 suba fori 1to6printtab 7 i forj 1to2 i 1print nextjprintnextiendsub 例7 9 编写sub过程 求三个数中的最大数和最小数 分析 首先要设置三个参数 如x y z 用于接收三个原始数据 另外引入两个参数max和min 用于返回最大和最小数 subs x y z max min max xmin xify maxthenmax yifymaxthenmax zifz minthenmin zendsub 7 2 2sub过程的调用 说明 1 要调用的sub过程名 2 可以是常量 变量或表达式 各参数之间用逗号分隔 如果是数组参数 则要在数组名之后跟一对空括号 3 用call语句调用一个sub过程时 如果过程本身没有参数 则省略和括号 4 格式二省略了call关键字 同时两边也不能带括号 格式一 call 格式二 例7 10 将求组合数一题改成用sub过程实现subfact nasinteger faslong dimiasintegerf 1fori 1tonf f inextiendsubprivatesubcommand1 click dimmasinteger nasintegerdimf1aslong f2aslong f3aslongm val text1 text n val text2 text callfact m f1 callfact n f2 callfact m n f3 text3 text trim str f1 f2 f3 endsub 例7 11 编写一个sub过程 计算k个数的和 即1 2 k 并通过命令按钮的单击事件调用该过程计算s 1 1 2 1 2 3 1 2 n 分析 编写一个sub过程计算1 2 k 设参数k s 参数s用于返回该和值 suba1 kasinteger sasinteger s 0forj 1toks s jnextjendsub privatesubcommand1 click dimnasinteger s1asinteger iasintegern val text1 text fori 1ton 调用过程a1求1 2 i 和值返回到s1中calla1 i s1 sum sum s1nextitext2 text sumendsub 7 3参数的传递 参数传递是指调用过程与被调用过程之间的一种数据通讯方法 数据的传递方式可以是单向的 也可以是双向的 分别称为按值传递和按地址传递 数据传递是通过形参和实参进行传递的 7 3 1形参和实参 形参 出现在sub或function语句中 实参 出现在调用程序中 例如 定义如下一个过程 subsubtest nasinteger sumassingle endsub调用语句 callsubtest a s 形参 实参 说明 一般情况下 形参表与实参表中对应参数个数 类型 位置顺序必须一一对应 除非使用关键字optional或paramarray对形参进行了约束 形参表中的参数可以是 除固定长度字符串之外的合法变量名 数组名 实参表中的参数可以是 常量 变量 表达式 数组名 形参与实参的结合有两种方式 按值传递和按地址传递 1 按值传递实参把其值传递给形参而不传递实参的地址 数据的传递是单向的 1 当实参为常量或表达式时 数据传递总是单向的 例如 callsubtest 10 1 2 subsubtest nasinteger sumassingle 7 3 2按值传递和按地址传递 2 实参是变量时 要实现按值传递需要在形参之前通过关键字byval来实现 例如 subss byvalx byvaly byvalz x x 1 y y 1 z z 1endsubprivatesubcommand1 click a 1 b 2 c 3callss a b c printa b cendsub运行时 单击命令按钮在窗体上打印 123 2 按地址传递指将实参的地址传给形参 使形参和实参具有相同的地址 即形参与实参共享同一存储单元 1 当实参为变量或数组时 形参使用关键字byref定义 或省略 表示要按地址传递 2 当参数是数组时 数组名之后必须使用一对空的圆括号 按地址传递可以实现调用过程与子过程之间数据的双向传递 例 subss byrefx byrefy byrefz x x 1 y y 1 z z 1endsubprivatesubcommand1 click a 1 b 2 c 3callss a b c printa b cendsub 运行时 单击命令按钮在窗体上打印 234 例7 14 编写一个计算乘幂的function过程 用来计算x的y次幂 其中y 0 单击窗体时调用该过程打印51 52 53 54 55的值 functionpower xassingle byvalyasinteger dimresultassingleresult 1dowhiley 0result result xy y 1looppower resultendfunction privatesubform click dimiasintegerfori 1to5printpower 5 i nextiendsub 思考 如果取消过程power中参数y前的关键字byval 则会出现什么情况 例7 15 编写三个sub过程letarray过程 产生 0 99 之间的随机整数 并赋值给一维数组 sortarray过程 实现数组从大到小排序 printarray过程 实现数组的输出 1 letarray过程subletarray value asinteger dimiasinteger nasintegerrandomizen ubound value fori 1tonvalue i int 100 rnd nextiendsub 2 sortarray过程 实现数组从大到小排序subsortarray value asinteger dimiasinteger jasinteger nasinteger tasintegern ubound value fori 1ton 1forj i 1tonifvalue i value j thent value i value i value j value j tendifnextjnextiendsub 3 sortarray过程 实现数组的输出subprintarray value asinteger dimiasinteger nasintegern ubound value fori 1tonprintvalue i ifimod4 0thenprint 每行显示4个数nextiendsub 在时间过程中调用以上sub过程 privatesubcommand1 click dimvalue 20 asintegercallletarray value print 排序前 callprintarray value callsortarray value print 排序后 callprintarray value endsub 7 4过程的嵌套调用 在一个过程执行期间又调用另一个过程 称为过程的嵌套调用 调用过程子过程s1子过程s2 调用s1 调用s2 例7 16 求 即求1 2 3 20 用function过程实现 设计以下函数 1 设计一个过程fact求n 2 设计另一个过程sigma求n个数的和 代码如下 privatesubcommand1 click dimnasintegern val inputbox n printsigma n 调用sigma过程endsubfunctionsigma nasinteger asdoubledimiasinteger sumasdoublesum 0fori 1tonsum sum fact i 调用fact过程nextisigma sumendfunction functionfact nasinteger asdoubledimiasinteger fasdoublef 1fori 1tonf f inextifact fendfunction 7 5过程的递归调用 递归调用 在过程中直接或间接调用自身 数学上常用于处理阶乘运算 级数运算 幂指数运算等问题 例 求n functionf n f1 1fori 1tonf1 f1 inextif f1endfunction functionf n ifn 1thenf 1elsef n f n 1 endifendfunction 例7 17 求n privatesubcommand1 click dimnasintegern val text1 text text2 text f n endsubpublicfunctionf n ifn 1thenf 1elsef n f n 1 endifendfunction 7 6vb工程结构 vb应用程序由三种模块组成 窗体模块 form 文件扩展名 frm 标准模块 module 文件扩展名 bas 类模块 class 文件扩展名 cls 1 窗体模块包含 事件过程通用过程通用声明 常量 变量 数组 外部过程 2 可以用文本编辑器查看窗体模块查看方法 右击 frm文件 选择打开方式为记事本显示 描述信息及程序代码 7 6 1窗体模块 当一个应用程序含有多个窗体时 可能其中的几个窗体都需要调用某一段公共代码 如果在每个窗体内都包含这些代码 就会造成大量的代码冗余 这时就可以在标准模块内建立一个包含此公共代码的通用过程 实现代码的共享 标准模块不对应于某个窗体 是纯代码模块 标准模块可以包含 全局常量 变量 全局过程标准模块级常量 变量 通用过程注 不能包含事件过程添加 工程 添加模块 选 新建 标签 打开 添加模块 对话框 默认名字 modulex 7 6 2标准模块 类是具有相同或相似特征的事物的集合 类封装了对象的属性 数据成员 和方法 处理数据的函数或过程 程序员一般不对类进行操作 而只能对类的实例 对象进行操作 visualbaisc所使用的每种控件都对应着一个类 如button按钮控件对应着button类 它们支持封装和多态性 但它们不支持继承 即不能从现有的类 控件 来创建新的类 控件 有时用户需要创建自己的类以实现特定的功能 则可以通过类模块创建自己的类 类模块文件的的扩展名为 cls 7 6 3类模块 缺省情况下 应用程序中的第一个窗体为启动窗体 如果想在应用程序启动时首先显示其它窗体 那么就得在 工程属性 对话框中改变启动窗体的名称 有时 有些应用程序启动时需要先做一些初始化工作 如装入数据文件 然后再根据数据文件的内容决定显示哪个窗体 有时应用程序根本就不需要加载窗体 比如一些监控程序 为此 可以在标准模块中编写一个main过程 作为应用程序的入口 定义submain过程为启动程序的步骤 工程 工程属性 选择 通用 选项卡 在 启动对象 下拉列表框中选择 submain 7 6 4submain过程 过程的建立位置不同 允许被访问的范围也不同 作用域 模块级 全局级1 模块级过程 在过程前如果加private关键字 则这种过程只能被其所在的模块中的其他过程所调用 2 全局过程 在过程前如果加public关键字 或省略 则这种过程可以被其他模块中的过程所调用 调用格式 模块名 过程名 参数表 注意 标准模块中的全局过程名如果唯一 则调用时可以省略模块名 7 6 5过程的作用域 例 设窗体form1中有按钮 command1 command2publicsubaa aa为全局过程msgbox 这是窗体form1中的过程 endsubprivatesubcommand1 click callaaendsubprivatesubcommand2 click form2 showendsub 添加标准模块module1 编写以下过程 publicsubbb bb为全局过程msgbox 这是标准模块中的过程bb endsub 设窗体form2中有按钮 command1 command2privatesubcommand1 click callform1 aaendsubprivatesubcommand2 click callmodule1 bbendsub 7 7变量的作用域与生存期 变量的作用域 指变量的有效范围 变量的生存期 指变量的作用时间 7 7 1变量的作用域将变量分为 局部变量模块级变量全局变量 1 局部变量 声明不声明dimaasinteger a每次执行过程时被初始化staticcassingle c在应用程序执行期间保持不变 作用范围仅在声明的过程中起作用其他过程中即使有同名变量 也不是指同一变量 例 subs x 1y 2z x yprintx y zendsubprivatesubc1 click x 2y 3z x ycallsprintx y zendsub 单击c1后运行结果 123235 2 模块级变量 声明在模块的通用声明段中用以下方法声明的变量 private 在模块运行时被初始化dim 在模块运行时被初始化 作用范围在该模块的所有过程中都起作用其他模块不能访问这些变量3 全局变量 声明在模块的通用声明段中用以下方法声明的变量public 应用程序运行时被初始化 作用范围
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年泉州市鲤城区法检系统书记员招聘考试参考试题及答案详解
- 2026年安徽省马鞍山市中小学教师招聘笔试参考题库及答案详解
- 2025年惠州市惠城区街道办人员招聘笔试试题及答案详解
- 2026年潍坊市寒亭区中小学教师招聘笔试参考题库及答案详解
- 2026年郑州市二七区中小学教师招聘笔试备考试题及答案详解
- 2026年兰州市城关区中小学教师招聘考试参考题库及答案详解
- 2026年浙江省杭州市街道办人员招聘笔试参考试题及答案详解
- 2026年淮北市烈山区街道办人员招聘笔试参考试题及答案详解
- 2026年伊春市金山屯区法检系统书记员招聘笔试模拟试题及答案详解
- 2026年鞍山市铁西区法检系统书记员招聘考试参考题库及答案详解
- 成都市金牛区卫生健康局所属事业单位2026年招募医务社会工作服务岗位(5人)笔试备考题库及答案详解
- 无粘结预应力钢绞线施工方案及工艺方法
- 【世界经济论坛】塑造学习的未来:人工智能时代的教育准备
- 2026年高考(浙江卷)历史试题及答案
- 电商运营流程与管理制度
- 痰湿体质的中医护理
- DBJ-T 13-491-2025 福建省建筑修缮工程施工质量验收标准
- 2023-2024学年北京市海淀区九年级(上)期末数学试卷(含解析)
- 《反应器操作与控制》教学课件-04流化床反应器操作与控制
- DIY甜品创业计划书
- 心内科导管室进修汇报
评论
0/150
提交评论