(27) 下列程序段的执行结果为
a=5
For k=1 To 0
a=a + k
Next k
Print k; a
A) -1 6
B) -1 16
C) 1 5
D) 11 21
解析:此题是考查For循环结构语句。
For循环有两种格式,其中一种格式是:
For 循环变量=初值 To 终值 Step[步长]
语句
[Exit For]
语句
Next[循环变量]
此循环语句的执行过程为:"循环变量"首先取得"初值",检查是否超过"终值",如果超过,就一次也不循环而跳出循环,属于"先检查后执行"的类型。现在来看程序段,For k=1 To 0中,初值为1,终值为0,显然当"循环变量"首先取得"初值"1,检查后超过"终值"0,所以一次也不执行,即最后执行Print时,k=1,a=5。
(28) 下列程序段的执行结果为
a=3
b=1
For I=1 To 3
f=a + b
a=b
b=f
Print f
Next I
A) 4 3 6
B) 4 5 9
C) 6 3 4
D) 7 2 8
解析:本题考查的是For循环结构语句,现在看程序段是如何运行的。
开始a=3,b=1。For循环中步长缺省值为1,循环变量I的初值为1,终值为3,所以此循环结构可以循环3次。
第一次循环后,结果为:f=4,a=1,b=4
第二次循环后,结果为:f=5,a=4,b=5
第三次循环后,结果为:f=9,a=5,b=9
所以每循环一次,便输出f当前值,循环3次即便输出3个f值分别为4,5,9。
(29) 下列程序段的执行结果为
I=9
x=5
Do
I=I + 1
x=x + 2
Loop Until I >=7
Print "I="; I
Print "x="; x
A) I=4x=5
B) I=7x=15
C) I=6x=8
D) I=10x=7
解析:此题用的是Do循环结构,其格式为:
Do [语句块]
[Exit Do]
Loop Until 循环条件
此循环由于"先执行后检查",所以至少执行一次。本题中,程序运行到循环条件I>=7的值为True,才停止。所以当程序结束运行后I=10,x=7。
(30) 以下程序段运行时从键盘上输入字符"-",则输出结果为
op$=InputBox("op=")
If op$="+" Then a=a + 2
If op$="-" Then a=a - 2
Print a
A) 2
B) -2
C) 0
D) +2
解析:此题是根据用户的输入计算变量a的值并显示。当输入字符"-"时,第一个If条件不成立,跳过,而第二个If语句条件满足,因此执行a=a-2,使a=-2。所以选项B)是正确答案。
(31) 以下程序段的输出结果为
Dim l, a(10) , p(3)
k=5
For i=0 To 10
a(i) =i
Next i
For i=0 To 2
p(i) =a(i (i + 1) )
Next i
For i=0 To 2
k=k + p(i) 2
Next i
Print k
A) 20
B) 21
C) 56
D) 32
解析:第一个循环对数组a()进行赋值,第二个循环对数组p()进行赋值,第三个循环对k进行累加,k的初值等于5,第一次循环k=k+p(0) *2=5,……,第三次循环k=k+p(2) *2=21并输出,所以选项B)正确。
(32) 下列程序的执行结果为
Private Sub Command1_Click()
Dim x As Integer, y As Integer
x=12: y=20
Call Value(x, y)
Print x; y
End Sub
Private Sub Value(ByVal m As Integer, ByVal n As Integer)
m=m * 2: n=n - 5
Print m; n
End Sub
A) 20 12
20 15
B) 12 20
12 25
C) 24 15
12 20
D) 24 12
12 15
解析:被调过程Value的两个参数m和n前面都有关键字"ByVal"修饰,即在主调过程用此过程时,实参与形参之间是以传值方式传递信息的,而当实参与形参以传值方式相结合时,形参的改变并没有影响到实参,单单就这一点来说,当程序代码执行主调过程中的Print x;y语句时,x和y的值应不变,还是12和20,这样就能够排除选项A)和选项B)了。当主调过程调用被调过程时,把实参x、y的值分别传给形参m和n,这就是说此时形参m值为12,n值为20,执行被调过程中的m = m * 2: n = n - 5语句后,m值为24,n值为15,所以Print m; n后, 程序输出的结果为24和15。最后程序输出的结果如选项C)所示。
(33) 在窗体上画一个命令按钮,然后编写下列程序
Private Sub Command3_Click()
Tcl 2
Tcl 3
Tcl 4
End Sub
Sub Tcl(a As Integer)
Static x As Integer
x=x + a
Print x;
End Sub
程序运行后,单击命令按钮,输出结果为
A) 2 3 4
B) 2 5 9
C) 3 5 4
D) 2 4 3
解析:在过程TCL中,将Integer型变量x定义为静态变量(Static),Static语句的格式与Dim语句完全一样,但Static语句只能出现在事件过程,Sub过程或Function过程中,在过程中的Static变量只有局部的作用域,即只能在本过程中可见,但可以和模块级变量传递,即使过程结束后,其值仍能保留。Tcl过程是将变量a的值加上x赋给x,然后输出x的值;第一次调用Tcl过程时,x未赋值,默认为0,所以输出结果为2,第二次调用Tcl过程时,因为x为静态变量,所以它的值为上次调用后的值,即为2,加上a后,x的值变为5,输出结果为5,同理,第三次调用后输出结果为9。
(34) 下面程序段,运行后的结果是Private Sub Command1_Click()
Dim b%(1 To 4) , i%, t#
For i=1 To 4
b(i) =i
Next i
t=Tof(b() )
Print "t="; t,
End Sub
Function Tof(a() As Integer)
Dim t#, i%
t=1
For i=2 To UBound(A)
t=t * a(i)
Next i
Tof=t
End Function
A) t=18
B) t=24
C) t=30
D) t=32
解析:程序开始调用循环语句对数组b()赋值,b(i) = I,且数组b的上下界分别为1和4;接着将数组b()作为对象,调用Tof过程,在Tof过程中,定义了两个变量t和I,I作为For循环的循环变量,初始值为2,终值为数组b的上界;循环体为"t = t * a(i) ",即将b(i)的值乘以t,然后在赋给t,当循环结束后,程序返回的就是数组b中除第一个元素以外所有元素值的乘积,此题的结果为2×3×4=24,输出结果为t=24。
(35) 单击按钮时,以下程序运行后的输出结果是
Private Sub Command1_Click()
Dim x As Integer, y As Integer, z As Integer
x=1: y=2: z=3
Call God(x, x, z)
Print x; x; z
Call God(x, y, y)
Print x; y; y
End Sub
Private Sub God(x As Integer, y As Integer, z As Integer)
x=3 * z + 1
y=2 * z
z=x + y
End Sub
A) 6 6 12
7 11 11
B) 8 5 10
5 11 11
C) 9 6 12
9 10 15
D) 8 10 10
5 9 10
解析:从整体上看,可得主调过程将两次调用过程God后,实参的值将随形参变化而变化,现在分析一下这两次调用实参和形参是怎么变化的:第一次调用被调过程God,主调过程把实参x,x和z的地址分别传给形参x,y和z,此时形参x,y和z值分别为1,1和3,执行语句x = 3 * z+1后,形参x值变为10,此时相对应的实参x也变为10,执行语句y = 2 * z后,形参y值变为6,则相对应的实参x值变为6。执行z = x + y后,形参z值应为12,当然这次调用后,程序代码输出的数值为6,6,12;第二次调用被调过程God,主调过程把实参x,x和y的地址分别传给形参x,y和z。应注意,此时实参x的值为6而不是1,所以此时形参x,y和z值分别为6,2和2,执行语句x = 3 * z+1后,形参x值为7,相对实参x值也相应的变为7。执行语句y = 2 * z后,形参y值变为4,相应的实参y值也变为4,执行z = x + y后,形参z值变为11,相应的实参y的值变为11,而形参y和z的地址相同,所以最后它们值都应为11,所以此次调用后,输出的数值为7,11和11。
二、填空题
(1) 在树结构中,树根结点没有 【1】 。
解析: 在树结构中,每一个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点;每一个结点可以有多个后件,它们都称为该结点的子结点。没有后件的结点称为叶子结点。
(2) Jackson结构化程序设计方法是英国的M.Jackson提出的,它是一种面向 【2】 的设计方法。
解析: 结构化分析方法主要包括:面向数据流的结构化分析方法(SA-Structured analysis),面向数据结构的Jackson方法(JSD-Jackson system development method) 和面向数据结构的结构化数据系统开发方法(DSSD-Data structured system development method)。
(3) 面向对象的模型中,最基本的概念是对象和 【3】 。
解析: 面向对象模型中,最基本的概念是对象和类。对象是现实世界中实体的模型化;将属性集和方法集相同的所有对象组合在一起,可以构成一个类。
(4) 软件设计模块化的目的是 【4】 。
解析: 模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程,由此分解来降低复杂性。
(5) 数据模型按不同应用层次分成3种类型,它们是概念数据模型、 【5】 和物理数据模型。
解析:数据模型按不同层次分成概念数据模型、逻辑数据模型和物理数据模型三类。
(6) 在Visual Basic的立即窗口内输入以下语句
X=65<CR>
?Chr$(X) <CR>
在窗口中显示的结果是 【6】 。
解析: Chr$()是求ASCII字符的函数,格式是Chr$(表达式),其中"表达式"应该是合法的ASCII码值,Chr$()函数把"表达式"的值转换为相应的ASCII字符。本题中X=65对应的ASCII码是字符A,所以显示的结果应该是A。
(7) 下列程序是判断一个整数(>=3) 是否为素数,请补充完整。
Dim n As Integer
n=InputBox("请输入一个整数(>=3) ")
k=Int(Sqr(n) )
i=2
swit=0
While i <=k And swit=0
If n Mod i=0 Then
【7】
Else
【8】
End If
Wend
If swit=0 Then
Print n; "是一个素数。"
Else
Print n; "不是一个素数。"
End If
解析:素数是只能被1和本身整除的正整数,在本题的程序中,swit是一个标志变量,如果"swit=0",则表示n不能被整除;如果能被一个整数整除,则swit变为1;
While循环执行的条件有两个,一个是"I<=k",另一个是"swit=0",必须两个条件同时成立才执行循环,当I>k时,显然不必再检查n是否能被I整除;而如果"swit=1",则表示n已被整除,肯定不是素数,也不必检查了。
只有"I<=k"和"swit=0"两者同时成立时才需要检查"n是否为素数",循环只有一个判断操作,即判断n能否被I整除,如果不能,则I=I+1。以便为下一次判断作准备。
(8) 下面程序是用来打印九九乘法表的,请补充完整。
Dim i As Integer, j As Integer, Str1$
Str1=""
For i=1 To 9
For j=1 To 9
If 【9】 Then
Str1=Str1 + Str$(j) + "×" + Str$(i) + "=" + Str$(Val(i j) )
Else
Str1=Str1 & Chr(13)
【10】
End If
Next j
Next i
Print Str1
解析: (1) Exit语句总是出现在If语句或Select Case语句内部,而If语句或Select Case语句在循环内嵌套,用Exit语句中断循环。函数首先定义了两个Integer型变量i、j,并将空格赋给Str1;第一个For循环的变量I从1到9步长为1,第二个循环的变量i也是从1到9步长为1,循环体为选择结构,它是用来输出i*j的值,所以j的值应该小于此时i的值,那么If的判断语句为j<=i,当满足条件时执行Then后面的语句,即输出i*j的值,如果不满足执行Else后面的语句,并跳出内循环。
(9) 在窗体上有一个命令按钮,然后编写如下程序:
Function Trans(ByVal num As Long) As Long
Dim k As Long
k=1
Do While num
k=k * (num Mod 10)
num=num \ 10
Loop
Trans=k
Print Trans
End Function
Private Sub Command1_Click()
Dim m As Long
Dim s As Long
m=InputBox("请输入一个数")
s=Trans(m)
End Sub
程序运行时,单击命令按钮,在输入对话框中输入"789",输出结果为 【11】 ,在输入
对话框中输入"987"输出 【12】 ,在输入对话框中输入"879",输出结果为 【13】 。
解析: 关键字ByVal用来实现传值,也就是说在定义通用过程时,如果形参前面有关键字Byval,则该参数用传值方式传递,否则用传址方式传递;在Sub过程中,先将输入的"456"赋给变量m,m作为参数,调用Trans过程;在Trans过程中以num作为Do While的循环条件;在循环体中,调用Mod函数,将num的个位数字与k相乘,然后赋给k,第一次循环时,num的值是789,所以k的值为9,执行num = num \ 10后,num的值为78,循环三次后,num变为0,退出循环,k值等于9×8×7=504,并将k的值作为返回值;当输入"987"或"879"时执行相同的操作,结果都为504。可以看出,此程序可用于求一个数值各位上数值的乘积。
(10) 下面程序的功能是产生10个小于100(不含100) 的随机正整数,并统计其中5的倍数所占比例,但程序不完整,请补充完整。
Sub PR()
Randomize
Dim a(10)
For j=1 To 10
a(i) =Int( 【14】 )
If 【15】 Then k=k + 1
Print a(j)
Next j
Print
Print k / 10
End Sub
解析: 小于100的随机正整数用(99 * Rnd)+ 1来表示;求倍数用取模来表示,即a(j) Mod 5 = 0,用k作计数器,累计计算能被5整除的数的个数。