蓄水池用料立方算法:全国计算机二级VB笔记
来源:百度文库 编辑:偶看新闻 时间:2024/05/03 10:48:46
第一讲:Visual Basic概述
重点:
1、掌握面向对象的程序设计的概念:对象、方法、属性与事件
2、事件驱动过程的程序设计原理
3、介绍VB集成开发环境
4、VB开发环境的基本操作
1.1 Visual Basic简介
•具有面向对象的可视化设计工具
•事件驱动的编程机制
•提供了易学易用的应用程序集成开发环境
•结构化的程序设计语言
•支持多种数据库的访问
•支持DDE、DLL、OLE技术
•完备的Help联机帮助功能
1.
1.2面向对象的程序设计方法基础
2. 对象及对象类:动作体的逻辑模型,称为“对象”
3. 属性: 属性是用来描述对象的特性。
4. 方法: 方法指对象可以进行的动作或行为。
VB 对象具有属性、方法和事件。属性是描述对象的数据;方法告诉对象应做的事情;事件是对象所产生的事情,事件发生时可以编写代码进行处理。
VB 的窗体和控件是具有自己的属性、方法和事件的对象。可以把属性看作一个对象的性质,把方法看作对象的动作,把事件看作对象的响应。
日常生活中的对象,如小孩玩的气球同样具有属性、方法和事件。气球的属性包括可以看到的一些性质,如它的直径和颜色。其它一些属性描述气球的状态(充气的或未充气的)或不可见的性质,如它的寿命。通过定义,所有气球都具有这些属性;这些属性也会因气球的不同而不同。
气球还具有本身所固有的方法和动作。如:充气方法(用氦气充满气球的动作),放气方法(排出气球中的气体)和上升方法(放手让气球飞走)。所有的气球都具备这些能力。
1. 3基于Windows环境下的应用程序的工作方式——事件驱动
在传统的或“过程化”的应用程序中,应用程序自身控制了执行哪一部分代码和按何种顺序执行代码。从第一行代码执行程序并按应用程序中预定的路径执行,必要时调用过程。
在事件驱动的应用程序中,代码不是按照预定的路径执行,而是在响应不同的事件时执行不同的代码片段。事件可以由用户操作触发、也可以由来自操作系统或其它应用程序的消息触发、甚至由应用程序本身的消息触发。这些事件的顺序决定了代码执行的顺序,因此应用程序每次运行时所经过的代码的路径都是不同的。
因为事件的顺序是无法预测的,所以在代码中必须对执行时的“各种状态”作一定的假设。当作出某些假设时(例如,假设在运行来处理某一输入字段的过程之前,该输入字段必须包含确定的值),应该组织好应用程序的结构,以确保该假设始终有效(例如,在输入字段中有值之前禁止使用启动该处理过程的命令按钮)。
在执行中代码也可以触发事件。例如,在程序中改变文本框中的文本将引发文本框的 Change 事件。如果 Change 事件中包含有代码,则将导致该代码的执行。如果原来假设该事件仅能由用户的交互操作所触发,则可能会产生意料之外的结果。正因为这一原因,所以在设计应用程序时理解事件驱动模型并牢记在心是非常重要的。
在VB中事件的调用形式是:
Private Sub对象名_事件名
(事件内容)
End Sub
1.4 Visual Basic 的集成开发环境
VB 集成开发环境 (IDE——Integrated Developing Environment ) 由以下元素组成:
1. 标题栏
用于显示正在开发或调试的工程名和系统的工作状态(设计态、运行态、中止态)。
2. 菜单栏
用于显示所使用的 Visual Basic 命令。VB6.0标准菜单包括:
3. 工具栏
在编程环境下用于快速访问常用命令。缺省情况下,启动 VB后显示“标准”工具栏,附加的编辑、窗体设计和调试的工具 栏可以从“视图”菜单上的“工具栏”命令中移进或移出。
4. 窗体设计器
用来设计应用程序的界面。启动VB后,窗体设计器中自动出现一个名为Form1的空白窗体,可以在该窗体中添加控件、图形和图片等来创建所希望的外观,窗体的外观设计好后,从菜单中选择“文件”→“保存窗体”→在保存对话框中给出合适的文件名(注意扩展名),并选择所需的保存位置→确定。需要再设计另一个窗体时,单击工具栏上的“添加窗体”按钮即可。
5. 控件(工具)箱
由一组控件按钮组成,用于设计时在窗体中放置控件。除了缺省的工具箱布局之外,还可以通过从上下文菜单中选定“添加选项卡”并在结果选项卡中添加控件来创建自定义布局。6. 弹出式(上下文)菜单
在要使用的对象上单击鼠标右键即可打开快捷菜单,其上会出现与当前对象相关的经常执行的操作,以加快操作速度。
7. 工程管理器窗口
用于浏览工程中所包含的窗体和模块,还可以从中查看代码、查看对象。
8. 属性窗口
是VB中一个比较复杂的窗口,其中列出了对选定窗体和控件的属性设置值。VB中正是通过改变属性来改变对象的特征,如大小、标题或颜色。
9. 对象浏览器
列出工程中有效的对象,并提供在编码中漫游的快速方法。可以使用“对象浏览器”浏览在 VB中的对象和其它应用程序,查看对那些对象有效的方法和属性,并将代码过程粘贴进自己的应用程序。
10. 对象浏览器
右击窗体中的对象、从工程管理器中点“查看代码”按钮。
11.窗体布局窗口
Form Layout window允许使用表示屏幕的小图象来布置应用程序中各窗体的位置。
12. 立即、本地和监视窗口
这些附加窗口是为调试应用程序提供的,它们只在 IDE 之中运行应用程序时才有效。
1.5 创建VB应用程序的一般步骤
一个VB程序也称为一个工程,由窗体、标准模块、自定义控件及应用所需的环境设置组成。开发步骤一般如下:
1. 创建程序的用户界面
2. 设置界面上各个对象的属性
3. 编写对象响应事件的程序代码
4. 保存工程
5. 测试应用程序,排除错误
6. 创建可执行程序
•硬件环境:486以上处理器、16MB以上内存、50MB以上的硬盘空间、CD-ROM驱动器、鼠标等
•软件环境:Windows95或 indowsNT3.51以上版本
•初次安装:
1)启动Windows95
2)插入具有VB6.0系统的光盘
3)运行VB6.0安装程序Setup.exe
4)选择“典型安装”或“自定义安装”或“最小安装”
•添加或删除VB6.0部件:
1)插入具有VB6.0系统的光盘
2)运行“开始/设置/控制面板”
3)双击控制面板中的“添加/删除程序”图标
4)选择其中的“Visual Basic 6.0”选项
•启动
1.桌面:开始/程序/Visual Basic 6.0
2.建立快捷方式,双击图标
•退出
1.选择文件菜单下的退出命令
2.单击窗口关闭按钮
举例:
1 启动VB,开始新工程
2创建程序的用户截面
3加入程序代码
4 保存工程文件
5 运行和调试应用程序,检查并排除程序中的错误
6 生成可执行程序
7 打印窗体和代码
第二讲 常用控件与界面设计
重点:
1、掌握窗体常用的属性、方法与事件,重点掌握窗体的Print方法的使用
2、掌握标签、文本框、命令按钮等控件的常用属性、方法、事件
2.1 创建窗体
补充内容:调整窗体布局 生成可执行文件
2.2 VB的常用控件(P19)
概述:
控体是用来进行用户界面设计的可视化部件。
常用的VB6 控件一览表 P20
常用控件:P21
(1) 文本框(TextBox):用于接收用户在框内输入 的信息或显示由程序提供的信息。
文本框在工具箱中的图标P25;在窗体中的形式
属性:
名称:文本框名称。命名规则同窗体名。(通常以“Txt”作为前缀。)
Text :文本属性。该属性的值为用户从文本框中输入的内容。
PasswordChar:口令属性。设置是否可以看到用户从文本框中输入的文本内容。
取值:空字符串:(默认值):可以看到输入的字符。
某一字符:用户每输入一个字符,文本框内就出现一个该字符。
MaxLength :最大长度属性。设置文本框的Text 属性中所能放入的字符总个数。
取值:0:(默认值)。
1~32 KB。
MultiLine :多行属性。设置用户是否可在文本框内输入多行文本。
取值: True:可多行输入。
False:(默认值)只能单行输入。
Alignment:对齐属性。设置文本框内的文本内容的对齐方式。
取值:0:(默认值)靠左对齐。
1:靠右对齐。
2:居中对齐。
说明:本属性只在MultiLine 为 True 时有效。
TabStop:[Tab]键属性。设置是否可用[Tab]键来移动焦点到另一个对象上。
取值:True:(默认值)可以。
False:不可以。
其它属性类似窗体。
方法:
Refresh :刷新。
SetFocus :设置焦点。通过本方法,可以使光标指向指定的文本框。
事件:
Change :当文本框的内容发生变化时,就引发本事件。
LostFocus:当光标离开文本框时,引发本事件。
Keypress:当用户按下或松开键盘上某个按键时,发生本事件。
(2)标签:(Label) 主要用于在窗体上增加文字说明。
标签在工具箱中的图标P25;在窗体中的形式
属性:
名称:标签名称。(通常以“Lbl”作为前缀。)
Caption :标题属性。本属性的值为显示在标签上的内容。
AutoSize :大小自适应属性。即标签的大小是否随着标题内容的多少而自动变化。
取值:True :是。
False :(默认值)否。
FontName :字体名称。设置在标签内显示的文本的字体名称。
方法:
Refresh :刷新。
Move :移动。
事件:
Click :单击事件。
DblClick:双击事件。
(3) 命令按钮:(commandbutton):用户用鼠标单击命令按钮,表示要执行某项功能。
属性:
名称:(通常以“Cmd”作为前缀。)
Caption : 标题 。其值就是在命令按钮上显示的文本。
Default :设定此命令按钮是否为窗体的默认按钮。
取值 true :在窗体启动(Active)后,按 Enter 键马上就会执行的命令按钮。(同一窗体中只能有一个命令按钮的此项属性值为 true )
False :否。
Enabled :设定命令按钮是否可用。
取值 true :(默认值):可用。
false :不可用。(命令按钮呈灰色)
事件:
click : 单击事件
方法:
SetFocus : 命令按钮经过 SetFocus 方法后,将取得焦点。(用户此时按回车键将会执行此命令按钮。)
(4)复选框:(checkbox):用来设定程序的执行状态。
属性:
名称:(通常以“Chk”作为前缀。)
caption: 标题,显示在复选框的右方,指明此复选框所代表的功能。
Value :表示复选框在执行时的三种状态。
取值: 0: 不复选,执行时无勾。
1: 复选,执行时有勾。
2: 灰色,表示用户不能修改这个设定值,只能看到它目前状态。
事件:
click :单击事件。
方法:
Move :
Refresh :
(5)选项按钮:(optionbutton)用来设定程序的执行状态。
属性:
名称:(通常以“Opt”作为前缀。)
caption:标题
alignment : 设置标题文本的对齐方式。
取值: 0:(默认值)靠左对齐
1:靠右对齐
2:靠中对齐
value : 其值决定该选项按钮是否被选中。
取值:true : 表示此选项按钮被选中。
False : 表示此选项按钮没选中。
说明:一个窗体或一个框架内的选项按钮只能有一个被选中,(不同框架内的选项按钮互不干扰)若用户不设定哪一个选项按钮的值为 true ,则系统指定第一个选项按钮的 value 值为 true 。
事件:
click :单击。
方法:
Move:
Refresh
(6) 框架 :(frame)可以用框架控件将其它各自独立的控件(一般指复选框、选项按钮等)组合在一组中。如实验指导书P13、P16。
属性:
名称 caption top left width height font forecolor 等等
事件:click dblclick 等等
说明:1、在使用框架控件将其它控件分组时必须先绘制框架控件,后绘制其中的控件。
2、在一个框架内的控件可以进行整体的激活、屏蔽、移动等等。
3、在同一个窗体中的多个选项按钮,只有一个可以被选中,但在窗体中可以用框架将选项按钮分类,在同一框架内的多个选项按钮中只有一个可以被选取。不同框架内的选项按钮彼此互不干扰。
4、要将控件画在框架之中,不能双击控件,因为那样将使控件重叠在框架的上面,必须单击工具图标,然后在框架内拖动后释放,这样的所画的控件在框架之中。
第三讲 常用控件与界面设计
重点:
1、掌握列表框、组合框、选项按钮、复选按钮、滚动条等控件的常用的属性、方法、事件
2、掌握菜单的设计
(7)列表框 ( ListBox):用于列出可供用户选择的项目列表。用户可以从中选择一个或多个项目。
属性:
名称:(通常以“List”作为前缀。)
List:列表属性。用于保存列表的内容。
List实际上是一个一维数组,数组中元素的值,就是在执行时看到的列表项(item)
一维数组:List 中有5个元素,List(0),List(1) List(2) ,List(3) ,List(4)
列表项文本 List (0)=68
List (1)=78
List (2)=88
List (3)=80
List (4)=76
数组名:List 列表项序号: 0,1,2,3,4, (从0开始)
列表项文本(数组元素值)分别为:68 78 88 80 76
Listcount:列表框内所有选项的总数,也就是List()数组元素的总个数。
ListIndex:用户最后单击的列表项在List() 数组中的编号顺序。
(无选中时其值为-1)
Text: 列表项的正文。其值为最后选中的列表项的文本。
请记住如下关系:
[对象名称.]List(ListIndex)=Text
Columns:列表框显示形式。设定Listbox的列表项若超过显示范围时,其卷动方式使用垂直滚动条或是水平滚动条。
取值:0:(默认值)使用垂直滚动条。逐行显示列表项,可能有垂直滚动条。
1~n :使用水平滚动条。此时列表框内一次可显示的列数(Column)即为 n 值。
MultiSelect:设定是否允许用户多重选取对象的列表项
取值: 0:不能多重选取。(默认值)
1:简易多重选取。(用鼠标或空格键来选取,一次一个)
2:高级多重选取。可用[shift] 或 [ctrl] 来选取。(类似文件选取)
Selected:设定列表项是否被选取的状态。它是一个与List大小相同的数组。
其中各元素的取值: True :被选取。
False:不被选取。(默认值)
Sorted:排序属性。设定列表项是否要照ASCII代码排序。(字母顺序)
取值: True :是(不区分大小写)
False:否。(默认值)
方法:(P28)
AddItem:添加列表项。
格式:[对象名称.]AddItem <列表项文本>[,插入位置序号]
说明:1、若不指定位置,则插入到列表项末尾。
2、新列表项插入后,原来位置及其后的列表项顺序下移。
Clear:删除列表所有项目。
RemoveItem:删除列表项。
格式: [对象名称.]RemoveItem 删除项序号
事件:
Click :单击事件。
Dblick:双击事件(使用较少)
应掌握:
1.如何添加或删除列表框中的列表项?
方法一:在设计态:定制 List 属性。(向列表中添加列表时,按[ctrl]+[Enter]换行。)
方法二:在程序代码中:用AddItem,RemoveItem 等方法进行。
2.如何知道目前用户所选取的列表项和目前列表框中的列表项数目?
用户目前所选的列表项:Text 的值。
目前列表框中的列表项数目:ListCount 的值。
(8)组合框(comboBox):将文本框和列表框结合在一起,在列表框中所选项目的文本会自动填入文本框。(与列表框相比,组合框一次只能选取一个列表项)
工具箱中的图标P25;在窗体中的形式
属性:
同Listbox 有:List, ListCount,ListIndex,Text,Sorted 等等。
Style :外观属性。设置组合框的类型和功能。
取值:(实验指导书P40)
0:(默认值)系统将创建一个带有下拉式列表框的组合框。
称为组合下拉式的组合框。它的下拉式窗体不是一直显示的。
(如word 中字体大小选择框),
此状态下用户可将所内容直接输入到文本框中。
1:系统创建一个由文本框和列表框直接结合在一起的简单组合框。
称为组合式的组合框。它的下拉式窗体是一直显示的。
如:word 中字体菜单对话框中的字体、字号对话内容。
2:系统创建一个没有文本框的下拉式列表框。单击列表框右侧的按钮,文本框才会显示出来。
称为单纯下拉式的组合框。
此状态下用户不可在文本框中输入,只能在列表中选择。且下拉式窗体也不是一直显示的。
Text:文本属性。其取值为用户从列表框中选定的文本内容或直接输入文本框中的内容。
事件:对不同类型的组合框,响应的事件是不相同的。
对于0,2类型的组合框:单击事件。
对于 1 类型的组合框:双击事件。
带有文本框的0,1组合框:在编辑文本时可引发Change 事件。
说明:1、用户若只需要使用单选的列表框,则可用组合框来代替。
2、如何添加或删除组合框中的列表项?(方法:同列表框)
3、如何知道用户目前所选取或输入的列表项是什么?
由于组合框不允许多重选取,所以,Text 属性值为内容;Listindex 属性值为序号。
方法: 同列表框。
图像:(image): 主要用于图像的显示、放大、缩小等静态显示图像场合。
图像框中不能容纳其他控件、也不能绘制图形和显示文本。而图片控件框中可以。
图像在工具箱中的图标P25;在窗体中的形式
属性:
名称:
visible :设置此对象在执行时是否看得见。
取值:True :(默认值)看得见。
False :隐藏。
enabled :可用否。
picture : 设定图像框中代表的图片名称。
其值在设定时的格式为: 盘符\ 路径\图片文件名(.ico 图标文件 .bmp位图文件)
stretch : 用来决定图像控件的大小是否要随着所载入图片的大小而变化。
取值: true : 随图片的大小而变化。
False :(默认值) 不随图片的大小而变化。
事件:
类似窗体。
方法:
Move Refresh
(10)图片:(picturebox): 不仅可以装入图像,还可以在它上面绘制各种图形和显示正文、放置控件(类似框架控件)。
图片在工具箱中的图标P25;在窗体中的形式
水平滚动条(horizontal scroll bar)、垂直滚动条(vertical scroll bar):
滚动条:用来附加在那些不能自动支持滚动的应用程序或控件中水平滚动或垂直滚动查阅大量信息。一般出现在文本框 、列表框右边;用来调整数据或选择输入。( 如word 中字体、段落对话框中)
滚动条在工具箱中的图标P25;在窗体中的形式
属性:(实验指导书 P18)
名称:(通常以“Hsb”、“Vsb”作为前缀。)
Max / Min : 定义了 Value 属性值所能出现的最大值和最小值。
说明:1、一开始使用滚动条时,Max 为32768,Min 为 0 。
2、水平滚动条位于最左边时、垂直滚动条位于最上边时为 Min;水平滚动条位于最右边时、垂直滚动条位于最下边时为 Max 。
Value : 滚动条目前所在位置所对应的数值。(也可在代码中设定。)
LargeChange : 当用户在滚动块的上方、下方(左方、右方)单击时Value所增加的值。默认值为1。
SmallChang : 当用户在滚动条两端的箭头按钮上单击时Value所增加的值。默认值为1。
事件:
Change : 在滚动块移动后(即Value值改变时)发生。
例如,可用一个滚动条的 Change 事件过程更新一个 TextBox 控件中滚动条的 Value 属性的设置。或者可以利用 Change 事件过程在一个工作区里显示数据和公式,在另一个区域里显示结果。
Scroll : 在拖动滚动块时发生。单击滚动箭头或滚动条时不发生。
方法:
Move : 用以移动滚动条。
Refresh : 强制全部重绘一个滚动条。
SetFocus : 设置焦点。将焦点移至指定的滚动条上。
时间:(timer) (计时器):用来实现与时间有关的功能。
时间控件在工具箱中的图标P25;在窗体中的形式
属性:
名称:
enabled
interval 用来设定引发timer 事件过程的间隔时间,单位为1/1000秒。
事件: (时间控件只有一个事件)
timer : 它会按照 interval 所设定的时间定时引发。
说明:时间控件的使用方法:
1.在 form 上放置一个时间对象。
2.在属性窗口中设定其 interval 属性。
3.填写timer 事件的程序内容,
4.当程序开始执行后,将不会看到它的图标,每隔 interval 定义的时间内,程序会触发一次timer 事件。
时间控控件应用举例:windows 中计时器,word 中的定时保存文件,定时更新屏幕画面(屏幕保护程序)等等。
第四讲 数据表达式与简单程序设计
本讲内容及要求:
1 熟悉VB程序中代码和语句书写规则;
2 掌握VB的数据类型;
3 掌握VB的 运算符和表达式的使用;
4 掌握常用内部函数的使用;
本章重点:
变量和常量的定义及使用、运算符和表达式的使用及常用内部函数的使用。
本章难点:
数据类型、内部函数。
4.1 程序代码的组织方式
一个VB程序由窗体界面和程序代码两部组成,通过程序代码把窗口界面的各个对象以及应用中的其它元素联系在一起。程序代码部分则由若干被称为“过程”的代码行及向系统提供某些信息的说明组成。过程及说明又被组织在“模块”之中。将设计的过程代码及相关说明合理地组织到不同的模块之中,也就是设计代码的结构,在创建VB应用程序时是最为重要的一个步骤。
一 过程
所谓“过程”,就是具有特定书写格式、包含若干可被作为一个整体执行的代码的组合。根据执行方式,可把“过程”分为“事件过程”和“通用过程”两类。
二 模块
模块是VB用于将不同类型过程代码组织到一起而提供的一种结构。在VB中具有三种类型的模块: 窗体模块
标准模块
类模块。
4.2. VB代码书写规则
(1) 程序中不区分字母的大小写,Ab 与AB等效;
(2) 系统对用户程序代码进行自动转换:
1) 对于VB中的关键字,首字母被转换成大写,其余转换成小写
2) 若关键字由多个英文单词组成,则将每个单词的首字母转换成大写
3) 对于用户定义的变量、过程名,以第一次定义的为准,以后输入的自动转换成首次定义的形式
(1)在同一行上可以书写多行语句,语句间用冒号(:)分隔
(2)单行语句可以分多行书写,在本行后加续行符:空格和下划线 _
(3) 一行允许多达255个字符
4.3 VB的数据类型
4.3.1.数据类型
1 VB的标准数据类型
数据类型
关键字
类型符
前缀
存储空间
范围
数值数据类型
字节型
Byte
Byt
1 个字节
0 到 255
整型
Integer
%
Int
2 个字节
-32,768 到 32,767
长整型
Long
&
Lng
4 个字节
-2,147,483,648 到 2,147,483,647
单精度型
Single
!
Sng
4 个字节
负数:-3.402823E38 到 -1.401298E-45;正数:1.401298E-45 到 3.402823E38
双精度型
Double
#
Dbl
8 个字节
负数: -1.79769313486232E308
- 4.94065645841247E-324;
正数:4.94065645841247E-324
1.79769313486232E308
货币型
Currency
@
Cur
8 个字节
从 -922,337,203,685,477.5808
到 922,337,203,685,477.5807
逻辑型
Boolean
Bln
2 个字节
True 或 False
日期型
Date
Dtm
8 个字节
100 年1月 1日 到 9999 年 12 月 31 日
对象型
Object
Obj
4 个字节
任何 Object 引用
变长字符型
String
$
Str
10 字节加字符串长度
0 到大约 20 亿
定长字符型
String
$
Str
字符串长度
1 到大约 65,400
变体数字型
Variant
Vnt
16 个字节
任何数字值,最大可达 Double 的范围
变体字符型
Variant
Vnt
22 个字节加字符串长度
与变长 String 有相同的范围
注意:
1)VB中对没有声明的变量其缺省的数据类型是变体型,可以用来存储各种数据,但所占用的内存比其它类型都多。为提高运行效率(整型效率较高),或达到一定的运算精确度(浮点型精度较高,但运行较慢),应合理的定义数据类型。
2) 逻辑型数据只有True 和False两个值,转换成整型时,True=-1 ,False=0,将其它类型转换成逻辑型时,非0数转换为True ,0转换为False。
3) 字符型可以包括所有的西文字符和汉字,字符必须用双引号括" "起来, 如:"abc123"
4)日期型数据按8字节的浮点数来存储,日期型数表示方式有两种:可以用号码符#括起来,也可以用数字序列表示(小数点左边的数字代表日期,右边代表时间,0为午夜,0。5为中午12点,负数表示是1899年12月31日前的日期和时间)。
如:#3/22/2002# #2002-3-22 14:30:20#
Dim T As Date
T=-2.5
Print T ' 打印出来的结果是1899-12-28 12:00:00
5)任何数据类型的数组都需要 20 个字节的内存空间,加上每一数组维数占 4 个字节,再加上数据本身所占用的空间。数据所占用的内存空间可以用数据元数目乘上每个元素的大小加以计算。例如,以 4 个 2 字节之 Integer 数据元所组成的一维数组中的数据,占 8 个字节。这 8 个字节加上额外的 24 个字节,使得这个数组所需总内存空间为 32 个字节。
2. 变量与常量
(1)变量或常量的命名规则
1) 必须以字母或汉字开头,由字母、汉字、数字或下划线组成,长度≤255个字符;
2) 不能使用VB中的关键字,并尽量不与VB中标准函数名同名;如:Dim 、Sin
3)VB中不区分变量的大小写,一般变量首字母用大写,其余用小写;常量全部用大写字母表示
4)为了增加程序的可读性,可在变量名前加一个缩写的前缀来表明该变量的数据类型。
(2)变量声明
1)用Dim语句进行显式声明
语句形式: Dim 变量名 [As 类型] 如: Dim intX As integer
说明:·如果没有As 类型,则默认为变体类型。
·可在变量名后加类型符来代替As 类型 如: Dim intX%
·一条语句可以同时定义多个变量,但每个变量必须有自己的类型声明,类型声明不能共用;
·字符串变量根据其存放的长度是否固定,定义方法不同:
定长字符串: Dim strA As String*10
表示最多存放10个字符,如果赋值不足10个,则右补空;若多于10个,则多余部分截去。
不定长字符串:Dim strA As String
最多可存放2MB个字符
2) 隐式声明
VB中允许变量不经过声明就直接使用,这种称为隐式声明,所有隐式声明的变量都是变体型的。
隐式声明容易造成错误,为了调试程序方便,一般对使用的变量都进行声明,可以在通用声明段使用Option Explicit 语句来强制显式声明所有变量。
(3)常量
1)直接常量
指在程序中直接给出值的数据,如:123、123&、123.45、1.234E2 、123D3分别表示整型、长整型、单精度浮点型(小数形式)、单精度浮点型(指数形式)、双精度浮点型。
八进制常数: 在数值前加&O ,如 &O123
十六进制常数:在数值前加&H ,如&H123
2)用户声明的符号常量
用Const来声明: Const 符号常量名 [As 类型] = 表达式
如:Const PI=3.14159 '声明了常量PI,代表3.14159,单精度型
Const MAX As Integer=&O144 ''声明了常量MAX,代表八进制数144,整型
Const COUNT#=45.67 '声明了常量COUNT,代表45.67,双精度型
3)系统提供的常量
系统定义的常量位于对象库中,在对象浏览器中的Visual Basic(VB)和Visual Basic for Aplication(VBA)等对象库中列出了VB的常量。这些常量可以与应用程序的对象、方法、属性一起使用。
如:Form1.WindowsState=vbMaximized 表示将窗口极大化。
3. 变量作用域与变量说明语句
1)变量作用域
变量的有效作用范围称为变量作用域。
VB有以下三个作用域等级,见表3:
4.4 运算符与表达式
运算符的功能及优先级
表达式的书写及运算规则
VB中的运算符和表达式可分为:算术运算符与算术表达式、关系运算符与关系表达式、逻辑运算符与逻辑表达式
4.4.1 算术运算符
VB的算术运算符有以下几种:
+:加法运算,也适合于字符串的之间的合并运算。
· -:加法运算。
· *:乘法运算。
· /:除法运算。
· \:整除运算。
· Mod:求余运算。例如:a Mod b表示a被b整除以后的余数。
· ^:幂运算。A^B表示以A为底的B次方。
把常量、变量等运算元素用算术运算符连接起来的式子称为“算术表达式”。例如:
a*b/(c*d) 3.14159265*r^2 等
带有括号的算术表达式在运算时将优先进行括号内的运算
注 意:
(1)/和\的区别:1/2=0.5,1\2=0
(2) Mod运算中,结果与被除数同号
例如:-9 Mod 7 结果为 -2
·
字符串运算符与字符串表达式
字符串运算符有:& 、+ 。 功能是字符串连接
例如:
" ABCD " + " EFGHI " ‘结果为: " ABCDEFGHI "
" VB " & "程序设计教程" ' 结果为: " VB程序设计教程"
说明:当连接符两旁的操作量都为字符串时,上述两个连接符等价。它们区别是:
+(连接运算):两个操作数均应为字符串类型;
&(连接运算):两个操作数既可为字符型也可为数值型,当是数值型时,系统自动先将其转换为数字字符,然后进行连接操作。
4.4.2
关系运算符与关系表达式
关系运算符都是双目运算,是用来比较两个运算量之间的关系,关系表达式的运算结果为逻辑量。若关系成立,结果为True,若关系不成立,结果为False。
关系运算也称比较运算,它表示不等式的真或假,VB共提供六种运算符,分别是=(等于),>(大于),<(小于),>=(大于等于),<=(小于等于)和<>(不等于)。
关系表达式就是用关系运算把两个比较对象连接起来的式子。
● 比较对象可以是变量、常量和算术表达式。例如:
a<32 x+y>=z/2 b$<> " Basic " object1 is object2
● 关系表达式的运算是采用“按值比较”的方法,即先求出运算符两边的“值”,若是变量,则取其当前值,如果两端的值满足条件,则结果为“True”,否则为“False”。
4.4.3 逻辑运算符与逻辑表达式
逻辑运算是对逻辑值进行的运算,Not 逻辑非为单目运算符(要求一个操作数),其它为双目运算符。
逻辑运算的优先次序是:
Not→And→Or→Xor
2. 逻辑表达式
逻辑表达式是用逻辑运算符把逻辑变量连接起来的式子。例如:
a>=2*3.141159*r And (x<>5 Or Not b)
x>2 Or Text1.text=”Microsoft”
表达式的书写:
(1)运算符不能相邻。例a+*b是错误的。
(2)乘号不能省略。例x 乘以y 应写成:x*y
(3)括号必须成对出现,均使用圆括号,可以嵌套使用。
(4)表达式从左到右在同一基准并排书写,不能出现上下标
(5)要注意各种运算符的优先级别,为保持运算顺序,在写VB表达式时需要适当添加括号()
4.4.4.运算规则
表达式中出现了多种不同类型的运算符时,其运算符优先级如下:
算术运算符>关系运算符>逻辑运算符
说明:
1.当一个表达式中出现多种运算符时,首先进行算术运算,接着关系运算符,最后处理逻辑运算符,在各类运算中再按照相应的优先次序进行。
2.可以用括号改变优先顺序,强令表达式的某些部分优先运行。括号内的运算总是优先于括号外的运算。对于多重括号,总是由内到外。
第五讲 数据表达式与简单程序设计
---选择分支与循环
重点:
1、掌握赋值语句及不同类型数据的赋值操作
2、InputBox和Msgbox函数的用法
3、If-else-endif语句的格式及情况语句select
5.1常用的函数
1. 数学函数
VB中常用的数学函数
函数名
功能
示例
结果
Sqr(x)
求平方根
Sqr(9)
3
Log(x)
求自然对数,x>0
Log(10)
2.3
Exp(x)
求以e为底的幂值,即求ex
Exp(3)
20.086
Abs(x)
求x的绝对值
Abs(-2.5)
2.5
Hex[$](x)
求x的十六进制数,返回的是字符型值
Hex[$](28)
"1C"
Oct[$](x)
求x的八进制数,返回的是字符型值
Oct[$](10)
"12"
Sgn(x)
求x的符号, 当x>0, 返回1 ;x=0, 返回0; x<0, 返回-1
Sgn(15)
1
Rnd(x)
产生一个在(0,1)区间均匀分布的随机数,每次的值都不同;若x=0,则给出的是上一次本函数产生的随机数
Rnd(x)
0-1之间的数
Sin(x)
求x的正弦值,x的单位是弧度
Sin(0)
0
Cos(x)
求x的余弦值,x的单位是弧度
Cos(1)
0.54
Tan(x)
求x的正切值,x的单位是弧度
Tan(1)
1.56
Atn(x)
求x的反正切值,x的单位是弧度,函数返回的是弧度值
Atn(1)
0.79
2. 字符函数
(1)字符串编码
在Windows采用的DBCS(Double Byte Character Set)编码方案中,一个汉字在计算机内存中占2个字节,一个西文字符(ASCII码)占1个字节,但在VB中采用的是Unicode(ISO字符标准)来存储字符的,所有字符都占2个字节。为方便使用,可以用StrConv函数来对Unicode 与DBCS进行转换,可以用函数Len()函数求字符串的字符数,用 LenB()函数求字符串的字节数。
(2)常用的字符串函数
函数名
功能
示例
结果
Len(x)
求x字符串的字符长度(个数)
Len("ab技术")
4
LenB(x)
求x字符串的字节个数
LenB("ab技术")
8
Left(x,n)
从x字符串左边取n个字符
Left("ABsYt",2)
"AB"
Right(x,n)
从x字符串右边取n个字符
Right("ABsYt",2)
"Yt"
Mid(x,n1,n2)
从x字符串左边第n1个位置开始向右取n2个字符
Mid("ABsYt",2,3)
"BsY"
Ucase(x)
将x字符串中所有小写字母改为大写
Ucase("ABsYug")
ABSYUG
Lcase(x)
将x字符串中所有大写字母改为小写
Ucase("ABsYug")
absyug
Ltrim(x)
去掉x左边的空格
Lrim(" ABC ")
"ABC "
Rtrim(x)
去掉x右边的空格
Trim(" ABC ")
" ABC"
Trim(x)
去掉x两边的空格
Trim(" ABC ")
"ABC"
Instr(x,"字符", M)
在x中查找给定的字符,返回该字符在x中的位置,M=1不区分大小写,省略则区分
Instr("WBAC","B")
2
String(n,"字符")
得到由n个首字符组成的一个字符串
String(3,"abcd")
"aaa"
Space (n)
得到n个空格
Space (3)
" "
Replace(C,C1,C2,N1,N2)
在C字符串中从N1开始将C2替代N2次C1,如果没有N1表示从1开始
Replace("ABCASAA","A","12",2,2)
"ABC12S12A"
3. 日期与时间函数
常用的日期与时间函数
函数名
含义
示例
结果
Date ()
返回系统日期
Date ()
02-3-19
Time()
返回系统时间
Time()
3:30 :00 PM
Now
返回系统时间和日期
Now
02-3-19 3:30 :00
Month(C)
返回月份代号(1-12)
Month("02,03,19")
3
Year(C)
返回年代号(1752-2078)
Year("02-03-19")
2002
Day(C)
返回日期代号(1-31)
Day("02,03,19")
19
WeekDay()
返回星期代号(1-7),星期日为1
WeekDay("02,03,17")
1
增减日期函数: DateAdd(要增减日期形式,增减量,要增减的日期变量)
例:计算期末考试日期:DateAdd("ww",15,#2002/3/19#)
求日期之差函数: DateDiff(要间隔日期形式,日期一,日期二)
例:计算距毕业天数: DateDiff("d", Now, #2005/6/30#)
日期形式
日期形式
yyyy
q
m
y
d
w
ww
h
n
s
意义
年
季
月
一年的天数
日
一周的天数
星期
时
分
秒
4. 转换函数
函数名
功能
示例
结果
Str (x)
将数值数据x转换成字符串
Str (45.2)
"45.2"
Val(x)
将字符串x中的数字转换成数值
Val("23ab")
23
Chr(x)
返回以x为ASCII码的字符
Chr(65)
"A"
Asc(x)
给出字符x的ASCII码值,十进制数
Asc("a")
97
Cint(x)
将数值型数据x的小数部分四舍五入取整
Cint(3.6)
4
Int(x)
取小于等于x的最大整数
Int(-3.5)
Int(3.5)
-4
3
Fix(x)
将数值型数据x的小数部分舍去
Fix(-3.5)
- 3
CBool(x)
将任何有效的数字字符串或数值转换成逻辑型
CBool(2) CBool("0")
True
False
CByte(x)
将0-255之间的数值转换成字节型
CByte(6)
6
CDate(x)
将有效的日期字符串转换成日期
CDate(#1990,2,23#)
1990-2-23
CCur(x)
将数值数据x转换成货币型
CCur(25.6)
25.6
Round(x,N)
在保留N位小数的情况下四舍五入取整
Round(2.86,1)
2.9
CStr(x)
将x转换成字符串型
CStr(12)
"12"
CVar(x)
将数值型数据x转换成变体型
CVar("23")+"A"
"23A"
CSng(x)
将数值数据x转换成单精度型
CSng(23.5125468)
23.51255
CDbl(x)
将数值数据x转换成双精度型
CDbl(23.5125468)
23.5125468
5. 格式输出Format函数
Format函数用于制定字符串或数字的输出格式。
语法:x = Format (expression, fmt )
expression是所输出的内容。fmt是指输出的格式,这是一个字符串型的变量,这一项若省略的话,那么Format函数将和Str函数的功能差不多。如:
语句
输出
Format (2, “0.00”)
2.00
Format (.7, “0%”)
70%
Format (1140, “$#,##0”)
$1,140
Format字符的意义
字符
意义
字符
意义
0
显示一数字,若此位置没有数字则补0
.
小数点
#
显示一数字,若此位置没有数字则不显示
,
千位的分隔符
%
数字乘以100并在右边加上”%”号
- + $ ( )
这些字出现在fmt里将原样打出
5.2 算法概论
1.算法的概念
算法:指用计算机解决某一问题的方法和步骤。
算法分类:
数值算法:用于解决一般数学解析方法难以解决的问题,如:求超越方程的根、求定积分、解微分方程等。
非数值算法:用于对非数值信息进行查找、排序等
2.算法的特征
(1)确定性:指算法的每个步骤都应确切无误,没有歧义。
(2)可行性:指算法的每个步骤必须是计算机能够有效执行、可以实现的,并可得到确定的结果。
(3)有穷性:指一个算法应该在有限的时间和步骤内可以执行完毕的。
(4)输入性:指一个算法可以有0或多个输入数据。
(5)输出性:指一个算法必须有一个或多个输出结果。
3.算法的评价
主要评价指标是:算法是否正确、运行的效率、占用系统资源的多少。
4.算法的描述
一般常用流程框图来描述算法。
图形符号
名称
代表操作
输入/输出
数据的输入与输出
处理
各种形式的数据处理
判断
判断选择,根据条件满足与否选择不同路径
起止
流程的起点与终点
特定过程
一个定义过的过程
流程线
连接各个框图,表示执行顺序
连接点
表示与流程图其他部分相连接
5.基本算法结构
“结构化程序设计方法”规定算法有三种基本结构: 顺序结构、选择结构和循环结构
6.算法示例
欧几里德算法——求两个自然数的最大公约数
5.3 赋值语句及 InputBox、MsgBox 函数
1 赋值语句:P59
一般格式: var=< 表达式 >
其中:var 可以是变量名或属性名。
功能:将表达式的值赋给“=”左边的变量(或为某个对象设置某属性值)。
使用说明:■ “=”左边的变量和右边的表达式的值的类型要一致。
程序举例:已知半径,求圆面积
已知三边长,求三角形面积P65
2 不同数据类型数据的赋值:P59
3 InputBox 函数:P60
InputBox 函数:用来接受用户通过键盘输入的数据。
InputBox 的使用形式:(P60)
v=InputBox(prompt[,title][,default][,x,y][,helpfile,context])
其中: v :可为 变体变量、字符串变量、数值变量。
功能:执行本语句,调用InputBox 函数时,将在屏幕上出现一个带有提示信息的对话框,当用户从对话框的用户编辑框中输入数据并按回车键(或单击确定按钮))后,系统则把输入的数据赋给变量v 。或按[Esc]键或取消按钮,则把0 或空串赋给变量 v 。
用户可通过设置InputBox 函数的参数来定制提示信息对话框的形式。具体内容见P61
例:P61
2、MsgBox 函数:向用户发布提示信息,并要求用户作出必要的响应。
函数格式:(P61)
例: P63
5.4 分支结构与分支结构语句
1 if –then 结构:(可实现单分支)
一般格式:
格式一: if e then 语句
格式二: if e then
语句组
end if
其中:e 为条件,其形式可为:逻辑变量、关系表达式或逻辑表达式。
功能:执行本语句时,判断 e 的值,若为 true ,则执行then 后的语句(语句组),若为 false ,则执行本 if 语句(或end if )下面的语句。
(对此功能的理解可看 P64图4-7 )
程序举例: 用InputBox 输入一个数,若此数大小0,则在窗体上将它显示出来。
Private Sub Form_click()
Dim x As Integer
x = InputBox("请输入一个数")
If x > 0 Then Print x
End Sub
2 if-then-else-end if 结构:(可实现两分支)
一般格式:if e then
A 语句组
Else
B 语句组
End if
功能:执行本语句时,先判断 e 的值:
e为 true : 执行A语句组后转end if 下一条语句继续执行。
e 为 false: 执行B语句组后转end if 下一条语句继续执行。
(对此功能的理解可参考P58 图4-3 (b))
程序举例: 教材P65、实验指导书P43 实验5-3
3 if-then-else if 结构:(可实现多分支)
一般格式:if e1 then
A1语句组
Else if e2 then
A2语句组
Else if e3 then
A3语句组
……
Else if en then
An语句组
else
A(n+1)语句组
End if
功能:执行本语句时依次判断各条件的值,
若有 ei 的值为 true ,则执行相应的 Ai 语句组后转end if 的下一条语句去继续执行。
若所有ei 的值均为 false ,则执行 else 后的 A(n+1) 语句组后转end if 的下一条语句去继续执行。
(对此功能的理解参考教材P66 图4-8)
一般来说,ei中最多只有一个值为 true 。
程序举例:教材 P66 例 4-2
4 Select-Case-End Select 结构语句:(可以实现多分支结构)P66
一般格式:Select Case e
Case c1
A1 语句组
Case c2
A2 语句组
……
Case cn
An 语句组
Case Else
A(n+1)语句组
End Select
其中: e : 测试表达式,形式可为:算术表达式 或 字符表达式。
c1,c2,…:测试项。形式可为以下三种:
◆ 具体取值:常量1,常量2,…..
◆ 连续的数据范围: 下界值 to 上界值
例如:8 to 12 B to H 等等。
◆ 满足某个判决条件: Is <关系表达式> 常量
例如: Is>20 Is<=”p”
其中Is 代表e (测试表达式)的值。
程序举例:教材P67 例4-2
第六讲 循环结构与循环结构语句
重点:
1、掌握单分支、双分支以及多分支结构语句的格式以及程序设计方法
2、do-loop型循环语句及循环结构的程序设计
3、For-Next型循环语句及循环结构的程序设计
4、循环的嵌套
1 for-next 循环语句:P69
一般格式: for v=e1 to e2 [step e3]
……
[exit for] 循环体语句组
……
next v
其中:v :循环控制变量。应为 整型 或 单精度型。
e1:循环控制变量的初值。
e2:循环控制变量的终值 。
e3:循环控制变量的步长值。
功能:(执行过程):P70
使用说明:◆ 超过终值的情况:当 e3 >0 时,指 v>e2, 当 e3<0 时,指v
◆ 循环次数的计算公式:循环次数=Int((e2-e1)/e3)+1
◆当step 1 时,此部分可以省略。
◆循环中执行到 exit for 语句时,结束本循环语句,转本next 的下一条语句去执行。
1.1程序举例
例:求 1+2+3+4+5
Private Sub Form_click()
Dim s As Integer, i As Integer
s = 0
For i = 1 To 5
s = s + i
Next i
Print "s="; s
End Sub
例: 求1*2*3*4
Private Sub Form_click()
Dim s As Integer, i As Integer
s = 1
For i = 1 To 4
s = s * i
Next I
Print "s="; s
End Sub
例P70
例 P71
先看len、mid函数的使用:
有一个字符串 A=”abcd”
(1) 则 len(A)=4 len(x) 可获得x字符串长度。(一个汉字为2个字符)
(2) mid(x,n1,n2) :取子串函数
作用一:取子串:
mid(A,1,1)=”a”
mid(A,1,2)=”ab”
mid(A,3,1)=”c”
从一个字符串中一个一个取出字符的方法:
for I=1 to len(x)
print mid(x,I,1)
next I
若逆序取出:
for I=len(x) to 1 step -1
print mid(x,I,1)
next I
作用二:改变一个字符串中某些字符。
mid(x,2,2)=”k”
1.2 循环嵌套:P73
for I= 1 to 2
fot j=1 to 3
print “b”
next j
print “a”
next I
程序举例:P73
例
rnd(x): 随机函数的使用方法:P73
改变程序中rnd(X)中的X取值,观察结果
Private Sub Form_click()
Print Rnd(1); Rnd(0)
End Sub
产生[a,b]范围内随机整数的公式:P73
int((b-a+1)*rnd+a)
例:生成5个3位随机整数。
For I=1 to 5
Print int((999-100+1)*rnd+100)
Next I
自习 P74 各例
isNumeric(x) : 判断一个字符串是否是一个数字串。
若x是数字串,其值为True ,若不是数字串,其值为False
2 do-loop 循环结构:P68
一般格式:4种 P68
do while e do
…… ……
[exit do] [exit do]
…… ……
loop loop while e
格式一:
(1)先判断e 的值,为 true ,执行循环体A,为false , 循环结束,转loop 的下面一条语句去执行。
(2)循环体执行完后,执行loop语句,返回(1)。
流程图P67 (a)
2.1例 :(补充)
求s=1+2+3+4+…… 当结果大小等于55时结束
Private Sub Form_click()
Dim s As Integer, n As Integer
s = 0
n = 0
Do While s < 55
n = n + 1
s = s + n
Loop
Print s, n
End Sub
格式二:
(1)执行循环体语句组。
(2)执行到 loop while 语句时,判断 e 的值,若为 true , 转(1),若为 false , 循环结束,转loop 的下面一条语句去执行。
流程图P67 (b)
格式三: do until e 格式四: do
….. ….
[exit do] [exit do]
…… ……
loop loop until e
格式三功能:
(1) 判断e 的值,若为 false ,则执行循环体语句;若为 true ,则循环结束,转loop 的下面一条语句去执行。
(2)执行loop 语句时,返回(1)
流程图P68 图4-13 (b)
格式四功能:
(1)执行循环体语句
(2)执行loop 语句时,判断 e 的值,若为 false , 返回(1),若为 true , 则循环结束,转loop 的下面一条语句去执行。
流程图P68 图4-13 (a)
特别说明:无论哪种格式,记住循环体执行的条件:
(1) while 后的条件值为 true 时,执行循环体,为 false 时,循环结束。
(2)until 后的条件值为false 时,执行循环体,为true时,循环结束。
程序举例:P68 例4-3
第七讲 选择分支与循环
-----VB程序设计的常用算法
重点:
1、重点掌握结构程序设计的方法和思想;
4、理解和掌握VB中常用算法的思想和设计方法;
算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。
一、计数、求和、求阶乘等简单算法
此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
本题使用数组来处理,用数组a(1 to 100)存放产生的确100个随机整数,数组x(1 to 10)来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x(1)中,个位是2的个数存放在x(2)中,……个位是0的个数存放在x(10)。
将程序编写在一个GetTJput过程中,代码如下:
Public Sub GetTJput()
Dim a(1 To 100) As Integer
Dim x(1 To 10) As Integer
Dim i As Integer, p As Integer
'产生100个[0,99]范围内的随机整数,每行10个打印出来
For i = 1 To 100
a(i) = Int(Rnd * 100)
If a(i) < 10 Then
Form1.Print Space(2); a(i);
Else
Form1.Print Space(1); a(i);
End If
If i Mod 10 = 0 Then Form1.Print
Next i
'统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数,并将统计结果保存在数组x(1),x(2),...,x(10)中,将统计结果打印出来
For i = 1 To 100
p = a(i) Mod 10 ' 求个位上的数字
If p = 0 Then p = 10
x(p) = x(p) + 1
Next i
Form1.Print "统计结果"
For i = 1 To 10
p = i
If i = 10 Then p = 0
Form1.Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个"
Next i
End Sub
二、求两个整数的最大公约数、最小公倍数
分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)
(1) 对于已知两数m,n,使得m>n;
(2) m除以n得余数r;
(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);
(4) m←n,n←r,再重复执行(2)。
例如: 求 m=14 ,n=6 的最大公约数. m n r
14 6 2
6 2 0
m=inputBox("m=")
n=inputBox("n=")
nm=n*m
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
Print "最小公倍数=", nm/n
三、判断素数
只能被1或本身整除的数称为素数 基本思想:把m作为被除数,将2—INT()作为除数,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现)
m =val( InputBox("请输入一个数"))
For i=2 To int(sqr(m))
If m Mod i = 0 Then Exit For
Next i
If i > int(sqr(m)) Then
Print "该数是素数"
Else
Print "该数不是素数"
End If
将其写成一函数,若为素数返回True,不是则返回False
Private Function Prime( m as Integer) As Boolean
Dim i%
Prime=True
For i=2 To int(sqr(m))
If m Mod i = 0 Then Prime=False: Exit For
Next i
End Function
四、验证哥德巴赫猜想
(任意一个大于等于6的偶数都可以分解为两个素数之和)
基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。如n1不是素数,就不必再检查n2是否素数。先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。然后使n1+2 再检验n1、n2是否素数,… 直到n1=n/2为止。
利用上面的prime函数,验证哥德巴赫猜想的程序代码如下:
Dim n%,n1%,n2%
n=Val(InputBox("输入大于6的正整数"))
For n1=3 to n\2 step 2
n2=n-n1
If prime(n1) Then
If prime(n2) then
Print n & "=" & n1 & "+" & n2
Exit For '结束循环
End if
End if
Next n1
五、迭代法
算法思想:
对于一个问题的求解x,可由给定的一个初值x0,根据某一迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x;再以新值作为初值,即:x1→x0,重新按原来的方法求x1,重复这一过和直到|x1-x0|<ε(某一给定的精度)。此时可将x1作为问题的解。
例:用迭代法求某个数的平方根。 已知求平方根的迭代公式为:
Private Function Fsqrt( a As single ) AS single
Dim x0 As Single, x1 As Single
x0 =a/2 '迭代初值
x1 = 0.5*(x0 + a/x0)
Do
x0 = x1 '为下一次迭代作准备
x1 = 0.5*(x0 + a/x0)
Loop While Abs(x1 - x0) > 0.00001
Fsqrt=x1
End Function
六、数制转换
将一个十进制整数m转换成 →r(2-16)进制字符串。
方法:将m不断除 r 取余数,直到商为零,以反序得到结果。下面写出一转换函数,参数idec为十进制数,ibase为要转换成数的基(如二进制的基是2,八进制的基是8等),函数输出结果是字符串。
Private Function TrDec(idec As Integer, ibase As Integer) As String
Dim strDecR$, iDecR%
strDecR = ""
Do While idec <> 0
iDecR = idec Mod ibase
If iDecR >= 10 Then
strDecR = Chr$(65 + iDecR - 10) & strDecR
Else
strDecR = iDecR & strDecR
End If
idec = idec \ ibase
Loop
TrDec = strDecR
End Function
七、字符串的一般处理
1.简单加密和解密
加密的思想是:
将每个字母C加(或减)一序数K,即用它后的第K个字母代替,变换式公式: c=chr(Asc(c)+k)
例如序数k为5,这时 "A"→ "F", "a"→ "f","B"→ "G"…
当加序数后的字母超过"Z"或"z"则 c=Chr(Asc(c)+k -26)
例如:You are good→ Dtz fwj ltti
解密为加密的逆过程
将每个字母C减(或加)一序数K,即 c=chr(Asc(c)-k),
例如序数k为5,这时 "Z"→"U", "z"→"u","Y"→"T"…
当加序数后的字母小于"A"或"a"则 c=Chr(Asc(c)-k +26)
下段程序是加密处理:
i = 1: strp = ""
nL = Len(RTrim(strI))
Do While (i <= nL)
strT = Mid$(strI, i, 1) '取第i个字符
If (strT >= "A" And strT <= "Z") Then
iA = Asc(strT) + 5
If iA > Asc("Z") Then iA = iA - 26
strp = strp + Chr$(iA)
ElseIf (strT >= "a" And strT <= "z") Then
iA = Asc(strT) + 5
If iA > Asc("z") Then iA = iA - 26
strp = strp + Chr$(iA)
Else
strp = strp + strT
End If
i = i + 1
Loop
Print strp
2.统计文本单词的个数
算法思路:
(1)从文本(字符串)的左边开始,取出一个字符;设逻辑量WT表示所取字符是否是单词内的字符,初值设为False
(2)若所取字符不是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符,再判断WT是否为True,若WT不为True则表是新单词的开始,让单词数Nw=Nw+1,让WT=True;
(3)若所取字符是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符, 则表示字符不是单词内字符,让WT=False;
(4) 再依次取下一个字符,重得(2)(3)直到文本结束。
下面程序段是字符串strI中包含的单词数
Nw = 0: Wt = False
nL = Len(RTrim(strI))
For i = 1 To nL
strT = Mid$(strI, i, 1) '取第i个字符
Select Case strT
Case " ", ",", ";", "!"
Wt = False
Case Else
If Not Wt Then
Nw = Nw + 1
Wt = True
End If
End Select
Next i
Print "单词数为:", Nw
八、穷举法
穷举法(又称“枚举法”)的基本思想是:一一列举各种可能的情况,并判断哪一种可能是符合要求的解,这是一种“在没有其它办法的情况的方法”,是一种最“笨”的方法,然而对一些无法用解析法求解的问题往往能奏效,通常采用循环来处理穷举问题。
例: 将一张面值为100元的人民币等值换成100张5元、1元和0.5元的零钞,要求每种零钞不少于1张,问有哪几种组合?
Dim i%, j%, k%
Print "5元 1元 0.5元"
For i = 1 To 20
For j = 1 To 100 - i
k = 100 - i - j
If 5.0 * i + 1.0 * j + 0.5 * k = 100 Then
Print i, j, k
End If
Next j
Next i
九、递归算法
用自身的结构来描述自身,称递归
VB允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function函数。递归处理一般用栈来实现,每调用一次自身,把当前参数压栈,直到递归结束条件;然后从栈中弹出当前参数,直到栈空。
递归条件:(1)递归结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。
例:编fac(n)=n! 的递归函数
Function fac(n As Integer) As Integer
If n = 1 Then
fac = 1
Else
fac = n * fac(n - 1)
End If
End Function
第八讲 数组
-----静态数态
重点:
1、掌握数组的概念以及数组的定义和数组的结构
2、数组相关的函数和语句
3、数组元素的引用
4、数组元素的输入、输出和处理
8.1 数组的概念
数组:是同类变量的一个有序的集合。
例:有5个学生的数学成绩,
若编程时这样存放: s1=50 s2=90 s3=80 s4=60 s5=70
则5个分数分别存放在s1 s2 s3 s4 s5 简单变量中
若编程时这样存放:
s(1)=89 s(2)=67 s(3)=42 s(4)=68 s(5)=97
则5个分数分别存放在一个s 数组中。
一、数组命名、数组元素、数组的维数与数组的类型:
上例中: 数组名 s 命名规则同简单变量的命名规则。P45
数组元素:数组中的每个成员为一个元素。
如上例中s 数组中有5个元素,分别为:
s(1) s(2) s(3) s(4) s(5)
数组元素又称为下标变量。
其中: 1,2,3,4,5称为下标。表示该元素在数组中排列的位置。
数组的维数:
一维数组:只有一个下标的数组称为一维数组。
二维数组:有两个下标的数组称为二维数组。 X(2,5)
N维数组:有N个下标的数组称为N维数组。 Score(1,3,5……)
数组的类型:
(1) 固定大小数组:P85
(2) 动态数组:
二、数组定义:程序中的数组必须先定义,后使用。
①数组说明语句一般格式:P85
Dim 数组名1([<维界定义>])[ As <数据类型> ][,数组名2(下标范围) As <数据类型>]……
其中:维界定义的形式: [下界1 to] 上界1[,[下界2 to] 上界2]……
例如:Dim a(1 to 5) As integer
本语句说明了一个 一维a 数组,有5个元素,分别为a(1),a(2),a(3),a(4),a(5)
又例如:Dim b(1 to 2,1 to 3) As Single,c(3) As Integer, d(3 to 5)
本语句说明了三个数组:
二维数组 b :有2行3列,6个元素分别为:
b(1,1) b(1,2) b(1,3)
b(2,1) b(2,2) b(2,3)
一维数组 c :有4个元素:c(0) c(1) c(2) c(3)
一维数组 d :有3个元素:d(3) d(4) d(5)
使用说明:
l 下界缺省时,为 0。
l 若在窗体或标准模块的所有过程之前书写下列语句:
Option Base 1
则下界缺省值为 1 。
l 下界1 或下界2只能是常量,不允许是变量或其它表达式。
8.2 数组的基本操作
7.2.1 数组元素的赋值
1.用赋值语句给数组元素赋值
例:P92
Dim Score(3) As Integer
Dim Two(1,1 to 2)As Integer
Score(0)=80
Score(1)=75
Score(2)=91
Score(3)=68
Two(0,1)= Score(0)
Print Two(0, 1)
2 通过循环逐一给数组元素赋值
例:
Private Sub Form_Click()
Dim A(6) As Integer, i As Integer
Dim B(1 To 2, 1 To 2) As Integer, j As Integer
For i = 0 To 6 '使用循环给一维数组赋值并输出
A(i) = Int(99 * Rnd) + 1
Print A(i)
Next i
Print
For i = 1 To 2 '利用二重循环给二维数组赋值并输出
For j = 1 To 2
B(i, j) = i * 10 + j
Print B(i, j);
Next j
Print
Next i
End Sub
3 用InputBox函数给数组元素赋值
Private Sub Form_Click()
Dim A(6) As Integer, V As Variant
For i = 0 To 6
A(i) = InputBox("给数组元素赋值", "数组A赋值")
Print A(i);
Next i
Print
End Sub
4 用Array函数给数组赋值
Array函数的一般使用形式如下:
〈变体变量名〉= Array([数据列表])
功能:将一个数据集赋给一个Variant 变量,并将该变量创建成一个一维数组。
例 P93
Option Base 1
Private Sub Form_Click()
Dim A As Variant, I As Integer
Dim B(4) As Variant
A = Array(5, 4, 3, 2, 1)
Print A(1); A(2); A(3); A(4); A(5)
A = Array(1.5, 2.3, 3.6, 4.1)
Print A(1); A(2); A(3); A(4)
A = "NO Array"
Print A
' B = Array(1, 2, 3, 4, 5, 6) ‘注意A与B的区别
End Sub
5.2.2 数组元素的输出
例:一维数组的输出
二维数组的输出 P94
Option Explicit
Option Base 1
Private Sub Form_click()
Dim k As Integer, i As Integer
Dim A(4, 5) As Integer, J As Integer, S As String
'生成数组
k = 10
For i = 1 To 4
If i Mod 2 <> 0 Then '处理奇数行
For J = 1 To 5
k = k + 1
A(i, J) = k
Next J
Else
For J = 5 To 1 Step -1 '处理偶数行
k = k + 1
A(i, J) = k
Next J
End If
Next i
'数组输出
If Check1.Value <> 1 Then
For i = 1 To 4 '输出到图片框
For J = 1 To 5
Picture1.Print A(i, J);
Next J
Picture1.Print
Next i
Else
For i = 1 To 4 '输出到多行文本框
For J = 1 To 5
S = S & Str(A(i, J))
Next J
S = S & Chr(13) & Chr(10)
Next i
Text1.Text = S
End If
End Sub
7.2.3 数组元素的引用
例5-1 P95
Option Explicit
Option Base 1
Private Sub Form_Click()
Dim Compare(12) As Integer, i As Integer
Dim Max As Integer, Min As Integer
Randomize
For i = 1 To 12
Compare(i) = Int(90 * Rnd) + 10
Print Compare(i);
Next i
Print
Max = Compare(1): Min = Compare(1)
For i = 2 To 12
If Compare(i) > Max Then
Max = Compare(i)
ElseIf Compare(i) < Min Then
Min = Compare(i)
End If
Next i
Print " 最大数是:"; Max
Print " 最小数是:"; Min
End Sub
例5-7 求裴波拉契数列。
Option Base 1
Option Explicit
Private Sub Form_Click()
Dim Fb(18) As Integer, I As Integer
Fb(1) = 1: Fb(2) = 1
For I = 3 To 18
Fb(I) = Fb(I - 2) + Fb(I - 1)
Next I
For I = 1 To 18
Text1 = Text1 & Str(Fb(I)) & ""
Next I
End Sub
例5-8 :
Option Explicit
Private Sub Command1_ClicK()
Dim St As String, Idx As Integer
Dim A(0 To 25) As Integer
Dim I As Integer, js As Integer
Dim CH As String * 1, L As Integer
St = Text1.Text
L = Len(St)
For I = 1 To L
CH = Mid(St, I, 1)
If CH >= "A" And CH <= "Z" Then
Idx = Asc(CH) - Asc("A")
A(Idx) = A(Idx) + 1
ElseIf CH >= "a" And CH <= "z" Then
Idx = Asc(CH) - Asc("a")
A(Idx) = A(Idx) + 1
End If
Print A(Idx)
Next I
For I = 0 To 25
If A(I) <> 0 Then
js = js + 1
Text2 = Text2 & Chr(I + Asc("A")) & ":" & Str(A(I)) & ""
If js Mod 5 = 0 Then Text2 = Text2 & Chr(13) & Chr(10)
End If
Next I
End Sub
第九讲 数组
-------动态数组与控件数组
重点:
1、 掌握动态数组的定义与使用
2、 熟悉控件数组的建立及使用
3、数组常用算法程序设计
1 动态数组的概念:程序在运行过程中,其元素个数(大小)可以改变的数组
2 动态数组说明的一般格式:
(说明数组时不指明维数及下标范围)
dim 数组名() [as 数据类型]
当可以确定数组元素大小时对动态数组再次说明,用如下重定义数组语句:
ReDim [Preserve] 数组名(维界定义) [As 数据类型 ]
说明:当重新定义数组后,要保留原来数组中的数据,则选择preserve选项。
例如: Dim Pin() As Integer
private Sub form_click()
ReDim Pin(5)
……
End Sub
详细说明动态数组定义格式中的每个参数的作用,并进行演示! 15时间
接着用下面的例子来说明动态数组的作用!
以下的例子可根据需要在讲授时选择!
例1:有一组数,以-999结束,编程找出其中正数、负数、零的个数。(-999不作为数据处理)
注:例1和例3两个中选择一个讲!
Private Sub Form_click()
Dim x() As Integer, n As Integer
Dim n1 As Integer, n2 As Integer, n3 As Integer
n = 1
Do
ReDim Preserve x(n)
x(i) = InputBox("请输入一个数")
Print x(i);
If x(i) = -999 Then Exit Do
If x(i) < 0 Then
n1 = n1 + 1
ElseIf x(i) = 0 Then
n2 = n2 + 1
Else
n3 = n3 + 1
End If
n = n + 1
Loop
Print
Print "小于0的数据个数为:"; n1
Print "等于0的数据个数为:"; n2
Print "大于0的数据个数为:"; n3
End Sub
例2:打印下面的图形:----------------------------- 选讲内容
*********
********
*******
******
*****
****
***
**
*
*
**
***
****
*****
*
***
*****
*******
Private Sub Form_click()
Dim i As Integer, j As Integer
For i = 1 To 9
Print Tab(5);
For j = 1 To 10 - i
Print "*";
Next j
Print
Next i
End Sub
Private Sub Form_click()
Dim i As Integer, j As Integer
For i = 1 To 5
Print Tab(5);
For j = 1 To i
Print "*";
Next j
Print
Next i
End Sub
Private Sub Form_click()
Dim i As Integer, j As Integer
For i = 1 To 4
Print Tab(9 - i);
For j = 1 To 2 * i - 1
Print "*";
Next j
Print
Next i
End Sub
例3 从键盘输入任意个数,求出这些数的总和和平均值!
Dim a() as integer
Dim I as integer, sum as integer, avg as single, t as integer
Do
I=inputbox(“请输入一数!”)
If i=-1 then
Exit do
Else
T=t+1
Redim preserve a(t)
A(t)=i
Sum=sum+i
endif
Loop
Avg=sum/ubound(a)
Print “sum=”;sum,”avg=”+cstr(avg)
例4 编程实现随机生成20个互不相同的两位整数!
Dim a() as integer ,I as integer, n as integer,j as integer
Redim a(20) as integer
For i=1 to 20
k= inputbox(“请输入N的值”)
for j=1 to i-1
if a(j)=k then exit for
next j
if j>i-1 then
a(i)=k
else
i=i-1
endif
next i
例 5 在一组有序数列中插入一个数,要求插入后的数还是有序数列!
Dim a() as integer
Dim I as integer , n as integer, k as integer
For i=1 to 10
A(i)=10*i
Next i
N=inputboxa(“请输入要插入的数”)
以下有两种方案1 前插入 2 后插入(可以用班级中的同学进行示范教学)
T=10
Redim preserve a(11)
A(t+1)=a(t)
T=t-1
Loop
A(t+1)=n
For i=1 to 11
Print a(i);
Next i
后插入法给学生讲清算法的原理,要求学生自己课后写出程代码!
9.2 控件数组
一、控件数组:
动态数组指在声明数组时未给出数组的大小(省略括号中的下标),当要使用该数组时,随时可用ReDim语句重新定义数组的大小。使用动态数组的优点是:用户可以根据需要有效地利用存储空间,它是在程序执行到ReDim语句时分配存储空间。
二、建立控件数组方法:
1复制现存控件:
在窗体上绘制控件数组中第一个元素的控件→设置它的名称属性→右键单击此对象→复制→右击窗体→粘贴。(重复复制操作)
将已存在的控件组成一个数组。(同一类型的控件)
确定第一个元素→选定要包含在控件数组中的其它对象→将它的名称属性设置成和第一个元素相同。(重复此操作)
说明:1 控件数组中的每个元素下标为此控件的index 属性值(≤32767)
控件数组中的每个控件共享一个事件过程。
2创建同名控件
在控件面板中直接添加相同类型的控件到窗体上,将它们的名子都命名为同一个名子时,系统将会提示你创建一个控件数组
三、应用举例
使用控件数组实现字体格式的设置!
9.3 数组应用例题(根据时间可以选择一个讲!)
根据需要,选择1-2道下面的题目,给学生讲清楚算法的思想!
1 排序
例5-3 选择排序法 直接排序法
Option Explicit
Option Base 1
Private Sub CmdSort_Click()
Dim Sort(10) As Integer, Temp As Integer
Dim I As Integer, J As Integer
Randomize
For I = 1 To 10
Sort(I) = Int(Rnd * (100 - 1)) + 1
Text1 = Text1 & Str(Sort(I))
Next I
For I = 1 To 9
For J = I + 1 To 10
If Sort(I) > Sort(J) Then
Temp = Sort(I)
Sort(I) = Sort(J)
Sort(J) = Temp
End If
Next J
Text2 = Text2 & Str(Sort(I))
Next I
Text2 = Text2 & Str(Sort(10))
End Sub
Option Explicit
Option Base 1
Private Sub CmdSort_Click()
Dim Sort(10) As Integer, Temp As Integer
Dim I As Integer, J As Integer
Dim Pointer As Integer
Randomize
For I = 1 To 10
Sort(I) = Int(Rnd * (100 - 1)) + 1
Text1 = Text1 & Str(Sort(I))
Next I
For I = 1 To 9
Pointer = I
For J = I + 1 To 10
If Sort(Pointer) > Sort(J) Then
Pointer = J
End If
Next J
If I <> Pointer Then
Temp = Sort(I)
Sort(I) = Sort(Pointer)
Sort(Pointer) = Temp
End If
Text2 = Text2 & Str(Sort(I))
Next I
Text2 = Text2 & Str(Sort(10))
End Sub
2 查找
例:5-4 顺序查找程序 (界面见P105)
先介绍For Each –next 结构的语句:
Option Explicit
Option Base 1
Dim Search As Variant
Private Sub Cmd生成数组_Click()
Dim I As Integer, Element As Variant
Search = Array(34, 12, 56, 81, 59, 83, 91, 26, 47)
For Each Element In Search ‘for each-next 结构语句见P90
Text1 = Text1 & Str(Element)
Next Element
End Sub
Private Sub Cmd查找_Click()
Dim I As Integer, Find As Integer
Text2 = ""
Find = InputBox("输入要查找的数")
For I = 1 To UBound(Search)
If Search(I) = Find Then Exit For
Next I
If I <= UBound(Search) Then
Text2 = "要查找的数" & Str(Search(I)) & "是Search(" & Str(I) & ")"
Else
Text2 = "在数列中没有找到" & Str(Find)
End If
End Sub
例 5-5 二分查找程序:
Option Explicit
Option Base 1
Dim Search As Variant
Private Sub Cmd二分查找_Click()
Dim Left As Integer, Right As Integer
Dim Mid As Integer, Flg As Boolean
Dim Find As Integer
Find = InputBox("输入要查找的数")
Left = 1: Right = UBound(Search)
Flg = False
Do While Left <= Right
Mid = (Left + Right) / 2
If Search(Mid) = Find Then
Flg = True
Exit Do
ElseIf Find > Search(Mid) Then
Left = Mid + 1
Else
Right = Mid - 1
End If
Loop
If Flg Then
Text2 = "要查找的数" & Str(Find) & "在Search(" & Str(Mid) & ")中"
Else
Text2 = Str(Find) & "不在数组中"
End If
End Sub
Private Sub Cmd生成数据_Click()
Dim V As Variant
Search = Array(12, 17, 23, 28, 30, 39, 41, 46, 57, 61, 78, 83, 85, 89, 93)
For Each V In Search
Text1 = Text1 & Str(V)
Next V
End Sub