VB.NET语言基础

Download Report

Transcript VB.NET语言基础

Slide 1

第2章 Visual Basic.NET语言基础

































Slide 2

教 学 目 的
认识Visual Basic.NET的程序设计基础,通过数据
类型、运算符及表达式、常量和变量等的学习,为
以后的程序设计打下牢固的基础。掌握三种基本结
构:顺序结构、选择结构和循环结构。除了基本数
据类型以外,在程序设计中还要用到复杂的数据类

型,数组、结构可以实现这部分功能。掌握过程的
基本知识,使程序设计的算法变得简单、实用。


Slide 3

教 学 要 求
1.了解数据类型的概念,掌握整型,字符型,字符串,
单精度,日期时间型的类型名;能够正确书写各种表达
式,正确理解各种运算符;掌握常用的字符串函数、数
学函数和随机函数的书写格式和功能。
2.学习和掌握顺序、选择、循环结构程序的特点;掌握
赋值语句的功能,会正确使用文本框、函数和过程输入
数据以及输出计算结果。掌握和熟练使用选择语句和循
环语句。
3.掌握数组定义,数组元素的引用,以及数组在程序中
的作用及其处理方法。
4.掌握Sub过程和Function过程的定义和调用方法,能正
确区分Sub过程和Function过程之间的差别;掌握形参和
实参的意义和作用,掌握形参与实参之间传值调用和引
用调用的特点。


Slide 4

重 点 难 点
重点:
1.变量和存储单元的对应关系;算术表达式、字符串表
达式、关系表达式和逻辑表达式的正确书写;字符串函
数、日期时间函数、数学函数和随机函数。
2.赋值操作的实质;数据输入、输出的方法; If语句和
Select Case语句执行流程,它们之间的区别。
For…Next、Do…Loop、While…Wend语句的书写格式、
执行流程以及在程序设计中的应用。
3.数组的应用。
4. Sub过程和Function过程的定义格式和调用方法,两
种过程的异同点;形参与实参的作用,传值调用和引用调
用的特点及其区别,数组作为参数在过程定义中的作用。


Slide 5

重 点 难 点
难点:
1.数据类型的概念;变量和存储单元的对应关系;
字符串的运算、逻辑运算、字符串函数和随机函数。
2.三种格式的If语句的区别,If语句与Select
Case语句的区别;正确使用三种不同的循环语句。
3.利用数组处理多个数据。
4.形参的作用,形参与实参之间的关系;Sub过程与
Function过程之间的异同;传值调用和引用调用的
特点,在过程设计中合理的选用形参与实参之间的
传值调用和引用调用;递归过程的执行流程,其中
的递归执行条件的正确选用。


Slide 6

教 学 内 容
2.1

VB.NET程序设计基础

2.2

流程控制

2.3

数组

2.4

过程


Slide 7

2.1 VB.NET程序设计基础

2.1.1 代码书写规则
2.1.2 基本数据类型
2.1.3 常量与变量

2.1.4 运算符和表达式
2.1.5 常用函数


Slide 8

2.1.1 代码书写规则
1. 关键字和标识符
关键字又称是系统保留字,是具有固定含义和使用方法
的字母组合。关键字用于表示系统的标准过程、方法、
属性、函数和各种运算符等。如:Private、Sub、If、
Else、Select等等。
VB.NET中标识符的命名规则:
(1) 标识符必须以字母、汉字或下划线开头;
(2)只能由字母、汉字或下划线组成;
(3) 不能使用关键字;
(4)如果以下划线开头,则必须包含至少一个字母或数字。


Slide 9

2.1.1 代码书写规则
2. 代码书写规则
程序语句最长不能超过1023个字符。代码的书写规则如下:
(1) 不区分字母的大小写;
(2) 不能在对象名、属性名、方法名、变量名、关键字的中间
断开;
(3) 一行可书写若干句语句,语句之间用“:”分隔;
(4) 一句语句分若干行书写时,要用空格加续行符“_”连接;
(5) 同一语句的续行符之间不能有空行;

3. 注释
注释语句可用REM或“‘ ”引导,在程序运行时不被执行。
例:
' 以下语句的作用是定义一个变量
Rem
以下语句的作用是定义一个变量


Slide 10

2.1.1 代码书写规则
1. 关键字和标识符
关键字又称是系统保留字,是具有固定含义和使用方法的
字母组合。关键字用于表示系统的标准过程、方法、属性、
函数和各种运算符等。如:Private、Sub、If、Else、
Select等等。
VB.NET中标识符的命名规则:
(1) 标识符必须以字母、汉字或下划线开头;
(2)只能由字母、汉字或下划线组成;
(3) 不能使用关键字;
(4)如果以下划线开头,则必须包含至少一个字母或数字。


Slide 11

2.1.2 基本数据类型








占字
节数









Boolea
n
Byte

4

True 或 False

1

0 -- 255

Char
Date

@

2
8
16

0 -- 65535
January 1,1 -- December 31,9999
+/-79228162514264337593543950335

#

8

-1.797 693 134 862 31E+308 –
+1.797 693 134 862 31E+308

Decima
l
Double


Slide 12

2.1.2 基本数据类型
数 据
类 型




占 字
节 数

Integer

%

4

-2 147 483 648 ~ +2 147 483 647

8

-9 223 372 036 854 775 808 ~
+9 223 372 036 854 775 807

Object

4

任何一种数据类型的数据均可存储在
Object数据类型中

Short

2

-32768 ~ +32767

4

-3.402 823E+38 ~ +3.402 823E+38

Long

&

Single

!

String

$









一个字符串可存储大约20亿个
Unicode字符


Slide 13

2.1.2 基本数据类型
•用户自定义的类型

VB.NET除了提供上述基本数据类型外,还可以创建复合
数据类型,如结构、数组和类。结构可以包含多个不同类型
的数据项。
•结构的声明
结构的声明由Structure语句开始,由End Structure语句
结束。例如:
Structure Student
Dim Number As Long
Dim Name As String
Dim Age As Integer
Dim Score As Single
End Structure


Slide 14

2.1.2 基本数据类型
•结构成员的引用
结构声明以后,就可以声明该结构的变量,例如:
Dim s AS Student
要访问结构变量的字段,必须使用“.”号,例如:
s.Number=001212
s.Age=18


Slide 15

2.1.3 常量与变量
1、 常量
(1) 直接常量
23、23.54、 “A”、“a”、 “张毅”、True、False、
#10/21/2006#。

(2) 符号常量
定义符号常量的一般格式如下:
Const <常量名> [As 数据类型] =表达式
功能: 定义由“常量名”指定的符号常量。
说明:常量名是标识符,它的命名规则与标识符的命名规则一
样。“As数据类型”用来说明常量的数据类型。
例如:
Const pi As Single=3.1415926
Const date=#1/2/98#


Slide 16

2.1.3 常量与变量
2、 变量
在程序运行过程中其值可以变化的量称为变量。变量的使
用前需要声明,声明格式为:
Dim 变量名 [As 类型]

Dim Height As Integer
Dim Score As Single
Dim Name As String
Dim A,B As Single


Slide 17

2.1.3 常量与变量
2、 变量
变量名称必须遵守下列规则:
必须以字母、汉字或下划线(_)开头。
仅能由字母、数字、下划线或汉字组成。
以下划线开头,其后必须跟有其他字符。
 不能使用VB.NET保留字。
 变量名在变量的作用范围内不能重名。

例如:
MyAge、_1、ab_453都是合法的变量名
21abc、My.Name、Money$都是非法的变量名。


Slide 18

2.1.3 常量与变量
3、 Option Strict和Option Explicit语句
•Option Strict
On:必须指出数据类型;
Off:编译器将分配数据类型。
Option Strict On
Const MinAge As Integer
Dim a AS Single
或者:
Option Strict Off
Const Days = 365
dim Salary
•右击“解决方案管理器”中的项目文件|属性|编译,即
可看到Optipn Strict语句,自行选择On或Off。


Slide 19

2.1.3 常量与变量
3、 Option Strict和Option Explicit语句
•Option Explicit
On:必须在使用变量前显示声明该变量
Off:可以在代码中直接使用变量,即隐式声明该变量。
Option Explicit On √
DimDim
b a AS Single
或者:
Option Strict Off
dim Salary
设置方式同Option Strict


Slide 20

2.1.3 常量与变量
4.类型转换语句
将值从一种数据类型改变为另一种数据类型的过程
被称为类型转换。

按涉及类型

扩展转换

收缩转换

按转换方式

显式转换

隐式转换


Slide 21

2.1.3 常量与变量
4.类型转换语句
•扩展转换与收缩转换(标准扩展转换表)

源数据类型

目标数据类型

Byte

Byte,Short,Long,Decimal,Single,Double

Short

Short,Long,Decimal,Single,Double

Long

Long,Decimal,Single,Double

Decimal

Decimal,Single,Double

Single

Single,Double

Double

Double

任意枚举类型

源类型的基础整数类型,以及任意能扩展的类型

Char

Char,String

任意类型

Object

任意派生类型

源类型的基类型


Slide 22

2.1.3 常量与变量
4.类型转换语句
•显式转换与隐式转换(类型转换关键字表)
使用类型转换关键字的类型转换,称为显式转换。

类型转换 目标数据
关键字
类型

类型转

关键字

目标数据
类型

Cbool

Boolean

Cint

Integer

Cbyte

Byte

Clng

Long

Cchar

Char

Cobj

Object

Cdate

Date

Cshort

Short

Cdbl

Double

CSng

Single

Cdec

Decimal

Cstr

String

类型转换改
变的是表达
式值的类型,
而不影响表
达式中变量
的值和类型


Slide 23

2.1.3 常量与变量
4.类型转换语句
•显式转换与隐式转换(类型转换关键字表)

由系统自动完成的类型转换,称为隐式转换。
Dim X As Integer
Dim Y As Single
X=125
Y=X
125.0


Slide 24

2.1.4 运算符和表达式
1、 算术运算符

a=2

运算符

含 义

优先级





结 果

^

指数

1

a^5

32

-

取负

2

-a

-2

*



3

3.6*a

7.2

/

浮点除

3

10.3/a

5.15

\

整除

4

10.3\a

5

Mod

取模

5

13 Mod a

1

+



6

10+a

12

-



6

10-a

8


Slide 25

2.1.4 运算符和表达式
1、 算术运算符
•指数运算与取负运算
指数运算比取负运算的优先级别要高,但当指数运算
符后面紧临着取负运算符时,先进行取负运算。
2^-2求的是2-2,结果是0.25;
(-2)^-2求的是(-2)-2 ,结果是0.25;

-2^-2求的是 -(2-2 ),结果是-0.25。


Slide 26

2.1.4 运算符和表达式
1、 算术运算符
•浮点除与整除运算
浮点除运算执行标准的除法运算,结果为浮点数。
13.49/2.49=5.42
整除运算执行整数除法运算,即运算符的操作数都

要先四舍五入取整,其运算结果被截断为整型数或
长整型数,并不进行四舍五入。
13.49\2.49=6


Slide 27

2.1.4 运算符和表达式
1、 算术运算符
•模运算
模运算符Mod用来求余数。
7 Mod3的计算结果为1

7.5 Mod 3的计算结果为1.5


Slide 28

2.1.4 运算符和表达式
2、 关系运算符

运算符
=
>
>=
<
<=
Like
Is

名称
等于
大于
大于等于
小于
小于等于
字符串匹配
对象引用比较

实例
"ABCDE"=" ABR"
"ABCDE">"ABR"
"bc">="大小"
23<3
"23"<="3"
"ABCDEFG"Like"* DE"
ClassSample 1 is Nothing

结果
False
False
False
False
True
True
True


Slide 29

2.1.4 运算符和表达式
2、 关系运算符
(1)如果两个操作数是数值,就按其大小进行比较。
(2)如果两个操作数是字符或字符串,则按字符的
UniCode码值从左到右逐个字符进行比较,其UniCode码

值大的字符串大。
"abcdf" > "abcf"比较结果为False
“10”>”2”比较的结果为False
(3)关系运算符之间的优先级相同。


Slide 30

2.1.4 运算符和表达式
3、 逻辑运算符

运算符 名称
Not

逻辑非

And
Or

逻辑与
逻辑或

Xor

逻辑异或

AndAl 简化逻辑
so
合取
OrElse

短路逻辑
析取

结果

当操作作数为假时,结果为真,反之
亦然
A和B都是True时,结果才为T
A和B都是False时,结果才为F
两个操作数的值不相同,结果为T,
相同时结果为F
当A为False时,结果为False;当A为
True时,结果与B相同;
当A为True时,结果为True;当A为
False时,结果与B相同;


Slide 31

2.1.4 运算符和表达式
3、 逻辑运算符
(1)要判断X是否在区间[a,b],应写成
a<=X And X<=b
(2)如果两个数值型的数据进行And、Or、Not和Xor运算
时,则先把数值转换为二进制数,然后对两个二进制数逐
位进行逻辑运算。
5 And 8的运算结果为0


Slide 32

2.1.4 运算符和表达式
4、 字符串运算符
使用字符串运算符“&”和“+”可以把两个字符串连接起来。
变量后使用“&”时,变量名与“&”之间应留有空格。当两个操
作数中有一个是数值型数据时:
(1)“&”把数值型数据转换为字符类型,然后进行字符的连

(2)“+”把字符数据转换为数值数据执行加法运算,但如果
字符数据不能转换成数值,就会出错。
12.23 + “asf”
12.34 & "abc"
12.34+"45"

是错误的。
' 结果为"12.34abc"
' 结果为57.34


Slide 33

2.1.4 运算符和表达式
5 、表达式
表达式由变量、常量、运算符和圆括号按一定的规则组成。表
达式的运算结果类型由数据和运算符共同决定。

乘号是“*”,既不能省略也不能用“.”代替。
表达式中只能使用圆括号,且优先级最高。
优先级:算术运算符>字符串连接运算符>关系运算符>逻辑

运算符。
在算术运算中,如果表达式具有不同的数据精度,则运算
结果的数据类型采用精度高的数据类型;当Long型数据与
Single型数据运算时,结果为Double型数据。


Slide 34

2.1.5 常用函数
1、数学函数
如果在程序中要使用这些方法,必须先在代码的开头引
入Math类,即在Public Class Form1语句的上面添加语
句Imports System.Math。
如果不添加这条语句,则使用这些方法时必须加上
System.Math类。
Math.Tan(30 / 180 * 3.142)


Slide 35

2.1.5 常用函数 1、数学函数
函数名称

函数功能及参数说明

a=-12.8,b=5.47,
例子 x=3.142
结果

Abs

返回绝对值。

Sin

返回Double型正弦值。 Sin(30 / 180 * x)

0.500058794237552

Cos

返回Double型余弦值。 cos(30 / 180 * x)

0.86599145625444

Exp

返回Double类型的以e
为底数的指数幂值。

237.460142940041

Log

返回Double型对数值。 Log(b)

1.6992785780777

Round

返回Double类型的最靠 Round(a)
Round(b)
近指定数值的数。

-13
5

Sign

返回Integer型数值,判
断参数的符号。

Sqrt

返回Double型开方值。 Sqrt(b)

Tan

返回Double型正切值。 Tan(30 / 180 * x) 0.577440794162556

Abs(a)

Exp(b)

Sign(a)
Sign(b)
Sign(0)

12.8

-1
1
0
2.33880306785151


Slide 36

2.1.5 常用函数
2、字符串处理函数

s为“123.2”,c为“中
国人民共和国Zhong”。

函数格式
函数功能及参数说明
结果
函数格式
函数功能及参数说明
函数功能及参数说明


例 例子

结果
结果
函数功能及
函数格式

子 UCase("lEFt") 结果
Ucase(s)
“LEFT”
把字符串参数转换成大写字符。
参数说明
StrComp("Zhe","zho")
把字符串参数转换成
Lcase(s)
LCase("lEFt")
“left”
把字符串参数转换成小写字符。
Lcase(s)
“left”
比较两个字符串。如果s1大LCase("lEFt")
小写字符。
-1
从字符串s的第n
StrComp("Zho","zho"
Lelf(s,n)
Left(c, 2)
从字符串s左边第一个字符开始截取n个字符。
“中国”
StrComp(s1 于s2,则返回1;如果s1小于
Mid(s,n[,L])
Mid(c, 3, 4)
) 4) “人民共和”
个字符开始截取L
Right(s,n)
Right(c,
“hong” 0
从字符串s右边最后一个字符开始截取n个字符。
把字符串参数转换成
,s2[,m])
Ucase(s) s2,则返回-1;如果s1=s2,
UCase("lEFt")
“LEFT”1
个字符。
StrComp("Zho","zhe"
大写字符。
Mid(s,n[,L])
Mid(c, 3, 1)
从字符串s的第n个字符开始截取L个字符。
“人”
则返回0。
)
LTrim(s)
LTrim(" 12.3 ")
“12.3 “
去除字符串s左边的空格。
去除字符串s左边
LTrim(s)
LTrim("
12.3
")
“12.3

从字符串s左边第一个
Microsoft.VisualBasi
RTrim(s)
RTrim("
12.3
")

12.3“
去除字符串s右边的空格。
的空格。
Left(s,n) 返回字符串s2在字符串s1中
“中国人”
字符开始截取n个字符。
c.Left(c,
3)
Trim(s)
Trim(" 12.3 ")
“12.3”
同时去除字符串s左边和右边的空格。
的第一个匹配项的起始位置;
去除字符串s右边
返回字符串s2在字符串s1中的第一个匹配项的起始位置;如果字符串s2
RTrim(s)
RTrim(" 12.3InStr(s,")"12") “ 12.3“
1
如果字符串s2不在字符串s1
从字符串s右边最后一
InStr([n,]s1,s2[,
不在字符串s1中,则返回0。其中参数n用来指定字符串匹配操作的起始
的空格。
InStr(2,
s, "12")
0
InStr(s,
"12")
1
Right(s,
Microsoft.VisualBasi
m])
位置,s1是搜索的字符串,s2是要查找的字符串,m用来指定字符串比
InStr(s,
"12",0)
1
InStr([n,] 较的类型。
中,则返回0。其中参数n用
“Zhong”0
个字符开始截取n个字
InStr(2, 5)
s, "12")
返回与指定字符
n)
c.Right(c,
s1,s2[,m]) 符。
来指定字符串匹配操作的起
StrReverse("Zheng
StrComp("Zhe","zho")
-1
InStr(s,
"12",0)
1
StrComp(s1,s2[, 比较两个字符串。如果s1大于s2,则返回1;如果s1小于s2,则返回-1;
StrReverse(s)
“gnehZ”
串s的字符顺序相
StrComp("Zho","zho")
0
始位置,s1是搜索的字符串, ")
m])
如果s1=s2,则返回0。
StrComp("Zho","zhe")
1
反的字符串。
s2是要查找的字符串,m用来
Len(s)
7
计算字符串所含字符的个数。
Len("中国Zhong")
同时去除字符串s
指定字符串比较的类型。
StrReverse(s)
“gnehZ”
返回与指定字符串s的字符顺序相反的字符串。
StrReverse("Zheng")
Trim(s)
Trim(" 12.3 ")
“12.3”
左边和右边的空
Len(s)
计算字符串所含字符的个数。
Len("中国Zhong")
7
格。


Slide 37

2.1.5 常用函数
3、随机函数
Rnd函数返回一个[0,1)区间的Single值,其格式为:
Rnd [(number)]
要产生一个[n,m]之间的随机数,可以用公式来完成:
Int((m-n+1)*Rnd+n)
求[2,100)之间的随机数:Int(98*Rnd+2)
求[2,100]之间的随机数:Int(99*Rnd+2)


Slide 38

2.1.5 常用函数
4、转换函数
函数
格式

函数功能及参数说明

例子

Chr(x)

返回与指定字符代码相关联的字符。参
数x是Integer型的数,其取值范围为32768~65536。

Asc(s)

返回字符s的代码数据或字符代码。对于
单字节字符集,函数返回值范围为0~255; Asc(“A”)
Asc(“人”)
对于双字节字符集,函数返回值的范围
为-32768~32768。

Str(x)

把数字转换为字符串。

Format(x[, 返回根据指定格式设置x的字符串。其中
格式说明 x是值数据;格式说明符是一个由预定义
符])
说明符组成的字符串。
Hex(x)

返回数值数据x的十六进制值的字符串。
如果x不是整数,则将其舍入到最接近的
整数;如果省略参数,则返回0。

Chr(65)
Chr(-14133)

结果
“A”
“人”

65
-14133

Str(12.3) & “a”

“12.3a”

Format(12.3)
Format(31.5,”00.00”)

12.3
31.50

Hex(459)

1CB


Slide 39

2.1.5 常用函数
4、转换函数
函数
格式

函数功能及参数说明

例子




Oct(459)

713

Oct(x)

返回数值数据x的八进制值的字符串。
对参数x的要求与Hex函数一致。

Val(s)

把参数s转换为适当类型的数值。参数s
Val(“2457”)
可以使String表达式、Object变量(其值
Val(“asds”)
必须可以转换为String类型)或Chr值。

245
7
0

Fix(x)

不进行舍入,直接返回数值x的整数部
分。

Fix(99.8)
Fix(-26.2)

99
-26

Int(x)

如果x>=0,则不进行舍入,直接返回x
的整数部分;如果x<0,则返回小于或
等于x的最大负整数。

Int(99.8)
Int (-26.8)

99
-27

Cint (99.8)
Cint (-26.2)

100
-26

Cint(x) 把数值进行四舍五入取整。


Slide 40

2.1.5 常用函数
5、日期函数
函数格式

函数功能及参数说明

例子

结果

Now()

返回当前系统日期和时间。

Now()

2005-3-21
17:12:57

Today()

返回或设置当前系统的日期。

Today()

2005-3-21
0:00:00

TimeOfDay()

0001-1-1
17:12:58

TimeOfDay() 返回或设置当前系统时间。
Year(d)

返回日期变量d指定的年,值是1~9999的整数。Year(Now)

2005

Month(d)

返回日期变量d指定的月,值是1~12的整数。 Month(Now)

3

Day(d)

返回日期变量d指定的日,值是1~31的整数。

Hour(d)

返回时间变量d指定的时,值是0~23的整数。 Hour(Now)

17

Minute(d)

返回时间变量d指定的分,值是0~59的整数。 Minute(Now)

12

Second(d)

返回时间变量d指定的秒,值是0~59的整数。 Second(Now)

57

Weekday(d)

返回1-7之间的整数,代表日期对应的星期数。 Weekday(Now) 2


Slide 41

2.1.5 常用函数
5、日期函数
•Day函数

使用Day函数时,需要用Microsoft.VisualBasic命名空
间对其进行限制。
Dim Mydate As Date
Mydate=#5/12/2003#
Debug.WriteLine(Microsoft.VisualBasic.Day(Mydate))


Slide 42

2.1.5 常用函数
5、日期函数
•DateAdd函数
DateAdd (Interval,Number,DateValue)
 完成Date型数据的加运算,并返回计算结果;
 Interval表示所要添加时间间隔的DateInterval枚举值
或者字符串表达式;
 Number是一个Double型的浮点数,指定加的数据;
 DateValue是Date型的数据。


Slide 43

2.1.5 常用函数
5、日期函数
DateAdd函数 (Interval参数的设置值 )
枚举值

字符串

待添加时间间隔的单位

DateInterval.Day

“d”



DateInterval.DayOfYear

“y”



DateInterval.Hour

“h”

小时

DateInterval.Minute

“n”

分钟

DateInterval.Month

“m”

月份

DateInterval.Quarter

“q”

季度

DateInterval.Second

“s”



DateInterval.Weekday

“w”



DateInterval.WeekOfYear

“ww”



DateInterval.Year

“yyyy”




Slide 44

2.1.5 常用函数
5、日期函数
•DateAdd函数 (Interval参数的设置值 1)
DateInterval.Day、DateInterval.DayOfYear和

DateInterval.Weekday可以被视为等效。DateAdd函数不返
回无效日期,如果出现参数的值无效,则发生错误。
Dim d As Date

d = #2/24/1996#
Debug.WriteLine(DateAdd("y", -5, d))
DateAdd函数还可以写成
DateAdd(DateInterval.DayOfYear, -5, d)


Slide 45

2.1.5 常用函数
5、日期函数
•DateDiff函数
DateDiff(Interval,Date1,Date2[,DayOfWeek][,WeekOfYear])
(1)Interval的设置与DateAdd函数中的Interval的设置相同
(2)Date1和Date2都是Date型的数据,用于计算Date2与Date1
之间的差值;
(3)DayOfWeek是FirstDayOfWeek的枚举值,用来指定周的第
一天,如果省略该参数,则使用FirstDayOfWeek.Sunday;

(4)WeekOfYear是FirstWeekOfYear的枚举值,用来指定年的
第一周,如果省略该参数,则使用FirstWeekOfYear.Jan1。


Slide 46

2.1.5 常用函数
5、日期函数
•DateDiff函数

Dim d As Date
d = #2/24/1996#
Debug.WriteLine(DateDiff(DateInterval.Year, d, Now))


Slide 47

2.1.5 常用函数
6、格式输出函数(Format)
使











0

数字占位符。如果表达式在格式中出现0
的位上有数字,则显示该数字;否则在该
位显示0;如果整数部分位数大于格式的
位数,则整数部分完整显示; 如果小数
部分位数大于格式位数,则进行舍入。

#

其作用与格式说明符0的作用相同,只是 Format(5,”##.##”)
如果格式说明符指定的位数多于表达式的 Format(5.45,”#.#”)
Format(-15.45,”#.#”)
数字个数,多余的位置不出现。

Format(5,”00.00”)
Format(5.45,”0.0”)
Format(-15.45,”0.0”)
Format(-15.45,"0000.0")

结 果
05.00
5.5
-15.5
-0015.5
5
5.5
-15.5

, 千位分隔符。

Format(12565.45,"#,###.#")

12,565.5

% 百分号占位符。

Format(0.445, "0###.00%")

0044.50%

: 时间分隔符,指定输出时间数据的格式。 Format(1231256, "00:00:00") 123:12:56
/

日期分隔符,指定输出日期数据的格式。 Format(19961256, "##/##/##") 1996/12/56


Slide 48

2.2 流程控制
三种基本控制结构

2.2.1 顺序结构
2.2.2 选择结构
2.2.3 循环结构


Slide 49

2.2.1 顺序结构
1、 赋值语句
赋值语句的作用是计算表达式的值,然后将值赋给变量。

变量名|对象属性名=表达式

例:
X=100
' 把100赋值给X
TextBox1.Text="欢迎使用VB.NET! "
'在文本框中显示欢迎使用VB.NET!
x=(100+x)/y


Slide 50

2.2.1 顺序结构
1、 赋值语句
赋值语句的作用是计算表达式的值,然后将值赋给变量。

变量名|对象属性名=表达式
注意

(1)赋值号与等号形同而义不同。

赋值号的左侧必须是变量,右侧可以是常量、
变量或表达式,其两侧不能交换,即使两侧都是
变量,对调后所产生的结果与对调前是不同的。


Slide 51

2.2.1 顺序结构
1、 赋值语句
赋值语句的作用是计算表达式的值,然后将值赋给变量。

变量名|对象属性名=表达式
注意

(2)当表达式为数值型并且与变量的精度不相
同时,则系统将表达式的值强制转换成左侧变
量的精度。
例如:
Dim m As Integer
m=7.89
‘m为整型变量,转换时四舍五入,
m中的结果为8


Slide 52

2.2.1 顺序结构
1、 赋值语句
赋值语句的作用是计算表达式的值,然后将值赋给变量。

变量名|对象属性名=表达式
注意

3)当表达式是数字字符串,赋值号左侧的变量
是数值类型时,系统会自动将表达式转换成数
值类型再赋值。但是当表达式中有非数字字符
或空串时,则出错。
例如:
Dim m As Integer
m=“123”
‘m 中 的 结 果 是 123 , 与
m=Val(“123”)效果相同
m=“123miles” ‘出现“类型不匹配”的错误


Slide 53

2.2.1 顺序结构
1、 赋值语句
赋值语句的作用是计算表达式的值,然后将值赋给变量。

变量名|对象属性名=表达式
注意

(4)当逻辑型表达式赋值给数值型时,True
转换为-1,False转换为0;反之,当数值型
数据赋值给逻辑型变量时,非0转换为True,
0转换为False。


Slide 54

2.2.1 顺序结构
1、 赋值语句
赋值语句的作用是计算表达式的值,然后将值赋给变量。

变量名|对象属性名=表达式
注意

(5)不能在一个赋值语句中,同时给多个变量赋值。
例如:
Dim a, b As Integer
a=b=10

思考:该语句并没有
语法错误,请思考a、
b的值是什么?


Slide 55

2.2.1 顺序结构
2、 复合赋值语句
复合赋值语句一般格式为
变量名 复合赋值运算符 表达式
例如:
N*=2+3

' 等价于N=N*(2+3)


Slide 56

2.2.1 顺序结构
3、数据的输入
•InputBox( )函数
该函数的作用是打开一个对话框,等待用户

输入内容,当用户单击“确定”按键或按回车
键时,函数返回输入的值,其类型为字符串。


Slide 57

2.2.1 顺序结构
3、数据的输入
InputBox(提示[,标题] [,默认] [,x坐标位置] [,y坐标位置])

注意

“提示”是字符串表达式,在对话框中作为显示信
息可以是汉字。若要多行显示,必须在每行的行末
加回车chr(13)和换行chr(10)控制符。
例如:
Dim StrBookName As String , StrS1 As String
StrS1=“请输入书名”+chr (13)+chr (10)+“然
后单击确定按钮”
StrBookName=InputBox(Strs1,“输入框”, ,
100,100)


Slide 58

2.2.1 顺序结构
3、数据的输入
InputBox(提示[,标题] [,默认] [,x坐标位置] [,y坐标位置])

注意

“标题”是字符串表达式,在对话框的标题
区显示。若省略,则将程序名放入标题框。
例如:
StrBookName=InputBox(Strs1,“输入
框”, ,100,100)


Slide 59

2.2.1 顺序结构
3、数据的输入
InputBox(提示[,标题] [,默认] [,x坐标位置] [,y坐标位置])

注意

“默认”是字符串表达式,当在输入对话框
中无输入时,则将该默认值作为输入的内容。
使用InputBox( )函数时,应注意各项参数的
次序必须一一对应,其中的可选项省略时,
处于中间的默认部分要用逗号跳过。
例如:
StrBookName=InputBox(Strs1,“输入
框”, ,100,100)


Slide 60

2.2.1 顺序结构
3、数据的输入
InputBox(提示[,标题] [,默认] [,x坐标位置] [,y坐标位置])

注意

“x坐标位置”和“y坐标位置”是整型表达
式,其值确定对话框左上角在屏幕上的位置。
屏幕左上角为坐标原点,单位为twip。
例如:
StrBookName=InputBox(Strs1,“输入
框”, ,100,100)


Slide 61

2.2.1 顺序结构
4、数据的输出
通过MsgBox函数或MsgBox过程可以打开一个信息框,为
用户指出错误或发出警告信息等,从而方便用户操作。
MsgBox函数可以返回所选按钮的整数值,返回值的意义
见表2.14 。若不需要返回值,就与MsgBox过程的作用一样
了。


Slide 62

2.2.1 顺序结构
4、数据的输出
MsgBox()函数用法如下:

变量=MsgBox(提示[,按钮][,标题])

“按钮”是整型表达式,
其值决定信息框按钮的

MsgBox过程的用法如下:

数目和类型以及出现在

MsgBox(提示 [,按钮] [,标题])

信息框上的图标类型,
其设置见表2.13。


Slide 63

2.2.1 顺序结构
4、数据的输出
例如:
MsgBox("还要继续吗?(Y/N)", 4, "消息框")
或者
MsgBox("还要继续吗?(Y/N)", MsgBoxStyle.YesNo, "消
息框")


Slide 64

2.2.1 顺序结构
4、数据的输出
•利用Lable控件实现数据的输出显示
•利用TextBox控件实现数据的输入和输出

注意

文本框可用来显示一个由多行文本组成的信
息。当文本信息超出文本框的尺寸时,文本框还
会添加自己的滚动条。
TextBox和Label控件之间的差别在于:Text
控件中的文本可以被编辑,而Label控件中的文
本不能被编辑。


Slide 65

2.2.1 顺序结构
4、数据的输出
•输出窗口
输出窗口用来输出程序运行时产生的信息,包括编
程环境给出的信息和程序中要输出的信息。
例如:
Dim x As String, y As Integer
x = "s0210" : y = 23
Debug.WriteLine("学号:"& x & y)

学号:s021023


Slide 66

2.2.2 分支结构
1、 If 语句
•If … Then 语句
(1)If

<表达式> Then

(2)If

<表达式> Then
<语句>

End

If

<语句>

单分支选择结构常用
来解决可选择的情况
较少的问题。
例如:输出两个数中
较大或较小的数。


Slide 67

2.2.2 分支结构
1、 If 语句

单分支选择结构的执行过程

•If … Then 语句
表达式的结果是
True还是False?
如果是False
如果是True

(1)If <表达式>Then <语句>
(2)If

<表达式> Then

表达式
False
True

<语句>
<语句>

End

If
其他语句


Slide 68

2.2.2 分支结构
1、 If 语句

单分支选择结构的流程图

•If … Then 语句
(1)If <表达式>Then <语句>
表达式

(2)If

<表达式> Then
<语句>

End

False
True
<语句>

If
其他语句


Slide 69

2.2.2 分支结构
1、 If 语句
•If … Then 语句

表达式 作为该条件语句中的

(1)If <表达式>Then <语句>

条件, 其形式一般为 关系表

(2)If

达式或逻辑表达式;如果是数

<表达式> Then

值表达式,则非0值为真,

<语句>
End

If

0值为假;如果是字符串则
只能使用“True”和“False”,
系统会把其强制转换为逻辑常
量True和False。


Slide 70

2.2.2 分支结构
1、 If 语句
•If … Then 语句
(1)If <表达式>Then <语句>
(2)If

<表达式> Then

当条件表达式为真时,程序就
会执行对应的<语句>。

第一种形式中的<语句>可以
是一条单个的语句,也可以是
用冒号分隔的多条语句,而且

<语句>
End

If

所有语句必须写在同一行上;

第二种形式中的<语句>可以
是一条或分行书写的多条语句。


Slide 71

2.2.2 分支结构
1、 If 语句
•If … Then 语句
(1)If <表达式>Then <语句>
(2)If

<表达式> Then
<语句>

End

If

例如:
if at=a
a=b
b=t
end if
或者
if a

Slide 72

[例]已知两个变量a和b,比较它们的大小,使得a中的值大于b。
Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MyBase.Load

Dim a, b, t As Integer
a = InputBox("a=")
b = InputBox("b=")

开始
Dim a, b, t As Integer
a =InputBox("a=")
b =InputBox("b=")

If a <= b Then
a>b

t=a
a=b
b=t
End If
Debug.WriteLine("a=" & a)

Debug.WriteLine("b=" & b)
End Sub

a不大于b吗?
a<=b
t=a
a=b
b=t
Debug.WriteLine("a=" & a)
Debug.WriteLine(“b=" & b)
结束


Slide 73

Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MyBase.Load

Dim a, b, t As Integer
a = InputBox("a=")
b = InputBox("b=")

If a <= b Then
t=a
a=b
b=t
End If
Debug.WriteLine("a=" & a)

Debug.WriteLine("b=" & b)
End Sub

t=a
a=b
b=t

这三条语句完成了
变量a与b的值进行
交换的过程。


Slide 74

2.2.2 分支结构
1、 If 语句
•If … Then…Else 语句

If … Then … Else
语句

(1)If <表达式> Then <语句1> Else <语句2>
是双分支选择结构。

(2)If <表达式> Then
<语句1>
Else
<语句2>
End If

该选择结构常用来解
决只有两种选择情况
的问题。


Slide 75

2.2.2 分支结构
1、 If 语句
•If … Then…Else 语句

双 分 支 选 择 结 构 流 程 图

True

(1)If <表达式> Then <语句1>
Else <语句2>

(2)If <表达式> Then
<语句1>
Else
<语句2>
End If

表达式

语句块1

False

语句块2

其他语句


Slide 76

•If … Then…Else 语句

例: 计 算 如 下 函 数
(a-b)/2

a>b

(b-a)/4

a≤b

y=

(1)用单分支结
构实现的代码为:
y=(a-b)/2
If a<=b then
y=(b-a)/4


Slide 77

•If … Then…Else 语句
例: 计 算 如 下 函 数
(a-b)/2

a>b

(b-a)/4

a≤b

y=

(2)用单行双分支结构实现的代码为:
If a>b Then y=(a-b)/2 Else y=(b-a)/4


Slide 78

•If … Then…Else 语句

例: 计 算 如 下 函 数
(a-b)/2

a>b

(b-a)/4

a≤b

y=

(3) 改用多行形式
的双分支结构来实
现的代码为:
If a>b Then
y=(a-b)/2
Else
y=(b-a)/4
End If


Slide 79

2.2.2 分支结构
1、 If 语句
•If … Then…ElseIf 语句
If <表达式1> Then
<语句块1>
ElseIf<表达式2>Then
<语句块2>


[Else
<语句块n+1>]
End If

If … Then …
ElseIf 语句是多分
支选择结构,该结
构主要解决一个条
件产生多种不同情
况的问题。


Slide 80

2.2.2 分支结构
1、 If 语句
•If … Then…ElseIf 语句
多 分 支 结 构 流 程 图

If <表达式1> Then
<语句块1>

表达式1

ElseIf<表达式2>ThenTrue
<语句块2>

False

表达式2
True

False

……



[Else

False

True
语句块1

语句块2

语句块n

<语句块n+1>]
其他语句

End If

表达式n

语句块n+1


Slide 81

2.2.2 分支结构
1、 If 语句
•If … Then…ElseIf 语句
If <表达式1> Then
<语句块1>
ElseIf<表达式2>Then
<语句块2>


[Else
<语句块n+1>]
End If

多分支选择结构会根据不
同的表达式值确定执行哪
个语句块。语句中测试条
件的顺序为表达式1、表
达式2……,一旦遇到表
达式值为True(或非零),
则执行该条件下的语句块。
若所有的表达式值均为
False或零,且语句中运
用了Else部分,则执行语
句块n+1,否则不执行该
语句中任何语句块。


Slide 82

[例] 已知输入某课程的百分制成绩Score,要求按五级制

进行评定,评定条件如下:
优秀

Score≥90

良好

80≤Score<90

中等

70≤Score<80

及格

60 ≤Score <70

不及格

0<=Score<60


Slide 83

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim score As Integer
Dim message As String
score = InputBox("请输入课程的成绩")
注意

If score >= 90 Then

Message = "优秀"
ElseIf score >= 80 Then

(1) ElseIf不能写成Else If。

Message = "良好"
ElseIf score >= 70 Then

(2) 语句中不论包含有几个

Message = "中等"

ElseIf score >= 60 Then
Message = "及格"
ElseIf score >=0 Then
Message = "不及格"

分支,程序执行了一个
分支后,其他分支不再
执行,接着执行下一条

End If
Debug.WriteLine("成绩为:" & score)
Debug.WriteLine("等级为:" & message)
End Sub

语句。


Slide 84

2.2.2 分支结构
2、 Select Case 语句
Select
Case

Case

表达式

表达式列表1
<语句块1>

Case

Select Case语句,又称

表达式列表2

情况语句,是多分支结

<语句块2>

构的另一种表达形式。


[Case Else]
[ < 语句块 n+1>]
End Select


Slide 85

2.2.2 分支结构
2、 Select Case 语句
Select
Case

Case

表达式

表达式列表1
<语句块1>

Case

表达式列表2

该语句中的“表达式列表I”
与表达式的类型必须相同,

<语句块2>

[Case Else]
[ < 语句块 n+1>]
End Select

常用的表达式形式有以下
三种形式:


Slide 86

2.2.2 分支结构
2、 Select Case 语句
Select
Case

Case

表达式

表达式列表1
<语句块1>

Case

(1)常量表

表达式列表2

<语句块2>

例如:
Case 1,2,3,4,5
Case “Book”, “PEN”


[Case Else]
[ < 语句块 n+1>]
End Select

当表达式的值为常量表中
一个元素时,表示与条件
匹配。


Slide 87

2.2.2 分支结构
2、 Select Case 语句
Select
Case

Case

表达式

表达式列表1

(2) 常量1 To 常量2

例如:

<语句块1>
Case

表达式列表2

<语句块2>


Case 0 To 59
Case “A” To “D”
当表达式的值在此区间

[Case Else]
[ < 语句块 n+1>]
End Select

内,则表示与条件匹配。


Slide 88

2.2.2 分支结构
2、 Select Case 语句
Select
Case

Case

表达式

表达式列表1
<语句块1>

Case

表达式列表2

<语句块2>

[Case Else]

(3) Is<关系运算符>常量
例如:

Case IS>85
Case IS<>“WORKER”
当表达式的值能使关系运
算符表达的关系成立时,

[ < 语句块 n+1>]
End Select

则表示与条件匹配。


Slide 89

2.2.2 分支结构
2、 Select Case 语句
Select
Case

Case

表达式

表达式列表1
<语句块1>

Case

表达式列表2

<语句块2>

[Case Else]
[ < 语句块 n+1>]
End Select

上述三种形式可以在一个
Case行中综合应用,但应
注意,其类型必须相同。
例如:
Case 40,60 To 69,Is>80


Slide 90

2.2.2 分支结构
2、 Select Case 语句
Select
Case

Case

表达式

表达式列表1
<语句块1>

Case

表达式列表2





如何使用Select Case

<语句块2>

[Case Else]
[ < 语句块 n+1>]
End Select

语句完成上一例题?


Slide 91

2.2.2 分支结构
选择结构应用举例
[例]输入年号,判断该年是否为闰年。年号符合下列条件
之一的是闰年。

分析

如果某个年号能够满足下列条件,它就是闰年。
(1)年号能被4整除,但不能被100整除。
(2)年号能被100整除,且能被400整除。


Slide 92

Private Overloads Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim year As Integer
year = Val(Text1.Text)
If year / 4 = Int(year / 4) And year / 100 <> Int(year / 100) Then
Text2.Text = year & "是闰年"
ElseIf year / 100 = Int(year / 100) And year / 400 = Int(year / 400) Then
Text2.Text = year & "是闰年"
Else
Text2.Text = year & "是平年"
End If
End Sub


Slide 93

2.2.3 循环结构
1、 For … Next循环语句
For…Next循环语句亦称

For var=e1 To e2 step e3



Next var

为计数循环,其循环次
数通常是预定的。

(循环体)
例:sum=1+2+…+100,
循环100次。


Slide 94

2.2.3 循环结构
For…Next循环语句的执行过程

1、 For … Next循环语句
计算e1,e2,e3的值,并储存起来

For var=e1 To e2 step e3



Next var

e1

var

Var超过 e2否

(循环体)

False
执行一次循环体
Var+e3

var


Slide 95

2.2.3 循环结构
For…Next循环语句的执行过程

1、 For … Next循环语句
计算e1,e2,e3的值,并储存起来

For var=e1 To e2 step e3



var
True




e1

Var超过 e2否

(循环体)

False
执行一次循环体
Var+e3

var

Next var
Next的后继语句


Slide 96

2.2.3 循环结构
跟踪循环语句的执行过程

1、 For … Next循环语句
e1=2,e2=10,e3=2

例:在文本框中显示2-10间各偶数的
e1

立方
Private Sub Form1_Load(ByVal sender As
System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim I As Integer, C As Integer
TxtOutput.Clear()
For I = 2 To 10 Step 2
C=I*I*I
TxtOutput.Text += C.ToString() +
" "
Next I
End Sub

i

i=2

2>10
i > e2
False
C=i*i*i
TxtOutput.Text +=
C.ToString() + " "


Slide 97

2.2.3 循环结构
跟踪循环语句的执行过程

1、 For … Next循环语句
e1=2,e2=10,e3=2

例:在文本框中显示2-10间各偶数的
e1

立方
Private Sub Form1_Load(ByVal sender As
System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim I As Integer, C As Integer
TxtOutput.Clear()
For I = 2 To 10 Step 2
C=I*I*I
TxtOutput.Text += C.ToString() +
" "
Next I
End Sub

i=2

i

2>10
4>10
i > e2
False
C=i*i*i
TxtOutput.Text +=
C.ToString() + " "
i+e3

i

i=4


Slide 98

2.2.3 循环结构
跟踪循环语句的执行过程

1、 For … Next循环语句
e1=2,e2=10,e3=2

例:在文本框中显示2-10间各偶数的
e1

立方
Private Sub Form1_Load(ByVal sender As
System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim I As Integer, C As Integer
TxtOutput.Clear()
For I = 2 To 10 Step 2
C=I*I*I
TxtOutput.Text += C.ToString() +
" "
Next I
End Sub

i=2

i

4>10
12>10
i > e2
True
False
C=i*i*i
TxtOutput.Text +=
C.ToString() + " "
i+e3

i

Next的后继语句


Slide 99

2.2.3 循环结构
说明

1、 For … Next循环语句

e1,e2,e3分别为循环变量的

For var=e1 To e2 step e3

值。




Next var

初值、终值以及变化的步长

(循环体)

进入For循环时,e1,e2,e3的

值就被确定并存储起来,即
使在循环体中对它们重新赋
值,也不改变预定的循环次
数。


Slide 100

2.2.3 循环结构
1、 For … Next循环语句

说明
步长值e3可以是正数,也可

For var=e1 To e2 step e3

以是负数,但不能取零。




Next var

(循环体)

在正常结束循环时,循环变
量var “超过”终值e2


Slide 101

说明

2.2.3 循环结构

For … Next循环结构
预定执行循环体的次
数为:

1、 For … Next循环语句

Int((e2-e1)/e3)+1

For var=e1 To e2 step e3

如果在循环体内对循
环变量重新赋值,则
会改变预定的次数。




(循环体)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load



Dim I As Integer, C As Integer
TxtOutput.Clear()
Next
var
For I = 2 To 10 Step 2
C=I*I*I
TxtOutput.Text += C.ToString() + " “
I=I+2
Next I
End Sub

请分析此循环重复执行
的次数?


Slide 102

2.2.3 循环结构
1、 For … Next循环语句
[例]

计算1+2+3+…+n

跟踪循环执行过程(n=5)

Private Sub Btn1_Click(ByVal sender As System.Object, ByVal e_ As System.EventArgs) Handles Btn1.Click

Dim i As Integer, n As Integer
Dim s As Integer
n = Val(TxtIn.Text) '从文本框输入n值
s = 0 '累乘变量初值必须为1
For i = 1 To n
s = s+ i
Next i
TxtOut.Text = s.ToString()
End Sub

第一次循环
s=0,i=1
i>n

s
1

s=s+i

i
2

false

i=i+1


Slide 103

2.2.3 循环结构
1、 For … Next循环语句
[例]

计算1+2+3+…+n

跟踪循环执行过程(n=5)

Private Sub Btn1_Click(ByVal sender As System.Object, ByVal e_ As System.EventArgs) Handles Btn1.Click

Dim i As Integer, n As Integer
Dim s As Integer
n = Val(TxtIn.Text) '从文本框输入n值
s = 0 '累乘变量初值必须为1
For i = 1 To n
s = s+ i
Next i
TxtOut.Text = s.ToString()
End Sub

第二次循环
s=0,i=1
i>n

s
3

s=s+i

i
3

false

i=i+1


Slide 104

2.2.3 循环结构
1、 For … Next循环语句
[例]

计算1+2+3+…+n

跟踪循环执行过程(n=5)

Private Sub Btn1_Click(ByVal sender As System.Object, ByVal e_ As System.EventArgs) Handles Btn1.Click

Dim i As Integer, n As Integer
Dim s As Integer
n = Val(TxtIn.Text) '从文本框输入n值
s = 0 '累乘变量初值必须为1
For i = 1 To n
s = s+ i
Next i
TxtOut.Text = s.ToString()
End Sub

第三次循环
s=0,i=1
i>n

s
6

s=s+i

i
4

false

i=i+1


Slide 105

2.2.3 循环结构
1、 For … Next循环语句
[例]

计算1+2+3+…+n

跟踪循环执行过程(n=5)

Private Sub Btn1_Click(ByVal sender As System.Object, ByVal e_ As System.EventArgs) Handles Btn1.Click

Dim i As Integer, n As Integer
Dim s As Integer
n = Val(TxtIn.Text) '从文本框输入n值
s = 0 '累乘变量初值必须为1
For i = 1 To n
s = s+ i
Next i
TxtOut.Text = s.ToString()
End Sub

第四次循环
s=0,i=1
i>n

s
10

s=s+i

i
5

false

i=i+1


Slide 106

2.2.3 循环结构
1、 For … Next循环语句
[例]

计算1+2+3+…+n

跟踪循环执行过程(n=5)

Private Sub Btn1_Click(ByVal sender As System.Object, ByVal e_ As System.EventArgs) Handles Btn1.Click

Dim i As Integer, n As Integer
Dim s As Integer
n = Val(TxtIn.Text) '从文本框输入n值
s = 0 '累乘变量初值必须为1
For i = 1 To n
s = s+ i
Next i
TxtOut.Text = s.ToString()
End Sub

第五次循环
s=0,i=1
i>n

s
15

s=s+i

i
6

false

i=i+1


Slide 107

2.2.3 循环结构
1、 For … Next循环语句
[例]

计算1+2+3+…+n

跟踪循环执行过程(n=5)

Private Sub Btn1_Click(ByVal sender As System.Object, ByVal e_ As System.EventArgs) Handles Btn1.Click

Dim i As Integer, n As Integer
Dim s As Interger
n = Val(TxtIn.Text) '从文本框输入n值
s= 0 '累乘变量初值必须为1
For i = 1 To n
s = s+ i
Next i
TxtOut.Text = s.ToString()

最后一次循环
s=0,i=1
i>n

false
s=s+i

True
s
15
i
6

i=i+1

End Sub

TxtOut.Text=f.ToString()


Slide 108

2.2.3 循环结构
1、 For … Next循环语句

如果输入的12个数为:
10 53 25 81 36 18 12 36 78 56 45 96

[例] 从12个给定数据中,找出其中的最大值以及该数在这12个数中的序号
Private Sub Btnsch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnsch.Click

Dim x As Integer
Dim i As Integer, max As Integer, ord As Integer
x = Val(InputBox(“请输入第 1 数据", "输入数据"))
max = x : ord = 1
For i = 2 To 12
x = Val(InputBox(“请输入第 “& i & ” 个数据", "输入数据"))
If max < x Then
max = x : ord = i
End If
Next i
TxtMax.Text = max.ToString()
TxtOrd.Text = ord.ToString()

第一次循环
i=2,max=10,ord=1
i>12
False
maxTrue
max=x,ord=i

End Sub

i=i+1

max=53
ord=2


Slide 109

2.2.3 循环结构
1、 For … Next循环语句

如果输入的12个数为:
10 53 25 81 36 18 12 36 78 56 45 96

[例] 从12个给定数据中,找出其中的最大值以及该数在这12个数中的序号
Private Sub Btnsch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnsch.Click

Dim x As Integer
Dim i As Integer, max As Integer, ord As Integer
x = Val(InputBox(“请输入第 1 数据", "输入数据"))
max = x : ord = 1
For i = 2 To 12
x = Val(InputBox(“请输入第 “& i & ” 个数据", "输入数据"))
If max < x Then
max = x : ord = i
End If
Next i
TxtMax.Text = max.ToString()
TxtOrd.Text = ord.ToString()
End Sub

第二次循环
i=2,max=10,ord=1
i>12
False
max
i=i+1

False


Slide 110

2.2.3 循环结构
1、 For … Next循环语句

如果输入的12个数为:
10 53 25 81 36 18 12 36 78 56 45 96

[例] 从12个给定数据中,找出其中的最大值以及该数在这12个数中的序号
Private Sub Btnsch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnsch.Click

Dim x As Integer
Dim i As Integer, max As Integer, ord As Integer
x = Val(InputBox(“请输入第 1 数据", "输入数据"))
max = x : ord = 1
For i = 2 To 12
x = Val(InputBox(“请输入第 “& i & ” 个数据", "输入数据"))
If max < x Then
max = x : ord = i
End If
Next i
TxtMax.Text = max.ToString()
TxtOrd.Text = ord.ToString()
End Sub

第三次循环
i=2,max=10,ord=1
i>12
False
maxmax=81
ord=4
True
max=x,ord=i
i=i+1


Slide 111

2.2.3 循环结构
1、 For … Next循环语句

如果输入的12个数为:
10 53 25 81 36 18 12 36 78 56 45 96

[例] 从12个给定数据中,找出其中的最大值以及该数在这12个数中的序号
Private Sub Btnsch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnsch.Click

Dim x As Integer
Dim i As Integer, max As Integer, ord As Integer
x = Val(InputBox(“请输入第 1 数据", "输入数据"))
max = x : ord = 1
For i = 2 To 12
x = Val(InputBox(“请输入第 “& i & ” 个数据", "输入数据"))
If max < x Then
max = x : ord = i
End If
Next i
TxtMax.Text = max.ToString()
TxtOrd.Text = ord.ToString()
End Sub

第四次循环
i=2,max=10,ord=1
i>12
False
max
i=i+1

False


Slide 112

2.2.3 循环结构
1、 For … Next循环语句

如果输入的12个数为:
10 53 25 81 36 18 12 36 78 56 45 96

[例] 从12个给定数据中,找出其中的最大值以及该数在这12个数中的序号
Private Sub Btnsch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnsch.Click

Dim x As Integer
Dim i As Integer, max As Integer, ord As Integer
x = Val(InputBox(“请输入第 1 数据", "输入数据"))
max = x : ord = 1
For i = 2 To 12
x = Val(InputBox(“请输入第 “& i & ” 个数据", "输入数据"))
If max < x Then
max = x : ord = i
End If
Next i
TxtMax.Text = max.ToString()
TxtOrd.Text = ord.ToString()
End Sub

最后一次循环
i=2,max=10,ord=1
i>12
False

True

False

maxmax=96
ord=12
True
max=x,ord=i
i=i+1


Slide 113

2.2.3 循环结构
2、While…End While循环语句
语法格式为:
While 条件
循环体
End

While

功能:当条件成立(为True)时,执行循
环体,之后重新判断条件;当条件不成立
(为False)时,终止循环,接着执行下一
条语句。


Slide 114

[例]用辗转相除法求两个数m,n的最大公约数和最小公倍数。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim m,n,r,x,y,z As Integer
m=TextBox1.Text
n=TextBox2.Text
x=m
y=n
' 保存最初两个数的值给x和y,以备求最小公倍数使用
r=m Mod n
While r<>0
m=n
n=r
r=m Mod n
End While
z=x*y/n
' 求最小公倍数
MsgBox("最大公约数为"+Str(n)+vbCrLf+"最小公倍数为"+Str(z),, "求最大公约数和
最小公倍数")
End Sub


Slide 115

2.2.3 循环结构
3、 Do…loop 循环语句
•前测型Do…loop循环:
Do {while | until} 条件
循环体

若选用while条件,则称为
当型循环,其功能是:当
条件成立(为True)时,执
行循环体,然后再测试条
件,若条件不成立(为
False)时,终止循环。
False

loop

条件

True
循环体

后继语句
当型循环流程图


Slide 116

2.2.3 循环结构
3、 Do…loop 循环语句
•前测型Do…loop循环:
Do {while | until} 条件

若选用until条件,则称为
直到型循环。与当型循环
的区别在于条件不成立时,
执行循环体,若条件成立,
则终止循环。

循环体
loop

True
条件
False
循环体

后继语句
直到型循环流程图


Slide 117

2.2.3 循环结构
3、 Do…loop 循环语句
•前测型Do…loop循环:
Do {while | until} 条件
循环体
loop

循环条件一般是关系表
达式或逻辑表达式,也

可以是其它任何形式表
达式,不管表达式形式
如何,结果都作为逻辑

量(True或False)。


Slide 118

2.2.3 循环结构
3、 Do…loop 循环语句
•后测型Do…loop循环语句:

Do
循环体
loop {while | until} 条件
功能:先执行循环体,然后判断条件,根据条
件成立与否决定是否继续执行循环,其中
while和until的用法与前测型Do … loop语句

相同。


Slide 119

[例]判断一个数n 是否为素数。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click

Dim n,i As Integer
Dim flag As Boolean
n=InputBox("请输入一个数值n:","判断素数")
flag=Ture
Do
Do
Do Until i>Sqrt(n)
i=2
If
If
Mod
i=0
Then
Do While i<=Sqrt(n)
If nn
n Mod
Mod i=0
i=0 Then
Then
flag=False
flag=False
If n Mod i=0 Then
flag=False
Exit
Exit
Do
flag=False
Exit Do
Do
Exit Do
End
End
If
End If
If
End If
i=i+1
i=i+1
i=i+1
i=i+1
Loop
Loop
Until i<=Sqrt(n)
i>Sqrt(n)
Loop While
Loop
If flag Then
MsgBox(Str(n)+"是素数!",,"判断素数")
Else
MsgBox(Str(n)+"不是素数!",,"判断素数")
End If
End Sub


Slide 120

2.2.3 循环结构
4、循环嵌套

循环结构内包含
多个循环结构

循环结构内包含
多重循环结构

循环结构出
现交叉

循环嵌套是指在一个循环结构的循环体内
包含有一个或多个循环结构。


Slide 121

[例]输出如下图形。
Private Sub Button1_Click(ByVal sender As
*
System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
***
Dim i,j As Integer
*****
Dim str1 As String
*******
str1=""
*********
For i=1To 5
str1=str1+Space(11-i)
For j=1To 2*i-1
str1=str+"*"
Next
str1=str1+vbCrLf
Next
MsgBox(str1,,“结果为”)
End Sub


Slide 122

2.2.3 循环结构
5、其他控制语句
•Go To 语句

语法格式为:
Go To{标号 | 行号}

标号是一个字符序列,首字符必须是字母,
与大小号无关,标号后应有冒号;行号是
一个数字序列。
该语句的作用是在执行时无条件地转移到
标号或行号所指定的语句去执行。


Slide 123

2.2.3 循环结构
5、其他控制语句
•Exit 语句

语法格式为:
Exit {For | Do|While}
当程序运行遇到Exit语句时,不再执行循环体
中的任何语句而被强制退出,转到循环语句的
下一条语句继续执行。
通常情况下,Exit语句与If或Select case语
句配合使用,即根据条件成立与否,决定是否
退出循环。


Slide 124

2.2.3 循环结构
5、其他控制语句
•End 语句

语法格式:End
End语句可以强行终止程序代码的执行,消除所有变量,
并关闭所有数据文件。在程序运行中,用户也可以单击
工具框上的“结束“按钮来强行结束程序的运行。


Slide 125

2.3 数组
2.3.1 数组的定义
2.3.2 数组的初始化
2.3.3 数组元素的引用
2.3.4 动态数组
2.3.5

For

Each …Next语句


Slide 126

2.3.1 数组的定义
数组应该先定义后使用。定义数组可以使用Dim、ReDim、
Static、Public、Protected、Private等语句:
Dim:用于模块或过程中;
ReDim:只用于过程中,定义动态数组;
Static:只用于过程中,定义静态数组;
Public:用于模块中,定义全局数组 。


Slide 127

2.3.1 数组的定义
1.一维数组的定义
Dim 数组名(下标上界)As 类型名
Dim Myarray(5) As Integer
说明:
(1)“数组名”的命名规则与变量相同。
(2)如果省略“As 类型名”,则定义的数组为Object类型。


Slide 128

2.3.1 数组的定义
1.一维数组的定义
(3)定义数组时只指定数组下标的上界,其下界为0,
而且不能改变。
(4)定义时,系统会把
数值型数组中的所有元素初始化为0;
字符类型的数组初始化为空字符串;
布尔型的数组初始化为False等。
(5)通常,数组各元素的类型是相同的。但是,当定义
的数组是Object类型时例外。


Slide 129

2.3.1 数组的定义
1.一维数组的定义(内存分配示意图)

Myarray(0)

内存单元

Myarray(2)

……

Myarray(4)

……

Myarray(1)

Myarray(5)
Myarray(3)


Slide 130

2.3.1 数组的定义
2.二维数组的定义
格式:

Dim 数组名(第一维下标上界,第二维下标上界) As
Dim Arr(3,4)As Integer

类型名


Slide 131

2.3.1 数组的定义
2.二维数组的定义
(1)二维数组在内存中“按行存放”。
(2)定义的二维数组a(m,n),其第i行第j列的元素a

(i,j)在数组中的排列位置可以用i×(n+1)+j+1计算。
(3)在同一定义体中定义的变量、一维数组和二维数
组必须是同一类型的数据。
Dim d,a(2),b(2,1) As Integer


Slide 132

2.3.1 数组的定义
内存单元

2.二维数组的定义
(内存分配图)

对应元素
A(0,0)
A(0,1)

A(0,2)

Dim a(2,3) as integer
则数组元素在内存中的
存储。

A(0,3)
A(1,0)
A(1,1)
A(1,2)
A(1,3)
A(2,0)
A(2,1)
A(2,2)
A(2,3)


Slide 133

2.3.2 数组的初始化
1.一维数组的初始化
Dim 数组名()As 类型 = {常量1,常量2,…,常量n}
数组初始化时,不能指定下标的上界;
元素个数由花括号中的常量个数决定;
各常量之间用逗号隔开;
常量的类型要与数组类型一致。
Dim numbers( ) As Single = {12,25,-6,5.1,0 }


Slide 134

2.3.2 数组的初始化
2.二维数组的初始化
Dim 数组名(,)As 类型 = {{第一行值},{第二行值},…,{第n行值}}

内层花括号的个数等于二维数组的行数;
第一维下标的上界等于内层花括号个数减1 ;
内层花括号中常量的个数等于二维数组的列数;

第二维下标的上界等于内层花括号中常量的个数减1。
初始化二维数组时,每维数据的个数要一致。


Slide 135

2.3.2 数组的初始化
3.多维数组的初始化
对于一个n(n>=3)维数组来说,初始化时,等
号左边括号中要用n-1个逗号指定数组维数,等号右

边的花括号中的初值要放在n-1层嵌套的花括号中。

Dim a( , , ) As Integer = {{{1,1,4},{5,2,1}},{{1,5,7},{4,3,7}}, {{0,5,3},{0,1,1}}}


Slide 136

2.3.2 数组的初始化
4. UBound函数和LBound函数
格式:UBound(数组名[,n])
LBound(数组名[,n])
UBound函数返回指定数组第n维的下标上界值;
LBound函数返回指定数组第n维的下标下界值。
如果数组是一维数组,参数n可以省略。
Dim a(,) As Short = {{2, 3}, {1, 2}, {5, 4}}
DeBug.WriteLine(UBound(a, 1))
DeBug.WriteLine(LBound(a, 2))


Slide 137

2.3.3 数组元素的引用
数组名(下标1[,下标2,……,下标n])
下标可以是整型常数、变量或整型表达式;
下标取值必须在指定范围之内,即0到下标上界;
在引用数组元素时,数组名和维数必须与定义数
组时一致。

Dim a()As Short = {3,2,4,9}
Dim b(1,1)As Short
b(1,0)= a(2)+ a(1)

b(1,1)= a(0)- a(3)


Slide 138

相关程序题:
 累加
 累乘
 数列的极值
 冒泡排序
 选择排序
 逆序输出
 查找(顺序、二分)


Slide 139

2.3.4 动态数组
1.动态数组的定义
动态数组的定义分两个步骤:
(1)用Dim、Public、Private等语句声明一个只有括
号但没有下标的数组。
(2)在过程中用ReDim语句重定义数组时,指定动态数
组的下标上界。


Slide 140

2.3.4 动态数组
1.动态数组的定义
用Dim语句定义
好的动态数组

使用ReDim语句的格式为:
ReDim
保留上次数组
各元素的值

[Preserve]

数组名(下标上界)
被赋过值的
变量


Slide 141

2.3.4 动态数组
1.动态数组的定义
使用ReDim语句:

可以多次对同一数组进行重定义,并对数组中的元素个数

进行修改;

不能改变数组的维数和类型。


Slide 142

2.3.4 动态数组
1.动态数组的定义
Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles _
MyBase.Click
Dim arr()nAs= Integer,
n As Integer
1arr() As
Dim
Integer, n As Integer
n=1
ReDim arr(n)
ReDim arr(n)
arr(0)
arr(0) = 56
: arr(1)==56
3 : arr(1) = 3
n
=
2
Debug.WriteLine(arr(0)
& " " & arr(1)) & " " & arr(1))
Debug.WriteLine(arr(0)
ReDim
arr(n)
n=2
ReDimarr(2)
arr(n) = 23
arr(2)
= 23
n=4
Debug.WriteLine(arr(0)
& " " & arr(1) & " " & arr(2))
Debug.WriteLine(arr(0)
" " & arr(1) & " " & arr(2))
ReDim Preserve &
arr(n)
n=4
arr(3) = -10 : arr(4) = 24
ReDim Preserve arr(n)
Debug.WriteLine(arr(0)
& " " & arr(1) & " " & arr(2) & " “ _
arr(3)
= -10 : arr(4) = 24
Debug.WriteLine(arr(0)
& " " & arr(1) & " " & arr(2) & " " & arr(3) _& " " & arr(4))
& arr(3) _& " " & arr(4))
End Sub


Slide 143

2.3.4 动态数组
2.Erase语句
Erase 数组名

释放数组的存储空间;
只能用在过程中。


Slide 144

相关程序题:
 数据的位置插入
 数据的位置删除
 数据的值插入
 数据的值删除
 有序的值插入


Slide 145

2.3.5 For Each…Next循环语句
For Each element In 数组名
循环体
Next element

For Each … Next语句专门用于数组或对象集合
中的每个成员的处理 。
其中,element是一个变量,在遍历数组时用来暂
时保存遍历到的那个元素。element的数据类型必
须与数组元素的类型一致。


Slide 146

[例]使用For Each…Next语句语句对数组a中所的元素求和。

Dim a( ) As Integer={1,2,3,4,5}
Dim s ,k As Integer
For Each k In a
s+=k;
Next
MsgBox(s)


Slide 147

2.4 过程
2.4.1 Sub过程

2.4.2 Function过程
2.4.3 参数传递
2.4.4 变量的作用域

2.4.5 递归过程


Slide 148

过程可分为事件过程和通用过程。
事件过程是当某个事件发生时,对该事件做

出响应的程序段。
将这一段代码抽象出来,建立一个独立的、
可供其它过程调用的过程,这样的过程称为通用过程。
通用过程主要包括Sub过程和Function过程
两类,前者也被称作子过程,后者称作函数过程。


Slide 149

过程

事件过程

通用过程

Sub过程

Function过程


Slide 150

2.4.1 Sub过程
1. Sub过程的定义
Sub过程的定义形式:
[Public|Private] [Static] Sub 过程名([形式参数列表])
<局部变量或常量定义>
<语句块>
[Exit Sub]
<语句块>
End Sub


Slide 151

2.4.1 Sub过程
1. Sub过程的定义
【例】实现两个浮点型变量值之间的交换。
Private Sub Swap(ByRef A As Single,ByRef B As Single)

Dim T As Single
T=A
End Sub

: A=B

: B=T


Slide 152

2.4.1 Sub过程
1. Sub过程的定义
Sub过程以Sub开头,以End Sub结束,两者之间称为
“过程体”。
过程名的命名规则与变量名相同。
Sub过程通过形参与实参的传递得到结果,调用时可返
回多个值。
 Exit Sub的功能是退出Sub过程,其目的是用于提前结

束本次过程调用。
[Private|Public]分别表示模块级的(私有的)过程和公
有的或全局的过程。默认为Public


Slide 153

2.4.1 Sub过程
1. Sub过程的定义
 [ByVal|ByRef] 变量名[( )] [As 类型],…
① 仅表示形式参数的类型、个数和次序;
② 在过程定义时并无具体值,也不分配存储空间;
③ 在过程被调用时,通过与实际参数结合获得具体的值。
④ ByVal表示当该过程被调用时,参数是按值传递的;

⑤ ByRef表示当该过程被调用时,参数是按地址传递的。
⑥ 形式参数也可以是数组。
在上例中,也可以将形式参数写成如下形式:

Private Sub Swap(ByRef A!,ByRef B!)


Slide 154

2.4.1 Sub过程
2. 建立Sub过程的方法
过程可以在窗体中建立也可以在模块中建立。
窗体:直接代码编辑器窗口输入要建立的通用过程。
模块: 模块代码以Module开头,以End Module结尾。
在模块中建立通用过程的一般步骤如下:
(1) 选择“项目”“添加模块”命令,出现“添加新项”对话
框。
(2) 在“添加新项”对话框的“模板”内选择“模块”,在
“名称”文本框中输入模块文件名,单击“打开”按钮,在代
码对话框中显示建立的该模块的模板。
(3) 在Module Module1下面输入要建立的通用过程代码。
(4) 选择“文件”“保存 Module1.vb”命令,保存模块文件。


Slide 155

2.4.1 Sub过程
3. Sub过程的调用
Sub过程的调用格式如下:
过程名([实参列表])|Call

过程名([实参列表])

为形参分配临时的存储单元;
① 将实参的值传递给形参对应的临时单元;

② 执行过程体中的语句;
③ 当过程运行结束后把临时单元释放掉;
④ 执行调用语句的下一条语句。


Slide 156

2.4.1 Sub过程
3. Sub过程的调用
实参: X
Private Sub _
Button1_Click(ByVal sender _
As System.Object, ByVal e _
As System.EventArgs) _
Handles Button1.Click

Y

3.95

形参:A

-12.2

B

3.95
-12.2

-12.2
3.95

调用过程
传值过程

T
3.95

Dim X,Y As Single
X=3.95 :Y=-12.2
Swap(X,Y)
TxtOutput.Text = “X=” + _
X.ToString( ) + “ Y=” + _
Y.ToString( )
End Sub

Private Sub Swap(ByVal _
A As Single,ByVal B As _
Single)
Dim T As Single

T=A:
A=B:
End Sub

B=T


Slide 157

2.4.2 Function过程
1、 Function过程的定义
Function过程的定义形式:
[Public|Private] [Static] Function 过程名([形式参数
列表])[As 类型]
<局部变量或常量定义>
<语句块>
[Exit Function]
<语句块>

End Function


Slide 158

2.4.2 Function过程
1、 Function过程的定义
Function过程以Function开头,以End Function结束,
两者之间称为“过程体”。

过程体中至少有一条Return语句:

Return 表达式。

调用时,过程的返回值即该表达式的值。

“As 类型”指定Function过程返回值的数据类型。


Slide 159

2.4.2 Function过程
1、 Function过程的定义
计算阶乘的Function过程。
Function Fact(ByVal N As Integer) As Long
Dim i As Integer
Dim Result As Long
Result=1
For i=1 to N

Result = Result * i
Next i
Return Result
End Function


Slide 160

2.4.2 Function过程
2、 Function过程的调用
Function过程可以作为表达式的一个运算分量来使用。
它的调用形式为:
过程名 ([实际参数表])
调用计算阶乘的Function过程的程序段代码:
Dim X As Integer,Y As Long
X=Val(InputBox(“请输入一个不大于10的自
然数:”))
Y=Fact(X)


Slide 161

2.4.3 参数传递
设计过程时要指定形式参数,包括形式参数的个数及
其类型;
在调用过程时,必须提供实际参数;

完成实际参数与形式参数的结合,称为参数传递。
参数传递分传值和地址传递两种方式。


Slide 162

2.4.3 参数传递
形式参数是指过程调用时由外部提供的数据或者过
程计算结果或者描述过程计算结果需要返回的量。
实际参数是指在调用通用过程时,出现在过程名后
一对圆括号内的变量、常量或表达式。
实参可以是常量、变量、表达式或数组名等形式。
形、实参表中的各个参数用逗号分隔。

在过程调用时,实际参数应在个数、类型和次序上与
形式参数保持一致。


Slide 163

2.4.3 参数传递
形参

Function Fact(ByVal N As Integer) As Long
Dim i As Integer
Dim Result As Long
Result=1
For i=1 to N
Result = Result * i
Next i
Return Result
End Function
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim X As Integer,Y As Long
X=Val(InputBox(“请输入一个不大于10的自然数:”))
Y=Fact(X)
实参
End Sub


Slide 164

2.4.3 参数传递
1、 值传递

ByVal表明调用过程时对应的实参与形参之间按传值方
式传递数据。

系统为形参分配临时存储单元,并将实参的值传送给形参;
在过程内部改变形参的值时,并不会影响到实参的值。

实参可以是常量、变量或表达式,而变量必须有确定的值。


Slide 165

1、 值传递
Private Function fun1(ByVal x%,ByVal y%) As Integer
Function
fun1(ByVal x%,ByVal y%) As Integer
Dim Private
sum As
Integer
x=x*xDim sum As Integer
y=y*yx=x*x
y=y*y
sum=x+y
sum=x+y
Return
sumsum
Return
EndSub
Function
EndButton1_Click(ByVal
Function
Private
sender As System.Object, _
Sub Button1_Click(ByVal
sender
As System.Object, _
ByVal e AsPrivate
System.EventArgs)
Handles
Button1.Click
ByValAe,B
As,C
System.EventArgs)
Handles Button1.Click
Dim
As Integer
A=5 Dim A ,B ,C As Integer
A=5
B=8 B=8
C=fun1(A,B)
C=fun1(A,B)
TxtOutPut.Text
= "A="
++
A.ToString()
"B="
TxtOutPut.Text
= "A="
A.ToString() ++" "" "
++
"B="
+ _+ _
B.ToString()
+ " +计算结果="
+ C.ToString()
B.ToString()
" 计算结果="
+ C.ToString()
End Sub
End Sub


Slide 166

2.4.3 参数传递
2、 地址传递
ByRef表明调用过程时对应的形参与实参之间按传地
址方式传递数据。
参数的传递是将实参的地址传递给形参,即形参与实
参共享相同的存储单元。
当过程中对形参的值更改时,将更改相应实参的值。
实参可以是变量或数组,而不能是常量或表达式。


Slide 167

2、 地址传递
Private Sub _
Button1_Click(ByVal sender _
As System.Object, ByVal e _
As System.EventArgs) _
Handles Button1.Click
Dim X,Y As Single
X=3.95 :Y=-12.2
Swap(X,Y)
TxtOutput.Text = “X=” + _
X.ToString( ) + “ Y=” + _
Y.ToString( )
End Sub

实参: X

Y

3.95

-12.2

3.95
-12.2

-12.2
3.95

形参:A

B

3.95

T

Private Sub Swap(ByRef _
A As Single,ByRef B As _
Single)
Dim T As Single

T=A:
A=B:
End Sub

B=T











Slide 168

2.4.4 变量的作用域
1.语句块级变量
语句块是由End、Else、Loop或Next语句终止的语
句集合。例如:
For…Next
If…Then…Else…End If
在某块内声明的变量只能在该块内使用。例如:
If XDim T As Integer
T=X : X=Y : Y=T
End If

T的作用域


Slide 169

2.4.4 变量的作用域
2.过程级变量
在某过程内声明的变量只能在该过程内
部使用,该变量称为“局部变量”。例如:
Private Sub Button1_Click(ByVal sender As
_ System.Object, ByVal e As
System.EventArgs) _ Handles Button1.Click
Dim AA As Integer

End Sub

AA的作用域


Slide 170

2.4.4 变量的作用域
2.过程级变量
Private
SubS1(
S1())
Private
Sub
Dim a, b As Integer
Dim
a, b As Integer
a = 11 : b = 22: a = a + 1: b = b + 1
a =TxtOutPut.Text
11 : b = 22: =a"a="
= a++ a.ToString()
1: b = b +
+ "1 b=" + b.ToString()
TxtOutPut.Text
= "a=" + a.ToString() + " b=" + b.ToString()
End Sub
Private
S2( )
EndPrivate
SubSub
Sub S2( )
Dim
a, a,
c As
Dim
c AsInteger
Integer
a =a33
: c: =c =44:
44: aa == aa –
1: cc==cc– –1 1
= 33
– 1:
TxtOutPut.Text
a.ToString()
+ "+ c="
+ c.ToString()
TxtOutPut.Text == "a="
"a=" ++a.ToString()
+ " c="
c.ToString()
EndEnd
Sub
Sub
Private
Sub Button1_Click(ByVal sender As System.Object, _
Private
Button1_Click(ByVal Handles
sender AsButton1.Click
System.Object, _
ByVal
e AsSub
System.EventArgs)
ByVal e As System.EventArgs) Handles Button1.Click
Call S1()
Call S1()
MsgBox("按任意键继续!")
MsgBox("按任意键继续!")
CallCall
S2()
S2()
EndEnd
Sub
Sub


Slide 171

2.4.4 变量的作用域
3.模块范围
包括VB.NET中的模块、类和结构。可以通过
将声明语句放在模块、类或结构中的任一过程或块
的外部来声明该级别的元素。

4.全局变量
全局变量在过程外部定义,可以被该模块的所
有过程调用。


Slide 172

2.4.4 变量的作用域
注:当全局变量和局部变量同名时,全局被屏蔽,
局部变量生效。

【例】局部变量与全局变量的区别。


Slide 173

Dim a As Integer
Private Sub S1()
Dim b As Integer
Dimba= As
Private
Sub
Integer
S1()
20
Dim
a =baAs
+ 1Integer
b =b 20
=b+1
Private
a =TxtOutPut.Text
a +Sub
1 S2() = “a=” + a.ToString() + “ b=” + b.ToString()
Dim
bEnd
= bbSub
+As
1 Integer
b=
30 Sub S2() = “a=” + a.ToString() + “ b=” + b.ToString()
Private
TxtOutPut.Text
a =Dim
aSub
+1b As Integer
End
30
b =b=
b +1
a = a +1
TxtOutPut.Text
= “a=” + a.ToString()
“ System.Object,
b=” + b.ToString()
Private
Sub Button1_Click(ByVal
sender +As
_ ByVal
b = b +1
End
Sub
e AsTxtOutPut.Text
System.EventArgs)
Handles Button1.Click
= "a=" + a.ToString()
+ " b=" + b.ToString()
a=10
End Sub
Call
S1()Sub Button1_Click(ByVal sender As System.Object, _
Private
MsgBox("按任意键继续!")
ByVal e As System.EventArgs) Handles Button1.Click
Calla=10
S2()
EndCall
SubS1()
MsgBox("按任意键继续!")
Call S2()
End Sub


Slide 174

2.4.5 递归过程
递归就是一个过程调用过程本身。递归调用中,
一个过程执行的某一步要用到它自身的上一步(或
几步)的结果。
递归分为两种类型,一种是直接递归,即在过程
中调用过程本身;一种是间接递归,即间接地调用
一个过程。
递归用过程可以分为“递推”和“回归”两个阶段。
实现:
“递推”和“回归”的递归计算公式;
一个结束递归过程的条件。


Slide 175

2.4.5 递归过程

语句结构如下:
If 递归结束条件 Then
函数名=递归终止值︱Return(递归终止值)
Else
函数名=递归计算公式︱Return(递归计算公式)
End if


Slide 176

2.4.5 递归过程
[例]递归算法求n!
Function Fac(ByVal x As Integer) As Long

If x = 1 Then Return 1 Else Return (x * Fac(x - 1))
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As_ System.EventArgs) Handles Button1.Click

Dim m As Integer
Dim n As Long
m = Val(TextBox1.Text)
n = Fac(m)
TextBox2.Text = Str(m) & "!=" & Str(n)
End Sub


Slide 177

2.4.5 递归过程
返回120

Fac(5)
返回24
Fac(4)
返回6
Fac(3)
返回2
Fac(2)
返回1
Fac(1)