第1章Visual Basic 程序设计概述
重点:VB特点;集成开发环境;VB文件类型;VB应用程序设计思想和步骤;对象及其三要素;事件;窗体、命令按钮、标签、文本框
1.1 VB简介
1、什么是Visual Basic?
Basic:Beginners All-Purpose Symbolic Instruction Code,初学者通用指令代码语言。
Visual:原意是指可视的或看得见的,是为用户发图形用户界面(GUI)提供的一种方法。
2、VB是微软公司开发,于1991年推出第一个版本VB1.0。
本课程使用VB6.0:标准版;专业版;企业版。
3、VB的特点
Visual Basic是Microsoft公司开发的,一种可视化的、面向对象和采用事件驱动方式的结构化高级程序设计语言,可用于开发Windows环境下的各类应用程序。
4、VB的功能强大
5、Visual Basic 6.0 的运行环境、安装、启动、退出
1.2 VB6.0的基本界面
VB应用程序设计是在一个集成开发环境(IDE,Integrated Developing Environment)中完成的。集成开发环境是指将程序的设计、编辑、修改、运行、调试查错等各种功能一体化的开发环境。
1、主窗口
2、其他窗口:窗体设计器窗口、属性窗口、工程资源管理器窗口、代码窗口、窗体布局窗口、立即窗口、工具箱窗口
各窗口知识要点:
1、标题栏中显示的VB工作模式,3种:
设计模式:design 可以设计界面,可以编写代码。
运行模式:run 不可设计界面,不可编写代码。
中断模式:break 程序运行暂时中断。不可设计界面,可编写代码。按F5/单击“继续”、单击“结束”。2、窗体窗口:最多255个;网格点;窗体名、窗体文件名、窗体标题栏名3者的区别
3、工具箱:包含用来构造应用程序界面的各种控件。
含有20个标准控件;
增添新控件:右击工具箱→部件→选择控件→“确定”
4、立即窗口:2个作用:运行命令或函数;调试程序,输出中间运行结果。
5、工程资源管理器窗口:以树型结构列出应用程序所包含的文件。→工程
管理功能:右击添加文件、删除文件等;双击查看相应对象;
1.3 VB应用程序设计初步
步骤:
1、分析程序问题。已知条件、要实现什么,在草纸上画出你设计的界面,简单写写代码。
2、创建工程。
3、在窗体上放置、调整控件,设置窗体和控件属性。
4、编写程序代码,调试程序。
5、保存窗体、工程等文件。
6、VB应用程序的执行,2种方式:
解释方式:“启动”;F5
编译方式:生成可执行( .exe)文件,文件→生成工程.exe
举例演示:例1-3-1
图:VB应用程序中各主要文件的结构关系
1.4 面向对象的程序设计(object oriented programming)
是一种以对象为基础、以事件驱动对象对事件进行处理的程序设计技术。
1、对象:具有属性和行为的实体。是数据和代码的集合。例:世上存在的任何事物每个窗体和控件
2、类:是具有相同性质的对象的集合,也是创建对象实例的模板,而对象则是类的一个实例。属于同一类的所有对象具有同一组属性、方法与事件,只是其属性值不同,对事件的响应不同。例:球按钮控件
3、对象由的三要素(3方面组成):属性、方法、事件
每个对象有自己的特征(属性)、行为(方法)和发生在该对象上的活动(事件)。
例:人具有身高等特征,具有行走、说话等行为,外界作用在人对象上的各种活动,如下雨等。
属性:对象的特征,描述对象的数据。
设置:属性窗口,在代码窗口进行语句设置。
对象名.属性名=属性值Label1.Caption=“123”方法:特定对象能执行的动作或功能,已设计好的特殊程序,要会用。
对象名.方法名[参数] Form2.Show Form1.Cls Form1.Circle (2300,1600) , 800
事件:能被对象识别和响应的动作。
事件在代码窗口中列出,选择。
对象名_事件名(参数) Label1_Click()
事件过程:响应事件后执行的操作通过一段程序来实现,这样的程序叫事件过程。
Sub 对象名_事件名(参数)
…→事件过程代码End Sub
事件驱动机制:
在没有事件发生时,VB应用程序处于等待状态。
当一个事件发生时,程序会执行相应的事件过程代码。处理完后,又等待下一个事件的发生。
事件发生的顺序基本上决定了程序代码的实行顺序。
1.4 学习界面设计的4个对象
1、窗体
2、命令按钮
3、标签
4、文本框
一个或若干个标准
模块(.Bas)文件
VB工程
(*.VBP)
类模块(.Cls)文件
一个或若干个窗体
模块(*.Frm)文件
1各种控件
2.窗体及控件的事件过程
3.自定义子过程(Sub)
4.自定义函数过程
(Function)
1.自定义子过程(Sub)
2.自定义函数过程
(Function)
第2章 程序设计基础
重点:数据类型;变量声明;运算符优先级;函数;编码规则。书上的例题和课后习题(format 了解即可)
写代码部分:
sub 代码段的开头
dim … 定义常量/变量(2.1、2.2)
… 功能代码语句(2.3、2.4、第3、5、6章) end sub 代码段的结尾 2.1 VB 的数据类型 一、VB 语言字符集
编程时使用的VB 字符集(必须是英文输入法下输入的),3类,共89个字符:
字母:A-Z a-z 数字:0-9 专用字符:27个
% & ! # $ @ + - * / \ ^ > < = ( ) ‘ “ ,
; : . ? _ 空格符 回车键 2.2 常量与变量
一、常量
1、直接常量:代码中直接给出的数据。
数值常量:s=3.1415926*r*r
前加&O &H 表示进制;后加&表示长整型
字符串常量:textbox1.text="VB 程序设计2009。"
逻辑常量:Label1.Visible=ture Command.Enabled=false
日期常量:Label1.Caption= #2/23/2009#
2、符号常量:用标识符代表常量值。
定义格式: const 常量名[ As 类型]=表达式
const pi=3.1415926 : s=pi*r*r : c=2*pi*r
二、变量
1、变量:值可改变的量,在内存中存储,通过变量名标识。
2、变量的2种形式:内存变量、属性变量。
3、变量的命名规则: 要求会辨别合法/非法变量名
4、显式声明变量,即先定义再使用。2种定义形式:
dim 变量名 类型声明符
给变量赋值(使用): [Let] <变量名> = <表达式>
例:dim a as integer dim a% 声明
a=10 a=7 使用
书上说明:4点
5、隐式声明变量:没有声明,直接使用。例:a="12"
这种方法是不好的习惯,要求变量要用显式声明。
6、强制显式声明:加入语句 option explic it
7、字符串型变量: 变长字符串变量:dim 变量名 as string 或 dim 变量名$ 定长字符串变量:dim 变量名 as string *字符串长度
字符串长度表示的是字符的个数,空格填充,截去超出部分。
例: dim a as string dim a as string * 10 a=textbox1.text a="hello 北京" 8、自定义数据类型: 定义:书上 使用:书上
1、算术运算符:(表2-3-1)
:把两边看作字符型,连接 +:分情况 (表) 结果:真 true -1 假 false 0 都是数值型,按数值大小比较。
都是字符型,按ASCII 码从左到右逐个比较。 ASCII 码值大小关系:空格<数字<大写字母<小写字 (表) 例:print 10 and 6 VB 的表达式:(书上例子) 2-3-4 1、三角函数:弧度和角度的转换 求30度的正弦值:sin(30*3.14/180) 2、取整函数:int(x) fix(x) round(x)、round(x,y):可以四舍五入 int(-11.4) fix(-11.4) round(1.512) round(1.512,2) 3、随机数函数rnd(x):产生[0,1)内的Single 类型数据。 如生成[m ,n]区间的随机整数,使用表达式Int(m+Rnd*(n-m+1))。 随机产生28~66之间的整数:int(rnd*39)+28 学习要求:内容简单,自己细看每一个运算,优先级,常用函数。选择题,要能正确运算出表达式的结果。 2.4 VB 的编码规则 1、不区分大小写。 2、续行:行尾加下划线 _ 3、多条语句写在一行:用冒号隔开: 4、注释:代码后:用 ’ 开头 单独行:用 ’ 或 rem 开头 “设置注释块”按钮 写代码部分----编程思想 1、分析问题:(1) 给出的条件(已知) (2) 输出内容(求) (3) 问题中用到的变量或常量等内容 (4) 如何解题(思考用什么VB 代码实现) 2、把上面每一部分都写成相应的代码块 3、把代码块放到到一起 4、检查,启动运行
第3章程序流程控制
重点:顺序、选择、循环结构各自的实现方法和应用。3.1 顺序结构程序设计
在顺序结构中,语句将按照出现的顺序逐条执行,从上到下。定义→输入→计算→输出
包含3类语句:数据输入;赋值语句;数据输出。
一、数据输入
1、TextBox文本框控件:返回字符型
2、InputBox()输入框函数
可产生一个对话框,作为输入数据的界面,等待用户输入数据,并返回所输入的内容,返回字符型。
变量名=InputBox(提示信息[,标题][,默认值][,xpos,ypos]) 注意:字符型转换成数值型:val( ) 相反:str( ) 焦点和Tab顺序
当一个对象具有焦点时,它可以接收用户的输入。
1、接收焦点前提:Enabled和Visible属性为True
2、设置焦点:在运行时单击对象;运行时用快捷键选择对象;在程序代码中使用SetFocus方法。
3、涉及到焦点的2个事件:当对象得到焦点时,会产生GotFocus事件;当对象失去焦点时,产生LostFocus事件。
4、Tab顺序:是按Tab时焦点在各个控件间移动的顺序。用TabIndex属性设置
不参与的,TabStop属性设为False
5、卸载对象语句unload 结束语句end
二、赋值语句
1、格式:[let] 变量名=表达式
[let] 对象名.属性名= 表达式
2、含义:(1)计算赋值号右边表达式的值;
(2)将此值赋给赋值号左边的标识符代表的变量或控件属性,作为它的当前值;
(3)该值一直保存到下一次再对它赋值为止。
(4)分清赋值号、关系运算符的等号。A=5=6
(5)赋值号两边的数据类型通常要一致,或转换成左侧的类型。类型转换例:单击窗体,代码执行结果是什么?private sub form_click() 结果:true -1 dim x as boolean, a as integer
x=-2 :a=true : print x, a
end sub
逻辑转换成数值型:true→-1 false→0
数值型转换成逻辑:非0→true 0→false
交换例:书上是交换两个内容,如何交换两个数值?private sub command1_click()
dim m as double, n as double, t as double
m= val(text1.text) : n= val(text2.text)
t=m : m=n : n=t
text1.text=m : text2.text=n
end sub
三、数据输出
1、Label标签控件显示文本;
2、TextBox控件显示文本;
3、Print方法输出;
4、format()函数设置输出格式;
5、msgbox函数和过程显示提示信息
Print方法:[对象.]Print[{Spc(n)|Tab(n)}][表达式列表][;|,] 作用:在对象上输出信息
对象:窗体、图片框、立即窗口或打印机(Pinter),省略对象在窗体上输出。form/picture/debug/printer.print "VB" Spc(n)函数:插入n个空格,允许重复使用。
Tab(n)函数:左端开始右移动n列,允许重复使用。
;(分号):光标定位上一个显示的字符后。,(逗号):光标定位在下一个打印区的开始位置处。每个打印区占14列。无;,换行。print
msgbox函数和过程显示提示信息:2个作用:
1、在对话框中显示信息:
过程使用形式:msgbox "提示信息", 对话框样式, 标题2、等待用户单击按钮,返回一个整数:
函数使用形式:
变量=msgbox("提示信息",对话框样式,标题)
对话框样式可使用3组VB常量:按钮+图标+默认按钮例:msgbox “密码不正确”,,“登录”
a=msgbox ("确定要删除信息么?",3,"确认信息")
例1、在银行存款,计算本利和的公式为:s=p(1+r)n,其中p为存款数,n为年数,r为年利率,s为n年后本金和利息之和。输出结果要求保留小数点后两位,四舍五入。例2、用户输入三角形的三边,计算输出三角形的面积。
)
)(
)(
(c
p
b
p
a
p
p
s-
-
-
=
2
c
b
a
p
+
+
=
3.2 选择结构程序设计
选择结构的作用是使程序依照条件而走不同的支路。程序往往根据需要而选择合适的语句结构。
VB支持的选择结构有:If...Then;If...Then...Else;If...Then...Elseif;Select Case;iif函数
一、单分支结构If...Then
有条件地执行其结构内的一条或多条语句。
格式一:If 条件表达式Then 语句
格式二:If 条件表达式Then
多条语句
End If
说明:表达式:关系表达式、逻辑表达式,算术表达式。表达式值按非零为True,零为False进行判断。
格式一只能是一句语句或语句间用冒号分隔,而且必须在一行上书写。
例:已知两个数x和y,比较它们的大小,使得x大于y。
If x t=x : x=y : y=t End If 或If x 二、双分支结构If...Then...Else If 条件Then 建立多个分支流程,并根[语句块1] 据条件选择其中一个分支。 Else [语句块2] End If 例:计算分段函数 单分支结构实现:y=cos(x)-x^3+3*x If x<>0 Then y=sin(x)+sqrt (x*x+1) 双分支结构实现:If x<>0 Then y=sin(x)+sqr (x*x+1) Else y=cos(x)-x^3+3*x End If 例:用户输入一个整数,判断并输出是奇数/偶数。 dim a as integer : a=inputbox("请输入一个整数") If a mod 2=1 Then msgbox a & "是一个奇数" Else msgbox a & "是一个偶数" End If y x x x x x x x = ++≠ -+= ? ? ? ?? sin cos 2 3 10 30 三、多分支结构 If...Then...Elseif 建立多个分支流程,并根据条件选择其中一个分支。 If 条件1 Then [语句块1] ElseIf 条件2 Then '注:ElseIf 不能写成 Else If [语句块2] ... [Else [语句块n]] End If 不管有几个分支,依次判断,当某条件满足,执行相应的语句,其余分支不再执行;若条件都不满足,且有Else 子句,则执行该语句块,否则什么也不执行。 例:已知变量ch 中存放了一个字符,判断该字符是字母字符、数字字符还是其他字符。 If UCase(ch) >= "A" And UCase(ch) <= "Z" Then MsgBox(ch + "是字母字符") '考虑大小写字母 ElseIf ch >= " 0" And ch <= "9" Then ' 数字字符 MsgBox(ch + "是数字字符") Else ' 除上述字符以外的字符 MsgBox(ch + "是其他字符") End If 例:求多段函数值 dim x as single, y as single 2 -1 x<0 x=val(inputbox("输入x 的值:")) x 0≤x<10 if x<0 then y = x 2 +1 10≤x ≤20 y=x^2-1 3 +x+1 20 y=x elseif x<=20 then y=x^2+1 else y=x^3+x+1 end if print "y=";y 四、情况语句 Select Case Select Case 测试表达式 用于实现多重选择, Case 表达式1 作用与If...Then...Else [语句块1] 类似,但主要用于只有 Case 表达式2 一个条件,且条件值为 [语句块2] 离散值的分支选择。 …… Case Else [语句块n] End Select 表达式与测试表达式的类型必须相同,是下面4种形式之一:一组用逗号分隔的枚举值:case 2,4,6,11 表达式1 To 表达式2:case 60 To 100 Is 关系运算符表达式:case Is< 60 混合形式:case 2,1,4 to 6, is>32 例:上一个例题改用Select Case 语句实现: Select Case ch Case "a" To "z", "A" To "Z" MsgBox ch + "是字母字符" Case "0" To "9" MsgBox ch +"是数字字符" Case Else MsgBox ch + "是其他字符" End Select 例:判断坐标点(x ,y),落在哪个象限。 If x > 0 And y >0 Then MsgBox("在第一象限") ElseIf …… 五、IIf 函数 iif(表达式,表达式为真时的函数值,表达式为假时函数值) 例:将x ,y 中大的数,放入Tmax 变量中: Tmax = iif(x > y , x, y) 与如下语句等价:If x > y Then Tmax = x Else Tmax = y 六、条件语句的嵌套 If 表达式1 Then … 注意:每个结构块的 If 表达式2 Then 清楚划分,首尾对应; … 每个结构块不能交叉。 End If … End If 3.3 循环结构 计算机最擅长的功能之一就是按规定的条件,重复执行某些操作。循环结构有:Do …Loop 和For …Next 语句。 一、Do …Loop 循环语句 用于控制循环次数未知的循环结构。 While 当型循环/ Until 直到循环。 形式1: 形式2: Do [While|Until <条件>] Do 语句块 语句块 [Exit Do] [Exit Do] Loop Loop [While|Until <条件>] 形式1为先判断后执行,有可能一次也不执行; 形式2为先执行后判断,至少执行一次。 二、For …Next 循环语句 用于控制循环次数预知的循环结构。注意:书上 For 循环变量 = 初值 To 终值 [Step 步长] 循环体 Next 循环变量 退出和结束语句: 1.Exit 语句:用于退出某种控制结构的执行。有多种形式的Exit 语句:Exit For 、Exit Do 、Exit Sub 、Exit Function 2.End 语句:独立的End 语句用于结束一个程序的运行,它可以放在任何事件过程中。 三、循环的嵌套 在一个循环体内又包含了一个完整的循环结构称为循环的嵌套。书上循环嵌套的例题 第4章 窗体和常用内部控件 重点:熟练使用下列各对象,及其属性/方法/事件。 1、窗体 2、常用内部控件(标准控件) ·按钮·标签 ·文本框 ·框架 ·计时器 ·滚动条 ·单选按钮 ·复选框 ·列表框 ·组合框 ·图片 ·图像 ·形状 ·直线 4.1 窗体Form 一、窗体概要 1、窗体是放置VB 提供的各种控件的一个容器,在窗体上设计和编辑应用程序的界面。 2、窗体的添加(工程→添加窗体);修改(在窗体设计器中 >0 初值<终值 =1 时,可省略 <0 初值>终值 =0 死循环 步长 修改);删除(工程资源管理器) 3、窗体文件:.frm 4、组成:标题栏、边框、窗口区 5、网格:工具→选项→通用 二、窗体的属性、事件和方法 1、窗体常用的属性 位置:top和left属性大小:width和height属性 单位:缇 1 twip=1/20点=1/1440英寸=1/567cm 2、窗体的事件(表1-4-7) Load、Activate、Click、DblClick、Unload 3、窗体的方法:Show、Hide、Move、Print、Cls、Refresh 三、设置启动窗体 应用程序有单窗体、多窗体情况,多窗体时: 1、设置启动窗体:工程属性→通用→启动对象 2、不使用启动窗体:以一个过程开始,选择Sub Main Sub Main:如果一应用程序只包含1个窗体,则程序从执行窗体Form的load过程开始。如果有多个窗体,则从设计阶段建立的第1个窗体开始执行。有时,希望在运行窗体程序之前先执行一些操作,此时可以将这些操作写在Sub Main过程中。 Sub Main是在模块中定义的,如果1个程序中包含有多个模块,只能允许有1个Sub Main过程。Sub Main 过程中可以包含若干语句。但它与其他语言中的主程序不同,程序启动时不会自动执行。 可指定程序从哪一个窗体或是Sub Main开始执行。 四、窗体的生命周期 一个窗体对象从程序启动到正常关闭必然触发事件的顺序: 1、initalize (初始化) 2、load (加载) 3、resize show (改变窗体大小、可见状态) 4、activate(窗体激活,此时处于等待其他事件发生的状态) 5、执行程序 6、queryunload (查询卸载) 7、unload (卸载) 例:单击Form1中的命令按钮,使Form2显示Form1隐藏;Form2加载时,大小为屏幕大小的一半,居中显示;单击Form2,用Move方法,使Form2移动并定位在屏幕的左上角,同时Form2的长宽也缩小一倍。Form2.show Form2.Width=Screen.Width/2 Form2.Top=(Screen.Height-Form2.Height)/2 Form2.Move 0,0,Form2.Width/2,Form2.Height/2 4.2 按钮Command 按钮控件:命令按钮 1、按钮的属性 2、按钮的事件(表1-4-7) Click 例:设置一个按钮,要求:名称为“sell”,背景为浅黄色,距离窗体左边500,上3000,按钮宽3000,高2000,提示文本为“销售管理”,单击按钮窗体上显示“按钮例子!”,随后按钮可见但不可用。 4.3 文本控件:标签Label 文本框T extBox 1、标签:显示文本 2、文本框:输入输出文本 例:设置一个标签,要求:名称默认,可以根据里面的内容自动调整大小。 设置一个文本框,要求:有水平和垂直滚动条(前提是允许多行),但不允许用户编辑。 设置用户输入密码文本框,要求显示都是e。 例:用户输入原始字符串,从中选取一些字符串,显示在另一个文本框中,并指明起始位置和长度。 Text2.text=text1.seltext label1.caption=text1.selstart label2.caption=text1.sellength 4.4 框架frame 容器型的控件:框架、窗体、图片框。 添加框架、主要属性例题 4.5 选择控件:单选按钮、复选框 1、单选按钮optionbutton 属性caption value→选中true;没选中false;Click事件2、复选框checkbox 属性:caption value →没选中0;选中1;选中灰色2;SetFocus、refresh、move方法;Click事件 4.6 列表框listbox和组合框combobox 1、列表框 属性;list 列表框中列出的各个选项ctrl+回车listindex 索引号,从0开始 列表框中的第一项是:list2.list(0)= "北京" listcount列表框中所有选项的个数 selected是否被选中true false list2.selected(3)=true text当前选中项目的文本内容list2.text multiselect:none simple extended style:标准样式0;复选框样式1 sorted是否按字母顺序排列true false Columns:0 列表中显示垂直滚动条 1~n 列表中显示水平滚动条,同时在列表的宽度范围内显示1~n列数据 Click事件; AddItem方法list2.additem "abcd", 2 RemoveItem方法list2.removeitem 3 Clear方法list2.clear 2、组合框 style、text属性;AddItem、RemoveItem、Clear方法4.7 图片框、图像框、形状、直线 1、图片框PictureBox 显示图形,又可作为其它控件的容器。 Picture、AutoSize属性;loadpicture(); 2、图像框image 显示静态图形 3、形状控件shape BackStyle:0—透明的1—不透明的 Shape: 4、直线line 4.8 计时器控件timer 没有width和height属性 interval属性:时间间隔,单位毫秒Timer 事件 例:综合运用图形和时钟控件,实现运动的小红球。 4.9 滚动条scrollbar水平滚动条、垂直滚动条 属性:max和min、smallchange和largechange、value 事件:拖动滑块触发Scroll、改变value属性触发Change 第5章数组 重点:一维数组、二维数组的使用;两种排序方法和顺序查找法;动态数组、控件数组。 引例:输入10个数,输出平均值及大于平均值的那些数? 5.1 数组的概念 1、一组类型相同数据的有序集合,用于保存大量的、逻辑上有联系的数据。 2、表现形式:a(i) a(i, j) a是数组名i, j是下标 A(10) '一维数组,对应数学中的数列 X(2,10) '二维数组,对应数学中的矩阵 Y(1,2,5) ' 三维数组 3、数组的特点:数组中的元素类型一致。 ?数组元素在内存空间上是连续存放。 ?数组元素的引用可通过下标进行,每个元素用下标变量来区分;下标变量代表元素在数组中的位置。 ?数组在使用前必须要定义(声明)。 4、VB中的数组分类: 按数组的大小(元素个数)是否可以改变来分为: 固定数组、动态(可变长)数组。 按元素的数据类型可分为: 数值型数组、字符串数组、逻辑数组、 日期型数组、变体数组等、对象数组。 按数组的维数可分为:一维数组、二维数组、多维数组。数:一个数组中的元素需要用多少个下标变量来确定。对象数组:控件数组、菜单对象数组 5.2 固定数组 一、一维数组1、一维数组的定义(声明) Dim 数组名([下界To ] 上界) As 数据类型 例:Dim Data(1 To 40) As Integer 说明:定义数组可以使用类型符。Dim Data%(1 To 40) 下界默认值为0,用Option Base n可设定数组的默认下界。数组定义后的初值:数值型数组各元素为0,逻辑型数组各元素为False,字符串数组各元素为空串("")。 可同时声明几个数组,用逗号分隔,例如 Dim A%(10 To 100), B(1100) As Long 定义时,下标的下界和上界值只能是常数或常数表达式。定义时,数组的上界值不得超出长整型范围,且数组的上界值不得小于下界值。 数组的元素个数称为数组长度。上界-下界+1 如果省略As子句,则数组的类型为变体类型。 2、一维数组的使用:使用形式是数组名(下标) 下标可以是整型变量、常量或表达式。 例:设有下面的数组定义:Dim (10) As Integer,B%(10) 则下面的语句都是正确的。 A(1)=A(2)+B(1)+5 ' 取数组元素运算 A(i)=B(i) ' 下标使用变量 B(i+1)=A(i+2) ' 下标使用表达式3、一维数组的基本操作(用一重循环) (1). 可通过循环给数组元素赋初值(一维数组的输入) For i = 0 To 9 ' A数组的每个元素值为1 a(i)=1 或a(i)=int(rnd*91)+10 随机产生10个10~100之间整数或A(i)=V al(InputBox("输入A(" & I & " ) 的值" ) ) Next i (2). 一维数组的输出 For i = 0 To 9 Print a(i); Next i (3). 求一维数组中最大元素及所在下标 Dim Max As Integer, iMax As Integer, a(9) as single ……'给a(9)里面的10个元素赋值 Max = a(0): iMax = 0 For i = 1 To 9 If A(i) > Max Then Max = A(i) iMax = i End If Next i Print "A(" & iMax & ")="; A(iMax) (4). 将数组元素倒置 For i =0 To 9\2 t=A(i) A(i)=A(9-i) A(9-i)=t Next i 例:输出斐波那契级数的前20项 Private Sub Form_Click() Dim F(20) As Integer, I As Integer F(1) = 1 : F(2) = 1 '第一、第二项为1 For I = 3 To 20 '第三项起每项为前二项之和F(I) = F(I - 2) + F(I - 1) Next I For I = 1 To 20 '在窗体上输出 Print F(I); If I Mod 5 = 0 Then Print '一行输出5个 Next I End Sub 二、二维数组 1、二维数组的定义(声明) dim 数组名([<下界> to]<上界>, [<下界> to]<上界>) [as <类型>] 其中的参数与一维数组完全相同。例Dim a(2,3) As Single 二维数组在内存的存放顺序是“一行一行存储”。例如数组a的各元素在内存中的存放顺序是: a(0,0)→a(0,1)→a(0,2)→a(0,3)→a(1,0)→a(1,1)→a(1,2)→a(1,3)→a(2,0)→(2,1)→a(2,2)→a(2,3) 2、二维数组的使用:数组名(下标1,下标2) 例如:a(1,2)=10 a(i+2,j)=a(2,3)*2 3、二维数组的基本操作(用二重循环) (1).二维数组的输入与输出 Dim a(1 to 4, 1 to 5) As Integer, i%, j% For i=1 to 4 For j=1 to 5 A(i,j)=V al(InputBox("a("& I &"," & j & ")=?")) Next j Next i For i=1 to 4 For j=1 to 5 print format(a(i,j), "!@@@@@"); Next j print Next i (2). 求最大元素及其所在的行和列 用变量max存放最大值,row,col存放最大值所在行列号Dim a(1 to 3, 1 to 4) as single ……‘输入元素 Max = a(1, 1): row = 1: Col = 1 For i = 1 To 3 For j = 1 To 4 If a(i, j) > a(row, Col) Then Max = a(i, j) row = i Col = j End If Next j Next i Print "最大元素是"; Max;"在第" & row & "行,"; "第" & Col & "列" (3) 矩阵的转置 把a方阵的转置的程序代码如下: a(1 to 5, 1 to 5) For i = 1 To 5 For j = i+1 To 5 Temp=a(i,j) a(i, j) = a(j, i) a(j, i)=Temp Next j Next i 设A是M*N的矩阵,要重新定义一个N*M的二级数组B,将A转置得到B的程序代码如下: For i = 1To M For j = 1To N b(j,i) = a(i,j) Next j Next i 5.3 动态数组 在声明时未给出数组的大小,在程序执行时再定义,再分配存储空间。包括声明和大小说明两步: ?在使用Dim、Private或Public语句声明括号内为空的数组。例:Dim a( ) As Integer 格式:Dim | Private|Public 数组名()As 数据类型?在过程中用ReDim语句指明该数组的大小。 格式:ReDim [Preserve] 数组名(下标1[,下标2…])Preserve:保留数组中原来的数据 5.4 for each …next循环 对数组中的每个元素重复执行一组语句。格式: For Each 成员In 数组名 语句组 [Exit for] Next [成员] 5.5 控件数组 控件数组由一组相同类型的控件组成,比如一组按钮或一组单选钮。 共用一个相同的名字,其中的每个控件都有一个与之关联的下标,或称索引(Index属性)。 求数组某一维的上界和下界值,如果省略N默认是1维UBound(<数组名>[, 第6章过程 重点:Sub子过程和Function函数过程的建立和调用;传址和传值的区别;变量和过程的作用域。 过程是用来执行一个特定任务的一段程序代码。在程序设计过程中,将一些常用的功能编写成过程,可供多个不同的事件过程多次调用,从而可以减少重复编写代码的工作量,实现代码重用,使程序简练、便于调试和维护。 6.1 Sub过程,又叫子过程。分为事件过程和通用过程第一、事件过程 事件过程的定义:1、窗体事件的语法 Private Sub Form_事件名(参数列表) <语句组>退出sub过程:exit sub End Sub 2、控件事件的语法 Private Sub 控件名_事件名(参数列表) <语句组> End Sub 说明:*这类过程与对象有关,对象事件触发后被调用。*事件过程的过程名由系统自动指定。 事件过程的调用:一般由事件的触发而引起(单击、窗体加载等),也可用call调用,如: Private Sub Form_DblClick() Call Command1_Click End Sub 第二、通用过程:由用户根据需要自主建立的过程 通用过程的定义: [Public|Private][Static] Sub 子过程名([形参表]) <语句组> End Sub 说明:这类过程不与对象相关,是用户创建的一段共享代码。过程的名称由用户自己命名。 形式参数列表:形式参数通常简称“形参”,仅表示形参的类型、个数、位置,定义时是无值的,只有在过程被调用时,虚实参结合后才获得相应的值。形式参数只在本过程内有意义。过程可以无形式参数,但括号不能省。 通用过程的调用: Call 过程名(实际参数列表)call swap(a,b) 或:过程名实际参数列表swap a,b 注意:实参列表,是往被定义过程的形参传递的数据,实参和形参数据类型一致,个数一致,顺序一致。 例:编一个交换两个整型变量值的子过程。 Private Sub Swap( X As Integer, Y As Integer) Dim temp As Integer Temp=X : X=Y : Y=Temp End Sub 在主程序中调用: Private Sub command1_click() Dim a%,b% a=val(inputbox("a=")) : b=val(inputbox("b=")) call swap(a,b) print "a=";a, "b=";b End Sub 例:编一个求n!的子过程,然后调用它计算7!+11!-10!Sub jch(n%,p#)Private Sub Form_Click()Dim i% Dim a # ,b # ,c # ,d # p = 1 Call jch(7,a) For i = 1 To n call jch(11,b) p = p * i jch 10,c Next i Print "7!+11!-10!=";a+b-c End Sub End Sub 6.2 Function函数过程 VB的函数有两类: 1、内部函数:abs() int() 2、外部函数:用户编写自己的Function过程 定义函数过程的语法是: [Static][Public|Private] Function 函数名([参数列表])[As类型] [语句序列] 函数名=表达式 End Function 函数名=表达式:函数过程有返回值,至少应该有一个给函数过程名赋值的语句,作为函数的返回值。 [As 类型]:定义了返回值类型。 调用Function 函数过程:把函数看作一个数,可以放在赋值号右端例如:T=MyFunc(5) 例:编一求最大公约数的函数过程 Sub Form_Click Dim x%, y%, z% x = 124: y = 24: z = gcd(x, y) MsgBox "最大公约数是" & z End Sub Function gcd( m%, n%) As Integer If m < n Then t = m: m = n: n = t Do while n<>0 r = m Mod n : m = n : n = r Loop gcd = n End Function 6.3 参数的传递 过程和调用它的程序之间都存在数据传递,过程本身使用的参数列表称为“形参”;主程序传递给过程的真正参数称为“实参”;过程在被调用时,用实参代替形参。 实参与形参的结合有两种方法: 传址(ByRef):按地址传递。定义过程时,缺省的参数传递方式是按地址传递。主调过程的实参与被调过程的形参共享同一存储单元。因此实参的值就会随过程体内对形参的改变而改变。 传值(ByVal):按数值传递。主调过程的实参与被调过程的形参各有自己的存储单元。在过程体内对形参的任何操作不会影响到实参。 Sub a (byval x as integer, y as single ) x 是传值, y 是传址 形参是数组时,只能采用传址方式 6.4 过程的嵌套与递归:会书上的例子 6.5 变量和过程的作用域 过程、变量可被访问的范围(能有效发挥其作用的范围)称之为过程、变量的作用域。 代码模块:窗体模块、标准模块、类模块 变量的作用域: 过程的作用域 第三章习题: 第4题:Private Sub Form_Click() Dim n As Integer, a As Integer n = 0 a = V al(InputBox("请输入初始值", "输出50个能被37整除的数")) Do While n < 50 If a Mod 37 = 0 Then Print a, n = n + 1 If n Mod 10 = 0 Then Print End If a = a + 1 Loop End Sub 第5题:Private Sub Form_Click() Dim a As Integer, b1 As Integer, b2 As Integer, b3 As Integer For a = 100 To 999 b1 = a Mod 10 '提取出a 的个位 b2 = (a \ 10) Mod 10 '提取出十位 b3 = a \ 100 '提取出百位 If b1 ^ 3 + b2 ^ 3 + b3 ^ 3 = a Then Print a End If Next a End Sub Private Sub Form_Click() Dim a As Integer, b As Integer, c As Integer, b3 As Integer For a = 1 To 9 For b = 0 To 9 For c = 0 To 9 If a ^ 3 + b ^ 3 + c ^ 3 = a * 100 + b * 10 + c Then Print a * 100 + b * 10 + c End if Next c Next b Next a End Sub 第6题 (1):Private Sub Form_Click() Dim i As Integer, t As Double, s As Single t = 1: s = 1 For i = 1 To 50 t = t * i : s = s + 1 / t Next Print "s="; s End Sub 第6题 (2):Private Sub Form_Click() Dim i%, n&, t!, e! e = 0: i = 0: n = 1: t = 1 Do While t > 0.000001 e = e + t : i = i + 1 : n = n * i : t = 1 / n Loop Print "前"; i; "项的和是"; e End Sub 第7题:Private Sub Form_Click() Dim a As Single, b As Single, c As Single, zhou As Double, p As Single, s As Double a = V al(InputBox("请输入三角形的第一个边长a")) b = V al(InputBox("请输入三角形的第二个边长b")) c = V al(InputBox("请输入三角形的第三个边长c")) If a + b > c And b + c > a And a + c > b Then zhou = a + b + c p = (a + b + c) / 2 s = Sqr(p * (p - a) * (p - b) * (p - c)) Print "三角形的周长是:"; zhou, "三角形的面积是:"; s Else MsgBox "您输入的三边不能构成三角形": Exit Sub End If End Sub 第8题:Private Sub Form_Click() Dim t As Integer, n As Integer t = 1 n = 1 Do While t < 4000 t = t * n n = n + 1 Loop Print n - 2 End Sub 第10题:方法一:Private Sub Form_Click() Dim a As Integer, b1 As Integer, b2 As Integer, b3 As Integer a = V al(InputBox("请输入一个三位数")) b1 = a Mod 10 '提取出个位 b2 = (a \ 10) Mod 10 '提取出十位 b3 = a \ 100 '提取出百位 Print b1 & b2 & b3 End Sub 方法二:Private Sub Form_Click() Dim a As String a = InputBox("请输入一个三位数") Print Right(a, 1) & Mid(a, 2, 1) & Left(a, 1) End Sub 方法三:输入一串字符,不限制个数,逆序输出 Private Sub Form_Click() Dim a As String, b As String, t As String * 1, i As Integer a = InputBox("请输入一个串字符", "逆序输出") For i = Len(a) To 1 Step -1 t = Mid(a, i, 1) b = b & t Next i Print a Print b End Sub 第11题:Private Sub Form_Click() Dim i As Integer, j As Integer, k As Integer Print: Print: Print For i = 1 To 7 Print Tab(2 * i + 2); For j = 2 * i - 1 To 13 Print "*"; Spc(1); Next j Print Spc(5); For k = 1 To 2 * i - 1 Print "$"; Spc(1); Next k Print Next i End Sub 12、如何判断一个数是素数?教材P97 Private Sub Form_Click() Dim a As Integer, i As Integer a = V al(InputBox("请输入一个正整数")) For i = 2 To a - 1 '判断a是否是素数If a Mod i = 0 Then Print "该数是一个合数" Exit For End If Next i If i = a Then Print "该数是一个素数" End If End Sub 13、求从100到1000之间所有3的倍数的数之和,当和大于3000时,停止计算,输出和。 Private Sub Form_Click() Dim i As Integer, sum As Integer sum = 0 For i = 100 To 1000 If i Mod 3 = 0 Then sum = sum + i If sum > 3000 Then Exit For End If Next i Print sum End Sub 下面的方法更简单 For i = 102 To 1000 Step 2 sum = sum + i If sum > 3000 Then Exit For Next i 14、一个数,它除3余2,除5余3,除7余2,求满足上面要求的最小数。 Private Sub Form_Click() Dim a As Integer For a = 2 To 1000 If a Mod 3 = 2 And a Mod 5 = 3 And a Mod 7 = 2 Then Print a Exit For End If Next a End Sub 第四章习题: 第3题 Private Sub Form_Load() Option1.V alue = True End Sub Private Sub Command1_Click() Dim a As Single, b As Single a = V al(Text1.Text) b = V al(Text2.Text) If Option1.V alue = True Then Label1.Caption = a + b If Option2.V alue = True Then Label1.Caption = a - b If Option3.V alue = True Then Label1.Caption = a * b If Option4.V alue = True Then Label1.Caption = a / b End Sub 第4题:Private Sub Form_Load() Dim n As Integer For n = 1 To 50 List1.AddItem Format(n, "@@@@") & _ Format(n ^ 2, "@@@@@@@@") & _ Format(Format(Sqr(n), "0.00"), "@@@@@@@@") & _ Format(Format(Log(n), "0.00"), "@@@@@@@@") & _ " " & Format(Exp(n), "0.00") Next End Sub 第5题:Private Sub Form_Load() Timer1.Enabled = False End Sub Private Sub Command1_Click() Timer1.Enabled = True Text1.Text = V al(Text1.Text) * 60 End Sub Private Sub Timer1_Timer() If V al(Text1.Text) > 0 Then Text1.Text = Text1.Text - 1 Else Timer1.Enabled = False MsgBox "时间到!" End If End Sub 第6题:Private Sub Timer1_Timer() If Picture1.Left > Form1.ScaleWidth Then Picture1.Left = 0 Else Picture1.Left = Picture1.Left + 100 End If End Sub 第五章习题: 第6题:Private Sub Form_Click() Dim a(1 To 4, 1 To 4) As Integer, i%, j% Randomize For i = 1 To 4 For j = 1 To 4 随机产生10~100的整数 a(i, j) = Int(Rnd * 91) + 10 Next j Next i Print "二维数组a是:" For i = 1 To 4 For j = 1 To 4 Print Format(a(i, j), "!@@@@@"); 矩阵的形式 Next j 输出数组Print Next i max = a(1, 1): row = 1: col = 1 For i = 1 To 4 For j = 1 To 4 If a(i, j) > a(row, col) Then max = a(i, j) row = i col = j End If Next j Next i Print "最大元素是"; max; "在第" & row & "行,"; "第" & col & "列" End Sub 第7题:Private Sub Form_Click() Dim a() a = Array(1, 3, 4, -1, 58, 60, -2, 10) For i = 0 To 7 If a(i) < 0 Then s = s + a(i) Next Print s End Sub 第8题:Private Sub Form_Click() Dim a(1 To 10) As Single, s As Single, max As Single, min As Single max = 0: min = 100 For i = 1 To 10 a(i) = V al(InputBox("输入第" & i & "个学生的成绩")) s = s + a(i) If a(i) > max Then max = a(i) If a(i) < min Then min = a(i) Next i Print "最高分是:"; max, "最低分是:"; min, "平均分是:"; s / 10 End Sub 第9题:Private Sub Form_Click() Dim a(1 To 3, 1 To 3) As Integer, i%, j% ……写随机产生整数的代码,范围自己定 ……写输出数组的代码 Print "对角线元素和是:"; a(1, 1) + a(2, 2) + a(3, 3) + a(1, 3) + a(3, 1) End Sub 第10题:Private Sub Form_Click() Dim a a=Split("王丹,王玉,王虹,李雪,李龙,李燕,李云,张峰,张涛,赵露", ",") b = InputBox("请输入某个姓氏") s = 0 For i = 0 To 9 If Left(a(i), 1) = b Then s = s + 1 Print a(i) End If Next i Print "姓氏为“" & b & "”的人一共有" & s & "个" End Sub 第12题:Private Sub Form_Click() Dim a(), n As Integer, m As Integer, k As Integer n = V al(InputBox("输入n×m矩阵,n的值")) m = V al(InputBox("输入n×m矩阵,m的值")) ReDim a(n, m) ……写随机产生整数的代码,范围自己定 ……写输出数组的代码 max = a(1, 1): row = 1: col = 1 For i = 1 To n For j = 1 To m If a(i, j) > a(row, col) Then max = a(i, j) row = i col = j End If Next j For k = 1 To n If a(k, col) < a(row, col) Then Exit For Next k If k =n+1 Then Print "鞍点是"; a(row, col); "第"; row; "行"; col; "列" Next i End Sub 第13题:Private Sub Form_Click() Dim a(), n As Integer n = V al(InputBox("输入n×n方阵,n的值")) ReDim a(n, n) ……写随机产生整数的代码,范围自己定 ……写输出数组的代码 For i = 1 To n s = s + a(i, i) + a(i, UBound(a) - i + 1) Next i If n Mod 2 = 0 Then Print "对角线元素之和是:" & s Else Print "对角线元素之和是:" & s - a(Round(n / 2), Round(n / 2)) End If End Sub 第14题:Private Sub Form_Click() Dim a(1 To 9, 1 To 9) As Integer For i = 1 To 9 a(i, i) = 1 a(i, UBound(a) - i + 1) = 1 Next i ……写输出数组的代码 End Sub 第六章习题: 第3题 随机生成x~y之间的整数的Function函数过程:Function suiji(x As Integer, y As Integer) As Integer suiji = Int(Rnd * (y – x+1)) + x End Function 主程序: Private Sub Form_Click() For i = 1 To 30 Print suiji(1, 100); If i Mod 10 = 0 Then Print Next i End Sub 第6题 Function bijiao(x As Integer, y As Integer) As Integer If x > y Then bijiao = x Else bijiao = y End If End Function Private Sub Form_Click() Dim a(1 To 10) As Integer, max As Integer Randomize For i = 1 To 10 a(i) = Int(Rnd * 91) + 10 max = bijiao(max, a(i)) Next i For i = 1 To 10 Print a(i); Next i Print "最大的数是"; max End Sub 第7题 Sub jio(x As Integer) If x Mod 2 = 0 Then Print "是偶数" Else Print "是奇数" End If End Sub Private Sub Form_Click() Dim a As Integer a = V al(InputBox("请输入一个整数", "输入框")) Call jio(a) End Sub 第8题 Sub judge(x As Integer) If x Mod 17 = 0 And x Mod 37 = 0 Then Print x End Sub Private Sub Form_Click() Dim i As Integer For i = 1000 To 2000 Call judge(i) Next i End Sub 第9题 Public Function f(x As Integer) As Single If x = 0 Then f = 0 Else f = Sqr(2 + f(x - 1)) End If End Function Private Sub Form_Click() Dim n As Integer, s As Single, i As Integer n = V al(InputBox("请输入一个整数n ", "输入框")) For i = 1 To n s = s + f(i) Next i Print "式子的前"; n; "项和是"; s End Sub