Else
MsgBox x & \非回文数\ End If End Sub
例6-12 设计一个数值转换函数,能够将十进制整数转换成16进制以内的任意进制数。 分析:十进制数转换成n进制,常采用的方法是“除n取余,余数倒写”,当n大于9时,需要把大于9的余数转换成字母。为了方便转换,可以将余数0~9、A~F分别放在一个字符串数组中。
转换函数过程名为DecToN有两个参数,一个是待转换的十进制整数,一个是需要转换的进制。转换结果是一个字符串(即函数值为一个字符型),程序代码如下:
Function DecToN(ByVal x%, ByVal n%) As String Dim p() As String, y$, r%
p = Split(\ If n > 16 Then DecToN =\ Exit Function End If y = \ Do
r = x Mod n x = x \\ n y = p(r) & y Loop Until x = 0 DecToN = y End Function
Private Sub Command1_Click() Dim x%, n%, y$
x = InputBox(\请输入待转换的十进制整数!\数值转换\
n = InputBox(\请输入需要的进制,注意不要大于16\数值转换\ y= DecToN(x, n) If y<>\
MsgBox \转换结果:\
Else
MsgBox \对不起!本程序不能转换超过16的进制!\
End if
End Sub
6.5 过程的递归调用
简单地说,递归就是一个过程调用自己本身。VB的过程具有递归调用功能。许多问题都具有递归的特性,用递归调用来解决会非常方便。
例6-13 利用递归调用计算n!。
分析:根据阶乘的定义,求n的阶乘可以转换为求n*(n-1)!,利用过程递归来完成。
n!= 1 n=0 n*(n-1)! n>0 -154-
代码如下:
Function fact(n) As Double If n > 0 Then
fact = n * fact(n - 1) Else
fact = 1 End If
End Function
Private Sub Command1_Click() Dim n As Integer, m As Double n = Val(Text1.Text) If n < 0 Or n > 20 Then
MsgBox \非法数据\请输入0-20之间的整数\ Exit Sub End If m = fact(n)
Label1.Caption = m End Sub
说明:当n>0时,在过程fact中调用fact过程,参数为n-1,这种操作一直持续到n=0为止。下面以n=5为例,说明递归调用的过程。
递归级别 执行操作 1 fact(5) 2 fact(4) 3 fact(3) 4 fact(2) 5 fact(1) 6 返回1 fact(1) 7 返回2 fact(2) 8 返回6 fact(3) 9 返回24 fact(4) 10 返回120 fact(5)
要编写递归过程的关键是写出能构成递归的两个条件: (1)递归结束条件及结束时的值;
(2)能用递归形式表示,并且递归向结束条件发展。 例6-14 用递归求两个数的最大公约数。
分析求最大公约数的方法可以得到构成递归的两个条件:
n m Mod n=0
r=m mod n :gys(n,r) m Mod n<>0
gys(m,n)= 函数代码如下:
Function gys%(ByVal m%, ByVal n%) Dim r% r = m Mod n
-155-
If r = 0 Then gys = n Else
gys = gys(n, r) End If End Function
注意:递归算法设计简单,但消耗机器时间和占据的内存空间比非递归要大很多。
教学体会
使用VB编写应用软件时,提倡用“可视化的思想进行界面设计,结构化的思想进行功能实现”,本章讲述的过程就是将功能相对完整的程序段组织在一起,便于在程序中多处调用,既提高了程序段的共享,也便于整个程序的调试和维护,是结构化程序设计思想的体现。本章有些概念、程序组织的结构是全新的,教师讲授费劲,学生学习“吃不消”现象普遍存在,但这章又是本书的重点和难点,应在教学中引起足够的重视。在教学过程中,应注意以下问题:
(1)与事件过程对比,充分理解用户自定义过程在程序设计中的作用,掌握使用自定义过程后程序结构的变化。
(2)掌握Sub过程和Function过程的定义与调用格式,熟悉参数传递方式及其特点,具备正确设置过程参数及参数传递的能力。
(3)在应用编程时,对Sub过程和Function过程不用刻意区别,用Sub过程可以实现的问题,同样可以用Function过程实现,反之亦然。编写过程的关键是确定参数的个数及其作用,明确参数传递方式以确定对形参与实参的具体要求。
(4)变量与过程的作用域是规定变量能访问或过程能被调用的范围,通过实例熟练掌握并能灵活应用。
-156-
习题
一、选择题
1.VB中在模块的通用声明段用Dim X 声明的变量是 变量。 (A) 过程级 (B) 模块级 (C) 全局 (D) 静态 2.在Visual Basic应用程序中,以下描述正确的是 。 (A) 过程的定义可以嵌套,但过程的调用不能嵌套 (B) 过程的定义不可以嵌套,但过程的调用可以嵌套 (C) 过程的定义和过程的调用均可以嵌套 (D) 过程的定义和过程的调用均不可以嵌套
3.以下程序运行时,单击命令按钮得到的结果是 。
Sub subp(b() As Integer) For i = 1 To 4 b(i) = 2 * i Next i End Sub
Private Sub Command1_Click() Dim a(1 To 4) As Integer
a(1) = 5: a(2) = 6: a(3) = 7: a(4) = 8 subp a
For i = 1 To 4 Print a(i); Next i End Sub (A) 2 4 6 8 (B) 5 6 7 8 (C) 10 12 14 16 (D) 出错 4.假定有以下两个过程:
Sub s1(ByVal x As Integer, ByVal y As Integer) Dim t As Integer t = x : x = y : y = t End Sub
Sub s2(x As Integer, y As Integer) Dim t As Integer t = x : x = y : y = t End Sub
则以下说法中正确的是 。
(A) 调用过程S1可以实现交换两个变量的值的操作,S2不能实现 (B) 调用过程S2可以实现交换两个变量的值的操作,S1不能实现 (C) 调用过程S1和S2都可以实现交换两个变量的值的操作 (D) 调用过程S1和S2都不能实现交换两个变量的值的操作
5.在窗体上添加一个命令按钮Command1和两个名称分别为Label1和Label2的标签,在通用声明段声明变量X,并编写如下事件过程和Sub过程:
Private X As Integer
Private Sub Command1_Click() X = 5: y = 3
-157-
Call proc(X, y) Label1.Caption = X Label2.Caption = y End Sub
Sub proc(ByVal a As Integer, ByVal b As Integer) X = a * a y = b + b End Sub
程序运行后,单击命令按钮,则两个标签中显示的内容分别是 。 (A) 5和3 (B) 25和3 (C) 25和6 6.下列程序输出结果为 。
Private Sub Command1_Click() For i = 1 To 3 GetValue (i) Next i
Print GetValue(i) End Sub
Private Function GetValue(ByVal a As Integer) dim S As Integer S = S + a GetValue = S End Function A) 4 B) 5 C) 10 7.以下程序的运行结果是 。
Dim x As Integer, y As Integer, z As Integer Sub s2(a As Integer, ByVal b As Integer) a = 2 * a b = b + 2 End Sub
Private Sub Command1_Click() x = 4 y = 4
Call s2(x, y) Print x + y End Sub (A) 0 (B) 8 (C) 12 8.以下程序的运行结果是 。
Private Sub Form_Click() a = 1: b = 2
Print \ Call mult(a, b)
Print \End Sub
Sub mult(x, ByVal y)
-158-
(D) 5和6 D) 11 (D) 14
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第06章 模块化程序设计(4)在线全文阅读。
相关推荐: