例5-10 利用递归求最大公约数。
程序如下:
Private Sub Command1_Click()
Dim x As Integer, y As Integer
Cls
x = CInt (InputBox("请输入第一个整数"))
y = CInt (InputBox("请输入第二个整数"))
Print x & "和" & y & "的最大公约数为" & gcd (x, y)
End Sub
Public Function gcd (m As Integer, n As Integer) As Integer
If (m Mod n = 0) Then
gcd = n
Else
gcd = gcd (n, m Mod n)
End If
End Function
在上述gcd函数中,若没有语句
If (m Mod n = 0) Then gcd = n
即只有gcd = gcd (n, m Mod n)
根据递归的处理过程,程序运行会出现“除数为0”的错误。由此可见,构成递归的条件为:
(1)递归结束条件及结束时的值。
(2)能用递归形式表示,并且递归向终止条件发展。
1.新建一个标准EXE工程。
2.设计窗体
窗体上放置三个标签框控件,三个文本框控件和一个命令按钮,程序运行后窗体界面如图5-1所示。
按表5-3设置各控件的主要属性。
表5-3 数制转换窗体及控件的属性设置
|
默认对象名称 |
设置对象名称 (Name属性) |
标题属性 (Caption) |
其他属性 |
|
Form1 |
使用默认对象名称 |
数制转换 |
|
|
Label1 |
输入R进制(2~16) |
| |
|
Label2 |
输入R制数 |
| |
|
Label3 |
转换成十进制数 |
| |
|
Text1~ Text3 |
无定义 |
Text属性为空 | |
|
Command1 |
转换 |
|
3.编写程序代码
“转换”按钮的Click事件代码:
Private Sub Command1_Click()
Dim r As Integer, st As String
r = Val(Text1.Text)
st = Text2.Text
Text3.Text = str (toDec (st, r)) ' 调用转换函数
End Sub
Text1文本框的LostFocu事件代码:
Private Sub Text1_s() ' 判断Text1的内容是否超出指定范围
If Val (Text1.Text) < 2 Or Val (Text1.Text) > 16 Then
MsgBox ("输入的进制数超出范围,请重新输入")
Text1.Text = ""
Text1.SetFocus
Else
Label2.Caption = "输入" & Text1.Text & "进制数"
End If
End Sub
“转换”函数过程代码:
Public Function toDec (str$, r%) As Integer
Dim tmp As String * 1, i As Integer
Dim k As Integer, n As Integer, sum As Long
n = Len (Trim(str))
sum = 0
For i = n To 1 Step -1
tmp = Mid (str, i, 1) ' 从右到左逐位取数码
Select Case tmp ' 确定逐位取出的数码值
Case "A", "a"
k = 10
Case "B", "b"
k = 11
Case "C", "c"
k = 12
Case "D", "d"
k = 13
Case "E", "e"
k = 14
Case "F", "f"
k = 15
Case Else
k = Va l(tmp)
End Select
sum = sum + k * r ^ (n - i) ' 按数码位不同码值进行转换
Next i
toDec = sum
End Function