第三章 VB基本语言 3.1编程基础 3.2数据类型 3.3 变量与常量 3.4 运算符和表达式 3.5 内部函数 3.6 基本语句 3.7数组
3.1 编程基础 VB代码不区分字母大小写 语句书写自由 注释有利于程序的维护和调试(Rem或 ‘) 保留行号列号 例:Rem This is a example Dim AnotherVar As String, _ ‘续行,下行还有 BirthDate As Date x=15: y=10 保留行号列号
3.2数据类型 使用VB语言编程,目的就是对数据进行处理。VB将不同的数据规定为不同的类型。它提供了11种标准数据类型,还可以自定义数据类型。
数据类型 关键字 类型符 前缀 占字节数 整型: Integer % int 2 长整型: Long & lng 4 单精度: Single 数据类型 关键字 类型符 前缀 占字节数 整型: Integer % int 2 长整型: Long & lng 4 单精度: Single ! Sng 4 双精度: Double # dbl 8 货币型: Currency @ cur 8 字节型: Byte byt 1 字符型: String $ str 不定 逻辑型: Boolean bln 2 日期型: Date dtm 8 对象型: Object obj 4 可变型: Variant vnt 按需分配
1 数值数据类型 有integer,long,single,double,currency,byte六种 标准数据类型 1 数值数据类型 有integer,long,single,double,currency,byte六种 保存整数: 整型(Integer) 以2个字节存储 ,十进制表示其范围: -32768~32767 eg: 123, intx, intx% 长整型(Long) 以4个字节存储 ,十进制表示其范围: -2147483648~+2147483647 eg: 123&, lngy, lngy&,
以8个字节存储。最多其小数点左边有15位数字,右边有4位数字。 保存二进制数: 字节型(Byte) 标准数据类型 保存浮点实数: 单精度浮点型(Single) 以4个字节存储。eg:123.45, 123.45! ,0.12345E+3(表示0.12345103) 双精度浮点型(Double) 以8个字节存储。eg:123.45#, 0.12345E+3#, 0.12345D+3 保存定点实数和整数: 货币型(Currency) 以8个字节存储。最多其小数点左边有15位数字,右边有4位数字。 eg:1234@,123.45@ 保存二进制数: 字节型(Byte) 以1个字节存储。其取值范围为0~255。
2.日期数据类型: Date 标准数据类型 用于保存日期和时间,表示方法有两种: 将可以被认作日期和时间的字符用号码符(#……#)括起来。 VB接受许多种日期时间格式 eg: # 27 March,1999 1:20 am# #Apr-2-05# #12/18/1999# #1998-5-12 13:20 # 以数字序列表示。小数点左边的数字代表日期,右边的数字代表时间,0为午夜,0.5为中午12点。负数代表1899年12月31日之前的日期和时间。
3. 字符数据类型: String 4.逻辑型数据类型:Boolean 标准数据类型 用于保存字符型数据,包括西文字符和汉字。表示方法为用“”括起来。 eg: "abc" "ABC" "计算机" "12.34" "321" ""(空串) “ ”(空格) 4.逻辑型数据类型:Boolean 用于进行逻辑判断,只有True和False两个值。 逻辑数据类型 其他数据类型 true -1 false
用来表示图形或应用程序中的对象,用4个字节存储。 标准数据类型 5.对象数据类型:Object 用来表示图形或应用程序中的对象,用4个字节存储。 6. 变体数据类型:Variant 是对所有未定义的变量的缺省数据类型。是可变的数据类型,它对数据的处理完全取决于程序上下文的需要。
3.3 变量与常量 变量或常量定义:命了名的存储单元。其中 变量与常量命名规则: 变量:在程序运行中其值可以改变的量。 3.3 变量与常量 变量或常量定义:命了名的存储单元。其中 变量:在程序运行中其值可以改变的量。 常量:在程序运行中其值不可以改变的量。 变量与常量命名规则: 必须以字母或汉字开头,由字母、汉字,数字或下划线组成,长度小于等于255个字符。 不能使用VB中的关键字。 VB中不区分变量名的大小写。 为了增加程序的可读性,可在变量名前加一个缩写的前缀来表明该变量的数据类型。
变量声明:使用变量前,一般须先声明变量名和其类型,以决定系统为它分配的存储单元。 用Dim语句显式声明变量 Dim 变量名 [AS 类型/类型符] 一条Dim语句可以同时定义多个变量,但每个变量必须有自己的类型声明。 eg: Dim intx As integer ,inty as integer, sngy As single 等价于 Dim intx%, inty%, sngy! 若 Dim intx, inty as integer, dblp2 as double 则 intx为变体型变量 字符型变量,声明方法有两种: Dim 字符串变量名 As String Dim 字符串变量名 As String*字符数 eg: Dim strs1 As String Dim strs2 As String*50 除了用Dim语句声明变量外,还可以用Static,Private,Public等,各关键字声明变量作用域不同。
隐式声明 变量未进行声明而直接使用,即隐式声明。其类型为 Variant 类型。 注意: 在通用声明处加 Option Explicit 语句可强制显式声明变量。 在VB菜单中,选工具--选项--编辑器(要求变量声明)
常量 常量有两类:一类是用户声明常量 ,一类是系统提供的常量。 用户声明常量 格式:Const 常量名 〔As类型/类型符〕=表达式 其中: 表达式:可以是数值常数,字符串常数及运算符组成的表达式。 字符串常数:"Hello!” 数值常数:十进制数: 1, 2.5, -456.37, 2.36E14 十六进制数:&HB4 八进制数: &O150 eg: Const MAX as Integer = &O144 Const CompanyName =“沈阳理工大学” Const Counts# =45.67
查看内部常量方法: 视图→对象浏览器 对象库中列出了vb的常量。 eg:窗口状态属性WindowsState可以接受下列常量: 系统提供的常量 VB内部已定义,可以直接使用的常量。 查看内部常量方法: 视图→对象浏览器 对象库中列出了vb的常量。 eg:窗口状态属性WindowsState可以接受下列常量: Form1. WindowsState= vbMinimized 等价于 Form1. WindowsState=1 通过系统常量的使用,可以使程序变得易于阅读和编写。 常量 值 描述 vbNormal 正常 vbMinimized 1 最小化 vbmaximized 2 最大化
3.4 运算符和表达式 运算符 和其他语言一样,VB中也具有丰富的运算符,通过运算符和操作数组合成表达式,实现程序编制中所需的大量操作。
算术运算符 Ia=3 注意:算术运算符两边的操作数应是数值型,若是数字字符或逻辑型,则自动转换成数值类型后再运算。 eg :30-True 结果是31,逻辑量True转为数值-1 False转为数值0 False + 10 + "4" 结果是14
字符串运算符有两个:& 、+ 功能是将字符串连接起来 区别: 字符串运算符有两个:& 、+ 功能是将字符串连接起来 区别: + 两旁的操作数应均为字符型;若均为数值型则进行算术加运算;若一个为字符型,另一个为数值型,则出错。 & 两旁的操作数不管是字符型还是数值型,先转换成字符型后再连接。 eg: 操作 结果 "abc" & 123 "abc123 " "abc" + 123 出错 “123” & 456 “123456” “123”+“456” "123456"
关系运算符 关系运算符是将两个操作数进行大小比较,若关系成立,则返回True,否则返回False。操作数可以是数值型、字符型。 比较时注意以下原则: 如果两个操作数是数值型,则按其大小比较。 如果两个操作数是字符型,则按字符的ASCII码值从左到右一一比较。 关系运算符优先级相同。 运算符 含义 表达式例子 = 等于 “ABC”=“ABD” F <> 或 >< 不等于 “AB”<>”ab” T < 小于 23<5 F > 大于 “ABC”>”ABR” F <= 小于或等于 “23”<=“3” T >= 大于或等于 “bc”>=“abc” T Like 字符串匹配 ”ABCDE”LIKE”*C*” T Is 比较对象变量
逻辑运算符作用是将操作数进行逻辑运算,结果是逻辑值True或False。 Not : 取反 当操作数为假时,结果为真。 And: 与 两个操作数均为真时,结果为真。 Or : 或 两个操作数有一个为真时,结果为真。 Xor : 异或 两个操作数为一真一假时,结果为真。 Eqv : 等价 两个操作数相同时,结果为真。 Imp : 蕴含 第一个操作数为真,第二个操作数为假时,结果为假,其余结果都为真。 X Y NOT X X AND Y X OR Y X XOR Y X EQV Y X IMP Y T F
表达式 组成 由变量、常量、函数、运算符和圆括号共同组成。 书写规则 (1) 运算符不能相邻。例a+ -b是错误的。 (2) 乘号不能省略。例x 乘以y 应写成:x*y (3) 括号必须成对出现,均使用圆括号。 (4) 表达式从左到右在同一基准上书写,无高低、大小。 不同数据类型的转换 运算结果的数据类型采用精度高的数据类型. Integer<Long<Single<Double<Currency 优先级 算术运算符>字符运算符>关系运算符>逻辑运算符
3.5 常用内部函数 调用方法: 函数名(参数列表) 有参函数 函数名 无参函数 说明: (1)使用库函数要注意参数的个数及其参数的数据类型 3.5 常用内部函数 VB提供了上百种内部函数(库函数),供编程时调用 调用方法: 函数名(参数列表) 有参函数 函数名 无参函数 说明: (1)使用库函数要注意参数的个数及其参数的数据类型 (2)要注意函数的定义域(自变量或参数的取值范围) (3)要注意函数的值域。
数学函数 -4 3 Int(-3.5) Int(3.5) 取小于或等于 N的最大整数 Int(N) 2.3 Log(10) 自然对数 Log(N) -3 Fix(-3.5) Fix(3.9) 取整 Fix(N) 20.086 Exp(3) ex Exp(N) 1 Cos(0) 余弦函数 Cos(N) 3.5 Abs(-3.5) 取绝对值 Abs(N) 结果 实例 含义 函数名
Tan(0) 正切函数 Tan(N) 3 Sqr(9) 平方根 Sqr(N) Sgn(-3.5) 符号函数 Sgn(N) Sin(0) Tan(0) 正切函数 Tan(N) 3 Sqr(9) 平方根 Sqr(N) -1 Sgn(-3.5) 符号函数 Sgn(N) Sin(0) 正弦函数 Sin(N) -4 4 Round(-3.5) Round(3.5) 四舍五入取整 Round(N) [0,1)之间的数 Rnd 产生随机数 Rnd[(N)] 结果 实例 含义 函数名
说明: (1) 在三角函数中的自变量是以弧度为单位。 如:sin30°→ sin(π/180*30) (2) Rnd函数返回0 ~ 1(包括0和不包括1)之间的双精度随机数。 产生a~b的之间的随机整数: Int(Rnd *(b-a+1)+a)。如要产生[30,50]之间的随机整数,可用下面表达式: Int(Rnd*21+30) 若要产生1-100的随机整数: Int(Rnd *100)+1
2. 数学函数 "ABC" Ucase$("abc") 小写字母转为大写字母 Ucase$(C) "144" Oct$(100) 十进制转换成八进制 Oct[$](N) "123.45" Str$(123.45) 数值转换为字符串 Str$(N) 123 Val("123AB") 数字字符串转换为数值 Val(C) "abc" Lcase$("ABC") 大写字母转为小写字母 Lcase$(C) 64 Hex(100) 十进制转换成十六进制 Hex(N) "A" Chr$(65) ASCII码值转换成字符 Chr$(N) 2003-11-13 CDate("2003/11/13") 转换成日期型 CDate 65 Asc("A") 字符转换成ASCII码值 Asc(C) 结果 实例 功能 函数名
(1) Chr和Asc函数互为反函数。 (2) Val将数字字符串转换为数值类型 Val("abc123") 值为:0, Val("1.2sa10") 值为1.2 注意: Val( )函数只将最前面的数字字符转换为数值。 例如:Val("-123.45ty3")结果为-123.45。 (3) Asc(“Abcd”) 值为: 65 (只取首字母的Ascii值) 说明: 要区别两个取整函数Int()和Fix() Fix(N)为截断取整,即去掉小数后的数。 Int(N)不大于N的最大整数。 例如: Fix(9.59) =9, Int(9.59) =9 Fix(-9.59) =-9, Int(-9.59) =-10
3、字符串函数 "BCD" Mid("ABCDE",2,3) 取字符子串 Mid(C,N1[,N2]) "ABCD" LTrim("ABCD") 去掉字符串左边空格 LTrim(C) "A3AB3" Replace("ACDABCD","CD","3") 用C2替代C1 Replace(C,C1,C2) 8 LenB("AB教育") 字符串所占的字节数 LenB(C) 4 Len("AB教育") 字符串长度 Len(C) "ABC" Left("ABCDE",3) 取字符串左边n个字符 Left(C,N) "123abc" A=Array("123","ab","c") :Join(A,"") 将数组A各元素连接成字符串变量 Join(A[,D]) 7 InStr(2,"EFABCDEFG","EF") 从n开始,在C1中找C2 InStr([N,]C1,C2[,M]) 结果 实例 说明 函数名
"ABCD" TRim(“ABCD") 去掉字符串两边的空格 TRim(C) "DCBA" StrReverse("ABCD") 将字符串反序 StrReverse(C) "AAA" String(3,"ABC") 重复首字符n次 String(N,C) S(0)="123" S(1)=“ab" S=Split("123,ab",",") 将字符串分隔成字符数组。与Join作用相反 Split(C[,D]) “" Space(3) 产生n个空格的字符串 Space(N) RTrim("ABCD") 去掉字符串右边空格 RTrim(C) “BCD" Right("ABCD",3) 取字符串右边n个字符 Right(C,N) 结果 实例 说明 函数名
说明: 如果返回是字符型,则函数后有“$”字符。当然一般也可以不写,习惯都写上。 例如: len("This is a book!") 15 Left$("ABCDEFG",3) "ABC" Mid$("ABCDEFG",2,3) "BCD" InStr(2, “ABCDEFGEF”, “EF”) 5(第一次出现的位置)
4、日期函数 Second(#1:12:56PM#) 返回秒(0~59) Second(C|N) Time 返回系统时间 Time[()] Year(365) 返回年代号(1753~2078) Year(C|N) Now 返回系统日期和时间 Month("2003,05,01") 返回月份代号(1~12) Month(C|N) Minute(#1:12:56PM#) 返回分钟(0~59) Minute(C|N) Hour(#1:12:56PM#) 返回小时(0~24) Hour(C|N) Day("2003,05,01") 返回日期代号(1~31) Day(C|N) Date 返回系统日期 Date[()] 实例 说明 函数名
5、Format函数 形式: Format (表达式[, "格式字符串"]) 功能:按用户指定格式返回表达式,常常用在Print方法中。 使用形式:Print Format$(表达式[,“格式字符串”]) 表达式:可以是数值、日期或字符串型表达式。 格式字符串:表示输出表达式时采用的输出格式。不同数据类型所采用的格式字符串是不同的。
6、 Shell函数 Shell函数可调用各种应用程序。格式如下: Shell(命令字符串[,窗口类型]) 其中: 命令字符串:要执行的应用程序名,包括路径,它必须是可执行文件(扩展名为.com、.exe、.bat)。 窗口类型:表示执行应用程序的窗口大小,0~4,6的整型数值,一般取1,表示正常正常窗口状态。 函数成功调用的返回值为一个任务标识ID,它是运行程序的惟一标识,若不成功,则会返回0。 提示:如果不知道应用程序的路径名,可用Start命令启动程序 例 i = Shell(start & "calc.exe")
3.6基本语句 赋值语句 是最基本的语句,作用是把右边表达式的值赋给左边的变量。VB使用赋值号“=”来赋值。 形式:[LET]变量名=表达式 其中: LET: 通常省略 表达式:其类型应与变量名的类型一致,即同为字符型或数值型。同为数值型精度不同时,强制转换成左侧精度。 eg:sngrate!=0.1 ‘给单精度型变量sngrate‘赋值。 Text1.text=“Visual Basic” ‘为文本框text属性赋值。
与用户交互函数和过程 VB与用户的直接交互是通过InputBox函数MsgBox函数和MsgBox过程进行的。 InputBox函数 功能:打开一个对话框,等待用户输入正文或按下按钮,当用户单击“确定”按钮后,函数返回文本框内输入的字符串。
格式: InputBox (提示 [,标题] [,缺省] [,x坐标位置,y坐标位置]) 参数: 提示( Prompt):必需的。为字符串表达式,最大长度1024 个字符,如果 prompt 包含多个行,则可在各行之间用回车符 (Chr(13))和换行符 (Chr(10)) 或来分隔。 标题(Title):可选的。对话框标题栏中的字符串表达式。如省略 ,则把应用程序名放入标题栏中。 缺省值(Default):可选的。显示在文本框中的字符串表达式,在没有其它输入时作为缺省值。如果省略 default,则文本框为空。 X坐标(xpos):可选的。数值表达式,成对出现,指定对话框的左边与屏幕左边的水平距离。如果省略 xpos,则对话框会在水平方向居中。 Y坐标(ypos):可选的。数值表达式,成对出现,指定对话框的上边与屏幕上边的距离。如果省略 ypos,则对话框被放置在屏幕垂直方向距下边大约三分之一的位置。
MsgBox函数和MsgBox过程 功能:打开 一个信息框,等待用户选择一个按钮,函数返回值为单击按钮的整数值。 格式:变量〔%〕=MsgBox(提示[, 按钮] [, 标题]) MsgBox过程与MsgBox函数的功能和参数完全相同,但没有函数返回值,适用于一些不需要返回值的消息框。格式为:MsgBox(提示[, 按钮] [, 标题])
参数 : 提示(Prompt):必需的。字符串表达式,作为显示在对话框中的消息。prompt 的最大长度大约为 1024 个字符,内容超过一行,可以用回车符 (Chr(13))和换行符 (Chr(10)) 将各行分隔开来。 按钮(Buttons):可选的。为数值表达式,是值的总和,决定显示按钮的数目及形式,使用的图标样式,缺省按钮是什么以及消息框的强制回应等。如果省略,则 buttons 的缺省值为 0。 标题(Title):可选的。在对话框标题栏中显示的字符串表达式。如果省略 title,则将应用程序名放在标题栏中。
它是由以下4组数组成,每组之中取一个数,将4个数相加得来的。 Buttons的值 它是由以下4组数组成,每组之中取一个数,将4个数相加得来的。 组1 按钮数目 内部常数 值 描述 vbOKOnly 只显示 “确定 ”按钮 VbOKCancel 1 显示 “确定 ” 及 “取消” 按钮 VbAbortRetryIgnore 2 显示 “终止”、“重试” 及 “忽略” 按钮 VbYesNoCancel 3 显示 “是”、“否” 及 “取消” 按钮 VbYesNo 4 显示 “是”及 “否” 按钮 VbRetryCancel 5 显示 “重试”及 “取消” 按钮
组2 图标类型 常数 值 描述 VbCritical 16 显示 关键信息 图标 VbQuestion 32 显示 询问信息 图标 VbExclamation 48 显示 警告信息 图标 VbInformation 64 显示 信息 图标
组3 缺省按钮 常数 值 描述 vbDefaultButton1 第一个按钮是缺省值 vbDefaultButton2 256 第二个按钮是缺省值 vbDefaultButton3 512 第三个按钮是缺省值
组4 强制回应模式 常数 值 描述 vbApplicationModal 组4 强制回应模式 常数 值 描述 vbApplicationModal 应用程序强制返回;应用程序一直被挂起,直到用户对消息框作出响应才继续工作 vbSystemModal 4096 系统强制返回;全部应用程序都被挂起,直到用户对消息框作出响应才继续工作
MsgBox函数返回所选按钮整数值 常数 值 所选按钮 vbOK 1 确定 VbCancel 2 取消 VbAbort 3 终止 vbRetry 4 重试 vbIgnore 5 忽略 VbYes 6 是 VbNo 7 否
例:试验Msgbox的功能 程序要求:在屏幕上开辟一个对话框,对话框的下部有三个按钮,其中左边按钮中标有“终止”,中间按钮中标有“重试”,右边按钮中标有“忽略”。对话框内提示语为“Are you continue to?”,对话框标题“功能测试”,显示“?”图标,并把第一个按钮作为默认活动按钮。输出函数的返回值,单击终止,打印返回值3;单击重试,打印返回值4;单击忽略,打印返回值5。
选择结构 选择结构:就是对条件进行判断,根据判断结果,选择执行不同的分支。 VB中提供了多种形式的条件语句来实现选择结构,主要包括If条件语句、Select case语句以及IIf函数。
If条件语句 If条件语句有四种格式:单分支结构,双分支结构,多分支结构和嵌套。 单分支结构条件语句 格式: If 条件 Then 语句块 End If If 条件 Then 语句 其中:条件为表达式,表达式值按非零值为True,零为False进行判断。 语句块可以是一句或多句语句。 语句可以是一句或用冒号分隔的多句语句 。 功能: 如果条件为真,则执行语句块(语句),然后执行If语句的下一条语句;如果条件为假,则直接执行If语句的下一条语句。
x y t 例:已知两个数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 将存放在两个变量中的数进行交换,必须借助于第三个变量。 x y t 1 3 2
双分支结构条件语句 格式: If 条件 Then 语句块1 Else 语句块2 End If If 条件 Then 语句1 Else 语句2 功能: 如果条件为真,则执行语句块1(语句1),否则执行else后面的语句块2 (语句2)。
例1: 双分支语句: If a/3 = int(a/3) Then Print “a能被3整除” Else Print “a不能被3整除” 等同于两条单分支语句: If a/3=int(a/3) Then Print "a能被3整除" If a/3<>int(a/3) Then Print “a不能被3整除"
例2: 输入三个数a , b , c ,输出三者之中最大者。 分析:问题可以描述为 (1)输入三个数值; (2)从中找出最大值; (3)输出结果。 算法设计 (1)用InputBox函数把三个数值输入到变量a , b , c 中; (2)首先假设a最大,放在变量max中,然后分别与b,c进行比较,保留其中最大的数在变量max中; (3)用Print方法输出max的值。
代码如下: a = val(InputBox(“请输入第 1 个数:”)) b =val(InputBox("请输入第 2 个数:")) Dim a!, b!, c!, max As Single a = val(InputBox(“请输入第 1 个数:”)) b =val(InputBox("请输入第 2 个数:")) c = val(InputBox("请输入第 3 个数:")) max = a If b > max Then max = b If c > max Then max = c Print Print a; “、”; b; “ 与 ”; c; “ 之中最大值是:” Print max
例3 : 输入系数 a,b ,编程序解方程ax + b = 0。 分析: 当a≠0时,x = –b/a ; 当a = 0,b≠0时,方程无解。 因为用0作除数会产生溢 出的运行错误,所以在计算x 的值之前,要先判断a是否为0。
代码如下: Private Sub Command1_Click() Dim a!, b!, x As Single a = Val(InputBox(“请输入系数a:” b = Val(InputBox(“请输入系数b:”) ) If a <> 0 Then x = -b / a : Print "x = "; x Else Print "方程无解!" End Sub
多分支结构条件语句 格式: If 条件1 Then 语句块1 [ElseIf 条件2 Then 语句块2 ElseIf 条件3 Then 语句块3] ...... [Else 语句块n+1] End If 功能: 如果条件1为真,执行语句块1;条件1为假,测试条件2,如果条件2为真,执行语句块2;一直这样执行下去,如都为假,则执行语句块n+1。其中,不管有多少分支,执行了一个分支后,其余不再执行。
例4: 如果成绩大于100,显示“成绩错误”;在90-100之间,显示“成绩优秀”;80-89之间,显示“成绩良好”;60-79之间,显示“及格”;0-59之间,显示“不及格”。 Private Sub Form1_Click() Dim iGrade As Integer iGrade = Val(InputBox("请输入成绩:")) If iGrade > 100 Then Print "成绩错误" ElseIf iGrade >= 90 Then Print "成绩优秀" ElseIf iGrade >= 80 Then Print "成绩良好" ElseIf iGrade >= 60 Then Print "及格" Else Print "不及格" End If End Sub
If语句的嵌套 是指If或Else后面的语句块中又包含If语句。 格式: If<条件1> Then If <条件2> Then …. End If 其中,为了增加程序的可读性,书写时采用锯齿型;If语句的形式若不在一行上书写,必须与End If配对,多个End If与它最接近的End If配对。
例5: 编一帐号和密码输入的校验程序。对输入的帐号和密码规定如下: 帐号不能超过6位数字,密码为4位字符。 “gong” 密码输入时屏幕显示“*”。 当帐号及密码输入不正确时,显示下图相关信息,若选择“重试”,则清除原输入的内容,若选择“取消”,结束程序,焦点定位在原输入的文本框。
控件属性设置: 默认控件名 Name属性 Caption属性 其他属性 label1 lblno 帐号 label2 lblpas 密码 Text1 txtno Maxlength=6 text2 txtpas Maxlength=4 Passwordchar=“*” command1 cmdok 确定
代码如下: Private Sub Txtno_LostFocus() If Not IsNumeric(Txtno) Then MsgBox “账号有非数字字符”, vbExclamation, “输入账号” Txtno.text=“” Txtno.SetFocus End If End Sub Private Sub Form_Load() Txtpas.Text = ""
Private Sub Cmdok_Click( ) If Txtpas.Text = "gong" Then MsgBox "输入正确" Else i = MsgBox(“密码错误”, 5 + vbExclamation, “输入密码”) If i <> 4 Then End Txtpas.Text = "" Txtpas.SetFocus End If End Sub
select case 语句(情况语句) 格式: Select Case 变量或表达式 Case 表达式列表1 语句块1 语句块2 ... Case 表达式列表n 语句块n [Case Else 语句块n+1] End Select 功能: 计算表达式的值,如果表达式的值和Case项中的值相等,则执行相应的语句体。执行完语句体后,执行End Select。如果没有合适的项,执行Case Else后面跟的语句体。 当条件范围重叠时, 即表达式的结果两个case都符合,只执行位置在前面的case里的命令
其中:“变量或表达式”可以是数值型或字符串表达式,“表达式列表”的类型必须与其相同,可以是如下形式: 例如: Case 1 ‘与一个值比较 表达式[,表达式],... 例如:Case “讲师”,“副教授”,“教授” 表达式1 To 表达式2 表达式1的值必须<表达式2的值,值可以是字符串。 例如:Case 60 To 100 Case “a” To “z” ‘与一个范围比较 Is 关系运算表达式 用于对象变量引用比较。 Is后面必须跟关系运算符,且只用一次Is 例如:Case 2,4,6,8,Is>10
Select case语句是IF多分支语句的另一种形式 例:在变量strc中存放一个字符,判断其是字母,数字,还是其他字符。 If strc>=“a” And strc<=“z” Or strc>=“A” And strc<=“Z” Then Print strc + “is alpha character” Elseif strc>=“0” And strc<=“9” Then Print strc+ “is numeral character” Else Print strc+”other character” End if Select case strc Case “a” to “z” , “A” to “Z” Case “0” to “9” Case else Print strc+“other character” End select
例6:某商场为了促销,采用购物打折的优惠办法,每位顾客一次购物 (1)1000元以上,按九五折优惠 (2)2000元以上,按九折优惠 (3)3000元以上,按八五折优惠 (4)5000元以上,按八折优惠 编写程序,输入购物款数,计算并输出优惠价。
IIf函数(条件函数) 格式:IIf(条件,表达式1,表达式2) 功能:如果条件为True,返回表达式1的值,为False返回表达式2的值。 例: 如果成绩>=60,给变量赋值“及格”,否则赋值“不及格”。 strMsg = IIf (iGrade>=60,"及格","不及格") 例: 求x,y中大的数。放入变量T中。 T=IIf(x>y, x, y)
循环结构 为了解决某一问题,或求取某一计算结果,程序中往往反复地按某一模式进行操作,即在指定条件下多次重复执行一组语句,即循环。VB提供了多种形式的循环结构,如For循环语句,DO…LOOP循环语句等。
For循环语句 格式: For 循环变量=初值 To 终值 [Step 步长] [循环体] [Exit For] Next 循环变量 其中:循环变量:必须为数值型。 步长:一般为正,初值小于终值 ;若为负,初值大于终值 。缺省步长为1。 循环体:可以是一句或多句语句。 Exit For:遇到该语句时,退出循环,执行Next的下一句语句。 功能:用于控制循环次数已知的循环结构。
For循环执行过程: 第一步:循环变量被赋初值,仅被赋值一次。 第二步:判断循环变量是否在终值内; 如果是,运行循环体;否,结束循环,转到Next的下一句运行。 第三步:运行到Next语句,循环变量=循环变量+步长。 转到第二步开始 处继续循环。(循环一次完成)
For循环流程图 步长 < 0 步长 > 0 如步长为零时,循环变量值不变,因此循环体内如果无Exit For 语句,则进入死循环。在设计时运行程序进入死循环可以使用Ctrl+Break,终止程序执行。
例7:求N!(N为自然数),n值从键盘输入。 由阶乘的定义可知: N! = 1 * 2 * …… * ( N – 2 ) * ( N – 1 ) * N = ( N – 1 )! * N 也就是说,一个自然数的阶乘,等于该自然数与前一个自然数阶乘的乘积,即从1开始连续地乘下一个自然数,直到N为止。
Do…Loop循环语句 Do…Loop循环语句用于控制循环次数未知的循环结构。有两种语法形式。形式1:先判断后执行条件形式,形式2:先执行后判断条件形式。
形式1: 先判断后执行格式 Do {While|Until}< 条件> 语句块 [Exit Do] Loop 其中: 1)循环体有可能一次也不执行。 2) 关键字While用于指明条件为真( True )时执行循环体中的语句块。Until指明条件为假( False )时执行循环体中的语句块。 3) Exit Do 表示遇到该语句时,退出循环,执行Loop下一句的语句。
Do While…Loop循环 Do Until…Loop循环 流程图 Do While…Loop循环 Do Until…Loop循环
形式2: 先执行后判断条件形式 Do 语句块 [Exit Do] Loop {While|Until}< 条件> 先执行后判断条件形式的Do…Loop语句与形式1的区别是首先执行循环体,然后测试循环条件,决定是否继续循环。所以,这种结构的语句至少执行一次循环体。
流程图
例8:用辗转相除法求两自然数m,n的最大公约数和最小公倍数。 算法分析: 对于m和n,使m>n; M除以n得余数r; 若r=0,则n为求得的最大公约数,结束。否则执行④ 将n赋值给m,r赋值给n,再重复执行② 求得最大公约数之后,最小公倍数等于原两数乘积除以最大公约数。
循环的嵌套: '正确的嵌套方式 ‘错误的嵌套方式 在一个循环体内又包含了一个完整的循环结构称为循环的嵌套。循环嵌套使用时,循环变量必须使用不同的变量名,而且不可以书写交叉的For循环语句。 '正确的嵌套方式 For i=1 To 9 For j=1 to 9 Print i,j Next j Next i ‘错误的嵌套方式 For i=1 To 9 For j=1 to 9 Print i,j Next i Next j
其他辅助控制语句 GOTO语句 格式:GoTo 标号|行号 功能:是无条件转向标号或行号指定的那行语句。 其中: 标号、行号:标号是一个以冒号结尾的标识符;行号是一个整形数,不以冒号结尾。标号和行号,在程序中必须存在,且是唯一的。 注意:GoTo语句容易破坏程序的结构,强烈不建议使用
End 语句 功能:用于结束一个程序的运行。 With 语句 格式: With 对象 语句块 End with 功能:可以对某个对象执行一系列的语句,而不用重复指出对象的名称。 例:with mylabel .height=2000 .width=2000 .fontsize=20 .caption=“this is mylabel” end with 其中: 当程序进入with语句块,对象就不能改变 ,因此不能用一个with语句来设置多个不同的对象。 属性前面的“.”不能省。
3.6数组 数组的概念 静态数组与动态数组 数组的基本操作
数组的概念 在实际处理数据时,经常需要处理大批量同类型数据,为此,我们引入了数组。数组不是一种数据类型,而是一组相同类型的变量的集合。 在计算机内存中,数组占据了一块连续的存储区域,数组名就是这块空间的名称。区域中每个单元都有自己的地址,该地址用下标表示,表示数组中的各个元素。数组应该先定义后使用,定义数组的目的是通知计算机为其留出所需的存储空间。 一个数组名代表一批数据
静态数组与动态数组 数组的划分: 我们按内存开辟空间的时机来划分数组,在声明时确定大小的数组称为静态数组,声明时未确定大小的数组称作动态数组。静态数组的大小一经定义,就不可改变,动态数组的大小在运行时可以改变。
在声明时已经确定了大小的数组称为静态数组。 一维数组 静态数组及声明 在声明时已经确定了大小的数组称为静态数组。 一维数组 声明一维数组形式如下: Dim 数组名(下标) [ As 类型] 其中: 下标:必须为常数,不可以为表达式或变量。 下标的形式:[下界 TO] 上界,省略下界,其默认值为0。 数组的大小:上界-下界+1 As 类型:如果缺省,是变体数组。 例如:Dim mark(1 to 100)As Integer 声明了一个一维数组,数组名为mark,类型为整型,下标范围为1 to 100,数组各元素是mark(1), mark(2),… mark(100)
多维数组 声明多维数组形式如下: Dim 数组名(下标1[,下标2,…]) [ As 类型] 其中: 下标个数:决定了数组的维数,最多允许有60维。 数组的大小:为每一维的大小的乘积。 例1:Dim array1(0 to 3,0 to 4)as long 或 Dim array1(3,4)as long 声明一个长整型的二维数组array1,(往往称为4行5列的数组)第一维的下标范围为0-3,第二维的下标范围为0-4,数组的大小为4*5=20 例2:Dim a(1,2,3)as Integer 声明一个整型的三维数组a,第一维的下标范围为0-1,第二维的下标范围为0-2,第三维的下标范围为0-3,数组的大小为2*3*4=24 例3:Dim a1(3,4)as Integer, a2(4,5)as Integer 声明两个整型的二维数组a1, a2 当希望数组下标从1开始时,可以使用Option Base 1命令来设置(此命令的Option Base 0为默认情况)。
动态数组及声明 在声明时未确定数组的大小(括号内为空),当要使用时随时用Redim语句重新指出数组的大小的称为动态数组。 建立动态数组的方法: 使用Dim、Private、Public语句声明括号内为空的数组。 形式如下: Dim 数组名( ) [ As 类型] 然后在过程中用ReDim语句指出数组大小。 ReDim语句形式如下: ReDim 数组名(下标1[,下标2…]) 例1: Dim sarray() as single Sub Form-Load() … Redim sarray(4,8) End sub 声明了动态数组sarray,在Form-Load()事件中重新指明二维数组的大小为5行9列。
注意: 在静态数组声明中的下标只能是常量,在动态数组redim语句中的下标可以是常量,也可以是有了明确值的变量。 在过程中可以多次使用ReDim语句改变数组大小和维数。 每次使用ReDim语句都会使原来数组中的值丢失,可以在ReDim语句后加Preserve参数来保留数组中的数据,但使用Preserve只能改变最后一维的大小,前面几维大小不能改变。 例2:Redim语句和Preserve语句的使用。 Dim a() as Integer Private sub Form-Click … Redim a(3,2) Redim Preserve a(3,4) End sub
数组的基本操作 数组元素的引用 定义了数组之后就可以使用数组了,具体操作时是针对每个数组元素进行的,使用时必须将数组元素的具体下标写清楚。 例: Option Base 1 '要求声明的数组元素下标从1开始 Dim a(5) '声明了一个数组a,它有5个元素 a(1)=78 '将a数组中下标为1的元素内容赋值78 a(5)=56 '将a数组中下标为5的元素内容赋值56 Print a(5) ‘打印a数组下标为5的元素的内容
给数组元素赋初值 在使用数组时,需要将一批数据放入数组元素中,赋值方法为 利用循环结构 For i=1 to 10 a(i)=0 Next i 使用Array函数直接将数组元素的赋值在一条命令中完成。 例:WeekDay=Array("Mon","Tue","Wed","Thu","Fri","Sat","Sun") 使用Array函数创建了一个数组,将数组赋值给WeekDay变量,而未经过声明的变量WeekDay此时经过赋值成为一个数组变量。 例:a=Array(1,2,3,4,5) Array函数说明: 数组元素值是一个用逗号隔开的值表,这些值用于给数组的各元素赋值。 声明的数组其类型只可以是变体型 。 此函数只用于一维数组。
数组元素的输入 可以通过文本控件输入,也可以通过Inputbox函数输入。 For i=0 to 3 For j=0 to 4 a(i,j)= Inputbox( “输入”& i & “,” & j &“的值” ) Next j Next i
数组元素的输出 可以使用for循环语句结合print方法实现数组元素的输出。 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
求数组中最大元素和所在下标及各元素之和 Dim a(1 to 10) as integer Dim max as integer,Imax as integer,sum as integer 。。。。 Max=a(1) Imax=1 Sum=a(1) For i=2 to 10 Sum=sum+a(i) If a(i)> max then max=a(i) Imax=i END if Next i
交换数组中各元素 例: 定义10个整数,并放入一个一维数组中,将数组中第一个元素与最后一个交换,第二个与倒数第二个交换…,即第1元素与第10元素互换,第2元素与第9元素互换…分别输出数组原来各元素的值和对换后各元素的值。
Option Base 1 Private Sub Form_Click() Dim i as Integer, t as Integer arr = Array(1, 3, 5, 7, 9, 2, 4, 6, 8, 10) Print "原来数组:" For i = 1 To 10 Print arr(i); Next i Print For i = 1 To 5 t = arr(i) arr(i) = arr(10-i+1) arr(10-i+1)= t Print "对换后的数组" End Sub