第 四 讲
基本课题:运算符和表达式、常用内部函数
授课日期 |
2004.9.9 |
2004.9.9 |
授课班级 |
03级计算机5、6班 |
03级计算机7、8班 |
教 学 目 的 与 要 求:
本讲主要介绍VB编程语言的基本知识,通过学习要求同学们能在VB中进行各种运算、能计算表达式的结果,学会怎样使用函数。
教 学 的 重 点、难 点:
重点:运算符的使用、表达式的计算、常用内部函数
对 教 材 的 处 理 和 意 见:
以教材为主,联系实际情况及时做补充。
2.2运算符和表达式
程序中对数据的基本运算是依靠运算符实现的。在VB中运算符的类型有赋值运算符、算术运算符、比较运算符、连接运算符、逻辑运算符。
表达式:通过常量、变量、运算符、函数等的组合而构成的式子。
2.2.1 赋值运算符
说明:VB中的赋值运算符“=”用来给变量、数组或对象的属性赋值,即把赋值运算符右边的内容(包括常量、变量,函数返回值或对象的属性的表达式的值)赋给运算符左边的变量或属性。
语法格式:<变量名> = <表达式>
其中:<变量名>可以是变量、数组的元素或运行时可改变的对象的属性。
<表达式>可以是常数、常量、变量、表达式或函数调用,但必须有确定的值。
如:Value = 10 ‘把数值赋给变量Value
Value = Sin(3.14/4)‘把函数Sin(3.14/4)的结果赋给Value
StringName = “LiLi”‘把字符串赋给StringName
Nam = Form1.Caption‘把窗体的Caption属性值赋给Name
注意:赋值号左边必须是变量名或对象的属性名,不能是数值、常量和表达式
赋值时,赋值号两端的数据类型应该匹配,不匹配时应进行适当地转换(转换函数)。
2.2.2 算术运算符
算术运算符按优先级的先后顺序排列为
乘幂(^)、取负(-)、乘(*)、除(/)、整除(\)、取模(Mod)、加(+)、减(-)
注意:-1取负结果是-1
除法:结果是实数
整除和取模:如果运算对象为实数,则先将其转换成最近的整数,再计算,其结果为整数。转换时0.5 à 0;以后的数将进行4舍5入。
例如:
5.5\2.4 à 6\2=3
0.5\1 à 0\1=0
0.6\1 à 1
1.5\1 à 2
2.2.3 关系运算符
关系运算符没有优先级的问题
运算符 |
名称 |
例子 |
说明 |
< |
小于 |
“12”< 56 |
值为True,强制转换为数值型 |
<= |
小于或等于 |
5 <= 5 |
值为True |
> |
大于 |
1 > (2 > 1) |
值为True,强制转换为数值型 |
>= |
大于或等于 |
“aa” > =”ab” |
值为False |
= |
等于 |
1 = True |
值为False,强制转换为数值型 |
<> |
不等于 |
“abc”<>“ABC” |
值为True |
例如:
3>x>1 :先比较3>x,然后将其值作为一个数值(True为-1、False为0)再与1作比较
2.2.4 逻辑运算符
运算符按优先级的先后顺序排列为
取反(Not)、逻辑与(And)、逻辑或(Or)、逻辑异或(Xor)、逻辑相符(Eqv)、逻辑隐含(Imp)
A |
B |
Not A |
A And B |
A Or B |
A Xor B |
A Equ B |
A Imp B |
True |
True |
False |
True |
True |
False |
True |
True |
True |
False |
False |
False |
True |
True |
False |
False |
False |
True |
True |
False |
True |
True |
False |
True |
False |
False |
True |
False |
False |
False |
True |
True |
逻辑与:全真出真
逻辑或:全假出假
逻辑异或:操作数相反时,结果为真
逻辑相符:操作数相同时,结果为真
逻辑隐含:当第一个操作数为真时,第二个操作数为假时,结果才为假,其余结果均为真。
例如:
True Xor False;True Eqv False;False Imp True
说明:
逻辑运算符两侧若有数值数据出现,则将数值数据转换为二进制(补码形式)进行按位运算。此时1为真,0为假。
2.2.5 字符串连接运算符
字符串连接运算符是指把两个字符串首尾相连拼接在一起形成一个新的字符串,运算符无优先级关系。
&和+
&运算符:当两个字符均为字符型时,其结果为字符型;当其中任意一个为数值型时,其结果为字符型变体。
如:“abc”&”123”=“abc123”“123”&456=“123456”(字符型变体)123&456=“123456” (字符型变体)
+运算符:当两个表达式都是字符串时按字符串连接,否则视具体情况会有不同结果。所以,最好用“&”进行字符串连接。
如:“123”+“456”=“123456”123+“456”=579
2.2.6 日期时间运算符
VB用8Byte存放日期时间型数据,存放形式类似于一个实数,它的整数部分表示日期,小数部分表示时间。
日期时间型数据A加上一个数值型数据B,则VB会将A的日期部分增加B的整数部分表示的天数计算出新日期;再把A的时间部分加上B的小数部分表示的时间计算出新的时间,新的日期与时间组合起来即运算的结果。减法的结果相反。
两个日期时间型数据做减法运算时其结果为一个数值,表示两个日期间隔天数
如:#1/1/2000# + 1‘结果为#1/2/2000#
#1/1/2000# - 1.5‘结果为#12/30/1999 12:00:00 PM#
#2/1/2000# - #1/3/2000#‘结果为29
#1/1/2000 12:00:00 PM# - #1/3/2000 6:00:00 AM#’结果为-1.75
日期时间值之间进行比较时,较晚的日期时间大于较早的日期时间
如:#1/1/2000# > #1/2/2000#‘结果为False
#1/1/2000 6:00:01 AM# > #1/1/2000 6:00:00 AM#‘结果为True
所有的运算符对运算量的类型都有要求,如果运算符不支持某种类型的数据,就会试图按隐式转换方式把它转换为支持的类型。如果转换不能成功,就会出现“类型不匹配“的错误。
如:
#1/1/2000# + True‘结果为#12/31/1999# ,把True转换为-1
2.2.7表达式
表达式由运算符、常量、变量及函数等构成,根据表达式的结果可将其分为:字符型表达式、算术型表达式、逻辑型表达式和日期型表达式。
1. 说明:
关系表达式:
(1)数值型数据按其大小进行比较。
(2)日期型数据将日期看成“yyyymmdd”的8位整数,按数值大小比较。
(3)字符型数据按其ASCII码值进行比较。在比较两个字符串时,首先比较两个字符串的第一个字符,其中ASCII码值较大的字符所在的字符串大。如果第一个字符相同,则比较第二个,……,以此类推。
常见字符值的大小如下:
“空格”< “0” < … < “9” < “A” < … < “Z” < “a” < … < “z” < “任何汉字”
(4)数学不等式2≤x≤3,在VB中不能写成2<=x<=3.
因为,x=5不满足2≤x≤3,但在VB中2<=x<=3却是真的。所以应写为2<=x And x<=3
2. 在包含各种运算的表达式中,各运算符的优先顺序规定如下:
(1)括号内运算
(2)函数运算
(3)算术运算、字符串连接运算和日期时间运算
(4)关系运算
(5)逻辑运算
3.表达式的写法
4.编写表达式与表达式的值
求下列表达式的值
逻辑运算符两侧若有数值数据出现,则将数值数据转换为二进制(补码形式)进行按位运算。此时,1为真,0为假。
(1)已知变量a=3,b=4,c=5,求下面表达式的值。
Not(a + b) + c -1 And b + c / 2‘结果为4
Not (3 + 4) + 5 –1 And 4 + 5 / 2
Not11And6.5
Not11And6
Not00001011And6
11110100And00000110
00000100
4
(2)表达式求值:-3 < -2 < -1‘结果为False
-3 < -2 < -1
True<-1
-1<-1
False
(3)已知变量a=3,b=4,c=5,求表达式a = b = c的值
a = b = c → 3 = 4 = 5 → False = 5 → False
(4)编制一个判断变量x的值是不是可以被3整除的奇数的逻辑型表达式。要求如果满足条件,表达式的值为True,否则为False。
X mod 3 = 0 and x mod 2 <> 0‘答案一
(X mod 3 = 0) and (x mod 2 <> 0) ‘答案二
X mod 2 = 1 and x mod 3 = 0‘答案三
5.运算过程中的溢出错误
当给一个数值型变量赋一个超出其表示范围的值时,会出现“溢出错误”。同样在表达式的运算过程中,当运算的中间结果超出变量的表示范围时,也会导致“溢出错误”。
例如:
dim int1 as integer,int2 as integer,sng1 as single
int1 = 20000:int2 = 20000
sng1 = int1 + int2 –10000‘“溢出”错误
把最后一个语句改为sng1 = int1 –10000 + int2‘不出错
练习:
写出下列表达式的值
150 Mod 40.5\200.9\3.215.3\4.6/289&12
“100”&250“100”+3503>9>1#05/05/1999# + 10
#01/21/2001# - #01/01/2001# And 20>10
3/2>3\2 Xor True4 Mod 3*10>2 Eqv False
True Imp 16 3<Y<910.5\2.4=6 Imp 18/3<>6
16 Mod 7>2 Eqv 16\7>2Not(3^2) Xor 3^2\4>6
注意:负数的补码计算方法:取其绝对值转化为二进制后取反,再加1。
2.3 常用内部函数 P61
2.3.1 数学函数
(1)Sin():求正弦值,其中参数的单位为弧度。
求30o的正弦值:Sin(30/180*3.1415926) → 1/2
(2)Cos():求余弦值,参数单位为弧度。Cos(0) → 1
(3)Tan():求正切值,常数单位为弧度。Tan(0) → 0
(4)Atn():求反正切值,结果的单位为弧度
Atn(3.1415926) → 1.26262725
(5)Log():求自然对数值。Log(10) → 2.3
建立计算以10为底的常用对数值的函数Lg(x)
Function Lg(x)
Lg=Log(x)/Log(10)
End Function
(6)Exp():求以e为底的指数值。Exp(3) → 20.086
(7)Sqr():求的平方根值。Sqr(9) → 3
(8)Abs():求绝对值。
(9)Hex():求参数的16进制形式。Hex(100) → 64
注:参数为小数时,采取四舍五入的方法变成整数,再转换成十六进制值。
(10)Oct():求参数的8进制形式。Oct(100) →144
注:参数为小数时,采取四舍五入的方法变成整数,再转换成八进制值。
(11)Sgn():符号函数。当参数为正时,值为1;参数为负时,值为-1;参数为0时,值为0。
Sgn(7*3+2) →1。
2.3.2 字符串函数
(1)Ltrim():去除字符串左边的空白部分。
Ltrim(“ABCD”) →“ABCD”
(2)Rtrim():去除字符串右边的空白部分。
Rtrim(“ABCD”) →“ABCD”
(3)Left(字符串,个数):取出字符串左边的一些字符。
Left(“Hello”,2) →“He”
(4)Right(字符串,个数):取出字符串右边的一些字符。
Right(“ABCDEF”,3) →“DEF”
(5)Mid(字符串,起始位置,个数):取出字符串中任意字符。
Mid(“ABCDEFG”,2,3) →“BCD”
注意:如果缺省个数,取出从起始位置开始后的所有字符。
例如:Dim s as string
s = mid(“从字符串中间取出一些字符”,2,3)返回值:“字符串”
s = mid(“从字符串中间取出一些字符”,7)‘返回值:“取出一些字符”
(6)Len():字符串长度,即字符串内字符的数目。
Len(“AB高等教育”) → 6
(7)LenB():字符串所占的字节数。
LenB(“AB高等教育”) → 12
注意:LenB 函数作用于字符串中的字节数据,如同在双字节字符集(DBCS)语言中一样。所以 LenB 返回的是用于代表字符串的字节数,而不是返回字符串中字符的数量。
(8)Ucase():将字符串中的小写字母转换为大写字母
Ucase(“abc”) →“ABC”
(9)Lcase():将字符串中的大写字母转换为小写字母
Lcase(“ABC”) →“abc”
(10)Space():产生指定长度的空字符串
Space(3) →“”
S = “Hello” & Space(4) & “World”
(11)String(N,C):返回由C中首字母组成的N个字符串。
String(3,”ABCDEF”) →“AAA”
(12)InStr([起始位置],字符串1,字符串2,[,比较类型])
根据比较类型模式确定字符串2在字符串1中第一次出现的位置。比较类型为1表示以文本比较的方式进行比较,为0表示以二进制比较的方式进行比较。
例如:以下代码使用InStr函数来查找某字符串中首次出现的位置。
Dim x As String, y As String, z As String
x = "XXpXXpXXPXXP"‘被检索的字符串
y = "P"‘要查找字符串”P”(大写P)
z = InStr(4, x, y, 1)‘从第4个字符开始,以文本比较的方式找起,返回值为6(小写p)。
‘z = InStr(4, x, y, 0)‘从第4个字符开始,以二进制比较的方式找起,返回值为9(大写P)。
‘z = Instr(x,y)‘缺省为二进制比较,返回值为9。
‘z = Instr(1,x,”W”)‘二进制比较从第1个字符开始返回 0 (没有找到 "W")。
Print z
结论:小写字母和大写字母在文本比较下是一样的,在二进制比较下是不一样的。
(13) InStrRev(字符串1,字符串2[起始位置[,比较类型]])
与InStr()函数功能类似,只是从字符串1的尾部开始向前查找。
(14) StrComp(字符串1,字符串2[,比较类型])
比较类型为1表示以文本比较的方式进行比较,为0表示以二进制比较的方式进行比较。缺省为二进制方式。
按比较类型比较两个字符串,相等时返回值为0;小于时返回值为-1;大于时返回值为1。
文本比较方式会将大小写字母视为一样,但二进制比较方式则视为不同。
Dim MyStr1, MyStr2, MyCompMyStr1 = "ABCD": MyStr2 = "abcd"' 定义变量。MyComp = StrComp(MyStr1, MyStr2, 1)' 返回 0。MyComp = StrComp(MyStr1, MyStr2, 0)' 返回 -1。MyComp = StrComp(MyStr2, MyStr1)' 返回 -1。
2.3.3 日期函数
(1)Date():返回系统日期
在立即窗口中输入:?Date()
2004-3-1
(2)DateAdd(interval,number,date):返回某一日期加上了一段时间间隔后的日期。
Interval为字符串表达式,指出时间间隔,取值分别为:yyyy(年)、q(季)、m(月)、y(1年的日数)、d(日)、w(1周的日数)、ww(周)、h(时)、n(分)、s(秒)
number为数值表达式,指出要加上的时间间隔的数目。其值可以是正值(未来的日期)或负数。
date为日期
DateAdd(“yyyy”,1,#2/29/2000#) à 2001年2月28日
(3)DateDiff(interval,date1,date2[,firstdayofweek[,firstweekofyear]]):返回两个指定日期间的时间间隔数目
interval:表示date1和date2之间的时间间隔(同DateAdd)
date1、date2是计算中用到的两个日期
firstdayofweek:指定哪天是一个星期的第一天
firstweekofyear:指定哪周是一年的第一周
DateDiff(“m”,#2/14/2000#,#3/8/2000#) →1
(4)DateSerial(year,month,day):返回包含指定的年、月、日的日期。
year、month、day 为Integer型数值表达式
DateSerial(0,1,20) →00-1-20
(5)Day(date):返回日期中的日。
Day(“97,05,01”) →1
(6)Hour(time):表示一天中的某一钟点。 Hour(22:18:20) →22
(7)Month(date):返回日期中的月份
Month(“97,05,01”) →5
(8)Second(time):返回秒数。 Second(22:18:20) →20
(9)Time():返回当前系统时间
(10)Timer():返回从午夜开始到现在的秒数
(11)TimeSerial(hour,minute,second):返回指定的时间
(12)Weekday(date,[firstdayofweek]):返回星期代号(1--7),星期日为1,星期一为2。 Weekday(“97,05,01”) →5,即星期四。
(13)Year(date):返回日期中的年份
2.3.4 转换函数
(1)Chr$():将ASCII码转换成对应字符
(2)Asc():将字符转换为ASCII码
如:Chr$(65)=“A”Asc(“A”)=65
(3)Str():将数值转换为字符串
Str(123.45)=“123.45”
(4)Val():将字符串转换为数值,对于包含非数值字符的字符串中,Val返回第一个非数值字符前的数值。
Val(“12ab”)=12Val(“ab”)=0
(5)CDbl():将参数转换为双精度型数值
(6)CLng():将参数转换为长整型数值
(7)CSng():将参数转换为单精度型数值
(8)Fix():将参数转换的小数部分舍去,转化为整数输出Fix(-4.7)=-4
(9)Int():将参数转换为小于等于该参数的最大整数输出Int(-4.7)=-5
(10)CCur():将参数转换为货币值,小数部分最多取4位
(11)Format(数值表达式,格式串):将数值转化为指定格式的字符串
Format(1234567.8,”###,#0.00”) à 1,234,567.80
Format(0.123,”0.00%”) à 12.30%
说明
(1)#:显示一位数字或什么都不显示。如果表达式在格式字符串中#的位置上有数字存在,就显示出来;否则,该位置就设么都不显示。 Format(123.45,”####.###”)=123.45
(2)0:显示一位数字或是零。如果表达式在格式字符串中0的位置上有一个数字存在,那么就显示出来;否则,就以零显示。
(3)%:先将表达式乘以100,而后在格式字符串出现该占位符的位置上插入百分比符号。
(4)@:字符占位符。显示字符或是空白。如果字符串在格式字符串中@的位置有字符存在,那么就显示出来;否则,就在那个位置上显示空白。除非有惊叹号字符(!)在格式字符串中,否则字符占位符将由幼而左被填充。如:Format(“AaBb”,”@@@@@@”) 返回:”AaBb”
(5)<:强制小写。将所有字符以小写格式显示。如:Format(“AaBb”,”<@@@@@@”,返回:”aabb”
(6)>:强制大写。
(7)!:强制由左而右填充字符占位符。缺省值是由右而左填充字符占位符。如:Format(“ABab”,”!@@@@@@”),返回:”Abab”。
2.3.5 随机函数
Rnd[(number)]:返回0~1之间的单精度随机数(1>x>=0)。X是产生随机数的种子。
例如:使用Rnd函数随机生成1—5之间的随机整数
dim x as Integer
x = Int((5 * Rnd) + 1)
2.3.6 判断函数
(1)IsArray(变量名)
该函数用来判断变量是否为数组,返回Boolean值。
(2)IsDate(表达式)
该函数用来判断表达式是否为日期,返回Boolean值。合法日期为100年1月1日—9999年12月31日。
例如:
dim mydate as date,check as Boolean
myate = #5/16/2000#
check = isdate(mydate)‘返回True
mydate = “Hello”
check = isdate(mydate)‘返回False
(3)IsEmpty(变量)
该函数用来判断变量是否已被初始化。如果变量未初始化或已明确设置为Empty,则IsEmpty返回True;否则返回False。
例如:
dim x,check as Boolean
check = isempty(x)‘返回True
x = Null‘赋以Null
check = isempty(x)‘返回False
x = Empty‘赋以Empty
check = isempty‘返回True
(4)IsNumberic(表达式)
用来判断表达式是否为数值型。如果表达式的运算结果为数值,则IsNumberic返回True;否则返回False。
例如:
dim x,check
x = 53
check = IsNumberic(x) ‘返回True
x = “459.95”
check = IsNumberic(x)‘返回True
x = “45 Help”
check = IsNumberic(x)‘返回False
练习:
写出下列表达式的值
Abs(-6.8)Sgn(78)Sgn(1.3\2.7)Left(“This is”,3)
Ltrim(Space(3)+“This”+Space(2))Right(“This is”,3)
Mid(“This is”,3,3)Len(Ltrim(Space(2)+”is”+Space(3))
Ucase(“This”)String(3,”+”) Date()-#9/1/2002#day(Date())
小结 |