改错题专项练习(一)
改错题要求
1. 新建工程,输入代码,改正程序中的错误。
2. 改错时,不得增加或删除语句。
3. 以Myfrm1的名字和Myprj1的名字分别将窗体和工程保存到软盘A的根目录下。
本专项练习共包括五题,每题30分钟,合计150分钟。请同学务必把握好解题时间。
第一题
本程序的功能是:从给定的字符〞age43dhbc765shdk8djfk65bdgth23end〃中找出所有的数(单个的数字或连续的数字都算一个数),并求出这些数的个数、总和及平均值(测试字符串含有5个数43、765、8、65、23,总和是904,平均值是180.8)。(2001秋VB02考题)
含有错误的源程序如下:
Option Explicit
Option Base 1
Private Sub getn(s As String, ByVal d() As Integer) ‘去掉ByVal
Dim k As Integer, st As String, n As Integer, f As Boolean
k = 1: n = 1
Do Until n > Len(s)
If Mid(s, n, 1) >= "0" And Mid(s, n, 1) <= "9" Then
st = st & Mid(s, n, 1)
f = True
ElseIf f Then
f = False
ReDim Preserve d(k)
d(k) =val( st)
st = ""
k = k + 1
End If
n = n + 1
Loop
End Sub
Private Sub Form_Click()
Dim p As String, num() As Integer, i As Integer
Dim s As Integer, av As Integer ‘Dim s As Integer, av As Single
p = "ags43dhbc765shdk8djfk65bdgth23end"
Call getn(s, num) ‘Call getn(p, num)
For i = 1 To UBound(num)
s = s + num(i)
Print num(i)
Next i
Print
av = s / UBound(num)
Print "s="; s, "av="; av
End Sub
第二题
本程序的功能是:验证在n与n!之间至少有一个素数,其中n>2。可输入n=4验证。(2001春VB05考题)
含有错误的源程序如下:
Option Explicit
Private Sub Form_Click()
Dim n As Integer, k As Long
Dim m As Long, f As Integer
n = Val(InputBox("请输入一个大于2的整数"))
m = 0 ‘m=1
For k = 1 To n
m = m * k
Next k
For k = n + 1 To m - 1
f = Flag(k)
If f = 1 Then Exit For
Next k
If f = 0 Then ‘If f = 1 Then
Print n; "与"; m; "之间一个素数是"; k
Else
Print n; "与"; m; "之间没找到一个素数"
End If
End Sub
Private Function Flag(n As Long) As Integer
Dim I As Integer
Flag = 1
For I = 2 To Sqr(n)
If n Mod I <> 0 Then ‘If n Mod I = 0 Then
Flag = 0
Exit For
End If
Next I
End Function
第三题
求下面数列的和,计算到第n项的值小于等于10-5为止。
其中
本程序若用x=0.5来测试,运行的正确结果为0.6480143。(2000秋VB05考题)
含错误的源程序如下:
Option Explicit
Private Function Fib(N As Integer) As Integer
If N = 1 Then
Fib = 1
ElseIf N = 2 Then
Fib = 2
Else
Fib = Fib(N - 1) + Fib(N - 2)
End If
End Function
Private Sub Form_Click()
Dim N As Integer, S As Single, X As Single, A As Single
Do
X = InputBox("输入一个绝对值小于1的数:")
If Abs(X) >= 1 Then Exit Do ‘If Abs(X) <= 1 Then Exit Do
Loop
S = X
N = 1 ‘N = 2
Do
A = X ^ Fib(N) / (Fib(N - 1) * Fib(N))
If Abs(A) <= e - 5 Then Exit Do ‘If Abs(A) <= 1e-5 Then Exit Do
S = S + A
N = N + 1
Loop
Print "s="; S
End Sub
第四题
下面程序的功能是:将一个字符串中的相同字符调整到一块,得到一个新的字符串(下面为程序正确执行时的画面)。(2002秋VB04考题)
含错误的源程序如下:
Option Explicit
Private Sub Command1_Click()
Dim S As String
S = Text1.Text
Call sub1(S)
Text2.Text = S
End Sub
Private Sub sub1(st As String)
Dim I As Integer, L As Integer, K As Integer
Dim P As Integer, AL As String * 1
For I = 1 To Len(st)
AL = Mid(st, I, 1)
P = I - 1
Do Until P >= 1 ‘Do While P >= 1
If AL = Mid(st, P, 1) Then
For K = I To P + 1 ‘For K = I To P + 1 Step -1
Mid(st, K, 1) = Mid(st, K - 1, 1)
Next K
Mid(st, P, 1) = AL
Exit Do
End If
P = P + 1 ‘P = P - 1
Loop
Next I
End Sub
第五题
下面是一个二分插入排序的程序。二分插入排序,是直接插入排序,是直接直接插入排序的一个改进,即将顺序查找插入位置,改为用二分法查找插入位置,元素的移动和插入处理基本相同。(2002秋VB08考题)
含错误的源程序如下:
Option Explicit
Option Base 1
Private Sub Form_Click()
Dim A(10) As Integer, I As Integer
For I = 1 To 10
A(I) = Int(rnd * 20) + 1
Print A(I);
Next I
Print
For I = 2 To 10
Call Insertion(A, K) ‘Call Insertion(A, I)
Next I
For I = 1 To 10
Print A(I)
Next I
Print
End Sub
Private Sub Insertion(S() As Integer, ByVal k As Integer)
Dim L As Integer, R As Integer, M As Integer
Dim Tem As Integer
L = 1: R = k - 1
Tem = S(k)
Do While L < R ‘Do While L <= R
M = (L + R) / 2
If S(M) < S(k) Then
L = M + 1
Else
R = M - 1
End If
Loop
Do Until k = L
S(k) = S(k - 1)
k = k + 1 ‘k = k - 1
Loop
S(k) = Tem
End Sub