VB调试题解答07317.docx
《VB调试题解答07317.docx》由会员分享,可在线阅读,更多相关《VB调试题解答07317.docx(51页珍藏版)》请在冰豆网上搜索。
VB调试题解答07317
第四部分:
上机程序调试题(改错或填空)
(一)说明
等级考试上机测试的程序调试题常常是在考生目录中给出一个标准模块程序Modify.BAS,要求根据题意修改该模块中的函数或过程,为检测所作修改是否正确,可以按照以下操作步骤进行调试:
1.要求学生建立一工程,将这一模块添加到工程中。
如果你是通过双击标准模块程序Modify.BAS进入VisualBasic程序设计系统的,则首先需要添加一个窗体模块。
2.将该标准模块程序Modify.BAS代码中用---n---(n为1,2,3,4,5)部分删除后改为合适的内容或将用****错误n****标示的下一语句中的错误改正,并在窗体模块中编写代码(常常写在窗体的Click()事件中)调用标准模块中的sub过程或自定义函数(如果在标准模块程序中有多个过程或函数,要注意调用的先后顺序,否则得不到正确结果),调试运行程序,使其能输出正确结果。
3.按试题要求保存工程。
(二)程序调试题
[题1]Modify.bas模块中的Transfer过程用于将一个十六进制整数转换为十进制整数;number函数过程用于将一个十六进制符号转换为数值。
PublicSubTransfer()
DimHexAsString'十六进制数
DimDecAsDouble'十进制数
DimtempAsString
DimiAsInteger
DimnAsInteger
Hex=InputBox("输入一个十六进制整数")
'******错误1*******
n=Val(Hex)
‘n=len(Hex)
i=0
Do
'******错误2*******
temp=Mid(Hex,i,1)
‘temp=Mid(Hex,n-i,1)
'******错误3*******
Dec=Dec+number*16^i
Dec=Dec+number(temp)*16^i
i=i+1
LoopWhilei'******错误4******
Form1.Printstr(Hex)&"转换为十进制数为"&str(Dec)
‘Form1.printHex&“转换为十进制数为”&str(Dec)
EndSub
PublicFunctionnumber(strAsString)AsInteger
SelectCasestr
Case"a","A"
number=10
Case"b","B"
number=11
Case"c","C"
number=12
Case"d","D"
number=13
Case"e","E"
number=14
Case"f","F"
number=15
CaseElse
number=Val(str)
EndSelect
EndFunction
[题2]Modify.bas模块中的BubbleSort过程是冒泡排序法;GenerateData过程产生个[1,20]之间互不相同的随机整数;Swap过程交换两个变量的数值。
PrivateConstn=10
Privatea(1Ton)AsInteger
'BubbleSort过程是冒泡排序
'Swap过程交换两个变量数值
'GenerateData过程产生10个[1,20]之间互不相同的随机整数
PublicSubBubbleSort()
DimiAsInteger,jAsInteger
i=1
Do
Forj=i+1Ton
Ifa(j)>a(i)Then
'*******1*********
Swap(a(j),a(i))
‘.Swapa(j),a(i)
EndIf
Nextj
i=i+1
'*******2*******
LoopWhilei=n
‘LoopwhileiForm1.Print"排序结果"
Fori=1Ton
Form1.Printa(i);
Nexti
EndSub
PublicSubGenerateData()
DimiAsInteger
DimjAsInteger
DimbAsBoolean
Fori=1Ton
b=False
DoWhileNotb
a(i)=Int(20*Rnd+1)
b=True
'******3******
Forj=1Toi
‘forj=1toi-1
Ifa(i)=a(j)Then
b=False
ExitFor
EndIf
Nextj
Loop
Form1.Printa(i)
Nexti
EndSub
'********4********
PublicSubSwap(ByValaAsInteger,ByValbAsInteger)
‘PublicSubSwap(aasinteger,basinteger)
DimtempAsInteger
temp=a
a=b
b=temp
EndSub
[题3]Modify.bas模块中的wrap过程用于判断一个字符串是否“回文”。
所谓“回文”是指字符串顺读与倒读都是一样的,如“潮起潮落,落潮起潮”。
PublicSubWrap()
DimlengthAsInteger
Dimstr1AsString
DimstrleftAsString
DimstrrightAsString
DimkAsInteger
str1=InputBox("请输入任意的字符串")'输入任意字符串
'****错误1*****
length=Val(str1)
‘length=len(str1)
k=1
Do
'****错误2*****
strleft=Left(str1,k)'从左边起逐个取出一个字符
‘strleft=mid(str1,k,1)
'****错误3*****
strright=Right(str1,k)'从右边起逐个取出一个字符
‘strright=mid(str1,length-k+1,1)
'****错误4****
Ifstrleft=strrightThen
‘Ifstrleft<>strrightThen
ExitDo
EndIf
k=k+1
LoopWhilek<=length/2
Ifk>length/2Then
Form1.Printstr1&"是回文"
Else
Form1.Printstr1&"不是回文"
EndIf
EndSub
[题4]Modify.bas模块中的MaxLine过程用于查找一个5行4列的二维数组中行平均值最大的行,并将该行所有数据调整到第一行的位置。
Modify.bas模块中的DataProduce过程用于产生原始数据;Average过程用于计算各行的平均值;PrintArraay过程用于打印二维数组和行平均值。
Dima(1To5,1To4)AsInteger
Dimave(1To5)AsInteger
PublicSubMaxLine()
DimiAsInteger
DimjAsInteger
DimtempAsInteger
DimLine_noAsInteger'最大平均值的行号
'找出最大平均值所在行
Line_no=1
Fori=2To5
'******错误1*******
Ifave(Line_no)>=ave(i)Then
‘Ifave(Line_no)'******错误2*******
Line_no=ave(i)
‘Line_no=i
EndIf
Nexti
'交换第一行与最大平均值所在行
Forj=1To4
temp=a(1,j)
'******错误3******
a(Line_no,j)=a(1,j)
‘a(1,j)=a(Line_no,j)
a(Line_no,j)=temp
Nextj
'交换对应行的平均值
temp=ave
(1)
ave
(1)=ave(Line_no)
ave(Line_no)=temp
'打印交换后的数据
Form1.Print"交换后的数据和平均值"
PrintArray
EndSub
PublicSubDataProduce()
DimiAsInteger
DimjAsInteger
'产生5*4数组
Fori=1To5
Forj=1To4
a(i,j)=Int(100*Rnd)
Nextj
Nexti
EndSub
PublicSubAverage()
DimiAsInteger
DimjAsInteger
DimsumAsInteger
'计算各行平均值
Fori=1To5
sum=0
Forj=1To4
'******错误4******
sum=a(i,j)
‘sum=sum+a(i,j)
Nextj
ave(i)=sum/4
Nexti
'将数组和平均值打印出来
Form1.Print"原始数据和平均值"
PrintArray
EndSub
PublicSubPrintArray()
DimiAsInteger
DimjAsInteger
Fori=1To5
Forj=1To4
Form1.Printa(i,j);Spc(3);
Nextj
Form1.Print"平均值=";ave(i)
Nexti
EndSub
[题5]Modify.bas模块中的TJ过程是将一批数据中小于零的数及它们的积打印出来,但不完整,请在横线上填入必要的内容,使其完整。
Modify.bas模块中的SCSJ过程是产生数据,数据的取值范围为-10~10之间的随机数。
PrivateConstn=10
Privatea(1Ton)AsInteger
'TJ过程是将一批数据中小于零的数及它们的积打印出来
'数据由SCSJ过程产生,数据的取值范围为-10~10之间的随机整数数
PublicSubTJ()
DimiAsInteger
DimtAsSingle
--------1--------t=1
Fori=1To10
If--------2--------a(i)<0Then
t=t*a(i)
EndIf
Nexti
Form1.Print"T=";t
EndSub
PublicSubSCSJ()
Randomize
Form1.Print"原始数据"
DimiAsInteger
DimjAsInteger
Fori=1Ton
'随机产生0或1,为0时取负,为1时取正
j=Int(Rnd*2)
If------3-----j=0ThenJ=-1
a(i)=j*Int(Rnd*(n+1))
Form1.Printa(i);
Nexti
Form1.Print
EndSub
[题6]Modify.bas模块中的calculate过程是产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来.
Publicsubcalculate()
Dima(1to100)asinteger
Dimx(1to10)asinteger
DimIasinteger,pasinteger
‘产生100个[0,99]范围内的随机整数
‘每行10个打印出来
forI=1to100
‘**********1**********
a(i)=rnd*100
‘a(i)=int(Rnd*100)
ifa(i)<10then
form1.printspace
(2);a(i)
else
form1.printspace
(1);a(i);
endif
ifImod10=0thenform1.print
nextI
‘统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数
‘并将统计结果保存在数组x
(1),x
(2),……,x(10)中,将统计结果打印出来
forI=1to100
‘**********2**********
p=int(a(i)/10)‘求个位上的数字
p=a(i)mod10
ifp=0thenp=10
‘**********3**********
x(p)=x(p)-1
x(p)=x(p)+1
nextI
form1.print“统计结果”
forI=1to10
p=I
ifI=10thenp=0
‘**********4**********
form1.print“个位数为”+str(p)+”共 “+str(x(p))+”个”
Form1.print“个位数为”+str(p)+”共”+str(x(i))
nextI
endsub
[题7]Modify.bas模块中的PrintArray过程是用于打印一个5行5列的数字方阵,并使两对角线上元素均为1,其余均为2。
要求打印的数字方阵两列数字之间空3格,两行之间空一行。
PublicSubPrintArray()
'下面程序用于打印5行5列的数字方阵
'使两对角线上元素均为1,其余均为2
'要求打印的数字方阵两列数字之间空3格,两行之间空一行
'只要修改标出出错位置的下面那一条语句
Dima(5,5)AsInteger
DimiAsInteger,jAsInteger
Fori=1To5
Forj=1To5
'********错误1*********
Ifi<>jOri<>6-jThen
Ifi<>jandi<>6-jthen
a(i,j)=2
Else
a(i,j)=1
EndIf
'********错误2*********
Form1.Printa(i,j)+Space(3);
Form1.printa(I,j);space(3);
Nextj
'*******错误3*******
Form1.Print
form1.print:
form1.print
Nexti
EndSub
[题8]Modify.bas模块中的Guess过程是猜数游戏,由计算机产生一个[1,100]的任意整数,输入猜数后计算机给出提示,如果5次后还没有猜中就结束游戏并公布正确答案,请改正其中的错误。
说明:
只要修改标出出错位置的下面那条语句。
PublicSubGuess()
DimRAsInterger
DimXAsInteger
DimtimeAsInteger
Randomize
----1----
R=Rnd*100'产生一个1—100的任意整数
R=int(rnd*100)+1
Times=1
Do
X=Val(InputBox("输入猜数X")
SelectCaseX
CaseR
Form1.Print"猜中了"
ExitDo
----2----
CaseX>R
CaseIs>R
Form1.Print"太大了,继续猜!
"
CaseElse
Form1.Print"太小了,继续猜!
"
EndSelect
Times=times+1
----3----
LoopWhiletimes>5
Loopuntiltimes>5
Iftimes>5Then
Form1.Print"猜数失败,游戏结束!
"
----4----
Form1.Print"正确答案为"&Str(x)
Form1.print“正确答案为”&str(r)
EndIf
EndSub
[题9]Modify.bas模块中的Findat过程是用于在一个字符串变量中查找”at”,并用消息框给出查找结果的报告:
没有找到或找到的个数。
PublicSubFindat()
'在字符串str1中查找"at"
Dimstr1AsString
DimlengthAsInteger'字符串长度
DimsumAsInteger'查到的个数
DimiAsInteger
str1=InputBox("请输入一个字符串")
length=----1----Len(str1)
i=1
sum=0
DoWhilei<=----2----length-1
If----3----mid(str1,I,2)="at"Then
sum=sum+1
EndIf
i=i+1
Loop
If----4----sum=0Then
MsgBox"没有找到!
"
Else
MsgBox"找到了"&Str(sum)&"个"
EndIf
EndSub
[题10]本程序从键盘上输入一个任意的字符串,将该字符串的所有组成字符拆分开,再按照字符ASCII码从小到大的顺序将这些字符重新组成新的字符串。
例如输入a4fkze5,重新组合的字符串为45aefkz。
请在横线上填入出境必要的内容。
OptionExplicit
PublicSubsortchar()
DimxAsString'原始字符串
DimyAsString'重新组合的字符串
Dimc()AsString'拆分出的字符
DimlasInteger'字符串长度
DimIasInteger,jAsInteger
DimtempAsString
X=InputBox("输入一个字符串")
L=------1------len(x)
ReDimc
(1)AsString
'字符串拆分
ForI=1tol
C(i)=------2------mid(x,i,1)
NextI
'字符排序
ForI=1tol-1
Forj=------3------i+1tol
Ifc(i)>c(j)Then
Temp=c(i)
C(i)=c(j)
C(j)=temp
EndIf
Nextj
NextI
'排序后的字符组成新字符串
y=""
ForI=1tol
------4------y=y&c(i)
NextI
Form1.Print"原始字符串";x
Form1.Print"重新组合的字符串";y
EndSub
[题11]sum过程用于计算f=1-1/(2*3)+1/(3*4)-1/(4*5)+……+1/(19*20),请在横线上填入必要的内容。
OptionExplicit
PublicSubsum()
DimfAsSingle
DimiAsInteger
DimsignAsInteger
'------1------sign=-1
f=1
'------2------forI=2to19
f=f+sign/(i*(i+1))
'------3------sign=-sign
Nexti
Form1.Print"f=";f
EndSub
[题12]有一个数列,它的前三个数是0,1,2,从第四个数起,每个数都是它前面的两个数之和(斐邦纳契数列),过程Fabonia用于求出该数列的第17个数是多少?
求出该数列的第几个数起每个数都超过1E+8?
请在横线上填入必要的内容。
OptionExplicit
PublicSubFabonia()
Dimlast_oneAsLong
Dimlast_twoAsLong
Dimthis_oneAsLong
DimiAsInteger
last_one=1'数列的第二个数
last_two=2'数列的第三个数
i=4'从数列的第四个数求起
Do
this_one=last_one+last_two
'------1------last_one=last_two
'------2------last_two=this_one
Ifi=17Then
Form1.Print"No:
17=";this_one
EndIf
'------3------i=i+1
LoopWhilethis_one<=100000000#
Form1.Print"No:
";'------4------i-1;is>1E+8
EndSub
[题13]以下程序完成下列功能:
随机产生9个[1-100]的整数数组,并按从小到大的顺序进行排序,从键盘输入一个正数,找到该数在原来9个数中的插入点,使得该数插入数组后,数组的10个数依然是从小到大的顺序。
请在横线上填入必要的内容。
OptionExplicit
PublicSubInsert()
Dimx(10)AsInteger
DimiAsInteger,jAsInteger
DimtempAsInteger
DiminsAsInteger,posAsInteger
'随机产生9个1--100的整数并排序
Randomize
Fori=1To9
'------1------x(i)=int(