认证考试第7章 数组与自定义数据类型
习
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
7(数组与自定义数据类型)
一、选择题
1(下面定义数组语句中错误的是:
(A) Private A(-10 To 5) (B) Dim A(10,-10 To -10) As Integer
(C) Dim A() As Integer (D) Dim A(N) ' N是变量
2(下面的哪一条语句与Visual Basic的默认设置相同:
(A) Option Base 1 (B) Option Base 0
(C) ByRef (D) Option Explicit
3(下面的哪条语句可以正确地定义一个动态数组:
(A) Private A(n) As Integer (B) Dim A() As Integer
(C) Dim A( , ) As Integer (D) Dim A(1 To n)
4(下面的哪一项可以在窗体模块的声明段中进行定义:
(A) 全局变量 (B) 全局常量
(C) 全局数组 (D) 全局自定义数据类型
5(如果在模块的声明段中有Option Base 0语句,则在该模块中使用Dim a(6,3 To 5)定义的数组的元素个数是:
(A) 30 (B) 18 (C) 35 (D) 21
二、判断题
1(使用ReDim语句不但可以改变动态数组的下标界限,而且可以改变其维数。
2(无论是在定义时,还是在访问其元素时,数组的下标不能是变量,只能是常量表达式。
3(数组下标的下界可以是负值,但上界只能是正数。
4(自定义数据类型中的各个成员不但可以是Visual Basic的基本数据类型,还可以是自定义数据类型或数组。
5(Visual Basic允许定义过程级自定义数据类型。
6(数组可以作通用过程的参数,但必须是最后一个参数。 7(数组作通用过程的参数时,一定是按地址传递。 8(自定义数据类型既可以作参数,也可以作返回值。 三、填空题
1(运行下面程序,当单击窗体时,窗体上显示在内容是 (1) ;如果把A语句替换为 x = 64,B语句替换为 r = 8,则输出结果为 (2) 。分析一下这个程序的功能是什么。
1 Dim n As Integer, k As Integer, x As Integer, r As Integer ' 模块级变量
2 Dim a(8) As Integer ' 模块级数组
3 Private Sub conv(d As Integer, r, i)
4 i = 0
5 Do While d <> 0
6 i = i + 1
7 a(i) = d Mod r: d = d \ r
8 Loop
9 End Sub
10
11 Private Sub Form_click()
12 x = 12 ' A 语句
13 r = 2 ' B 语句
14 Print CStr(x); "("; CStr(r); ")="; 15 If x = 0 Then
16 Print 0
17 Else
18 Call conv(x, r, n)
19 For k = n To 1 Step -1
20 Print a(k);
21 Next k
22 Print
23 End If
24 End Sub
2(阅读下面程序,当单击窗体时,窗体上显示的内容是 (3) 。
1 Private Sub Form_Click()
2 Dim a(3, 3) As Integer : Dim i As Integer
3 a(1, 1) = 1: a(1, 2) = 2: a(1, 3) = 3: a(2, 1) = 4
4 a(2, 2) = 5: a(2, 3) = 6: a(3, 1) = 7: a(3, 2) = 8: a(3, 3) = 9
5 For i = 1 To 3
6 For k = 1 To i
7 Call chang(a, i)
8 Next
9 Next
10 For i = 1 To 3
11 For k = i To 3
12 Print a(i, k) & ",";
13 Next
14 Next
15 End Sub
16
17 Sub chang(a() As Integer, i As Integer) 18 c = a(i, UBound(a, 2))
19 For k = UBound(a, 2) - 1 To 1 Step -1 20 a(i, k + 1) = a(i, k)
21 Next
22 a(i, 1) = c
23 End Sub
3(下面的事件过程把一维数组中元素的值向右循环移位,移位次数由文本框输入。“循环”指的是最右边的元素值补到最左边。
例如,数组各元素的值依次为0,1,2,3,4,5,6,7,8,9,10;移位三次后,各元素的值依次为:8,9,10,0,1,2,3,4,5,6,7。在画线处填入适当的语句。
1 Private Sub Command1_Click()
2 Dim intArray(10) As Integer
3 Dim intI As Integer, intJ As Integer, intK As Integer
4 For intI = 0 To 10
5 intArray(intI) = intI
6 Next
7 intJ = Text1.Text
8 Do
9 intK = intK + 1
10 (4)
11 Loop Until (5) 12 For intI = 0 To 10
13 Print intArray(intI)
14 Next
15 End Sub
16
17 Private Sub Moveright(intA() As Integer) 18 Dim intI As Integer, intJ As Integer, intK As Integer
19 intI = UBound(intA) : intJ = intA(intI) 20 For intK = intI To LBound(intA) + 1 Step -1 21 (6)
22 Next
23 (7)
24 End Sub
4(本程序段的功能是重新排列数组a中元素的值,使相等元素值相邻存放,并且保持它们在数组中首次出现时的相对次序。在画线处填入适当内容。 例如,原数组:1,2,4,3,3,3,2,1,4,5
重排后:1,1,2,2,4,4,3,3,3,5
排列的原理是:先删去重复元素,再根据各元素在数组中出现的次数展开排列。
1 Dim n As Integer
2 Dim i As Integer, j As Integer, k As Integer, t As Integer, m As Integer
3 Dim a() As Integer, b() As Integer
4 n = 10
5 ReDim a(n), b(n)
6 a(1) = 1: a(2) = 2: a(3) = 4: a(4) = 3: a(5) = 3
7 a(6) = 3: a(7) = 2: a(8) = 1: a(9) = 4: a(10) = 5
8 m = 1
9 (8)
10 Do While m <= t
11 k = 1 : i = m + 1 12 Do While i <= t 13 If a(i) = a(m) Then 14 k = k + 1 15 For j = (9) 16 a(j) = a(j + 1) 17 Next j
18 t = t - 1 19 Else
20 (10) 21 End If
22 Loop
23 b(m) = k : m = m + 1 24 Loop
25 t = n
26 For i = m - 1 To 1 Step -1 27 For j = 1 To (11) 28 a(t) = a(i)
29 (12) 30 Next j
31 Next i
32 For j = 1 To n
33 Print a(j)
34 Next j
5(本程序生成50个位于,100,100之间的不重复的随机整数,并找出第几个是最大
值(执行结果如图7.15所示)。填空完善程序。
1 Option Base 1
2 Private Sub Command1_Click()
3 Dim i As Integer, k As Integer, t As Integer, s As Integer
4 Dim max As Integer, pmax As Integer
5 Dim a() As Integer
6 Randomize
7 max = -100
8 pmax = 1
9 (13)
10 Do
11 If Rnd > 0.5 Then s = 1 Else s = -1 图7.15 不复重的50个随机数 12 t = s * Int(Rnd * 100) + 1 13 (14) 14 Do While k < i 15 If t <> a(k) Then 16 k = k + 1 17 Else
18 Exit Do 19 End If
20 Loop
21 If k = i Then 22 (15)
23 a(k) = t
24 Print a(k);
25 i = i + 1
26 If (i - 1) Mod 10 = 0 Then Print 27 If max < t Then max = t: (16) 28 End If
29 Loop Until i > 50
30 Print
31 Print "最大值为"; max; ",位于第"; pmax; "个" 32 End Sub
四、改错题
下面程序的功能是分别找出48、308和1155三个数的所有质因子(如图7.16所示)。
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
:
(1)新建工程,输入以下代码;
(2)改正程序中的错误,改错时,不得增加或删除语句; (3)分别以tform和tprj为文件名将窗体和工程保存到C:盘新建的文件夹t中。
1 Private Sub Form_click()
2 Dim Fac() As Integer, N(3) As Integer
3 Dim I As Integer, J As Integer
4 N(1) = 48: N(2) = 308: N(3) = 1155
5 For I = 1 To 3
6 Call Factor(Fac, N(I))
7 Print N(I); "的质因子有:";
8 For J = 1 To UBound(Fac)
9 Print Fac(J);
10 Next
图7.16 求质因子(改错题) 11 Print
12 ReDim Fac(I)
13 Next
14 End Sub
15
16 Private Sub Factor(F() As Integer, ByVal N() As Integer)
17 Dim I As Integer, J As Integer, Idx As Integer 18 Dim K As Integer
19 K = 2
20 Do Until N = 1
21 If N Mod K = 0 Then
22 Idx = Idx + 1
23 ReDim F(Idx)
24 F(Idx) = K
25 N = N / K
26 Else
27 K = K - 1
28 End If
29 Loop
30 End Sub
五、编程题
1(编程找出三个三位数,它们分别是某三个二位数的平方,且1,9这九个数字在这三个三位数中各只允许出现一次。
2(定义一个二维动态数组a(1 To n,1 To n)代表n×n的方阵(n由文本框输入)。编程给数组元素赋值,使之成为如下所示的螺旋方阵(图中是n=5时的情况)。
116151413,,,,217242312,,,, 318252211,,419202110,,,,56789,,
3(有17个人围成一个圈(编号为0,16),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。求此人原来的编号是多少。
*4(编写递归函数过程实现折半查找。
*5(编写一个求多个正整数最大公约数的递归函数。
参考答案
一、选择题
1(D 2(B 3(B 4(A 5(D
二、判断题
1(? 2(× 3(× 4(? 5(× 6(× 7(? 8(?
三、填空题
1((1)12(2)=1 1 0 0 (2)64(8)=1 0 0
2((3)3,1,2,6,4,9,
3((4)Call Moveright(intArray) 或 Moveright intArray (5)intK = intJ
(6)intA(intK) = intA(intK-1) (7)intA(LBound(intA)) = intJ
4((9) t = n (9) i To t-1 (10) i = i+1 (11) b(i) (12)t = t-1
5((13)i = 1 (14)k = 1 (15)ReDim Preserve a(k) (16)pmax = k
四、改错题
(1)第16行中形参N后面的空括号应删除
(2)第23行应为:ReDim PreServe F(Idx)
(3)第27行应为:K = K + 1.
五、编程题
1(这三个三位数分别是:361、529和784。
1 Private Sub Command1_Click()
2 Dim intA(10 To 31, 1 To 4)
3 Dim int1 As Integer, int2 As Integer, int3 As Integer
4 Dim int4 As Integer
5 Dim bln1 As Boolean
6 For int1 = 10 To 31
7 intA(int1, 1) = int1 * int1
8 intA(int1, 2) = intA(int1, 1) Mod 10
9 intA(int1, 3) = intA(int1, 1) \ 10 Mod 10
10 intA(int1, 4) = intA(int1, 1) \ 100
11 Next
12 For int1 = 10 To 31
13 For int2 = int1 + 1 To 31
14 For int3 = int2 + 1 To 31
15 For int4 = 1 To 9
16 bln1 = False
17 bln1 = bln1 Or (int4 = intA(int1, 2))
18 bln1 = bln1 Or (int4 = intA(int1, 3))
19 bln1 = bln1 Or (int4 = intA(int1, 4))
20 bln1 = bln1 Or (int4 = intA(int2, 2))
21 bln1 = bln1 Or (int4 = intA(int2, 3))
22 bln1 = bln1 Or (int4 = intA(int2, 4))
23 bln1 = bln1 Or (int4 = intA(int3, 2))
24 bln1 = bln1 Or (int4 = intA(int3, 3))
25 bln1 = bln1 Or (int4 = intA(int3, 4))
26 If Not bln1 Then Exit For
27 Next
28
29 If int4 = 10 Then
30 Print intA(int1, 1), intA(int2, 1), intA(int3, 1)
31 End If
32 Next
33 Next
34 Next
35 End Sub
2(
1 Private Sub Command1_Click()
2 Dim a() As Integer
3 Dim nc As Integer, nr As Integer, n As Integer
4 Dim i As Integer, j As Integer, k As Integer
5 n = Cint(Text1.Text)
6 ReDim a(1 To n, 1 To n)
7 nc = n: nr = 1: i = 1: j = 1
8 For k = 1 To n * n
9 a(i, j) = k
10 If i < nc And j = nr Then
11 i = i + 1
12 ElseIf i = nc And j < nc Then
13 j = j + 1
14 ElseIf i > nr And j = nc Then
15 i = i – 1
16 ElseIf i = nr And j > nr + 1 Then
17 j = j – 1
18 End If
19 If i = nr And j = nr + 1 Then
20 nc = nc – 1 21 nr = nr + 1 22 End If
23 Next
24 For i = 1 To n
25 For j = 1 To n 26 Print a(i, j), 27 Next
28 Print
29 Next
30 End Sub
3(10号。
解法一:
1 Private Sub Command1_Click()
2 Dim intA(0 To 16) As Integer
3 Dim intNum As Integer
4 Dim int1 As Integer
5 Dim int2 As Integer
6 For int1 = 0 To 16
7 intA(int1) = 1
8 Next
9 int1 = 0
10 int2 = 0
11 intNum = 17
12 Do While intNum > 1 13 int1 = int1 + intA(int2) 14 If int1 Mod 3 = 0 And intA(int2) <> 0 Then
15 intA(int2) = 0 16 intNum = intNum - 1 17 End If
18 int2 = int2 + 1 19 If int2 > 16 Then int2 = 0 20 Loop
21 For int1 = 0 To 16 22 If intA(int1) = 1 Then Print int1
23 Next
24 End Sub
解法二:
1 Private Sub Command1_Click()
2 Dim intA(0 To 16) As Boolean
3 Dim intNum As Integer
4 Dim int1 As Integer
5 Dim int2 As Integer
6 int1 = 0
7 int2 = 0
8 intNum = 17
9 Do While intNum > 1 10 Do While intA(int2) 11 int2 = int2 + 1 12 If int2 > 16 Then int2 = 0 13 Loop
14 int1 = int1 + 1 15 If int1 Mod 3 = 0 Then 16 intA(int2) = True
17 intNum = intNum - 1 18 End If
19 int2 = int2 + 1
20 If int2 > 16 Then int2 = 0 21 Loop
22 For int1 = 0 To 16
23 If Not intA(int1) Then Print int1 24 Next
25 End Sub
4(
1 Function Search3(a() As Integer, intStart As Integer, _
2 intEnd As Integer, b As Integer) As Integer
3 Dim m As Integer, n As Integer, int1 As Integer
4 m = intStart
5 n = intEnd
6 int1 = (m + n) \ 2
7 If b < a(int1) Then
8 n = int1 - 1
9 Search3 = Search3(a, m, n, b) 10 ElseIf b > a(int1) Then 11 m = int1 + 1
12 Search3 = Search3(a, m, n, b) 13 Else
14 Search3 = int1
15 End If
16 If m = n Then
17 Search3 = m
18 End If
19 End Function
说明:对应于形参a()的实参为被搜索的数组(递增或递减),intStart和intEnd是数组
下标的下界和上界,b是要查找的数值。 5(
1 Private Function gcd(a() As Integer) As Integer
2 Dim i As Integer, j As Integer
3 Dim u As Integer, v As Integer, r As Integer
4 i = LBound(a)
5 j = UBound(a)
6 If i = j Then
7 gcd = a(i)
8 Else
9 u = a(j - 1)
10 v = a(j)
11 Do While v <> 0
12 r = u Mod v
13 u = v
14 v = r
15 Loop
16 a(j - 1) = u
17 ReDim Preserve a(i To j - 1) 18 gcd = gcd(a)
19 End If
20 End Function