第七章习题答案
第 7 章 过 程
一、叙述题
1.程序中使用通用过程有何益处?
解答:使用通用过程的好处:代码可重复利用,使程序简便、高效,有利于程序的调试和维护。
2.子程序过程和函数过程有何区别?
解答:子程序过程与函数过程的区别是:子程序过程名没有返回值,函数过程名有返回值。若只需有一个返回值,则习惯使用函数过程;若需要有多个返回值,一般使用子程序过程。
3.什么是形参?什么是实参?参数传递中有哪些注意事项?
解答:形参是声明过程时的一种形式虚设的参数,只代表了该过程参数的个数、类型及位置,形参的名字并不重要,也没有任何值,只表示在过程体内进行某种运算或处理。在过程被调用时,形参要被实参所替换。
实参是调用过程时提供给过程形参的初始值或通过过程体处理后返回的结果。 参数传递的注意事项见表4-3。
表4-3 形参与实参的对应关系
解答:参数传递有传值方式和传地址方式。两者区别是:传值方式是一种单向的数据传递,即调用时只能由实参将值传递给形参,调用结束不能由形参将操作结果返回给实参;传地址方式是一种双向的数据传递,即调用时实参将值传递给形参,调用结束时由形参将操作结果返回给实参。
按地址传递时,要求实参必须是变量、数组元素或数组。 5.若要在过程执行结束后其值仍然保留,应如何声明变量? 解答:可以将变量声明为全局变量(Public )、通用声明段或模块声明中的模块变量,过程中的静态变量(Static )。
6.程序中怎样添加标准模块?在标准模块中可以声明事件过程? 解答:添加标准模块有如下3 种方法: (1)“工程”菜单-“添加模块”
(2)右击“工程资源管理器”-“添加模块”
(3)点击“添加窗体”右侧的下拉菜单-“添加模块”
事件过程依附于窗体和控件,所以在标准模块中不能声明事件过程。
7.在模块的通用声明处与在过程的声明部分声明的变量名相同,两者是否为同一变量,
两者间有没有联系?
解答:表示不同的变量,两者之间没有任何关系。 二、单选题
1.B 在过程中可以用Dim 、Static 声明变量。 2.D
3.B 实参为常量时,只要与形参类型相容即可。 4.D
5.C 使用Public 语句声明一个常量、定长字符串变量及数组时,该语句应在标准模块的通用声明段中。
6.A
7.A 在过程中不能对形参数组进行说明。 8.B 9.B 10.B
11.A Function 过程名只能返回一个值。 12.D 13.A 14.D
15.C 在一个窗体的过程中调用另一个窗体的全局过程时,一定要加限定。
16.D 变长形参字符串数组对应变长实参字符串数组,定长形参字符串数组对应定长实参字符串数组。
17.B 在调用过程时,与使用ByRef 说明的形参对应的实参可以按传值方式结合。 18.B
19.C 过程声明中,形参不允许为定长字符串变量。 20.A
21.A 在标准模块或窗体模块中用Public 语句声明的变量均是全局变量。 22.A
23.C 使用Public 语句声明一个常量、定长字符串变量及数组时,该语句应在标准模块的通用声明段中。
24.A
25.A 引用窗体名时,一定要用其Name 属性的值。 26.B 27.B 三、填空题
1.52 51 2.4 11 8 35 3.1 3 5
四、编程及上机调试
1.编写程序,生成由1~50之间的整数组成的5×5方阵(二维数组)。找出方阵的所有凸点。所谓凸点是指在本行、本列中数值最大的元素。一个方阵可能有多个凸点,也可能没有凸点。程序中应定义一个名为Tudian 的Sub 过程,用于查找方阵的凸点。
【分析】先找出某一行的最大元素,再判断它是否为所在列的最大元素。 【程序代码】
Private Sub Command1_Click()
Dim a() As Integer, i As Integer, j As Integer, n As Integer n = InputBox("输入方阵的阶 N :", , 5) Randomize ReDim a(n, n) For i = 1 To n For j = 1 To n
a(i, j) = Int(Rnd * 50 + 1)
Text1 = Text1 & Right(" " & Str(a(i, j)), 3) Next j
Text1 = Text1 & vbCrLf Next i
Call tudian(a) End Sub
Private Sub Command2_Click() Text1 = "" Text2 = "" End Sub
Private Sub Command3_Click() End End Sub
Private Sub tudian(a() As Integer)
Dim i As Integer, j As Integer, c As Integer Dim max As Integer, s As String For i = 1 To UBound(a, 1)
max = a(i, 1): c = 1 ' 每行的第一个作为最大值 For j = 1 To UBound(a, 2)
If a(i, j) > max Then ' 其余元素依次与最大值进行比较 max = a(i, j): c = j End If Next j
For k = 1 To UBound(a, 1)
If a(k, c) > max Then ' 同列元素依次与最大值进行比较 Exit For ' 若有大的,则不是凸点 End If Next k
If k > UBound(a, 1) Then ' 条件满足则是凸点 s = s & "a(" & i & "," & c & ")" & vbCrLf End If Next i
If s "" Then
Text2 = "方阵的凸点:" & vbCrLf & s Else
Text2 = "方阵没有凸点" 's 为空则没有凸点
End Sub
程序运行界面如图4.1所示。
图4.1 求方阵的凸点
2.编写程序验证哥德巴赫猜想:一个大于2的偶数可以表示为两个素数之和,要求程序中包含一个名为Prime 的函数过程,用于判断一个数是否为素数。
【程序代码】
Private Sub Command1_Click() Dim x As Integer, i As Integer x = Val(Text1) For i = 2 To x
If prime(i) And prime(x - i) Then
Text2 = Str(x) & "是" & Str(i) & "和" & Str(x - i) & "两个素数之和" Exit Sub End If Next i End Sub
Private Function prime(x As Integer) As Boolean For i = 2 To Int(Sqr(x)) If x Mod i = 0 Then Exit Function End If Next i
prime = True
Private Sub Command2_Click() End End Sub
3.利用随机函数Rnd 生成10个两位的整数,将其降序排列输出到一个文本框中,要求程序中包含一个名为Sort 的Sub 过程,用于将一个数值进行降序排序。
【分析】在窗体通用声明处声明数组,这样在每个过程中使用的是同一个数组。排序方法很多,可选择一种组织成过程。这里用冒泡排序法。
【程序代码】
Dim a(10) As Integer
Private Sub sort(a() As Integer)
Dim x As Integer, i As Integer, j As Integer For i = 1 To UBound(a) - 1
flag = False For j = 1 To UBound(a) - i If a(j)
flag = True t = a(j + 1): a(j + 1) = a(j): a(j) = t End If Next j
If Not flag Then Exit For Next i End Sub
Private Sub Command1_Click() Dim i As Integer Randomize For i = 1 To 10
a(i) = Int(Rnd * 90 + 10) Text1 = Text1 & Str(a(i)) Next i End Sub
Private Sub Command2_Click() Dim i As Integer
Call sort(a) For i = 1 To 10
Text2 = Text2 & Str(a(i)) Next i End Sub
Private Sub Command3_Click() End End Sub
' 标志变量初值置为false ' 发生过交换 ' 若成立,说明某一轮比较未发 ' 生位置交换,退出循环 ' 产生数组 ' 调用过程
程序运行界面如图所示。
降序排序界面
4.编写程序,找出输入字符串中ASCII 代码值最大的字符,把它移动到原来字符串的末尾,其它字符的排列顺序维持不变。例如,输入“student ”,结果是“stdentu ”(若输入字符串中含有多个最大字符,只移动其中的一个)。程序中应定义一个通用过程,用于找出一个字符串中ASCII 代码值最大的字符及其位置。
字符处理
【程序代码】
Private Sub Command1_Click()
Dim s As String, i As Integer, n As Integer s = Text1
Call search(s, n)
Text2 = Left(s, n - 1) & Mid(s, n + 1) & Mid(s, n, 1) End Sub
Private Sub search(s As String, n As Integer) Dim i As Integer, maxc As String maxc = Left(s, 1) For i = 2 To Len(s)
If maxc
End Sub
Private Sub Command2_Click() Text1 = "" Text2 = ""
Text1.SetFocus End Sub
Private Sub Command3_Click() End End Sub
5.编写程序,求出1000之内的所有完数。所谓“完数”是指一个数恰好等于它的因子之和。如6的因子为1、2、3,而6 = 1 + 2 + 3,所以6是完数。要求程序中包含一个名为Wanshu 的函数过程,用于判断一个数是否为完数。
【分析】 【程序代码】
Private Function wanshu(n As Integer) As Boolean Dim i As Integer, sum As Integer For i = 1 To n - 1
If n Mod i = 0 Then ' 条件满足是因子 sum = sum + i ' 累加因子 End If Next i
If sum = n Then wanshu = True ' 条件满足是完数 End Function
Private Sub Command1_Click() Dim i As Integer For i = 1 To 1000
If wanshu(i) Then Picture1.Print i End If Next i End Sub
Private Sub Command2_Click() End End Sub
程序运行界面如图所示。
找1000以内的完数
6.创建一个包含两个窗体的工程,用户界面如图7.52与图7.53所示。添加一个标准模块,在标准模块中定义两个通用过程:一个是Function 过程Max ,用于求数组a 中10个数的最大值;另一个是Sub 过程Sort ,用于对数组a 中10个数按从小到大顺序排序。
要求:(1) 窗体Form1为主窗体,当单击“生成随机数”按钮时,生成10个[10,99]区间内的随机整数,将这10个随机整数存入数组a ,同时显示在“随机数”文本框中。单击“求最大数”按钮时,调用标准模块中的Function 过程Max ,求这l0个数的最大数并显示在“最大值”文本框中。
当单击“打开排序窗口”按钮时,打开窗体Form2。
(2) 在窗体Form2中,当单击“排序”按钮时,调用标准模块中的Sub 过程Sort ,对数组a 中的10个数按从小到大的顺序排序,并将排序后的结果显示在“排序结果”文本框中。
单击“返回”按钮返回到窗体Form1。
图7.52 Form1窗体界面 图7.53 Form2窗体界面
【程序代码】 标准模块代码
Public a(10) As Integer
Public Sub sort(a() As Integer)
Dim i As Integer, j As Integer, t As Integer For i = 1 To UBound(a) - 1
For j = i + 1 To UBound(a) If a(i) > a(j) Then t = a(i) a(i) = a(j) a(j) = t End If Next j Next i End Sub
Public Function max(a() As Integer) As Integer max = a(1)
For i = 2 To UBound(a) If max
Next i
End Function 窗体Form1代码
Private Sub Command1_Click() Dim i As Integer Randomize
For i = 1 To UBound(a)
a(i) = Int(Rnd * 90) + 11 Text1 = Text1 & Str(a(i)) Next i End Sub
Private Sub Command2_Click() Form1.Hide Form2.Show End Sub
Private Sub Command3_Click() Text2 = max(a) End Sub
Private Sub Command4_Click() End End Sub
窗体Form2代码
Private Sub Command1_Click() Call sort(a)
For i = 1 To UBound(a)
Text1 = Text1 & Str(a(i)) Next i End Sub
Private Sub Command2_Click() Form2.Hide Form1.Show End Sub