vb中超过50千克每多一千克等于多少升需要20元,如何编程

第一篇:vb编程Visual Basic 程序设计简明教程 第 二 版
Visual Basic
程序设计简明教程
Visual Basic程序设计概述(1)
第二章 VB简单的程序设计(3) 第三章 VB语言基础(2) 第四章 基本的控制结构(6) 第五章 数组(4) 第六章 过程(5) 第七章 常用控件(4) 第八章 界面设计(3) 第九章 文件(2) 第十章 图形(3) 第十一章 数据库技术(1)
第一章 Visual Basic程序设计概述
1.1 1.2 1.3 引例 VB主要功能和特点 VB集成开发环境
1.1 引例1.1
一行内容在窗体左、右移动; 移动两种方法:手动和自动,当自动时,文字闪烁显 示; 当内容超出窗体,进行反弹。
1.1 引例 2.1
对输入的字符进行转换的程序。转换规则:
? 大写字母转换成小写字母, ? 小写字母转换成大写字母 ? 空格不转换 ? 其余转换成“*”。
要求:每输入一个字符,马上就进行判断和转 换。通过上述两例说明VB面向对象、可视化、事件驱 动的特点。
1.2 VB主要功能和特点 1. 具有面向对象的可视化设计工具; 2. 事件驱动的编程机制; 3. 提供了易学易用的应用程序集成开发环境; 4. 结构化的程序设计语言; 5. 支持多种数据库系统的访问; 6. Active技术; 7. VB 6.0在开发环境上、网络功能等的增强; 8. 完备的help联机帮助功能。
1.3 VB集成开发环境
工程窗口 工具箱
1. 主窗口 应用程序窗口,由标题栏、菜单栏和工具栏组成。2. 窗体(form)窗口 设计VB程序的界面。3. 代码(code)窗口 编辑窗体、标准模块中的代码。4. 属性(properties)窗口 所有窗体或控件的属性设置。5. 工程资源管理器(project expror)窗口 保存一个应用程序所有的文件。6. 工具箱(toolbox)窗口 显示各种控件的制作工具,供用户在窗体上设计。
第二章 VB简单的程序设计(3学 2.1 程序设计方法的发展 时)
2.2 2.3 2.4 2.5 2.6 2.7 2.8 VB中的有关概念 建立简单的应用程序 基本控件和属性 工程的管理及环境的设置 生成可执行文件和制作安装盘 程序调试 常见错误
程序设计方法的发展
1. 初期的程序设计
高运行效率、少占用内存为目标。
2. 结构化程序设计
程序的可读性、可维护性为目标。程序= 算法+数据结构 的面向过程的程序设计。
3. 面向对象的程序设计
降低程序的复杂性、提高软件的开法效率和改善工作界 面为目标。程序=对象+消息 的面向对象的程序设计。
对象的有关概念
1. 类 类是创建对象实例的模板, 包含了创建对象的属性描述和 行为特征的定义。2. 对象 是类的一个实例,继承了类的属性、方法。VB中常用的对象有:窗体、控件等。3. 对象的建立和命名 4. 对象的三要素 (1)属性 对象的性质,即用来描述和反映对象特征的参数。(2)方法 对象的行为,即将一些通用的过程编写好并封装起来,作 为方法供用户直接调用。
(3)事件 响应对象的动作称为事件,它发生在用户与应用程序交 互时。如单击控件、鼠标移动、键盘按下等。事件过程 指附在该对象上的用户编写的程序代码,是事件的处理程 序。事件驱动过程 是图形用户界面的本质,由用户控制而代码作出响应。5. VB程序的执行步骤如下: (1)启动应用程序,装载和显示窗体; (2)窗体(或窗体上的控件)等待事件的发生; (3)事件发生时,执行对应的事件过程; (4)重复执行步骤(2)和(3) ; (5) 直到遇到END结束语句结束程序的运行; 或按“结束”强行停止程序的运行。
建立简单的应用程序
以例2.1为例: 1. 建立用户界面的对象; 2. 对象属性的设置; 3. 对象事件过程及编程; 4. 程序运行和调试; 5. 保存文件。
一、常用属性
基本控件和窗体
1. Name名称属性 创建的对象名称,有默认的名。在程序中,控件名是作为对 象的标识而引用,不会显示在窗体上。2. Caption标题属性 该属性决定了控件上显示的内容。3. Height、width、top和left属性
L e ft W id t h
4. Enabled属性 控件是否可操作。当设置为false时,呈暗淡色,禁止用户进 行操作。5. Visible属性 控件是否可见。当设置为false时,用户看不到,但控件本身存 在。6. Font属性 Fontname:字体;Fontsize:字体大小;Fontbold:是否是粗 体; Fontitalic:是否斜体;Fontstrikethru:是否加一删除线。Fontunderline:是否带下划线。例2.2 在窗体是建立两个命令按钮 Command1和Command2, Command2 的Font通过属性窗口设置, 其余属性 通过代码实现
7. Forecolor前景颜色属性 设置控件的前景颜色(即正文颜色).。其值是一个十六进 制常数,用户可以在调色板中直接选择所需颜色。8. Backcolor背景颜色属性 9. Backstyle背景风格属性 0-transparent:透明显示,即控件背景颜色显示不出来。10. BorderStyle边框风格属性 0-None:控件周围没有边框 。1-Fixed Single:控件带有单边框。11. Alignment属性 控件上正文水平对齐方式 0:正文左对齐 ;1:右对齐;2:居中。12. AutoSize属性 控件是否根据正文自动调整大小, False 13. WordWarp属性 AutoSize True时,WordWarp才有效。按正文字体大小在垂直方向上改变显示区域的大小。
14.TabIndex属性 决定了按Tab键时,焦点在各个控件移动的顺序。各个控件默认 TabIndex值就是以控件建立时 的顺序,第一个为0。15.控件默认属性 反映该控件最重要的属性,使用时可省略属性名。注意:Command的默认属性为Default,当该属性为True,当按 Enter键,该控件起作用。
默认控件名 标题 有关属性设置 Name Caption 颜色、对齐、 Form1 MousePointer=99,MouseIcon=Key04.ico 鼠标属性例 左对齐 Alignment=0, BorderStyle =1 Label1 居中 Alignment=1,BorderStyle =1 Label2 自动 AutoSize=True, WordWarp=False, BorderStyle =1 Label3 背景白 BackColor= &H00FFFFFF&, BorderStyle =0 Label4 前景红 ForeColor= &H000000FF&, BorderStyle =0 Label5
最小化按钮 最小化按钮
1.属性 控 制 Caption标题 菜 单 MaxButton、MinButton 框 Icon、ControlBox Picture、AutoRedraw BorderStyle (0 1 2 3 4 5 ) WindowsState (0-正常、1-最小化、2-最大化) 2.事件 Click、DblClick和Load Load 当装入窗体时激发,通常用于对属性和变量初始化 3.方法 Print、Cls和Move等 例2.4 上述属性、Click、DblClick和Load 事件演示。
边 框 样 式
三、标签 Label
用于显示文本(输出)信息,不能作为输入信息的界面。例2.5 显示浮雕效果的文字,实现方法:字颜色、标签位置
四、文本框 TextBox
是一个文本编辑区域,可在该区域输入,编辑和显示正文内容。1.其他属性 ? Text:正文内容;
? Maxlength:设置正文的最多字符个数,0任意长度值; ? MultiLine:是否为多行,默认为一行,False; ? ScrollBars:MultiLine为True时,该属性才有效,表示滚动条的形式 0-None、1-Horizontal、2-Vertical、3-Both; ? Locked:是否可被编辑属性,False,表示为可编辑。? PassWord:口令字符; Text属性返回输入的数据,屏幕显示该字符; ? SelStart、SelLength、SelText:选中文本的起始、长度、内容。
例2.6 复制选中的文本
2.常用事件 ? Change:当改变文本框的Text属性时会引发该事件。
? KeyPress(KeyAscii As Integer):同上,并可返回一个KeyAscii参数 KeyAscii 为13,按回车键;为0 去除刚输入的字符。? LostFocus:当控件失去焦点时发生。? GotFocus:当控件获得焦点时发生。
3.常用方法
[对象.]SetFocus:是把光标移到指定的文本框对象中。
4.文本框的应用 数据过滤
例2.7 要求输入合法的数字数据。当输入结束时(按Tab键),对于 输入正确的数据,显示正确信息;对输入的非数字数据,则响铃 (Beep)、显示错误信息、清除文本框中的内容,并使焦点重新回到文 本框。? Text2_ LostFocus 当输入结束按Tab键时,该事件激发。? IsNumeric(Text2):判断是否输入非数字数据。? Text2.SetFocus:使焦点重新回到文本框。
五、命令按钮CommandButton
接受用户输入的命令。输入命令可以有三种方式: 鼠标单击、Tab键焦点到该按钮、快捷键。
1. 其他属性
Caption:命令按钮显示的内容,可设置快捷键,例 &Ok,显示 Ok。Value: 检查该按钮是否按下。该属性在设计时无效。Picture :按钮可显示图片文件(.bmp和.Ico),当Style为1时有 效。Style:确定显示的形式,0 只能显示文字,1 文字、图形均可 。ToolTipText :设置工具提示,和Picture结合使用。
2. 事件 Click
3. 例 2.8 建立一个允许剪切、复制和粘贴的简单便笺板程序。可增加内容:利用MouseMove事件决定命令按钮的有效性, 即当选中内容,“剪切”、“复制”按钮有效,否则无效。
六、常用方法
方法是面向对象的,故使用的形式为: [对象.]方法 1.Print方法
形式: [对象.]Print[{Spc(n)|Tab(n)}][表达式列表][;|,] 作用:在对象上输出信息 对象:窗体、图形框或打印机(Printer) ,省略对象在窗体上输出。Spc(n)函数:插入n个空格,允许重复使用。Tab(n)函数:左端开始右移动n列,允许重复使用。;(分号):光标定位上一个显示的字符后。,(逗号):光标定位在下一个打印区的开始位置处。无 ;,时换行。开始打印的位置是由对象的CurrentX和CurrentX属性决定, 缺省为打印对象的左上角0,0。注意:Print方法在Form _Load事件过程中起作用,必须设置窗体的 AutoRedraw为True。
例2.9 显示图形 Private Sub Form_Click() For i = 1 To 5 Print Tab(i); String(6 - I, &&); Spc(6); String(I, &▲&) Next i End Sub
注意: String(number, character)
返回指定长度重复字符 的字符串。考虑: 若把Spc(6)换成Tab(6), 效果如何?
2. Cls方法 形式:[对象.]Cls 作用:清除运行时在窗体或图形框中显示的文本或图形。注意:不清除在设计时的文本和图形。3. Move方法 形式:[对象.]Move 左边距离[,上边距离[,宽度[,高度]]] 作用:移动窗体或控件,并可改变其大小。对象:可以是窗体及除时钟、菜单外的所有控件 例2.10 图形移到窗体的中心。
七、应用举例
例2-11 编一计算月支付贷款的程序。现要求根据房产商提供的 信息,买房者选择房型、面积、单价、按揭期等信息,计算每月 支付代款的程序。窗体1:列表框选择数据、标签显示数据、文本框输入数据; 窗体2:图形框显示房屋的平面图。Pmt函数计算月支付贷款。
2.5 工程的管理及环境的设置
一、工程的组成 工程文件包含了一个应用程序的所有文件: 窗体文件(.frm):控件及属性、事件过程和自定义过 程; 窗体的二进制数据文件(.frx),自动产生同名.frx文件; 标准模块文件(.bas); 类模块的文件(.cls); 资源文件(.res); ActiveX控件的文件(.ocx). 二、创建、打开和保存工程
三、添加、删除和保存文件
1. 窗体名和窗体文件名概念 窗体名:窗体的Name属性, 窗体文件名 在代码中用来引用该窗体,同一 窗体名 工程不能有相同的窗体名; 窗体文件名:窗体存放在磁盘上的文件名,该文件包含了该窗体 的所有控件属性和代码,同一文件夹不能有相同的文件名。2. 在工程中添加现存的窗体时,只是对该窗体文件的引用纳入工程。因此,如果更改窗体并保存它,会影响包含此窗体文件的任何工程。3. 在工程中删除窗体时,仅将此窗体从工程里删除掉,但是窗体文件 仍存在于磁盘上。但是,如果在VB之外删除一个窗体文件,VB不能更新 此工程文件,当打开此工程时,将显示一个文件丢失的错误信息。4. 对窗体文件改名方法 1) 打开工程 “另存为…Form”实现文件的复制――保存工程文件。2) 利用编辑程序打开工程文件,修改FORM=XXX的文件名。
2.6 生成可执行文件和制作安装盘
以工程文件例2.11为例。
1. 生成可执行文件 文件/生成V6B2-11.exe文件,然后关闭Visual Basic6.0。2. 制作安装盘 在向导的指导下运行V B6.0中文版工具“Package & Deployment”; “打包”:把工程中用到的各种类型的文件进行打包压缩后,存 放到特定的目录下。“展开”:再把这些打包的文件展开到用户可以携带的安装介质 软盘、光盘等。3. 检测安装程序 在没有VB 6.0系统的环境下,执行安装盘中的Setup.exe文件,将 发行盘进行安装。
2.7 程 序 调 试
一、错误类型 (1)编辑错误 在编辑代码时,VB会对键入的代码直接进行语法检 查。当发现代码存在打字错误,遗漏关键字或标点符 等语法错误,VB 在Form窗口中弹出一个子窗口,提 示出错信息,出错的那一行变成红色。这时,用户必 须单击“确定”按钮,关闭出错提示窗,然后对出错 行进行修改。
(2)编译错误
编译错误指按了“启动”按钮,VB开始运行程序前, 先编译执行的程序段时,产生的错误。此类错误由于用 户未定义变量、遗漏关键字等原因产生。这时,Visual Basic也弹出一个子窗口,提示出错信息,出错的那一行 被高亮度显示。
(3) 运行错误
运行时错误指VB在编译通过后,运行代码时发生的错 误。这类错误往往是指令代码执行了一非法操作引起 的。例如类型不匹配、试图打开一个不存在的文件等。
(4) 逻辑错误
程序运行后,得不到所期望的结果,这说明程序存在逻 辑错误。这类错误往往是程序存在逻辑上的缺陷所引 起。例如,运算符使用不正确、语句的次序不对、循环 语句的起始、终值不正确等。通常,逻辑错误不会产生 错误提示信息,故错误较难排除,需要程序员仔细地阅 读分析程序以及调试。 
二、调试错误 (1)VB的三种模式
设计模式[设计] 进行程序的界面设计、属性设置、代码编写等。? 运行模式[运行] 执行“运行/启动”命令,可以查看程序代码,但不能修改 ? 。? 中断模式[中断] 当在运行模式,按了“中断”命令或当程序出现运行时错误 时进入中断模式。可以查看代码、修改代码、检查数据。
(2)调试窗口
有三个调试窗口,它们是:“立即”窗口、“监视”窗口、和 “本地”窗口。可单击视图菜单中的对应命令打开这些窗口。
(3)设置断点和逐语句跟踪
断点是告诉VB挂起程序执行的一个标记,当程序执 行到断点处即暂停程序的运行,进入中断模式。设置或 删除断点的步骤: 中断模式下,直接查看某个变量的值,只要把鼠标指 向所关心的变量处,稍停一下,就在鼠标下方显示该变 量的值。
2.8 常 见 错 误
1. 使用中文标点符号 系统产生“无效字符”,以红色显示。2. 字母和数字形状相似 小写字母“l”和数字“1”形式相同、小写字母“o”与数字“0”。3. 对象名称(Name)属性写错 Text1、Text2、Command1 txtInput、txtOutput、cmdOk 4. 对象的属性名、方法名、标准函数名写错 尽量使用自动列出成员功能。正确的系统按规定的大小写表示。5. 无意形成控件数组 建立控件时小心使用“复制”、“粘贴”按钮。6. 打开工程时找不到对应的文件 保存文件时先保存窗体.frm文件、再保存.vbp文件,注意路径。
第三章 VB语言基础 (2学时)
3.1 3.2 3.3 3.4 3.5 3.6 编码规则 数据类型 变量与常量 运算符和表达式 常用函数 常见错误
编 码 基 础
1. VB代码不区分字母的大小写 系统保留字自动转换每个单词的首字母大写; 用户自定义行以第一次为准。2. 语句书写自由 一行可书写几句语句,之间用冒号分隔; 一句语句可分若干行书写,用续行符_连接一行&=255个字 符。3. 注释有利于程序的维护和调试 Rem开始 或 单撇号 ' 4. 保留行号与标号
标准数据类型
数 据 类 型
3.3 变量与常量
一、变量和常量的命名规则
变量:在程序运行中其存储的值可以改变。常量:在程序运行中其值不可以改变。命名规则: 1. 以字母或汉字开头,后可跟汉字、字母、数字或下划线 组成,长度小于等于255个字符; 2. 不要使用VB中的关键字; 3. VB中不区分变量名的大小写; 4. 为了增加程序的可读性,可在变量名前加一个缩写的前 缀来表明该变量的数据类型。
二、变量声明 1.用Dim语句显式声明变量
形式:Dim 变量名 [AS 类型] Dim 变量名类型符 例 Dim iCount As integer , sAllsum As single 等价于 Dim iCount%, sAllsum!
2.隐式声明
未进行上述的声明而直接使用,其类型为 Variant 类 型。建议不使用。注意: 在通用声明处加 Option Explicit 语句可强制显式声明 变量。
三、常量 1. 用户声明常量
形式: Const 常量名 [AS 类型] = 表达式 省略 [AS 类型] ,常量的类型由表达式值的类型决定。为使与变量名区分,一般常量名使用大写字母。例 Const MAX=100
2. 系统提供的常量
系统定义常量位于对象库中,可通过“对象浏览器”查看。例:vbNormal vbMinimized、vbbCrLf等
3.4 运算符和表达式 一、运算符
1. 算术运算符
例:5+10 mod 10 \ 9 / 3 +2 ^2 结果:10
2. 字符串运算符 & 、+ 字符串连接 & 123 & + & 456 & 结果 & 123456 & & 123 & & & 456 & 结果 & 123456 & 区别:+ 两边必须是字符串,& 不一定 例如: &abcdef& & 12345 ' 结果为 &abcdef12345 & &abcdef & + 12345 ' 出错 &123& & 456 ' 结果为& 123456 & “123” + 456 ' 结果为 579 注意: &123 & + True ' 结果为 122 True转换为数值-1,False转换为数值0
3.关系运算符
将两个操作数进行大小比较,结果为逻辑量。字符串比较,则按字符的ASCII码值从左到右一一比较,直到出现 不同的字符为止.。例: &
ABCDE & & & ABRA &
结果为 False
& &女字& 按汉字的拼音字母比较
4. 逻辑运算符
将操作数进行逻辑运算,结果是逻辑值: 条件表达式1 And 条件表达式2
T; 条件表达式均为T, 结果为 条件表达式有一个为T 结果为
条件表达式1 Or 条件表达式2 T。
二、表达式
变量、常量、函数、运算符和圆括号。2.书写规则 (1) 运算符不能相邻。例a+ -b是错误的。(2) 乘号不能省略。例x 乘以y 应写成:x*y。(3) 括号必须成对出现,均使用圆括号。(4) 表达式从左到右在同一基准上书写,无高低、大小。3. 不同数据类型的转换 运算结果的数据类型向精度高的数据类型靠。Integer&Long&Single&Double&Currency 4. 优先级 算术运算符&=字符运算符&关系运算符&逻辑运算
表达式书写举例
a*b*c*d/e/f/g
e10 + ln 10 sin 45o + x + y +1
a*b *c*d/(e*f*g)
sin(45*3.14/180)+(exp(10)+log(10))/sqr(x+y+1)
例:用人单位招聘秘书:年龄小于40岁的女性,学历专科或本科, 年龄&40,性别=“女”,(学历=“专科”,学历=“本科”) And And Or 考虑:若分别写成: 年龄&40 And 性别= &女& And (学历= &专科& And 学历= &本科&) 年龄&40 Or 性别= &女& Or (学历= &专科& Or 学历= &本科&) 例:表示算术表达式: 3 ≤ x ≤ 7 正确的VB表达式: 3〈=x And x &=7 错误的VB表达式: 3&=x&=7
或 3&=x Or x&=7
比a小,比b大 用 Or 比a大,比b小 用 And
3.5 常用内部函数
1. 数学函数 Rnd函数返回0和1(包括0但不包括1)之间的双精度随机数。每次运行时,要产生不同序列的随机数,执行Randomize 语 句。例产生1~100的随机数: Int(Rnd *100)+1 2. 转换函数 Chr(66) &B& Asc (&B&) 66 Asc(Chr(99)) 99 Chr(Asc(&K&)) &K& Ucase$(&abcdefg&) &ABCDEFG& 3.日期函数 Time返回系统时间、Date返回系统日期、Now返回系统日期和时间 DateAdd(要增减日期形式,增减量,要增减的日期变量) DateDiff(要间隔日期形式,日期1,日期2) 例如求离你毕业还有多少天: DateDiff(&d&,date, ## )假定2006年毕业
4. 字符串编码和函数
(1)字符串编码 Windows系统对字符采用了DBCS编码,中文2字节,西文1字节 VB中字符Unicode编码,任何字符2字节。Len(“中国good ”)为6;LenB(“中国good ”)为12。StrConv() 进行DBCS与Unicode之间转换。(2)字符串函数 Mid$(&ABCDEFG&,2,3) InStr(2, &ABCDEFG&, &EF&) S=Split(&123,56,ab&,&,&) Join(S,&&) &123 56 ab& “AB123AB123” &BCD& 5 S(0)=&123”,S(1)=&56”,S(2)=&ab&
Replace(&ABCDABCD&,&CD&,&123&)
5. 格式输出函数 例3.1 利用Format函数显示有关的日期和时间。Private Sub Form_Click( ) FontSize = 12 MyTime = #9:21:30 PM# MyDate = #7/21/1997# Print Tab(2); Format(MyDate, &m/d/yy&) Print Tab(2); Format(MyDate, &mmmm-yy&) Print Tab(2); Format(MyTime, &h-m-s AM/PM&) Print Tab(2); Format(MyTime, &hh:mm:ss A/P&) Print Tab(2); Format(Date, &dddd,mmmm,dd,yyyy&) Print Tab(2); Format(Now, &yyyy年m月dd日 hh: mm&) Print FormatDateTime(Now) ' VB6.0新提供的函数 End Sub
6. Shell函数
Shell函数负责执行一个可执行文件,返回一个Variant,如果成 功,代表这个程序的进程ID,若不成功,则会返回0。形式:Shell(命令字符串,窗口类型) 窗口类型值为1表示正常窗口,缺省窗口最小化为图标。i = Shell(&c:\windows\calc.exe&) j= Shell(&c:\&, 1)
提示:如果不知道应用程序的路径名,可用Start命令启动程序 i = Shell(start & &calc.exe&) ; i = Shell(start & & vb6.exe &)
常 见 错 误
1. 逻辑表达式书写错,在VB没有造成语法错而形成逻辑错 例如,数学表达式 3≤x<10 VB表达式写为 3&=x&10。问题在于VB中的逻辑量与数值量可相互转换。2. 同时给多个变量赋值,在VB没有造成语法错而形成逻辑错 例如:Dim x%,y%,z% x=y=z=1 3. 标准函数名写错 4. 变量名写错 检查方法:在通用声明段加Option Explicit 5. 语句书写位置错 在通用声明段只能有Dim语句,不能有赋值等其他语句
第四章 基本的控制结构 (8学时)
4.1 4.2 4.3 4.4 4.5 4.6 顺序结构 选择结构 循环结构 其他辅助控制语句 常用算法(一) 常见错误 (顺序、条件、循环)
一、赋值语句
顺 序 结 构
形式:[LET]变量名=表达式
作用: 将表达式的值赋值给变量名。一般用于给变量赋值或对控件设定属性值。例: sRate!=0.1 Text1.Text = &欢迎使用Visual Basic 6.0 & 当表达式的类型与变量的类型不一致时,强制转换成左边 的精度,如 iA% = 10 / 3 iA中的结果为3 注意:虽然赋值号与关系运算符等于号都用“=”表示,VB 系统会根据所处的位置自动判断是何种意义的符号。
二、与用户交互函数和过程
1. InputBox函数
InputBox(提示[,标题][,缺省][,x 坐标位置][,y坐标位置]) 其中:提示: 提示信息;标题: 对话框标题;缺省:输入区缺省 值 函数返回字符类型。例要在屏幕上显示图示的对话框: 相应的语句如下:
Dim strName As String * 40
strName= InputBox(&请输入你的姓名& + vbCrLf + &然后单击确定& , &输入框& )
也可以使用如下语句: Dim strName As String * 40, strS1 As String * 40 strS1 = &请输入你的姓名& + Chr(13) + Chr(10) + &然后单击确定& strName= InputBox(strS1, &输入框& , , 100,100) 当键盘输入“王晓明” 后,变量strName获得键盘输入的值。
2. MsgBox函数和MsgBox过程
函数形式:变量[%] = MsgBox(提示[,按钮][,标题]) 过程形式:MsgBox 提示[,按钮][,标题]
按钮值如下: 值: 函数返回所选按钮整数
例4.1 编一帐号和密码检验程序。要求: 帐号不超过6位数字,有错,清除原内容再输入。密码输入时在屏幕上以 “*”代替; 若密码错,显示有关信 息,选择“重试”按钮,清除原内容再输入,选择“取消”按 钮,停止运行。分析: 帐号6位,MaxLength为6,LostFocus判断数字IsNumeric函 数 密码PassWordChar为“*”,MsgBox函数设置密码错对话 框。
数据合法性检查中引起程序的死循环 Private Sub Text1_LostFocus() If Not IsNumeric(Text1) Then Text1 = && Text1.SetFocus End If End Sub
Text1 Text2
Private Sub Text2_LostFocus() If Not IsNumeric(Text2) Then Text2 = && Text1.SetFocus End If End Sub
If Text2 && && And Not IsNumeric(Text2)
选 择 结 构
1. If…Then语句(单分支结构) If &表达式& Then 语句块 End If 或 If &表达式& Then &语句&
例:已知两个数x和y,比较它们的大 小, 使得x大于y. If x&y Then t=x x=y y=t End If 或 If x&y Then t=x: x=y: y=t 重要的是学会两个数的交换,若上述语句次序变一下,结果如何?
2. If…Then…Else语句(双分支结构)
If &表达式& Then &语句块1& Else &语句块2& End If If &表达式& Then &语句1& Else &语句2&
?sin x + x 2 + 1 x ≠ 0 ? 计算分段函数: y = ? ?cos x ? x 3 + 3x x = 0 ? 单分支结构实现: y=cos(x)-x^3+3*x If x&&0 Then y=sin(x)+sqr (x*x+1) 双分支结构实现: If x&&0 Then y=sin(x)+sqr (x*x+1) Else y=cos(x)-x^3+3*x End If
3. If…Then…ElseIf语句(多分支结构)
形式: If &表达式1& Then &语句块1& ElseIf &表达式2&Then &语句块2& … [Else 语句块 n+1 ] End If
例4.2 已知变量strC中存放了一个字符,判断该字符是字母字 符、数字字符还是其他字符。用多分支结构实现: If Ucase(strC) &=&A& And Ucase (strC) &=&Z& Then Print strC + &是字母字符& ElseIf strC &=&0& And strC &=&9& Then Print strC + &是数字字符& Else Print strC + &其他字符& End If 不管有几个分支,依次判断,当某条件满足,执行相应的语句, 其余分支不再执行;若条件都不满足,且有Else子句,则执行该 语句块,否则什么也不执行。. ElseIf不能写成 Else If。例4.2a 根据边长判断三角形类型
例4.3 已知百分制成绩mark,显示对应的五级制成绩 哪些正确,哪些错误?
方法一 方法二 If mark &= 90 Then If mark & 60 Then Print &优& Print &不及格& ElseIf mark &= 80 Then ElseIf mark & 70 Then Print &良& Print &及格& ElseIf mark &= 70 Then ElseIf mark & 80 Then Print &中& Print &中& ElseIf mark &= 60 Then ElseIf mark & 90 Then Print &及格& Print &良& Else Else Print &不及格& Print &优& End If End If 方法三 If mark &= 60 Then Print &及格& ElseIf mark &= 70 Then Print &中& ElseIf mark &= 80 Then Print &良& ElseIf mark &= 90 Then Print &优& Else Print &不及格& End If
4.If语句的嵌套 If语句的嵌套是指If或Else后面的语句块中又包含If语句。形式如下: F x&y If &表达式1& Then T If &表达式11& Then … x 与 y 交换 End If x &y … End If F x & y& z y&z 例4.4 已知x,y,z三个数,使得x&y&z
用一个IF语句和一个嵌套的IF语句实现
T y 与 z 交换 z 为最小数 F
If x&y Then t=x: x=y: y=t If y&z Then t=y: y=z: z=t If x&y Then t=x: x=y: y=t End If End If
T x 与 y 交换 使 得 x &y
If语句的嵌套注意事项:书写锯齿型; If 与End If配对。
5. Select Case语句(情况语句)
Select Case 变量或表达式 Case 表达式列表1 语句块1 Case 表达式列表2 语句块2 … [Case Else 语句块n+1] End Select
&表达式列表&:与&变量或表达式&同类型的下面四种形式之一: 表达式 一组枚举表达式(用逗号分隔) 表达式1 To 表达式2 Is 关系运算符表达式 例: 数值型或字符串表达式
2,4,6,8 60 To 100 Is & 60
例4.5 变量strC中存放了一个字符,判断该字符类型。
在例4.2中用多分支结构实现: If Ucase(strC) &=&A& And Ucase (strC) &=&Z& Then Print strC + &是字母字符& ElseIf strC &=&0& And strC &=&9& Then Print strC + &是数字字符& Else Print strC + &其他字符& End If
用Select Case语句实现:
Select Case strC Case &a& To &z&,&A& To &Z& Print strC + &是字母字符& Case &0& To &9& Print strC + &是数字字符& Case Else Print strC + &其他字符& End Select
例4.6 已知坐标点(x,y),判断其落在哪个象限。
方法一 方法二 If x & 0 And y &0 Then Select Case x,y Case x & 0 And y & 0 Print &在第一象限& Print &在第一象限& ElseIf x & 0 And y & 0 Then Case x & 0 And y & 0 Print &在第二象限& Print &在第二象限& ElseIf x & 0 And y & 0 Then Case x & 0 And y & 0 Print &在第三象限& Print &在第三象限& ElseIf x & 0 And y &0 Then Case x & 0 And y &0 Print &在第四象限& Print &在第四象限& End If End Select
哪个能实现,哪个不能实现? 方法二代码错误:
1. Select Case 后不能出现多个变量; 2. Case后不能出现变量及有关运算符。返回72
例4.7由计算机来当一年级的算术老师,要求给出一系列的1~10的 操作数和运算符,学生输入该题的答案,计算机根据学生的答案判 断正确与否,当结束时给出成绩。分析:产生1~10操作数,可通过Int(10 * Rnd + 1) 实现 设置的控件名 Label1 Text1
6.条件函数
(1)IIf函数形式是:
IIf(表达式,当表达式为True时的值,当表达式为False时的值) 例如,求x,y中大的数,放入Tmax变量中,语句如下: Tmax=IIf(x & y,x,y) (2)Choose函数形式是: Choose(数字类型变量,值为1的返回值,值为2的返回值……) 例如,Nop是1-4的值,转换成 + 、-、×、÷运算符的语句如下: Op= Choose(Nop,&+&,&-&,&×&,&÷&) 当值为1,返回字符串“+”,然后放入Op变量中,值为2,返回字 符串“-”,依次类推;当Nop是1-4的非整数,系统自动取Nop的整 数办法在判断;若Nop不在1~4之间,函数返回Null值。(3) Switch函数形式是: Switch(条件表达式1,条件表达式1为True时的值 [,条件表达式2,条件表达式2为True时的值……])
常 见 错 误
1.在选择结构中缺少配对的结束语句 对多行式的If块语句中,应有配对的 End If语句结 束。2. 多边选择ElseIf关键字的书写和条件表达式的表示 ElseIf 不要写成Else If; 多个条件表达式次序问题,见例4.3。3. Select Case语句的使用 Select Case 后不能出现多个变量;Case子句后不 能出现变量,见例4.6。
循 环 结 构
循环变量得初值
& 循环变量 =终值
1. For循环语句 (一般用于循环次数已知) 形式 For 循环变量=初值 to 终值 [Step 步长] 语句块 [Exit For] 循环体 语句块 Next 循环变量 例4.8 计算1~100的奇数和,程序段如下:
Dim i %, s% s=0 For i = 1 To 100 step 2 s=s+i Next i 等价于: Dim i %, s% s=0 : i = 1 re: If i &= 100 Then s=s+i i = i +2 GoTo re End If
语句块 循环变量加步长
&0 初值&终值 =1 时,可省略 &0 初值&终值 =0 死循环
= Int ( 终值 ?初值 + 1) 步长
要注意: 出了循环,循环控制变量值的问题。例程序段: ? 循环执行次数 = Int ( 133 2 + 1) = 4 For i=2 To 13 Step 3 Print i , 输出 i的值分别为: Next i 2 5 8 11 Print : Print “I=“, i 出了循环输出为: I=14 在循环体内对循环控制变量可多次引用;但最好不要对其 赋值,否则影响原来的循环控制规律。
例4.9 改变循环控制变量对循环的影响。Private Sub Command1_Click() j=0 For i = 1 To 20 Step 2 i=i+3 j=j+1 Print &第&; j; &次循环i=&; i Next i Print &退出循环后i=&; i End Sub 正常情况:i=1,3,5,7,9,11,13,15,17,19 现在:i=4,9,14,19 例4.10 输出可打印的ASCII码字符与它的编码值。
2. Do…Loop循环语句(用于控制循环次数未知) 形式2: 形式1: Do Do { While|Until }&条件& 语句块 语句块 [Exit Do [Exit Do 语句块] 语句块] Loop { While|Until} &条件& Loop
表达式列表 1
语句块 Exit D o 语句块
Exit D o 语句块
表达式列表 1
W hile… Loop
例4.11 我国有13亿人口,按人口年增长0.8%计算,多少年 后我国人口超过26亿。
分析:解此问题两种方法,可根据公式:26=13*(1+0.008)n 直接利用标准对数函数求得;也可利用循环求得,程序如下: Private Sub Command1_Click() x = 13 n=0 Do While x & 26 x = x * 1.008 n=n+1 Loop Print n, x End Sub
例4.12用辗转相除法求两自然数m,n的最大公约数和最小公倍数。分析:求最大公约数的算法思想: (1)对于已知两数m,n,使得m&n; (2) m除以n得余数r; (3)若r=0,则n为最大公约数结束;否则执行(4); (4)m n,n r,再重复执行(2)。例 求 m=14 ,n=6 的最大公约数. If m & n Then t = m: m = n: n = t r=m mod n Do While (r && 0) m=n n=r r= m mod n Loop Print &最大公约数=&, n
辗转相减法 m=m-n m&n n=n-m n&m m=n m、n为公约数 Do While m && n m n If m & n Then 14 6 m=mCn 8 6 Else 2 6 n=nCm 2 4 End If 2 2 Loop
3. 循环的嵌套
一个循环体内又包含了一个完整的循环结构称为循环的嵌套. 例4.13打印九九乘法表. For i = 1 To 9 For j = 1 To i For j = 1 To 9 se = i & &×& & j & &=& & i * j Picture1.Print Tab((j - 1) * 9 + 1);
Next j Picture1.Print Next i
思考:打印上三角或下三角程序如何改动?要打印下三角?
对于循环的嵌套,要注意以下事项: 内循环变量与外循环变量不能同名; 外循环必须完全包含内循环,不能交叉; 不能从循环体外转向循环体内,反之则可以。正确 错误
For ii =1 To 10 For jj=1 To 20 … Next jj Next ii For ii =1 To 10 … Next ii For ii =1 To 10 … Next ii
For ii =1 To 10 For jj=1 To 20 … Next ii Next jj For ii =1 To 10 For ii=1 To 20 … Next ii Next ii
其他辅助控制语句
1. Go To 语句 形式: Go To {标号|行号} 作用:无条件地转移到标号或行号指定的那行语句. 标号是一个字符序列,行号是一个数字序列. 2.Exit语句 多种形式: Exit For、Exit Do、Exit Sub、Exit Function等。作用:退出某种控制结构的执行。3. End语句 多种形式: End、 End If、 End Select、 End With、 End Type、 End Sub、 End Function、 作用:End结束一个程序的运行;其余表示某个结构的结束,与 对应的结构语句配对出现。
4.With 语句
With 对象 语句块 End With 作用:对某个对象执行一系列的操作,而不用重复指出对象的 名称。With Label1 .Height = 2000 .Width = 2000 等价 .FontSize=22 .Caption = &MyLabel& End With Label1.Height = 2000 Label1.Width = 2000 Label1.FontSize=22 Label1.Caption = &MyLabel& 形式如下:
1. 累加、连乘
常用算法(一)
算法是对某个问题求解过程的描述
1~100的5或7的倍数的和 Sum = 0 For i = 1 To 100 If i Mod 5 = 0 Or i Mod 7 = 0 Then Sum = Sum + i End If Next i Print Sum 时会产生什么情况?
3~10的乘积 t=1 For i =3 To 10 t=t*i Next i Print t
思考:若把循环体前面置各变量初值的语句放在循环体内,程序运行
例4.14 求自然对数e的近似值,要求其误差小于0.00001,近似公式为
m ∞ 1 1 1 1 1 1 e = 1 + + + + ... + + ... = ∑ ≈ 1 + ∑ 1! 2! 3! i! i = 0 i! i =1 i!
该例题涉及两个问题: (1)用循环结构求级数和的问题。本例根据某项值的精度来控制 循环的结束与否。循环体外对累加和的变量清零 e=0 (2)累加:e=e+t 连乘:n=n*i 循环体外对连乘积变量置1 n=1 Private Sub Form_Click() Dim i%,n&, t!, e! e = 0 : n = 1 ‘ e存放累加和、n存放阶乘 i = 0 : t = 1 ‘ i计数器、t第i项的值 Do While t & 0.00001 e = e + t : i = i + 1 ‘ 累加、连乘 n = n * i : t = 1 / n Loop Print &计算了 &; i; & 项的和是 &; e End Sub
2. 求素数 素数是一个大于2,且不能被1和本身以外的整数整除的整数。判别某数m是否为素数最简单的方法是: 对于m 从 i=2,3,…,m-1判别m能否被i整除,只要有一个能整 除,m不是素数,否则m是素数。
例4.15 求100以内素数的代码:
求100以内的素数
For m = 2 To 100 For i = 2 To m - 1
If (m Mod i) = 0 Then GoTo NotNextM
Next i Print m NotNextM: Next m
m是否为素数
思考: 此例用Go To语句对非素数不作判断,若不用GoTo语句, 如何修改程序?
“穷举法”也称为“枚举法”或“试凑法”,即将可能出现的各 种情况一一测试,判断是否满足条件,一般采用循环来实现。例4.16 百元买百鸡问题。假定小鸡每只5角,公鸡每只2元,母鸡每 只3元。现在有100元钱要求买100只鸡,编程列出所有可能的购鸡方 案。设母鸡、公鸡、小鸡各为x、y、z只,根据题目要求,列出方程为: x+y+y=100 3x+2y+0.5z=100 三个未知数,两个方程,此题有若干个解。解决此类问题采用“试凑法”,把每一种情况都考虑到。方法一:最简单三个未知数利用三重循环来实现。方法二:从三个未知数的关系,利用两重循环来实现。
“递推法”又称为“迭代法”,其基本思想是把一个复杂的计算过程转 化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由 新值代替旧值。例4.17 猴子吃桃子。小猴在某天摘桃若干个,当天吃掉一半多一个;第二 天吃了剩下的桃子的一半多一个;以后每天都吃尚存桃子的一半多一个, 到第7天要吃时只剩下一个,问小猴共摘下了多少个桃子? 分析:这是一个“递推”问题,先从最后一天推出倒数第二天的桃子,再 从倒数第二天的桃子推出倒数第三天的桃子……。设第n天的桃子为xn,那 么它是前一天的桃子数的xn-1 的一半减1,即xn =( xn-1 +1)×2
5.最小、最大值
在若干个数中求最大值,一般先假设一个较小的数为最大值的初值, 若无法估计较小的值,则取第一个数为最大值的初值;然后将每一个 数与最大值比较,若该数大于最大值,将该数替换为最大值;依次逐 一比较。例 随机产生10个100~200之间的数,求最大值。Private Sub Command1_Click() Max = 100 For i = 1 To 10 x = Int(Rnd * 101 + 100) P If x & Max Then Max = x Next i Print Print &最大值=&; Max End Sub
例4.18 实际应用,求最短残料。有一根长度为321米的钢材料,要将它截取成两种规格a、b的长度分 别为17米和27米的短料,每种至少1段,问分隔成a,b各多少段后, 剩余的残料r最少? 分析,该题利用“试凑法”通过二重循环求残料r的最小值正数,残料 不可能是负数。程序如下:
Private Sub Command1_Click() Dim a%, b%, r!, ia%, ib% r = 321 For b = 1 To 321 \ 27 For a = 1 To 321 \ 17 - b t = 321 - b * 27 - a * 17 If t & 0 And t & r Then r=t ia = a ib = b End If Next a Next b Print ia, ib, r End Sub ‘ 最小值初值取钢材料的长度 ‘ b最多的段数 ‘ a最多的段数 ‘ 当前的残料 ‘ 求最短的残料 ‘ 最短残料时a的段数 ‘ 最短残料时b的段数
常 见 错 误
1. 不循环或死循环的问题
主要是循环条件、循环初值、循环终值、循环步长的设置有问 题。2. 循环结构中缺少配对的结束语句 For 少 配对的Next 3. 循环嵌套时,内外循环交叉 4. 累加、连乘时,存放累加、连乘结果的变量赋初值问题 (1)一重循环 在一重循环中,存放累加、连乘结果的变量初值设置应在循环语 句前。(2)多重循环 这要视具体问题分别对待。
第五章 数 组 (4学时)
5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 数组的概念 静态数组及声明 动态数组及声明 数组的基本操作 控件数组 自定义数据类型 常用算法(二) 常见错误
数组的概念
例5.1若我们要求一个班100个学生的平均成绩,然后统计高于平均分 的人数。按以前简单变量的使用和循环结构相结合,求平均成绩程序段如下:
aver = 0 For i = 1 To 100 mark = InputBox(&输入& + i + &位学生的成绩&) aver = aver + mark Next i aver = aver / 100 但若要统计高于平均分的人数,则无法实现。mark是一个简单变量,存放的是最后一 个学生的成绩。已有知识解决方法:再重复输入成绩,带来两个问题: (1)输入数据的工作量成倍增加; (2)若本次输入的成绩与上次不同,则统计的结果不正确。解决此问题的根本方法,引入数组,始终保持输入的数据,一次输入,多次使用。
1. 静态数组及声明
静态数组及声明
数组不是一种数据类型,而是一组相同类型的变量的集合,数组必须先声明后使 用。两类数组: 静态(定长)数组、动态(可变长)数组
形式: Dim 数组名(下标1[,下标2…]) [As 类型] 声明了数组的名、维数、大小、类型 维数:几个下标为几维数组,最多60维。下标:[下界 To ] 上界 省略下界为0 ,必须为常数。每一维大小:上界-下界+1 数组大小: 每一维大小的乘积 例:Dim mark(1 to 100) As Integer
Dim lArray( 0 To 3, 0 To 4) As Long 等价于: Dim lArray(3, 4) As Long
共有 4×5个元素
注意:(1)下界缺省为0,也可在重新定义数组的下界。例如:
Option Base 1 (2)错误的声明,下标是变量 n =Inputbox(&输入n & ):Dim x(n) As Single (3)在数组声明中的下标说明了数组的整体,即每维的大小; 而在程序其他地方出现的下标表示数组中的一个元素。两者写法形式 相同,但意义不同。例如: Dim x(10) As Integer ' 声明了x数组有11个元素 x(10)=100 ' 对x(10)这个数组元素赋值
5.3 动态数组及声明
动态数组指在声明数组时未给出数组的大小(省略括号中的下标),当要使用 它时,随时用ReDim语句重新指出数组大小。形式如下: ReDim 数组名(下标[,下标2…]) [As 类型] 例 Sub Form_Load( ) Dim x( ) As Single 例5.2 求若干个学生的平均分。…
… End Sub 说明: ? Dim、Private、Public变量声明语句是说明性语句,可出现在过程内或通用 声明段;ReDim语句是执行语句,只能出现在过程内。? 在过程中可多次使用ReDim来改变数组的大小和维数。? 使用ReDim语句会使原来数组中的值丢失,可以在ReDim语句后加Preserve 参数来保留数组中的数据。使用Preserve只能改变最后一维的大小,前面几维 大小不能改变。ReDim中的下标可以是常量,也可以是有了确定值的变量。? 静态数组在程序编译时分配存储单元,动态数组在运行时分配存储单元。
n =Inputbox(“输入n”) ReDim x(n)
5.4 数组的基本操作
1. 数组元素的赋初值 (1)用循环 For i = 1 To 10 iA(i)=0 Next i (2) Array函数 Dim ib As Variant ib = Array(&abc&, &def&, &67&) For i = 0 To UBound(ib) Picture1.Print ib(i); & &; Next i
注意: ? 利用Array对数组各元素赋值,声明的数组是可调数组或连圆括号 都可省,并且其类型只能是Variant。? 数组的下阶为零,上界由Array函数括号内的参数个数可决定,也 可通过函数Ubound获得。
2.数组的赋值 在VB6.0中,提供了数组直接对数组的赋值。例如: Dim a() As Variant, b() As Variant, i% a = Array(1, 2, 3, 4, 5) For i = 0 To UBound(a) ReDim b(UBound(a)) b(i) = a(i) b=a Next i
注意:赋值号左边的数组只能声明为Variant的可调数组或简单变量。
3. 数组的输出 输出方阵sC中的下三角元素 For i = 0 To 4 For j = 0 To i sc(i, j) = i * 5 + j Print sc(i, j); & &; Next j Print ' 换行 Next I
4. 求数组中最大元素及所在下标 Dim Max As Integer,iMax As Integer Max=iA(1):iMax=1 For i = 2 To 10 If iA(i)&Max Then Max=iA(i) iMax=i End If Next I 5. 将数组中各元素交换 For i =1 To 10\2 t=iA(i) iA(i)=iA(10-i+1) iA(10-i+1)=t Next I
控 件 数 组
一组相同类型的控件组成。它们共用一个控件名,具有相同 的属性,建立时系统给每个元素赋一个唯一的索引号(Index)。控件数组共享同样的事件过程,通过返回的下标值区分控件 数组中的各个元素。例: Private Sub cmdName _Click(Index As Integer)
If Index = 3 then ‘ 处理第四个命令按钮的操作 End If … End Sub
1.在设计时建立控件数组
在窗体上画出控件,进行属性设置,这是建立的第一个元素 选中该控件,进行“Copy”进行若干次和“Paste”操作建立了所需 个数的控 件数组元素。进行事件过程的编程。
例5. 3 建立含有四个命令按钮的控件数组,当单击某个命令按钮,分 别显示不同的图形或结束操作。
Private Sub Command1_Click(Index As Integer) Select Case Index Case 0 …… &画直线& Case 1 …… &画矩形& Case 2 …… &画圆& Case Else End End Select End Sub
控件名 Command1 Command1 Command1 Command1 Picture1
Index 0 1 2 3 空白
Caption 直线 矩形 圆 结束 ――
2运行时添加控件数组
建立的步骤如下: 在窗体上画出某控件,设置该控件的Index值为0,表示该控件为数 组,这是建立的第一个元素。在编程时通过Load方法添加其余的若干个元素,也可以通过Unload 方法删除某个添加的元素 每个新添加的控件数组通过Left和Top属性确定其在窗体的位置, 并将Visible 属性设置为True。
例5.4 利用在运行时产生控件数组,构成一个国际象棋棋盘。当单击棋格,显示对应的序号,并且将所有棋格颜色变反。
5.6 自定义数据类型
一组不同类型变量的集合。相当于C语言中的结构类型;Pascal中 的记录类型。
1.自定义类型的定义
形式如下: Type 自定义类型名 元素名:表示自定义类型中的一个成员 元素名[(下标)] As 类型名 下标:表示是数组 … 类型名:为标准类型 [元素名[(下标)] As 类型名] End Type 例如,以下定义了一个有关学生信息的自定义类型: Type StudType No As Integer ' 学号 Name As String * 20 ' 姓名 Sex As String * 1 ' 性别 Mark(1 To 4) As Single ' 4门课程成绩 Total As Single ' 总分 End Type
(1)自定义类型一般在标准模块(.BAS)中定义,默认是Public;在窗体必须是 Private。(2)自定义类型中的元素类型可以是字符串,但应是定长字符串。(3)不要将自定义类型名和该类型的变量名混淆,前者表示了如同Integer、 Single等的类型名,后者VB根据变量的类型分配所需的内存空间,存储数据。(4)自定义类型一般和数组结合使用,简化程序的编写。
2.自定义类型变量的声明和使用
(1) 声明形式: Dim 变量名 As 自定义类型名 例 Dim Student As StudType (2) 引用 形式:变量名.元素名 例 表示Student变量中的姓名,第4门课程的成绩,则表示如下: Student.Name,Student.Mark(4)
3.自定义类型数组的应用
例5.5 利用自定义类型数组,编写一个输入、显示、查询程序。
5.7 常用算法(二)
例5.6 输入一串字符,统计各字母出现的次数,不区分字母大小写。
分析: ? 统计26个字母出现的个数,先声明一个具有26个元素的数组,每个元素的 下标表示对应的字母,元素的值表示对应字母出现的次数。? 从输入的字符串中逐一取出字符,转换成大写字符(不区分大小写),进 行判断。运行界面:
For I = 1 To le c = UCase(Mid(Text1, I, 1)) If c &= &A& And c &= &Z& Then j = Asc(c) - 65 + 1 a(j) = a(j) + 1 End If Next I
2.大量数据的输入
例5.7 输入一系列的数据,并将它们分离后存放在数组中。对 输入的数据允许修改和自动识别非数字数据。分析: (1)利用文本框输入和编辑数据,输入时去除非法数字。(2)输入结束利用Rplace函数去除重复输入的分隔符; (3)对利用Split函数按分隔符分离,放到数组中; (4)还可利用Join函数将数组中各元素合并成一个字符串。
3.数组排序(选择法)
例5.8 对已知存放在数组中的n个数,用选择法按递增顺序排序。(1) 从n个数的序列中选出最小的数(递增),与第1个数交换位置; (2) 除第1个数外,其余n-1个数再按(1)的方法选出次小的数,与第2 个数交换位置; (3) 重复(1)n-1遍,最后构成递增序列。For i = 1 To n - 1 iMin= i For j = i+1 To n If iA(j) & iA(iMin) Then iMin = j Next j t= iA(i): iA(i) = iA(iMin) : iA(iMin) = t Next I
原始数据 a (1 ) a (2 ) a (2 ) a (3 ) a (3 ) a (3 ) a (4 ) a (4 ) a (4 ) a (4 ) a (5 ) a (5 ) a (5 ) a (5 ) a (5 ) a (6 ) a (6 ) a (6 ) a (6 ) a (6 ) 第 1 趟交换后 第 2 趟交换后 第 3 趟交换后 第 4 趟交换后 第 5 趟无交换 2 2 2 2 2 8 6 3 3 3 3 6 9 9 6 6 6 9 3 6 9 7 7 3 8 8 8 8 8 2 7 7 7 9 9 7
图 1 .3 .2 5
排序过程示意图
排序(冒泡法)
例5.9 选择法排序在每一轮排序时找最小(递增次序)数的下标,出了 内循环(一轮排序结束),再交换最小数的位置;而冒泡法排序在每一 轮排序时只要将第一个与其他几个比较,只要次序不对,就交换,出 了内循环,最小数已冒出。排序进行的过程见下表。For i = 1 To n-1 ' 进行n-1轮比较 For j = i+1 To n ' 从n~i个元素进行两两比较 If iA(j) & iA(i) Then ' 若次序不对,则马上进行交换位置 t = iA(j) : iA(j) = iA(i) : iA(i) = t End If Next j ' 出了内循环,一轮排序结束,最小数已冒到最上面 Next i
4.数组元素的插入与删除
(1) 插入 例5.10 在有序数组a(1 to n)(原有n-1个元素)插入一个值Key元素,算法: ?查找要插入的位置k(1&=k&=n-1) ?腾出位置,把最后一个元素开始到第k个元素往后移动一个位置 ?第k个元素的位置腾出,就可将数据Key插入 ④ ③ ② ①
要找到欲删除的元素的位置k;然后从k+1到n个位置开始向前移 动;最后将数组元素减1。
① ② ③ ④ ⑤
5.8 数组中常见错误和注意事项 1.静态数组声明下标出现变量
n = InputBox(&输入数组的上界&) Dim a(1 To n) As Integer 2.数组下标越界 引用的下标比数组声明时的下标范围大或小。Dim a(1 To 30) As Long, i% a(1) = 1: a(2) = 1 For i = 2 To 30 a(i) = a(i - 2) + a(i - 1) a(0)不存在 Next i 3.数组维数错 数组声明时的维数与引用数组元素时的维数不一致。Dim a(3, 5) As Long a(i)=10 4.Aarry函数与Split函数使用问题 只能对Variant 的变量或动态数组赋值。5.获得数组的上界、下界 Ubound 、Lbound函数
第六章 过 程 (5学时)
6.1 6.2 6.3 6.4 6.5 6.6 6.7 函数过程的定义与调用 子过程的定义与调用 参数传递 变量、过程的作用域 递归 常用算法(三) 重点和难点
6.1 函数过程的定义
除了系统提供的内部函数过程和事件过程外,用户可自定义过程: b 以Sub保留字开始的为子过程; a S1 以Function保留字开始的为函数过程。c
1. 引例6.1
area = c (c ? x )( c ? y )( c ? z )
e 已知多边形的各条边的长度,要计算多边形的面积。g S3 计算多边形面积,可将多边形分解成若干个三角形。f 计算三角形面积的公式如下: x 1
( x + y + z)
定义函数过程area: Public Function area(x!, y!, z!) As Single Dim c! c = 1 / 2 * (x + y + z) area = Sqr(c * (c - x) * (c - y) * (c - z)) End Function
调用函数过程: Sub command1_click() …… 输入若干个三角形边长 S=area(a,b,c)+area(c,d,e) S=S+area(e,f,g) Print S End Sub
2.函数过程的定义
自定义函数过程有两种方法: (1)利用“工具”菜单下的“添加过程”命令定义,生成一个函数 的框架。(2)利用代码窗口直接定义。函数过程形式: Function 函数过程名([参数列表]) [As 类型] 局部变量或常数定义 语句块 函数名 = 返回值 函数过程体 [Exit Function] 语句块 函数名 = 返回值 End Function 函数过程名:命名规则同变量名 参数列表形式: [ByVal]变量名[()][As 类型] 称为形参或哑元,仅表示参数的个数、类型,无值。函数名 = 返回值 在函数体内至少对函数名赋值一次。[Exit Function] : 表示退出函数过程。
例6.2 定义MyReplace(S,OldS,NewS)函数过程,具有Replace函
数功能。Function MyReplace(s$, OldS$, NewS$) As String
Dim i%, lenOldS% lenOldS = Len(OldS) i = InStr(s, OldS) Do While i & 0 i = InStr(s, OldS) Loop MyReplace = s ' 替换后的字符串赋值给函数过程名 ' 取OldS字符子串长度 ' 在字符串中找有否OldS字符子串 ' 找到用NewS 字符子串替换OldS字符子串 ' 找下一个OldS字符子串
s = Left(s, i - 1) + NewS + Mid(s, i + lenOldS)
End Function
假定S为“abcdefgabcd”,Oolds为“cd”,News为“3”,调用MyReplace函 数的返回值为“ab3efgab3”。上述程序循环执行2次: (“abcdefgabcd”,“cd”,“3”) 第1 次 i=3 结果 “ab3efgabcd” (“ab3efgabcd”,“cd”,“3”) 第2 次 i=9 结果 “ab3efgab3”
3.函数过程的调用 函数过程调用同标准函数调用,形式:函数过程名([参数列表]) 参数列表:称为实参或实元,它必须与形参个数相同,位置与 类型一一对应。可以是同类型的常量、变量、表达式。
程序运行的流程 :
Private Sub Command1_Click() s= “VB程序设计教程5.0版” & VB程序设计教程5.0版& Print MyReplace(s, &5.0&, &6.0&) End Sub
MyReplace$(s$, OldS$, NewS$)
Function MyReplace$(s$, OldS$, NewS$) Dim i%, lenOldS% lenOldS = Len(OldS) i = InStr(s, OldS) Do While i & 0 s= Left(s, i - 1) + NewS + Mid(s, i + lenOldS) i = InStr(s, OldS) Loop MyReplace = s End Function
函数过程的不足:
(1)不是为了获得某个函数值,而是为了某种功能的处理,如例 1.1。(2) 要获得多个结果。1.引例6.3 编写一个两个数交换的过程供多次调用。Swap (x,y)子过程的定义 主调程序调用Swap子过程 Public Sub Swap(x, y) Private Sub Form_Click() Dim t Dim a, b t=x a = 10 x=y b = 20 y=t Call Swap (a, b) End Sub Print &a=&;a,&,b=&; b End Sub
2.子过程定义 Sub 子过程名[(参数列表)]
局部变量或常数定义 语句 [Exit Sub] 语句
End Sub 3.子过程的调用 子过程名 [参数列表] 或 Call 子过程名(参数列表) 4.子过程与函数过程区别: (1)函数过程名有值,有类型,在函数体内至少赋值一次; 子过程名无值,无类型,在子过程体内不能对子过程名赋值; (2)调用时,子过程调用是一句独立的语句。函数过程不能作为单独的语句加以调用,必须参与表达式运算。(3)一般当过程有一个函数值,使用函数过程较直观; 反之若过程无返回值,或有多个返回值,使用子过程较直观。
例6.4分别编一计算某级数部分和的子过程和函数过程,并调用。
x x 级数为: + x + 1 + ... + + ... 2! n!
函数过程实现求部分级数和
Function jishu1(x!, eps#) As Double Dim n%, s#, t# n = 1: s = 0: t = 1 Do While (Abs(t) &= eps) s = s + t t = t * x / n n = n + 1 Loop jishu1 = s
xn 精度为: & eps n!
子过程实现求部分级数和
Sub jishu2(s#, x!, eps#)
Dim n%, t# n = 1: s = 0: t = 1 Do While (Abs(t) &= eps) s = s + t t = t * x / n n = n + 1 Loop
End Function
f1 = jishu1(2#, 0.000001) ' 调用函数过程 Call jishu2(f2, 2#, 0.000001)‘ 调用子过程 或 jishu2 f2,2#,0.00001
程序运行流程:
Private Sub Command1_Click() Dim f1#, f2# 找函数名调用jishu1 ① f1 = jishu1(2#, 0.000001) 函数名带了值返回 ④ 找子过程名调用jishu2 ② Function jishu1(x!, eps#) As Doubl … jishu=表达式 ③ End Function ⑥ Sub jishu2(s#, x!, eps#) … ⑦ ⑧ s=表达式 End Sub
Call jishu2(f2, 2#, 0.000001) Print &f1=&; f1, &f2 = &; f2 End Sub
6.3 参数传递
指主调过程的实参传递给被调过程的形参。1. 传址与传值 传址: 形参得到的是实参的地址,当形参值的改变同时也改变实参的值。传值: 形参得到的是实参的值,形参值的改变不会影响实参的值。例6.5 两个变量的交换。Sub Swap2(x%, y%) Sub Swap1(ByVal x%, ByVal y%) t% = x: x = y: y = t t% = x: x = y: y = t End Sub End Sub Private Sub Command1_Click() 传地址 ByVal 传值 a% = 10: b% = 20: Swap1 a, b '传值 a a Print &A1=&; a, &B1=&; b 实参 10 10 a = 10: b = 20: Swap2 a, b '传址 x x Print &A2=&; a, &B2=&; b End Sub 形参 10 a 的地址 例6.6 求若干个数的最大公约数。
2. 数组参数的传递
当参数是数组通过传址方式进行传递。注意: ? 在实参和形参中写数组名,忽略维数的定义,但圆括号不能省。? 被调过程可通过Lbound和Ubound函数确定实参数组的下、上界。Lbound和Ubound函数的形式如下: {L|U}bound(数组名[,维数]) 其中:维数指明要测试的是第几维的下标值,缺省是一维数组。例 6.7 编一函数tim,求任意一维数组中各元素之积。调用tim,求 t1 = ∏ ai
和 t 2 = ∏ bi
Function tim(a() As Integer) Dim t#, i% t=1 For i = Lbound(a) To Ubound(a) t = t * a(i) Next i tim = t End Function
调用: Sub Command1_Click() Dim a%(1 To 5),b%(3 To 8) … t1# = tim(a()) t2 #= tim(b()) Print t1, t2 End Sub
使用过程注意事项:
1. 确定自定义的过程是子过程还是函数过程 函数过程名有值,子过程名无值。2.过程中形参的个数和传递方式的确定 过程中参数的作用是实现过程与调用者的数据通信。(1)从主调程序获得初值,值传递。(2)将结果返回给主调程序,地址传递。3. 实参与形参结合时对应问题 个数、类型、位置、次序一一对应。形参是值传递,对应实参可以是表达式、常量、数组元素。形参是地址传递,对应实参只能是简单变量。数组、记录类型、对象只能是地址传递。
实验6.2子过程DeleStr(s1,ByVal s2 As String)形参的确定
s1,要处理的字符串,从主调程序得初值,删除子串后结果在s1 中,所以用地址传递。s2删除的子串,值传递。
实验6.3函数过程 MaxLength(s)形参的确定
s 要处理的字符串,值传递。MaxLength函数名,最长的单词长度。
实验6.4回文数的判断中形参的确定
1. 函数过程,用一个形参,值传递对所判断的数字;函数名是否为回 文数。Function IsH(ByVal ss As String) As Boolean 2. 子过程,用两个形参,值传递对所判断的数字,地址传递是否为回 文数。Sub hui(ByVal ss As String, Tag As Boolean)
变量、过程的作用域
作用域:变量、过程随所处的位置不同,可被访问的范围。1.过程的作用域 窗体/模块级:加Private关键字的过程,只能被定义的窗体 或模块中的过程调用。全局级:加Public关键字(缺省)的过程,可供该应用程序 的所有窗体和所有标准模块中的过程调用。
2. 变量的作用域 局部变量:在过程内用声明的变量,只能在本过程中使用。窗体/模块级变量:在“通用声明”段中用Dim语句或用 Private语句 声明的变量,可被本窗体/模块的任何过程访问。全局变量:在“通用声明”段中用Public语句声明的变量,可 被本应用程序的任何过程或函数访问。
例如在下面一个标准模块文件中不同级的变量声明: Public Pa As integer ' 全局变量 Private Mb As string *10 ' 窗体/模块级变量 Sub F1( ) Dim Fa As integer ' 局部变量 … End Sub Sub F2( ) Dim Fb As Single ' 局部变量 … End Sub
若在不同级声明相同的变量名,系统按局部、窗体/模块、全局次 序访问如: Public Temp As integer ' 全局变量 Sub Form_Load() Dim Temp As Integer ' 局部变量 Temp=10 ' 访问局部变量 Form1.Temp=20 ' 访问全局变量必须加窗体名 Print Form1.Temp, Temp ' 显示 20 10 End Sub
3. 静态变量
局部变量声明: Dim 声明,随过程的调用而分配存贮单元,每次调用都对变量 初始化;过程体结束,变量的内容自动消失,存储单元释放。Static 声明,每次调用过程,变量保持原来的值。声明形式:Static 变量名 [AS 类型] Static Function 函数过程名([参数列表]) [As 类型] Static Sub 子过程名[(参数列表)] 过程名前加Static,表示该过程内的局部变量都是静态变量。例6.9 Private Sub Form_Click() Private Function sum(n As Integer) Dim i% ,isum% Dim j As Integer For i = 1 To 5 j=j+n isum = sum(i) sum = j Print isum End Function Next i End Sub 结果为:1,2,3,4,5 Static j As Integer,结果?
过程的直接调用 Sub f1(x) Sub Command1_Click() Function f2(x) Function f3(x) … …… …… …… Call f1(y) x=f2(xx)*3… f2=f3(x)+3 End Sub End Sub 过程的递归调用 Sub Command1_Click() …… Call f1(y) End Sub Sub f1(x) … Call f1(y) End Sub End Sub f3=x*x End Sub
1.递归的概念 用自身的结构来描述自身就称为“递归”。例对阶乘的定 义:
n! = n ? ( n ? 1)! ( n ? 1)! = ( n ? 1) ? ( n ? 2)!
2. 递归过程
n =1 ?1 例6.10 编fac(n)=n! 的递归函数 fac(n) = ? ?n * fac(n ? 1) n & 1
过程在自身定义的内部调用自己。
Function fac(n As Integer) As Integer If n = 1 Then fac = 1 Sub Command1_Click() Else Print “fac(4)=”;fac(4) fac = n * fac(n - 1) End Sub End If 结果: fac(4)=24 End Function
fac(4)=4*fac(3) fac(4)=4*6 fac(3)=3*fac(2) fac(3)=3*2 fac(2)=2*fac(1)
fac(1)=1 fac(2)=2*1
在递归处理中,用栈来实现。栈中存放形参、局部变量、返回地址。递推过程:每调用自身,当前参数压栈,直到达到递归结束条件。回归过程:不断从栈中弹出当前的参数,直到栈空。递归算法设计简单,但消耗的机时和占据的内存空间比非递归大。思考: 若上述fac函数中少了 : If n = 1 Then fac = 1 即仅有语句: fac = n * fac(n - 1) 或 n&=0 程序运行将造成何结果?由此可见构成递归的结构如下: 递归结束条件及结束时的值; 能用递归形式表示,并且递归向终止条件发展。
例6.11利用递归求最大公约数
? n gcd( m , n ) = ? ?gcd( n, m Mod n )
m Mod n = 0 m Mod n ≠ 0
Public Function gcd(m As Integer, n As Integer) As Integer If (m Mod n) = 0 Then gcd = n Else gcd = gcd(n, m Mod n) End If End Function Private Sub Form_Click() Print gcd(10, 4) End Sub
分析以下子过程的功能 ,当n=100,r=8,结果是多少? Public Sub f(ByVal n %, ByVal r %) If n &r Then Call f(n \ r, r) ' ① Print n M '② End Sub Private Sub Command1_Click() Call f(100, 8) End Sub
n 12 100 r 8 8 返回地址 2 2
显示结果 1 4 4
例6.12 打印分形图
递归常见错误: 1.递归调用出现“栈溢出”
在递归调用时,其中的参数要向终止方向收敛。如下求阶乘的递归函数过程: Public Function fac(n As Integer) As Integer If n = 1 Then fac = 1 Else fac = n * fac(n - 1) End If End Function Private Sub Command1_Click() Print & fac(5)= & ;fac(5) Print & fac(5)= & ;fac(-5) ' 栈溢出 End Sub
6.6 常用算法(三)
1.数制转换
例6.13 将一个十进制整数m转换成 r (2~16)进制字符串。方法:将m不断除 r 取余数,直到商为零,以反序得到结果。
2.例6.14加密和解密 简单加密的思想是: 将每个字母C加一序数K,式子 c=chr(Asc(c)+k), 例如序数k为5,这时 “A” “F”,“a” “f”,“B” “G”… 当加序数后的字母超过“Z”或“z”则 c=hr(Asc(c)+k -26)。解密为加密的逆过程。
(1)顺序查找 例6.15。
顺序查找根据查找的关键值与数组中的元素逐一比较(数组可无序) Public Sub Search(a() As Variant, ByVal key As Variant, index%) Dim i% For i = LBound(a) To UBound(a) If key = a(i) Then ' 找到,元素的下标在index中,结束查找 index = i Exit Sub End If Next i index = -1 ' 找不到, index形参的值为-1 End Sub
平均查找次数 n/2
(2)二分法查找
要查找的数组必须有序。思想:要查找的关键值Key同数组的中间mid项元素比较: Key&a(mid) high=mid-1 查找区域缩小一半,继续 Key=a(mid) 找到 结束 Low 12 34 56 78 111 222 333 444 555 666 777 888
Key&a(mid) low=mid+1 查找区域缩小一半,继续
直到找到或查找区域中无元素. 本例用递归实现6.16
Sub birsearch(a(), low%, high%, key , index%) mid
444 Key high
选择、冒泡、插入法排序等。前两种排序欲排序的数据全部输入后,再进行排序; 插入法排序每输入一项,马上插入到数组应在的位置,数组始终有序。例6.17 实现的步骤:
(1)输入欲排序的数据项x;在数组a中找x应所处的位置j; (2)从数组的最后一个元素开始到下标j依次往后移,使j位置空出; (3)将x放入位置j处,一个数据插入完成; (4)有若干个数重复(1)~(3)。
5. 例6.18 高次方程求根 有牛顿迭代法、二分法、弦截法等 (1)牛顿迭代法 迭代公式:
f ( xi ) xi +1 = xi ? f ' ( xi )
思想: 对方程给定一个初值x0作为方程的 近似根,利用迭代公式,求得x1, 当
x1 ? x0 ≤ ε
x1为求得的近似根,否则x1作为x0再迭代。
(2) 二分法求根
思想: 已知求根区间[a,b]有一根,每次把求根区间缩小一半,直到找到解 或求根区间足够小。方法:求[a,b]的中点c,判断: f(c)=0,,c为求得的根,结束; f(a)与f(c)同号,则[a,c]无根,代替a; 否则[c,b]无根,c代替b; 使求根区间缩小一半,重复上述步骤,直到区间小于精度。Public Function halfRoot(ByVal a!, ByVal b!) Dim c! Do While Abs(b - a) & 0.00001 c = (a + b) / 2 If f(c) = 0 Then Exit Do ElseIf f(a) * f(c) & 0 Then a=c Else b=c End If Loop halfRoot = c End Function
6.例6.19数值积分 有矩形法、梯形法、抛物线法(又称辛卜生法)等。梯形法积分的思想是: 将积分区间[a,b]n等分,小区间的长度为, h = b ?
f ( x i ) + f ( x i +1 ) si = ×h 第i块小矩形的近似面积为: 2
整个积分的结果为这n块小面积的累加,即 : n ?1 f ( xi ) + f ( xi +1 ) S ≈∑ × h ≈ ? ( f ( a ) + f (b )) + 2 i =1 ?2
? f ( x i )? × h i =1 ? Public Function trapez(ByVal a!, ByVal b!, ByVal n%) As Single Dim sum!, h!, x! h = (b - a) / n sum = (f(a) + f(b)) / 2 For i = 1 To n - 1 x=a+i*h sum = sum + f(x) Next i trapez = sum * h End Function
7.字符串处理 例6.20 编写一个英文打字训练的程序.要求如下: (1)在标签框内随机产生30个字母的范文; (2)当焦点进入文本框时开始计时,并显示当时时间; (3)在键入文本框按产生的范文输入相应的字母; (4)当键入满了30个字母后结束计时,禁止向文本框输入 内容 ,与范文逐一比较,显示打字的速度和正确率。
重点和难点
1. 确定自定义的过程是子过程还是函数过程 函数过程名有值,子过程名无值。
过程有一个返回值,则使用函数过程; 若返回多个值或无返回值,一般使用子过程。
2.过程中形参的个数和传递方式的确定 过程中参数的作用是实现过程与调用者的数据通信。(1)从主调程序获得初值,值传递。(2)将结果返回给主调程序,地址传递。3. 实参与形参结合时对应问题 个数、类型、位置、次序一一对应。形参是值传递,对应实参可以是表达式、常量、数组元素。形参是地址传递,对应实参只能是简单变量。数组、记录类型、对象只能是地址传递。
4. 变量的作用域问题 局部变量、静态变量、全局变量特点、作用 5. 递归调用出现“栈溢出” 递归过程中有终止的条件和终止时的值或某种操作; 每递归调用一次,其中的参数要向终止方向收敛。
第七章 常 用 控 件
7.1 单选按钮和复选框 7.2 框架 7.3 列表框和组合框 7.4 滚动条和Slide控件 7.5 时钟 7.6 ProgressBar控件 7.7 UpDown控件 7.8 Animation控件 7.9 SSTab控件 7.10 鼠标器和键盘
1. 标准控件
内部控件 出现在工具箱上的控件20个。
2. ActiveX控件
ActiveX部件:是可以重复使用的编程代码和数据。是由用ActiveX技术创建的一个或多个对象所组成 。ActiveX部件文件:扩展名OCX,在Windows的SYSTEM目录中。ActiveX控件 ActiveX文档 ActiveX部件 ActiveX DLL ActiveX EXE ActiveX控件添加到工具箱: 工程/部件 选定控件
常用ActiveX控件所在的文件:
ActiveX控件 通用对话框 (CommonDialog) ToolBar StatusBar ProgressBar Slider Animation UpDown Microsoft Windows Common Control-2 6.0 MSCOMCT2 .OCX Microsoft Windows Common Control 6.0 ActiveX部件 Microsoft Common Dialog Control 6.0 文件名 COMDLG32 .OCX MSCOMCTL .OCX
ActiveX控件与ActiveX DLL/EXE的区别: ActiveX控件: 有界面; 用“工程/部件”命令加载; 工具箱上有图标。ActiveXDLL/EXE: 没有界面; 用“工程/引用”设置引用; 工具箱上没有图标。
3. 可插入对象
Windows应用程序的对象; 可插入对象可添加到工具箱上; 同标准控件一样使用。例如:Microsoft Excel工作表。
7.1 单选钮和复选框 Caption属性:文本标题。Alignment属性 0:控件钮在左边,标题显示在右边。1:控件钮在右边,标题显示在左边。Value属性
单选钮(逻辑型) 检查框(数值型)
True:选定 0--Unchecked:未被选定 False:未选定 1--Checked:选定 2--Grayed:灰色,禁止选择 Style属性 0--Standard:标准方式 1--Graphical:图形方式
事件:Click 因为单击时自动改变状态,故不需要编写过程。
例7.1 用单选钮和检查框设置文本框的字体。
7.2 框架(Frame)
设Caption为 &字体&
框架内控件的创建方法: 方法1:单击工具箱上的工具,然后用出现的“+”指针,在框架 中适当位置拖拉出适当大小的控件。不能使用双击工具箱上图标的自动方式。方法2:将控件“剪切”到剪贴板,然后粘贴(Ctrl+V)到框架。
Caption属性:框架标题 Enabled属性 False:标题呈灰色,不允许对框架内的对象进行操作。Visible属性 True:框架及其控件可见。False:框架及其控件被隐含起来。Click、DblClick事件: 一般不需要编写框架的事件过程。
例7.2 框架用法示例。
7.3 列表框和组合框
列表框各主要属性的值:
List1 List1.ListIndex = 3 (下标从0开始的) List1. ListCount = 5 List1. Selected(3) = True,其余为False。List1. Sorted = False,没有排序。List1. Text 为 “cox” , 与List1. List(List1. ListIndex)相等 Combo1
下拉式组合框 简单组合框 下拉式列表框
列表框各主要属性的值:
List1.ListIndex = 0 List1. ListCount = 8 List1. Selected(3) = True 其余为False。List1. Sorted = False List1. Text 为 “李宁”
1. 共有的重要属性 (P:可在程序中设置或引用,D:可在设计状态设置。) List :PD 字符型数组,存放列表框的项目,下标是从0开始。ListIndex:P 选中的项目的序号,没有项目被选定时为-1 ListCount:P 项目的数量,ListCount-1是最后一项的下标。Sorted:D True:按字母顺序排列。False:按加入先后顺序排列。Text:P 列表项中被选定的内容, List 1.List(List 1.ListIndex) = List1.Text。
2. 列表框的特有属性 Selected:P
逻辑数组。Selected(i)的值为True表示第i+1项被选中。
MultiSelect
0-None:禁止多项选择。1-Simple:简单多项选择。2-Extended:扩展多项选择。
3. 列表框的特有属性
类型 下拉式组合框 简单组合框 下拉式列表框 Style 0 1 2 输入 能 能 不能
AddItem 对象.AddItem item [, index] RemoveItem 对象.RemoveItem index Clear 对象.Clear
列表框:Click、DblClick。组合框:Click,只有简单组合框才有DblClick事件。一般不需要编写Click事件过程。通常在单击命令按钮或发生DblClick事件时才读取Text属 性。
例7.3 对列表框进行项目添加、修改和删除操作。
例7.4 对列表框进行项目添加、修改和删除操作。
Check1 Combo1 Text1
Check2 Option1 Option2
7.4 滚动条和Slider控件
垂 直 滚 动 条 水 平 滚 动 条 SmallChange Min Value Max SmallChange Slider 控 件
Min 属性 Max 属性 SmallChange 属性 LargeChange 属性
LargeChange LargeChange
共同具有的重要属性 Max:最大值 -32 768~32 767 Min:最小值 -32 768~32 767 SmallChange 最小变动值,单击箭头时移动的增量值。LargeChange 最大变动值,单击空白处时移动的增量值。Value 滑块所处位置所代表的值。
事件: Scroll:拖动滑块时会触发Scroll事件。Change:Value属性改变时触发Change事件。例7.5 用一个文本框(txtSpeed)显示滚动条(hsbSpeed)滑块 当前位置所代表的值。
例7.6 调色板程序。
Sub hsbSpeed_Change() Text1.Text= HScroll1.Value End Sub
例7.7 用Slider控件设置文本框中的字体大小。
7.5 时钟(Timer)
时钟控件以Interval为时间间隔产生 Timer事件。属性 Interval属性 单位:ms(0.001s),0.5秒是500。Interval=0:屏蔽计时器。Enabled属性 True:有效计时 False:停止时钟工作 事件 Timer
例7.8 定时的闹钟 例7.9 蝴蝶飞舞
7.6 ProgressBar控件
Max 属性 Min 属性 MousePointer 属性 BorderStyle 属性 Appearance 属性 Orientation 属性 Scrolling 属性
位于Microsoft Windows Common Control 6.0部件。
重要属性:
Max、Min:该控件的界限。Value:决定控件被填充多少。
例7.10 用进度条指示一个大数组的计算进度。
7.7 UpDown控件
位于Microsoft Windows Common Control-2 6.0。通常与伙伴控件 “捆绑”在一起使用。
BuddyControl
BuddyProperty
Value Increment
UpDown应用示例。
7.8 Animation控件
位于Microsoft Windows Common Control-2 6.0。属性: Center:决定动画是否在控件的中央播放。AutoPlay属性:决定在用Open方法打开文件时是否自动播 放。方法: Open:打开文件; Play: 播放动画; Stop: 停止播放; Close:关闭文件。例7.11 为例7.10配上动画。
7.9 SSTab控件
位于Microsoft Tabbed Dialog Control 6.0。
重要属性:
Style:选项卡样式; Tabs: 选项卡总数; TabsPerRow:每一行选项卡的数目; Rows:选项卡总行数; TabOrientation:选项卡的位置; ShowFocusRect:决定选项卡上的焦点矩形是否可视; Tab:当前选项卡的序号。序号从0开始,如果Tab为1, 则第 二个选项卡为当前活动的选项卡。
例7.12 选项卡制作示例。
7.10 鼠标器和键盘
1. 鼠标器事件 注意:鼠标事件发生在什么对象上,是窗体上还是控件上。MouseDown事件
Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)(发生在窗体上的事件过程)
MouseUp事件
Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) (发生在窗体上的事件过程)
MouseMove事件
Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) (发生在窗体上的事件过程)
(1) Button参数
B0为1:按下了左键; B1为1:按下了右键; B2为1:按下了中键。例如:Button为2(010B),即B1 为1,表示按下了右键; 如果按了左键,则B0为1, B1和B2为0, Button为1(001B)
If Shift = 1 Then '或者 If Shift = vbLeftButton Then … ' 这是按了左健后执行的代码 … Endif
使用符号常数:
1―vbLeftButton:用户按下左键触发了鼠标事件; 2―vbRightButton:用户按下右键触发了鼠标事件; 4―vbMiddleButton:用户按下中键触发了鼠标事件。
(2) Shift参数
B0为1:按下了Shift键; B1为1:按下了Ctrl键; B2为1:按下了Alt键。例如:Button为2(010B),即B1 为1,表示仅按下了Shift键; 如果同时按了Ctrl和Shift键,则B0和B1为1,B2为0,Button为3(011B) 注意: 可能同时按下两个或三个键。如果Button&&1成立,并不表示没有按下
Shift,因为可能其他键也被按下了。如果要测试按下了某个键,则应用and进行 位运算。例如Button and 1成立,表示肯定按下了Shift(可能其他键也被按下 了)。If Shift = 1 and Button = 2 Then … ' 这是仅按住Ctrl了健单击鼠标后执行的代码 … End If
思考: Shift = 1 and Button and 2 表示什么意义?
符号常数: 1―vbShiftMask; 2―vbCtrlMask; 4―vbAltMask 。Shfit And vbCtrlMask为真: 按下了Ctrl键; CBool(Shift And vbCtrlMask) Or CBool(Shift And vbShiftMask)为真, 按下了Ctrl键和Shift键 (3) x,y:鼠标的当前位置 例7.13 显示鼠标器指针所指的位置。例7.14 画圆程序。按下鼠标右键画圆,按下鼠标左键移动时画线。在画线时用note14.ico作为鼠标的指针。
2. 键盘事件
KeyPress事件过程 Sub Form_KeyPress(KeyAscii As Integer) Sub object_KeyPress([index As Integer,]KeyAscii As Integer) KeyDown事件过程 Sub Form_KeyDown(keycode As Integer, shift As Integer) Sub object_KeyDown([index As Integer,]keycode As Integer, shift As Integer) KeyUp和KeyDown事件过程 Sub Form_KeyUp(keycode As Integer, shift As Integer) Sub object_KeyUp([index As Integer,]keycode As Integer, shift As Integer)
Shift与鼠标事件过程Shift相同。KeyCode:键盘扫描码; K A ii 字符ASCII码
KeyDown和 KeyUp 输入一个ASCII字符 按任意一个键 KeyAscii接收到 字符的ASCII值 事件发生一次 97 65 KeyCode接收到 键的扫描码 事件发生两次 第一次是17 第二次是65 第一次是17 第二次是65 KeyPress
事件发生的时间 参数值 按Shift+A时 事件发生的次数 按Shift+A时参数值 (键盘处于大写状态) 按Shift+A时参数值 (键盘处于小写状态)
窗体的KeyPreview为True 焦点在控件上输入
窗体的: KeyPress KeyDown KeyUp
控件的: KeyPress KeyDown KeyUp
在这里作一点修改 影响所有控件
在这里作一点修改 影响一个控件
假定窗体KeyPreview为True,并有下面事件过程, 则当文本框中输入“1”时,实际上是得到的是“3”
Sub Form_KeyPress(KeyAscii AsInteger) KeyAscii = KeyAscii + 1 End Sub Sub Text1_KeyPress(KeyAscii As Integer) KeyAscii = KeyAscii + 1 End Sub
?窗体KeyPreview为False时
在文本框中输入“1”时,实际上 得到的是什么。
对输入的数据进行验证、限制和修改
1. 修改输入数据 接收大写字符。
将KeyPreview设置为True时:
Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii &= Asc(&a&) And KeyAscii &= Asc(&z&) Then KeyAscii = KeyAscii + Asc(&A&) - Asc(&a&) End If End Sub
如果把它改为某个控件的事件过程,效果一样吗? 2. 限制数据输入 文本框只能接收“0”~“9”的数字字符。
Sub txtExample_KeyPress(KeyAscii As Integer) If KeyAscii & 48 Or KeyAscii & 57 Then KeyAscii = 0 End If End Sub
例7.15 编写一个程序,当按下Alt+F5时终止程序的运行。
'先把窗体的KeyPreview设置为True,再编写如下的程序: Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) '按下Alt键时,Shift的值为4 If (KeyCode = vbKeyF5) And (Shift = 4) Then End End If End Sub
例7.16 “锤打红心”游戏
(1) 利用上、下、左、右四个箭头键控制“铁锤” : “ ”:37(&H25) “ ”:38(&H26) “ ”:39(&H27) “ ”:40(&H28) (2) 如 果 Abs(Image1.Left - Image2.left & 300) And Abs(Image1.Top Image2.Top & 320)成立,则认为是重叠,“铁锤”锤打到“红心”。(3) 在窗体上的时钟控件(Timer1)过程中控制“红心”移动。Timer1的Interval 属性为200,即每1秒产生5个Timer事件。
3.拖放 自动拖放
(1DragMode属性 0:(缺省),手工拖动模式 ; 1:自动拖动模式 。( 2 )DragIcon属性 拖动过程中显示的图标(Ico或Cur文件)。lblExample1.DragIcon=LoadPicture (&C:\Icons\Mail.ico&) lblExample2.DragIcon=picIcon.Picture ( 3 ) Drag方法 当DragMode为0时,需用Drag方法启动拖放。[控件名称.]Drag 参数 0:开始拖放操作; 1(省略):结束拖放操作; 2:取消拖放操作。
例7.17 拖放应用示例。
例7.18 拖放应用示例。
4. OLE 拖放 OLEDragMode属性(源控件设置): 0----Manual:缺省,手工; 1----Automatic:自动。OLEDropMode属性(目标控件设置): 0----None:缺省,目标控件不接受“放”; 1----Manual:手工实现“放”操作; 2----Automatic:自动实现“放”。完全支持自动OLE拖放: PictureBox Image TextBox。示例 支持自动“拖”操作,不支持自动“放”: ComboBox FileListBox DirListBox和ListBox。示例 只支持OLE拖放事件的控件有: CheckBox Frame OptionButton、 Label DriveListBox CommandButton
例7.19从Windows资源管理器把文件的文件名拖到标签 上。
OLEDropMode为1(Manual)
Sub Label1_OLEDragDrop(Data As DataObject, Effect As Long, _ Button As Integer, Shift As Integer, X As Single, Y As Single) Label1.Caption = Data.Files(1) ' 在资源管理器中选定文件且拖出时,系统就把所选定的文件名 ' 保存在Data对象的Files属性中,Files属性实质上是一个数组 'Label1.Caption = Data.Files(1)将保存的第一个文件名显示'在标签 中 End Sub
第八章 界 面 设 计
8.1 通用对话框 8.2 菜单设计 8.3 多重窗体和多文档界面 8.4 工具栏和状态栏 8.5 RichTextBox控件 8.6 应用程序向导
8.1 通用对话框(CommonDialog)
通用对话框添加到工具箱:
工程/部件 打开通用对话框: 选定 部件标签
通用对话框的类型 打开(Open) 另存为(Save As) 颜色(Color) 字体(Font) 打印机(Printer) 和帮助(Help)
选定Microsoft CommDialog Control 6.0
Action 1 2 3 4 5 6 方法 ShowOpen ShowSave ShowColor ShowFont ShowPrinter ShowHelp
Action:打开通用对话框。DialogTiltle:对通用话框标题。CancelError True:选择“取消”按钮,出现错误警告; Err.Number置为32755(cdCancel)。False(缺省):选择“取消”按钮,没有错误警告。
1.文件对话框(打开、保存)需设置的属性
FileName FilterIndex
“打开”文件对话框属性页
DialogTiltle FileName InitDir Filter DefaultExt FilterIndex
属性 FileName:包含路径; FileTitle:不包含路径。Filter:例如,
Documents(*.DOC)|*.DOC|Text Files(*.TXT)|*.txt|All Files|*.*
FilterIndex:决定在文件类型列表框中显示第几组类型的文件。InitDir:初始化路径。
例8.1 用命令按钮的Click事件显示文件打开对话框。CommonDialog1.InitDir= &C:\Windows & CommonDialog1.Filter = &文本文件 | *.Txt& CommonDialog1.CancelError = True CommonDialog1. ShowOpen 2. “另存为”对话框 没有提供真正的存储文件操作,仍需要编程完成储存操作。属性 DefaultExt:缺省扩展名。3. “颜色”对话框 属性 Color:返回或设置选定的颜色。例8.2 “颜色”对话框的使用。' 设置初始目录 ' 过滤文件类型 ' 控制取消按钮 ' 打开对话框
4.“字体”对话框
FontName FontBold、FontItalic FontSize
FontStrikethru FontUnderline Color
Flags属性:指示所显示的字体类型,必须设置。
cdlCFScreenFonts cdlCFPrinterFonts cdlCFBoth&H3 cdlCFEffects &H1 屏幕字体 &H2 打印机字体 打印机字体和屏幕字体。&H100 显示删除线和下划线检查框以及颜色组合框
例8.3 字体对话框的使用。
5. “打印”对话框 属性 FromPage:起始页号; ToPage:终止页号; Copies:打印份数。
如果打印驱动程序不支持多份打印,该属性有可能始终返回 1。
例8.4 打印对话框的使用。6. “帮助”对话框 帮助文件需要用其他的工具制作,如Microsoft Windows Help Compiler。例8.5 属性 HelpCommand:在线Help帮助类型; HelpFile:Help文件的路径及其名称; HelpKey:在帮助窗口显示由该帮助关键字指定的帮助信 息。
8.2 菜单的设计
下拉式菜单系统的组成结构 :
主菜单条 菜 单 项
主菜单名 快捷键 热键
下级子菜 单标记
一、菜单编辑器的使用
工具/菜单编辑器(Ctrl+E); 窗体上快显菜单/菜单编辑器。
常用属性:
1. 标题(Caption) 热键 菜单项属性 操作按钮 菜单列 表框 2. 名称(Name)文本框 3. 快捷键(Shortcut) 前面加& 分隔符也应有名称 菜单名没有快捷键
4. 复选(Checked)检查框 TRUE 有 5. 有效(Enabled)检查框 6. 可见(Visible)检查框
例 8.6 建立一个有菜单功能的文本编辑器

我要回帖

更多关于 一千克等于多少克 的文章

 

随机推荐