VISUAL BASIC 复习
VB概述
§1VB的特点
1.可视化的设计平台
2.面向对象的设计方法
对象具有自己的属性(对象的性质)、方法(对象的动作)和事件(对象的响应),它构成对象的三个要素。
3.事件驱动的编程机制
4.集成化的开发环境
5.结构化的设计语言
§4VB程序设计
VB应用程序的开发有三个步骤:
(1)设计应用程序界面。
(2)设置对象的属性
(3)编写事件驱动代码
保存工程
简便方法:
执行“文件/保存工程”命令
(第一次保存文件)系统先打开“文件另存为”对话框,保存窗体文件(或标准模块文件),然后再打开“工程另存为”对话框,保存工程文件。
保存修改后的工程文件
选择“文件/保存工程”命令保存所做的修改,(保存与工程有关的修改过的窗体文件或标准模块文件)。
VB基础知识
常量
(1)字符串常量
用双引号括起来的字符序列(除双引号和回车符)。
例如:
"China"
“I am a student.”
"95.3%"
"计算机软件"
(2)数值常量
整型1234(十进制)
长整型12345678(十进制)
单精度数:有三种形式,12.34,123!,123.45E-5
双精度数:有两种形式,12.34#,123.45D-5
在常数后面加上类型说明符:
%整型&长整型!单精度
#双精度$字符串型。
2.符号常量
格式:Const常量名=表达式
功能:定义一个符号常量来表示表达式的值。
说明:“常量名”可加以类型说明符。符号常量的类型由类型说明符或表达式的类型决定。Const PI=3.141593
变量
1.变量的命名
变量名以字母开头,后跟字母、数字和下划线组成
说明:
(1)变量名不能是保留字
(2)VB变量名不区分字母大小写。
2.变量的类型
(1)用类型说明符
在变量的尾部加上类型说明符:
%整型&长整型!单精度
#双精度$字符串型。
例如:Num%,Str1$均是合法的变量名
在引用时,可以省略类型说明符。
(2)定义变量时声明其类型
格式:Dim变量名As类型
“类型”可为基本数据类型或用户自定义的类型。
Boolean(布尔型)Long(长整型)
Single(单精度型)Double(双精度型)
String(字符串型)Variant(变体型)
用户自定义类型
例如:
Dim str1As String,country As String*20
Dim i As Integer,sum As Single
定义变量后,数值型变量的初值为0
字符型变量的初值为空字符串
其中:
变长字符串的初值是长度为0
定长字符串的初值的长度等于定义值。
3.变体类型变量
如未定义类型的变量
例如:Dim sum As Variant
Dim sum
运算符与表达式
1.算术运算符(8种)
优先级(从高到低):
指数(∧)
取负(-)
乘法、浮点除法(*,/)
整数除法(\)
取模(Mod)
加法、减法(+,-)。
整除:被除数和除数为整数,结果为整数。
31.7\5.88
32\6结果为:5
取模(求余)运算:结果为整数除法的余数。
31.77Mod5.88(四舍五入)
32Mod6,余数为2
3Mod6余数为3
字符串表达式
字符串运算符:&或+
功能:把字符串连接成一个字符串。
说明:
(1)符号“&”与字符串变量之间应间隔一个空格,
例如:
str1&str2
(2)“&”能强制把其它类型的数据转换为字符串,
而“+”不能。
例如:
2008&"奥运会"2008奥运会
"2008"+"奥运会"2008奥运会
注意:
Print"123"+567结果:690
Print"abc"+567出错:类型不匹配
常用内部函数
数学函数
函数功能
Abs(x)返回x的绝对值
Int(x)求不大于x的最大整数
Int(7.8)结果为7,Int(-7.8)结果为-8
Cint(x)把x小数四舍五入,转换为整数,
Exp(x)计算ex,e是自然数2.718281
Log(x)求x的自然对数
Sqr(x)求x的平方根
Rnd返回0~1之间的随机数:
字符串函数
Len(str)返回字符串长度
Left$(str,n)取字符串左边n个字符Right$(str,n)取字符串右边n个字符
Mid$(str,p[,n])从位置p开始,取n个字符,如n省略,取到最后Str$(num)数值转字符串
Val(str)字符串转数值
Asc(str)返回字符串首字母ASCII码
Chr$(n)ASCII码转字符
说明:
(l)三角函数Sin、Cos和Tan自变量的单位是弧度
反正切函数Atn(x)的返回值单位为弧度。
度转换为弧度:1°=3.14159/180*x
(2)用函数Rnd可以产生不同的随机数。
产生指定范围的随机数:
l产生0~n之间的随机数(不含0和n)
Rnd*n
l产生0~n之间的随机整数(含0,不含n)
Int(Rnd*n)
l产生a~b之间的随机整数(含a,不含b)
Int((b-a)*Rnd+a)
l产生a~b之间的随机整数(含a和b)
Int((b-a+1)*Rnd+a)
顺序结构
结构化程序三种基本结构:
顺序结构、选择结构和循环结构。
1赋值语句
变量=表达式
属性名=属性值
注意:
当变量类型与表达式的类型不同时,VB自动将表达式的类型强制
转换为变量类型。
例如:
Dim Num As Integer
Num=8.89(将9赋给Num,四舍五人)
3数据输入
方法1:用文本框
例:Dim m As Integer
m=Val(Text1.Text)
方法2:用Inputbox()函数
例:m=Val(InputBox("enter m:"))
方法3:从文件输入
Input#2,m
4输出数据
方法1:用文本框
例:Text1.Text=n
或Text1=n
方法2:用标签
例:Label1.Caption=n
方法3:用Print方法
例:Print n
方法4:输出到列表框
例:List1.AddItem n
方法5:输出到文件
例:Open"abc.dat"For Output As#1
Write#1,n
【例】交换变量a、b的值。
用中间变量t作暂存单元,必须与交换的变量同类型。
t=a:a=b:b=t
3.2窗体
窗体常用的方法Print,
窗体事件
1.Click事件
2.Load事件
Load是把窗体装入工作区事件,
Form_Load()事件是执行程序时自动触发的,因此常用来在启动程序时对属性和变量进行初始化。
3.UnLoad事件
关闭窗体触发该事件
选择结构
满足条件为“真”,用“True”表示;
不满足条件为“假”,用“False”表示。
关系表达式
1.关系运算符(6种)
=、<>、<、>、<=、>=
优先级相同,运算从左到右。
2.关系表达式
例如:“apply”>“apple”
按ASCII码逐字符进行比较。
空格<“0”…“9”<“A”…“Z”<“a”…“z”“apply”>“apple”结果为True
逻辑表达式
逻辑运算符:Not、And、Or
优先级:
逻辑非(Not)、逻辑与(And)、逻辑或(Or)注意:
表示:a≤x≤b
a<=x And x<=b
选择结构
1.单行If语句
If条件Then语句组1[Else语句组2]
语句组:各语句间需用“:”分隔。
2.块结构If语句
If条件Then
语句块1
Else
语句块2
End If
例:计算分段函数
1+x(x≥0)
y=
1-2x(x<0)
If x>=0Then
y=1+x
Else
y=1-2*x
End If
用单行If语句:
If x>=0Then y=1+x Else y=1-2*x
或:
If x>=0Then y=1+x
If x<0Then y=1-2*x
3.多分支选择结构
If条件1Then
语句块1
ElseIf条件2Then
语句块2
ElseIf条件3Then
语句块3
……
Else
语句块n+1
End If
从多个条件中,选择执行一个语句块
“纵然分支众多,仅选其一”
说明:
当有多个条件为真时,只能执行最前面的一个语句块。注意:ElseIf之间不能有空格
【例】学生成绩判定。
Private Sub Command1_Click()
x=Val(InputBox("输入学生成绩:"))
If x>=90Then
Print“优”
ElseIf x>=80Then
Print“良”
ElseIf x>=70Then
Print“中”
ElseIf x>60Then
Print“及格”
Else
Print“不及格”
End If
End Sub
4.2.4IIf函数
IIf是单行If语句的简单版本。
变量=IIf(条件,True部分,False部分)
注意:IIf函数中的三个参数都不能省略。
例:计算分段函数
1+x(x≥0)
y=
1-2x(x<0)
Private Sub Command1_Click()
Dim x As Single,y As Single
x=Val(Text1.Text)
y=IIf(x>=0,1+x,1-2*x)
Text2.Text=y
End Sub
【例】判闰年。
闰年的条件:
(1)被4整除,但不能被100整除;
(2)能被400整除。
最好:
If x Mod400=0Then
y$="是闰年"
ElseIf x Mod4=0And x Mod100<>0Then
y$="是闰年"
Else
y$="不是闰年"
End If
也可
x=Val(InputBox("输入年份"))
If x Mod4=0and x Mod100<>0or x Mod400=0Then y$="是闰年"
Else
y$="不是闰年"
End If
4.Select Case语句
用于实现多分支结构。
Select Case测试表达式
Case条件1
语句块1
Case条件2
语句块2
……
Case Else
语句块n+1
End Select
功能:
从多个条件中选择执行第一个符合条件的语句,都不符合,则执行Case Else后的语句块。
注意条件:
常量表:1,3,5
测试范围:10to20,“a”to“z”
比较范围:Is<10
(不能为逻辑表达式)
【例】学生成绩评定
Private Sub Command1_Click()
x=Val(InputBox("输入考试成绩"))
Select Case x
Case90To100
y$="优"
Case80To89
y$="良"
Case70To79
y$="中"
Case60To69
Case0To59
y$="不及格"
Case Else
y$="输入错误"
End Select
Form1.Print"成绩:";x,"等级:";y$
End Sub
循环结构
“当型”循环:当条件为真,执行循环体。“直到型”循环:做循环,直到条件为真为止。
1.For-Next循环
常用于循环次数已知。
For循环变量=初值To终值[Step步长]
循环体
[Exit For]
Next循环变量
【例】计算n!。
Private Sub Command1_Click()
n=Val(InputBox("输入一个自然数"))
Term=1
For i=1To n
Term=Term*i
Next i
Print n;"!=";Term
End Sub
【例】计算2+4+6+……+100的值。Private Sub Command1_Click()
Sum=0
For x=2To100Step2
Sum=Sum+x
Next x
Form1.Print"Sum=";Sum
End Sub
【例】计算1+2!+3!+ (10)
Private Sub Command1_Click()
T=1
S=0
For k=1To10
S=S+T
Next k
Print S
End Sub
2.While-Wend循环
适合处理循环次数未知的循环。
While条件
语句块
Wend
功能:当条件为真时执行循环。
【例】计算1+2+3+……+100
Private Sub Command1_Click()
Dim n As Integer,s As Integer
s=0
n=1
While n<=100
s=s+n
n=n+1
Wend
Lable1.Caption=“1+2++3+……+100=”&s
End Sub
3.Do-Loop循环
Do
语句块
[Exit Do]
Loop[While|Until条件]
Do[While|Until条件]
语句块
[Exit Do]
Loop
功能:
While条件——当“条件”为True执行循环体。
Until条件——“条件”为False执行循环体。
如无条件,则为死循环。
说明:
格式1:“先循环,后判断”,至少执行一次循环。
格式2:“先判断,后循环”,如条件不满足,则一次循环也不执行。【例】计算1+2+3+……+100
s=0
n=1
Do while n<=100
s=s+n
n=n+1
Loop
也可
s=0
n=1
Do Until n>100
s=s+n
n=n+1
Loop
【例】将十进制数转换为二进制数
Private Sub Form_Click()
Dim m As Integer
m=InputBox("enter m:")
a$=""
While m<>0
r=m Mod2
a$=r&a$
m=m\2
Wend
Print a$
End Sub
注意:
a$=a$&r
则为:4=001
列表框
列表框的方法
AddItem方法:用于在列表框中插入一个列表项。
格式:
列表框.AddItem项目字符串[,索引值]
如省略索引值,则在列表框的最后插入新列表项。【例】将文本框内容添加到列表框1
Private Sub Command1_Click()
List1.AddItem Text1.Text
End Sub
多重循环
说明:
(1)必须完整嵌套,不得交叉。
(2)Exit For语句和Exit Do语句只能退出当前层循环。
指定每行显示数据的个数
For n=1to30
Print n;””;
If n Mod10=0Then Print
Next n
'每显示10个数据换行
常用算法(1)
1.不定方程求解。
【例】百鸡问题
x+y+z=100
5x+3y+z/3=100
Private Sub Command1_Click()
Dim x As Integer
Dim y As Integer,z As Integer Print"公鸡","母鸡","小鸡"
For x=0To20
For y=0To33
z=100-x-y
If5*x+3*y+z/3=100Then Print x,y,z
End If
Next y
Next x
End Sub
2.求最大公约数和最小公倍数
辗转相除法:
【例】计算最大公约数和最小公倍数。Private Sub Command1_Click()
Dim m As Integer,n As Integer
Dim u As Integer,v As Integer
m=Val(Text1.Text)
n=Val(Text2.Text)
If m>n Then
u=m:v=n
Else
u=n:v=m
End If
Do
r=u Mod v
u=v
v=r
Loop Until r=0
Print"最大公约数:";u
Print"最小公倍数:";m*n/u
End Sub
或
r=u Mod v
Do While r<>0
u=v
v=r
r=u Mod v
Loop
Print"最大公约数:";v
3.判素数(质数)
【例】判n是否为素数。
Private Sub Command1_Click()
Dim n As Integer,i As Integer
n=Val(InputBox("输入正整数"))
For i=2To n-1
If n Mod i=0Then Exit For
Next i
If i>n-1Then
Print n;"是质数"
Else
Print n;"不是质数"
End If
End Sub
例求100~200之间素数,并写入顺序文件。Private Sub Command1_Click()
Open“shusu.dat”For Output As#1
For n=101To200step2
S=1‘是
For i=2To Int(Sqr(n))
If n Mod i=0Then
S=0‘不是
Exit For
End If
Next I
If s=1Then Write#1,n
Next n
close#1
End Sub
添加到列表框:
List1.AddItem n
数组
6.1静态数组
编译时分配存储空间。
定义:Dim b(3,4)As Long
分配4×5个长整型变量的空间,
二维数组在内存按行的顺序存放
b(0,0)b(0,1)B(0,2)b(0,3)b(0,4)b(1,0)b(1,1)B(1,2)b(1,3)b(1,4)b(2,0)b(2,1)B(2,2)b(2,3)b(2,4)b(3,0)b(3,1)B(3,2)b(3,3)b(3,4)例:Dim b(3,2to4,1to3)As Integer
共分配4×3×3=36个元素,共72Byte
Option语句
格式:Option Base1
注意:只能出现在窗体层或模块层
必须位于数组定义之前。
例:
Option Base1
……
Dim a(10)As Integer,x(5,5)As String
每一维下标的下界均从1开始。
动态数组
运行时分配内存区,
定义分两步进行:
(1)先在窗体层、标准模块或过程中Dim或Public声明一个
没有下标的数组。
(2)过程中用ReDim语句定义带下标的数组。
说明:
声明时不指定数组的维数
数组的维数由第一次出现的ReDim语句指定。
例如:
Dim Test()As Integer
Dim n As Integer
Sub Form_click()
……
n=InputBox(”Enter a value:”)
ReDim Test(n)
……
End Sub
数组元素的引用
形式:数组名(下标)
数组元素赋初值
运行前对数组进行初始化。
格式:数组变量名=Array(初值表)
说明:数组下标下界缺省为0,只能对一维数组初始化【例】
Dim a As As Variant
a=Array(1,2,3,4,5,6,7)
注意:下标从0~6
【例】一维数组元素赋初值。
Option Base1
Private Sub Form_Click()
Dim a As Variant
a=Array(1,2,3,4,5,6,7)
For i=1To7
Print a(i);
Next i
End Sub
运行结果:
1234567
数组输入/输出
一般通过For循环语句和InputBox函数实现,
一维数组用单重循环。
二维数组采用双重循环。
【例】一维数组的输入和输出。
For i=1To10
a(i)=InputBox("Enter data:")
Next i
【例】二维数组的输入和输出。
123
456
789
For i=1To3
For j=1To3
a(i,j)=InputBox("enter data:")
Next j
Next i
For i=1To3
For j=1To3
Print a(i,j);"";
Next j
Next i
【例】用Rnd产生10个0~100之间随机数。
For i=1To10
a(i)=Int(100*Rnd)
Next i
用户自定义类型
定义格式:
Type自定义类型名
元素名1As类型名
元素名2As类型名
……
元素名n As类型名
End Type
其中:
类型名——可为任何基本类型,也可为用户自定义类型。
说明:
(1)一般在标准模块中定义,默认为Public。
如在窗体模块的“声明”段定义,则必须加上Private,且只能在窗体模块中使用。
(2)自定义类型中的元素可以为数组名。
【例】
Private Type student
num As String*8
name As String*8
total As Integer
average As Integer
End Type
1.自定义类型变量的声明
Dim变量名As自定义类型名
例如:
Dim stud As Student
2.引用自定义类型变量中的元素
形式:变量名.元素名
3.自定义类型数组的声明和使用
声明:Dim st(5)As Student
引用形式:
记录数组元素.成员名
【例】输入5个学生的学号、姓名、和3门课的成绩,利用自定义类型数组,计算每个学生的总分和平均分,并按平均成绩从高到低输出学生的成绩单。
Private Type student
no As String*6
name As String*6
s1As Single
s2As Single
s3As Single
total As Single
aver As Single
End Type
Private Sub Form_Click()
Dim a(1To5)As student,t As student
Open“stud.dat”For Output As#1
‘Open“stud.dat”For Random As#2Len=Len(t)打开随机文件
……
n=5
For i=1To n
a(i).total=a(i).s1+a(i).s2+a(i).s3
a(i).aver=a(i).total/3
Next i
For i=1To n-1
For j=i+1To n
If a(i).aver t=a(i) a(i)=a(j) a(j)=t End If Next j Next i Print"学号姓名语文数学英语总分平均分" For i=1To n Print Tab(2);a(i).no;Tab(10);a(i).name;Tab(18);a(i).s1;""; Print a(i).s2;"";a(i).s3;"";a(i).total;"";a(i).aver Write#1,a(i).no,a(i).name,a(i).s1,a(i).s2,a(i).s3,a(i).total,(i).aver ‘Put#2,i,a(i)写入随机文件 Next i Close#1 End Sub 注意:写入文件一行一个记录 运行结果 说明: 交换两个记录数组元素的值,则该记录数组元素的所有成员都将交换。 6.7常用算法(2) 1.求最大值和最小值 【例】找10个数中的最大值与最小值。 For i=1To10 If a(i)>Max Then Max=a(i) If a(i) Next i 6.7.2排序 升序:从小到大 降序:从大到小 1.比较交换法 For i=1To n-1 For j=i+1To n If a(i)>a(j)Then t=a(i) a(i)=a(j) a(j)=t End If Next j Next i 2.选择法排序 For i=1To n-1 p=i For j=i+1To n If a(p)>a(j)Then p=j Next j t=a(i) a(i)=a(p) a(p)=t Next i 3.冒泡法排序 特点:相邻的两个元素进行比较 For i=1To n-1 For j=1To n-i If a(j)>a(j+1)Then t=a(j) a(j)=a(j+1) a(j+1)=t End If Next j Next i 查询 1.顺序查询 从一组数据中,按顺序地查找指定的数据。【例】用顺序查询法在下列数据中查找关键字值…… k=Val(InputBox("输入要查询的数")) p=1 While k<>a(p)And p p=p+1 Wend If k=a(p)Then Print k;"be found,on";p;"th position." Else Print k;"has not be found." End If 2折半查询 折半查找也称为二分法查询 只能对有序数列进行查询。 【例】用折半查询法查找关键字值66。 -123,-10,5,8,30,56,59,66,90,518 Option Base1 Private Sub Form_Click() Dim a As Variant a=Array(-123,-10,5,8,30,56,59,66,90,518) n=UBound(a) Print"数组a中的10个数为:" For Each ii In a Print ii;""; Next ii Print k=Val(InputBox("输入要查询的数")) Print"要查询的数是:";k low=1 hig=n find=-1 While low<=hig And find=-1 m=(low+hig)\2 If k=a(m)Then find=1 Print k;"has be found,on";m;"th position." Else If k hig=m-1 Else low=m+1 End If End If Wend If find=-1Then Print k;"has not be found." End If End Sub 注意:若数据按降序排列