380 likes | 539 Views
Visual Basic. 程序设计教程. 第九讲. VB 工程基础与常用算法. 本讲教学内容. 4.5 VB 工程设计基础 4.6 常用算法设计. 4.5 VB 工程设计基础 一、 VB 工程的组成. 2. 各自的作用 从这个结构中可以看到,工程文件是整体的定义,所有内容都包含在工程内。 工程下经常使用的内容包括 3 个部分:窗体组、公共模块组和类模块组。 窗体组主要用于建立窗体,然后在窗体布置控件及设置公共信息,设置各控件的属性、方法和事件过程。
E N D
Visual Basic 程序设计教程
第九讲 VB工程基础与常用算法
本讲教学内容 4.5 VB工程设计基础 4.6 常用算法设计
4.5 VB工程设计基础 一、VB工程的组成
2. 各自的作用 • 从这个结构中可以看到,工程文件是整体的定义,所有内容都包含在工程内。 • 工程下经常使用的内容包括3个部分:窗体组、公共模块组和类模块组。 • 窗体组主要用于建立窗体,然后在窗体布置控件及设置公共信息,设置各控件的属性、方法和事件过程。 • 公共模块组主要用于存放用户自定义的子过程、自定义函数和设置有关公共变量。
二、变量的作用域 1. 什么是变量作用域 变量作用域是指变量可作用范围。 2. 按作用域分变量有以下几种类型 • 局部变量 • 窗体级变量 • 全局变量 • 静态变量
(1) 局部变量 • 窗体上的控件建立事件过程的内部用Dim声明,或不说明而直接使用的变量是局部变量。 • 局部变量仅仅在这个过程内部有效,在过程之外使用是没有作用的。 • 局部变量是在过程执行时,才会在内存中为变量开辟存储单元,过程结束时局部变量所占用的内存单元将被释放,每次调用过程时局部变量都会重新分配空间。 • 局部变量的作用域为定义变量的过程内部使用。
(2) 窗体级变量 • 如果需要在一个窗体中各个控件的事件过程中使用同一个变量,这个变量就要被定义为窗体级变量。 • 在程序代码窗口的通用声明段中用Dim语句声明的变量称为窗体级变量。 • 窗体级变量可以被本窗体的任何过程访问。 • 窗体级变量随着窗体的加载而生成,只要窗体不被卸载就一直占用内存的单元。 • 窗体级变量的作用域为定义变量的窗体内部使用。
(3) 全局变量 • 如果一个多窗体的工程,而且需要在多个窗体之间使用同一个变量,该变量必须定义为全局变量。 • 全局变量必须在工程公共标准模块中用Public语句声明。 • 声明格式:Public 变量名 [As 类型] • 全局变量在执行工程时就已经在内存中形成,并一直保存到工程结束为止。 • 全局变量的作用域为整个工程。
(4) 静态变量 • 局部变量会随着过程的结束而消失,如果希望下次执行这个过程时能够找到原来执行时生成的值,就要使用静态变量。 • 静态变量一般在过程内定义。 • 静态变量定义形式:Static 变量名 [As 类型] • 静态变量在第一次使用过程时生成,而过程结束时静态变量不释放一直保存,再次调用过程时静态变量保持原来的值。 • 静态变量只能被定义的过程所使用,不会被其他过程所使用,所以其作用域也是在定义变量的过程内部使用。
变量优先级 如果在一个工程中出现了不同级别的变量同名的情况,就需要搞清各级别之间的优先级。系统规定作用域小的变量优先级高于作用域大的变量。 如果在优先级高的变量作用域内使用优先级低的同名变量,则需要在变量名字前加上窗体名或工程名,标志这是一个优先级低的变量。
三、过程作用域 1. 什么是过程作用域 过程作用域是指过程可作用的范围。 2. 按作用域分类过程有哪几种类型 • 窗体/模块级过程 • 全局级过程
3. 窗体/模块级过程特点 • 窗体模块级过程是在由Private方式定义的过程。 • 窗体/模块级过程仅仅在本身的窗体/模块内部有效,在窗体/模块级之外是没有作用的。 • 所以窗体/模块级过程的作用域是过程所在的窗体/模块。
4. 全局级过程的特点 • 全局级过程是由Public方式定义的过程。 • 全局级过程在工程内的所有窗体和模块中都有效。 • 所以其作用域是整个工程。
5. 不同级过程比较 在一个工程中出现了不同级别的过程同名的情况时,与变量的使用方式相同,系统规定各级别之间的优先级为作用域小的过程的优先级高于作用域大的过程。 使用时应避免同名过程的出现。 下面介绍过程声明与作用域:
四、过程、函数及参数传递 1. 基本问题 (1) 什么是过程 过程就是完成某一特定功能的程序,可供事件过程或其它过程所调用。 (2) VB有两大类过程 • 系统提供的内部函数和事件过程 • 用户自定义函数和过程
(3) 用户自定义函数和过程的特点 这类函数和过程是用户根据自己的需要定义的,可在工程中被调用执行。 (4) VB提供的自定义过程有如下4种: • Sub子过程 • Function函数过程 • Property属性过程 • Event事件过程 只讨论前两种自定义过程。
(5) 子过程和函数过程的异同点 共同点:都是为完成某个功能而编写的一段程序,使用时被其他过程调用。 不同点:子过程考虑更多的是执行的过程,结果体现在执行过程中,不带有返回值,调用时使用Call语句;函数过程强调的是返回的结果,因此具有类型,调用时需要使用相同类型的变量接收函数的返回值或在表达式中应用函数,函数过程不能单独作为一条语句执行。
2. 子过程和函数过程的形式 (1) 子过程形式 [Private|Public] [Static] Sub <过程名>[(参数表)] <语句序列> [Exit Sub] <语句序列> Eed Sub
说明: • 子过程以Sub开头,以End Sub结束。其中的语句序列称为过程体。 • 过程名:命名规则与变量名相同,由用户指定 • 参数表:过程被调用时传送给该过程的形式参数表。 • Exit Sub语句:表示从过程中退出,并返回主调过程。
(2) 函数过程形式 [Private|Public] [Static] Function <函数名>[(参数表)][As 类型] <语句序列> [Exit Function] [函数名=表达式] End Function
说明: • 函数过程以Function开头,以End Function结束,其它含义与子过程中相似。 • As 类型:是函数过程返回值的数据类型。 • 由函数过程返回的值放在<表达式>中,再将它赋给函数名。 • Exit Function语句:表示从函数过程中退出,并返回主调过程。
3. 子过程与函数过程的创建方法 子过程与函数过程既可以在窗体模块中创建,也可以在标准模块中创建。可能用以下两种方法创建。 (1) 用“工具”菜单下的“添加过程”命令 (2) 用手工输入方法 掌握它们的操作方法
4. 子过程和函数过程的调用方法 (1) 子过程的调用方法 方法1:用Call语句调用Sub过程,格式为: Call 过程名[(参数表)] 方法2:把过程名作为一个语句来使用,格式为: 过程名 [参数表] (2) 函数过程的调用方法 函数名([参数表])
(3) 说明 ① 在Call语句中,参数表必须在括号内,在第二种方法中则必须省略参数表两边的括号。 ② 调用中的参数称为实参。若调用的过程有参数表则调用时也必须有参数,若调用的过程无参数,则调用时也不能有参数。 ③ 调用Sub过程必须是一个独立的语句,不能在表达式中调用Sub过程。 ④ 如果在定义Function过程时有(参数表),那么在调用时也必须有参数表。 ⑤ Function过程调用必须放在表达式中。
5. 参数的传递 (1) 什么是参数传递 定义过程时如果有(参数表),那么在调用时也必须有(参数表),这就是参数传递。 (2) 形式参数与实际参数 • 过程定义中的参数称为形式参数,过程调用时给出的参数称为实际参数。 • 在定义过程时,形参为实参预留位置,而在调用过程时,实参则按位依次传给形参。 • 形参与实参对应的变量名可以不同,但变量个数必须相等,类型必须相同。
例如: Sub Test (m1 As Single, m2 As Integer, m3 As String) …… End Sub 调用语句为: Call Test (A!, B%, “Happy”)
(3) 传递参数有两种方法:按值传递和按址传递 • 按值传递:就是只把实参的值传递给形参,在过程中如果形参的值发生变化不会影响实参的值。 • 按址传递:就是把实参的地址传递给形参,即形参与实参共用一个地址。在过程中如果形参的值发生变化将引起实参的值也发生变化。 两者的区别:在定义过程时如果形参前面带有ByVal则是按值传递,没有加ByVal或者加ByRef则表示按址传递。 【例4-24】举例说明值传递和引用传递的差别。
4.6 常用算法设计 • 素数判别 • 动态字幕 • 冒泡排序 • 顺序查找 • 递归求阶乘 • 最大公约数
【例4-25】判断一个数是否是素数,所谓素数是指能且只能被1和它本身整除的数。【例4-25】判断一个数是否是素数,所谓素数是指能且只能被1和它本身整除的数。
【例4-27】排序的冒泡算法 随机产生10个三位正整数,使用冒泡算法对这组数据按照升序排序。
【例4-28】顺序查找算法 随机产生100个三位正整数,输入一个数,编程判断它是否在产生的数据中。
【例4-30】求两个正整数N和M的最大公约数。 如:N=28,M=35 最大公约数为7