文档库 最新最全的文档下载
当前位置:文档库 › VB12_2

VB12_2

VB12_2
VB12_2

6.5 递归P145

一个函数在内部自己再次调用自己(循环)

例:猴子摘桃子问题, tz(1)=(tz(2)+1)*2

Tz(n)=(tz(n+1)+1)*2

Private Sub Command1_Click()

Print tz(9)

Print tz(8)

Print tz(1)

End Sub

Private Function tz(n As Integer) As Integer

If n = 10 Then

tz = 1

Else

tz = (tz(n + 1) + 1) * 2

End If

End Function

例,求jc(n)=n!

Jc(n)=n*jc(n-1)

Private Sub Command1_Click()

Print jc(1)

Print jc(5)

End Sub

Private Function jc(n As Integer) As Long

If n = 1 Then

jc = 1

Else

jc = n * jc(n - 1)

End If

End Function

6.6 变量作用域范围与生命期

1 局部变量

Prvaite 或dim 定义的,在过程/函数内部首次定义的变量(仅作用于本过程/函数内部,外部不能引用)

在一个窗体的首部的“通用”处用private或dim定义的变量(可作用于本窗体所有过程/函数)

例:

Private m As Integer '窗体级变量

Public x As Integer 'x不但本窗体可用,其它窗体也可引用

Private Sub Command1_Click()

Dim n As Integer

n = 100 '过程局部变量

m = m + 1

Print n, m

x = x + 10

Print x

kk = 100

x1 = 1000

End Sub

Private Sub Command2_Click()

Dim n As Integer

n = 200 '过程局部变量

m = m + 1

Print n, m

x = x + 10

Print x

x1 = x1 + 1000

End Sub

Private Sub Command3_Click()

Form2.Show

End Sub

2 全局变量:(1)上例中在通用处定义的public 变量

注意:全局变量不能定义在过程/函数内部的

(2)模块级全局变量

工程---添加模块(模块是程序运行自动先运行的一段初始化准备程序)

注意:如果过程/函数内重新定义了外部的或全局的同名变量,则本过程内部以自定义的变量为准,屏蔽外面其它同名变量

Private Sub Command4_Click()

Dim x1 As Integer '自定义一个x1,屏蔽掉模块中x1

x1 = x1 + 10

Dim m As Integer '自定义一个m,屏蔽通用中的m

m = m + 1

Print x1, m ’10 1

End Sub ‘x1和m与外面无关

3 静态变量

引例:

Private Sub Command1_Click()

Call t1(3)

End Sub

Private Sub t1(n As Integer)

Dim s As Integer

s = s + n

Print s

End Sub 输出3(调用t1时传n,输出n)

例:Private Sub Command1_Click()

Call t1(3)

End Sub

Private Sub t1(n As Integer)

Static s As Integer

s = s + n

Print s

End Sub

多次点击按钮,得3,6,9….

Static变量在过程结束时,不消失,要保留本次计算的结果,供下次接着使用

Private Sub Command1_Click()

's=1+(1+2)+(1+2+3)+...(1+2+3+4+5)

Dim i As Integer

s = 0

For i = 1 T o 5

s = s + t1(i)

Next i

Print s

End Sub

Private Function t1(n As Integer) As Long Static s As Integer

s = s + n

t1 = s

End Function

6.7 过程示例P149

6-4 :

Dim a(10) As Integer

Private Sub Command1_Click()

For i = 1 T o UBound(a)

a(i) = Int(Rnd() * 999) + 1

Next i

For i = 1 T o 10

Print (a(i) - min(a)) / (max(a) - min(a)) Next i

End Sub

Function max(a() As Integer) As Integer max = a(1)

For i = 1 T o UBound(a)

If a(i) > max Then max = a(i)

Next i

End Function

Function min(a() As Integer) As Integer min = a(1)

For i = 1 T o UBound(a)

If a(i) < min Then min = a(i)

Next i

End Function

Private Sub Command2_Click()

End Sub

例6-6 升序数

Private Sub Command1_Click()

Dim a(10) As Long

For i = 1 T o UBound(a)

a(i) = Int(Rnd() * 1000) + 100

Print a(i), sx(a(i))

Next i

End Sub

Function sx(n As Long) As Boolean

f = True '假设x是升序数

s = Trim(Str(n))

For i = 1 T o Len(s) - 1

If Mid(s, i + 1, 1) <= Mid(s, i, 1) Then

f = False

Exit For

End If

Next i

sx = f

End Function

方法2: 只改写sx函数(类似于素数判断)Function sx(n As Long) As Boolean

s = Trim(Str(n))

For i = 1 T o Len(s) - 1

If Mid(s, i + 1, 1) <= Mid(s, i, 1) Then Exit For Next i

If i > Len(s) - 1 Then

sx = True

Else

sx = False

End If

End Function

例子6-7

Private Sub Command1_Click()

Dim a(10) As Integer

For i = 1 T o UBound(a)

a(i) = Int(Rnd() * 100) + 10

Print a(i);

Next i

Print

Call sort(a)

For i = 1 T o UBound(a)

Print a(i);

Next i

End Sub

Private Sub sort(a() As Integer)

k = 1

For i = 2 T o UBound(a)

x = a(i) '把x插入到已经有k个有序数据的数组a中

For j = k T o 1 Step -1 '从右向左把大于x的数向右移动一位

If a(j) > x Then

a(j + 1) = a(j)

Else '发现第一个小于或等于x的数

Exit For '退出,此退出时的位置的后面就是x应该的位置End If

Next j

a(j + 1) = x '插入数x

k = k + 1 '有序数列的数多一个

Next i

End Sub

例6-9 未完成

Private Sub Command1_Click()

Call ss("abc")

End Sub

Sub ss(s As String)

If Len(s) = 1 Then

Print s

Else

ss (Mid(s, 1, Len(s) - 1))

End If

End Sub

相关文档