上机程序调试题题目及参考答案.docx
《上机程序调试题题目及参考答案.docx》由会员分享,可在线阅读,更多相关《上机程序调试题题目及参考答案.docx(58页珍藏版)》请在冰点文库上搜索。
![上机程序调试题题目及参考答案.docx](https://file1.bingdoc.com/fileroot1/2023-6/25/fb3e50a5-c714-4361-8a38-dac5e5be27c2/fb3e50a5-c714-4361-8a38-dac5e5be27c21.gif)
上机程序调试题题目及参考答案
第二部分VB上机考试模拟试题
一、程序调试题(改错或填空)
(二)程序调试题
[题1]Modify.bas模块中的getanswer过程是用于计算一元二次方程的根,并将结果输出来。
OptionExplicit
PublicSubgetanswer()
'该过程是用于计算一元二次方程的根,并将结果输出来。
Dimdalt!
a#,b#,c#
a=InputBox("输入系数a")
b=InputBox("输入系数b")
c=InputBox("输入系数c")
dalt=b*b-4*a*c
If----1----dalt>0then
dalt=Sqr(dalt)
MsgBoxFormat((-b+dalt)/2/a),"0.00"+Chr(13)+Chr(10)+Format((-b-dalt)/2/a,"0.00")
Elseif---2----dalt=0then
MsgBoxFormat(-b/2/a,"0.00")+Chr(13)+Chr(10)+Format(-b/2/a,"0.00")
Else
dalt=---3----Sqr(-dalt)
MsgBoxFormat((-b+dalt)/2/a,"0.00")+"+i"+Chr(13)+Chr(10)+Format((-b-dalt)/2/a,"0.00")+"-i"
EndIf
EndSub
[题2]打印输出一菱形图案。
PublicSubprt()
'打印由#组成的菱形图案
'#
'###
'#####
'#######
'#########
'#######
'#####
'###
'#
DimiAsInteger,jAsInteger
DimstartAsString'每行起始空格数
DimcountAsInteger'每行#个数
Fori=1To9
Ifi<=5Then
'------1------start=space(21-i)
count=2*i-1
Else
start=Space(11+i)
'-------2------count=19-2*i
EndIf
'------3------form1.printstart;
Forj=1Tocount
Form1.Print"#";
Nextj
'------4------form1.print
Nexti
EndSub
[题3]过程pyramid用以打印一个数字金字塔,请在横线上填入必要的内容(将横线删除掉后填入正确的内容),使其完整。
OptionExplicit
PublicSubpyramid()
'打印数字金字塔
'1
'222
'33333
'4444444
'555555555
'6666666
'77777
'888
'9
DimiAsInteger
DimjAsInteger
DimstartAsString'每行起始空格数
DimnumAsInteger'每行数字个数
Fori=1To9
Ifi<=5Then
start=Space(20-i)
num=2*i-1
Else
start='------1------Space(10+i)
num='------2------2*(10-i)-1
EndIf
Form1.Printstart;
Forj=1Tonum
'------3------form1.printtrim(str(i));
Nextj
'------4------form1.print
Nexti
EndSub
[题4]改错。
OptionExplicit
PublicSubprt()
'打印由数字组成的如下所示金字塔图案
'9
'888
'77777
'6666666
'555555555
'44444444444
'3333333333333
'222222222222222
'111111*********11
DimiAsInteger,jAsInteger
'******错误1******
Fori=9To1step-1
Form1.PrintSpace(i);
'******错误2******
Forj=1To2*(10-i)-1
'******错误3******
Form1.Printtrim(str(i));
Nextj
Form1.Print
Nexti
EndSub
[题5]计算s=7+77+777+……+(n个7组成的数)。
PublicSubtotal()
'计算s=7+77+777+……+(n个7组成的数)
Constn=20
DimsAsSingle
DimiAsInteger
Fori=1Ton
s=s+'-------1------number(i)
Nexti
Form1.Print"s=";s
EndSub
PublicFunctionnumber('---2---nasinteger)AsSingle
DimiAsInteger
number=0
Fori=1Ton
'---3---number=number*10+7number=value(number&7)
Nexti
EndFunction
[题6]Modify.bas模块中的过程eat用于计算猴子共摘了多少个桃子。
OptionExplicit
PublicSubeat()
'该过程是用于计算猴子共摘了多少个桃子。
'(小猴在一天摘了若干个桃子,当天吃掉了一半多一个;
'第二天吃了剩下的一半多一个;
'以后每天都吃尚存的一半零一个,到第7天早上要吃时只剩下一个了),
'并将结果输出来。
Dimn%,i%,x%
x=1
fori=6to---1----1step----2-----1
-----3----x=2*(x+1)
Nexti
Form1.Print"共有";x;"个桃子"
EndSub
[题7]Modify.bas模块中的Prime过程是求出100到200之间所有的素数,并打印出来。
PublicSubprime()
'打印出100到200之间所有的素数,并统计素数的个数
DimiAsInteger
DimjAsInteger
DimkAsInteger
DimtAsInteger'统计素数的个数
DimbAsBoolean
Fori=100To200
b=True
------1-------k=2
j=Int(Sqr(i))
DoWhilek<=jAndb
IfiModk=0Then
------2------b=false
EndIf
------3------k=k+1
Loop
if------4-------bb=truethen
t=t+1
Form1.Printi
EndIf
Nexti
Form1.Print"t=";t
Endsub
[题8]过程even用以验证一个偶数可以分解为两个素数之和;Isprime用以判断x是否是素数。
请在横线上填入必要的内容(将横线删除掉后填入正确的内容),使其完整。
PublicSubeven()
'从键盘输入一个大于4的偶数,将它所有的不重复的分解式求出
DimxAsInteger
DimiAsInteger
'--1--dowhilex<4orxmod2<>0dowhilex<4orxmod2=1'保证x是大于4的偶数
x=Val(InputBox("x="))
Loop
Fori=3Tox/2Step2'在不大于x的奇数中找素数
'------2------ifisprime(i)andisprime(x-i)
Form1.Printx;"=";i;"+";x-i
EndIf
Nexti
EndSub
PublicFunctionIsprime(xAsInteger)AsBoolean
DimiAsInteger
'------3------isprime=true
Fori=2Tox-1
'------4------ifxmodi=0then
Isprime=False
ExitFor
EndIf
Nexti
EndFunction
[题9]Modify.bas模块中的find过程是用于找出被3、5、7除,余数为1的最小的5个整数,并将结果输出来。
OptionExplicit
PublicSubfind()
'该过程是用于找出被3、5、7除,余数为1的最小的5个整数,并将结果输出来。
DimcountN%,n%
countN=0
n=1
Do
n=----1----n+1
if--2----nmod3=1andnmod5=1andnmod7=1then
Form1.Printn
countN=countN+1
EndIf
Loop----3-----untilcountN=5whilecountN<5
EndSub
[题10]Modify.bas模块中的过程rn通过调用函数isLeapYear判断某年是否是闰年,若是,则打印"今年是闰年",否则打印"今年不是闰年"。
闰年的判断方法是:
凡是年份不能被4整除的都不是闰年,而且如果年份能被100整除但不能被400整除的也不是闰年。
OptionExplicit
PublicSubrn()
'该过程通过调用函数isLeapYear判断某年是否是闰年,若是,则打印"今年是润年"
'否则,打印"今年不是闰年"。
Constyear=2023
If----1----Isleapyear(year)Then
Form1.Print"今年是闰年"
Else
Form1.Print"今年不是闰年"
EndIf
EndSub
FunctionisLeapYear(yAsInteger)AsBoolean
IfyMod4<>0Or(yMod100=0AndyMod400<>0)Then
isLeapYear=False
Else
isLeapYear=True
EndIf
EndFunction
[题11]Modify.bas模块中的CountTo60过程是用于从一堆一分、二分、五分的硬币中取出20枚,使其总值为60分,要求输出取法的数量及每一种取法的一分、二分、五分的个数。
请建立工程将Modify.bas模块加入工程中进行调试。
注意:
只要修改标出出错位置的下面那一条语句即可,其余代码不要改动。
'从一堆一分、二分、五分的硬币中取出20枚,使其总值为60分
'输出取法的数量及每一种取法的一分、二分、五分的个数
DimoneAsInteger'一分硬币个数
DimtwoAsInteger'二分硬币个数
DimfiveAsInteger'五分硬币个数
Constn=20'总数20枚
DimkAsInteger'取法数量
k=0
Forone=1Ton
'*******错误1********
Fortwo=one+1Tonfortwo=1ton-one
five=n-one-two
'*******错误2*********
Ifone+two+five=60Thenifone+two*2+five*5=60then
k=k+1
Form1.Print"one=";one;"two=";two;"five=";five
EndIf
'*******错误3********
Nextonenexttwo
'******错误4******
Nexttwonextone
Form1.Print"k=";k
EndSub
[题12]过程same用以找出1—100之间所有的同构数。
所谓同构数是指一个数出现在它的平方数的右端,如25在25平方625的右端,则25为同构数。
利用数字转字符再取出右端字符的方法进行判断。
PublicSubsame()
DimiAsInteger
DimxAsString,x2AsString
Fori=1To1000
x1='------1------'trim(str(i))将i转字符型
x2='------2------'trim(str(i^2))将i^2转字符型
if'------3------x1=right(x2,len(x1))Then
Form1.Printi;"是同构数"
EndIf
Nexti
EndSub
[题13]Modify.bas模块中的ArmstrongNumber过程是用于求出1—999之间所有的Armstrong数,并打印出来。
所谓Armstrong数是指一个数等于它每位上数字的立方和。
PublicSubArmstrongNumber()
DimarmstrongAsInteger
DimiAsInteger
DimhundredAsInteger'百位上的数字
DimtenAsInteger'十位上的数字
DimoneAsInteger'个位上的数字
Fori=1To999
hundred=----1----i\100
ten=----2----(imod100)\10i\10mod10
one=----3----(imod100)mod10imod10
If----4----i=hundred^3+ten^3+one^3Then
Form1.Printi;"isarmstrongnumber"
EndIf
Nexti
EndSub
[题14]过程cloze用以求1~1000中的所有完数。
所谓完数是指一个数的所有因子之和等于其自身。
请在横线上填入必要的内容(将横线删除掉后填入正确的内容),使其完整。
OptionExplicit
Dima(50)AsInteger'存放每个数分解出来的因子
PublicSubcloze()
'求1--100中的所有完数
DimiAsInteger,jAsInteger
DimnAsInteger'因子个数
DimsAsInteger'因子和
Fori=1To1000
n=0
s=0
factor'-------1------i,n
Forj=1Ton
s=s+a(j)
Nextj
'-------2------ifi=sthen
Form1.Printi
EndIf
Nexti
EndSub
PublicSubfactor(ByValxAsInteger,ByRefkAsInteger)
DimiAsInteger
a
(1)=1
k=1
'------3------fori=2tox/2fori=2tox-1
IfxModi=0Then
k=k+1
'------4------a(k)=i
EndIf
Nexti
EndSub
[题15]Modify.bas模块中的Summary过程是用于计算并打印出s=1+2+2^2+2^3+……,直至s超过1E+16。
OptionExplicit
PublicSubsummary()
'该过程是用于计算s=1+2+2^2+2^3+……,直至s超过1E+16
DimsAsSingle
DimiAsInteger
------1------s=1
i=1
------2------dowhiles<=1E+16
s=s+2^i
------3------i=i+1
Loop
Form1.Print"s=";s
EndSub
[题16]Modify.bas模块中的qiuN过程是用于求出满足不等式1+2x+3x^2+4x^3+…+(n+1)x^n<1000的最大n值。
其中x是大于等于1的实数,其值由键盘输入。
OptionExplicit
PublicSubqiuN()
'该过程是用于求出满足不等式1+2x+3x^2+4x^3+…+(n+1)x^n<1000的最大n值,
'其中x是大于等于1的实数,其值由键盘输入。
DimxAsSingle,sAsSingle,nAsInteger,s1AsSingle,pAsSingle
x=Val(InputBox("x="))
s=1:
n=1
p=x
while----1----s<1000
s1=s
s=s+(n+1)*p
p=p*----2----x
n=----3----n+1
Wend
n=----4-----n-1
form1.Print"TheMaxismofn";n,"s=";s1
EndSub
[题17]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
[题18]Modify.bas模块中的JiSuan过程是用于计算1-(1/2)+(1/3)-……+(1/99)-(1/100)的值并打印出来。
PublicSubJiSuan()
'计算1-(1/2)+(1/3)-...+(1/99)-(1/100)的值并打印出来
DimiAsInteger
'******错误1*******
DimkAsIntegerdimkassingle
DimsAsSingle
s=0
'*******错误2*******
Fori=1To100fori=1to100step2
k=1/i
s=s+k
'*******错误3*******
k=1/i+1k=1/(i+1)
s=s+k
Nexti
Form1.Print"s=";s
EndSub
[题19]Modify.bas模块中的summary过程是用于计算1!
+2!
+…+20!
,并打印出计算结果,但不完整,请在横线上填入必要的内容,使其完整。
Modify.bas模块中的nFaction函数过程用于计算n!
。
PublicFunctionnFactor(ByValnAsInteger)AsDouble
DimiAsInteger
DimtempAsDouble
----1----temp=1
Fori=1Ton
temp=temp*i
Nexti
nFactor=----2----temp
EndFunction
PublicSubsummary()
DimsumAsDouble
DimiAsInteger
DimnAsInteger
n=20
Fori=1Ton
sum=sum+----3----nfactor(i)
Nexti
Form1.Print"sum="&----4----sum
EndSub
[题20]Modify.bas模块中的find过程是用于从1到10000中找出这样的数,该数各个位的数字的阶乘相加之和等于该数,并将结果输出。
其中阶乘由fact函数计算。
OptionExplicit
PublicSubfind()
'该过程是用于从1到10000中找出这样的数,
'该数各个位的数字的阶乘相加之和等于该数,并将结果输出。
Dimk,a,n,i
DimpAsInteger
Fork=1To10000
a=LTrim(Str(k))
n=0
Fori=----1-----1tolen(a)
p=Val(Mid(a,i,1))
n=-----2----n+fact(p)
Nexti
Ifn=kThenform1.Printk
Nextk
EndSub
Functionfact(xAsInteger)AsLong
'该函数用于计算阶乘
DimyAsLong
Dimi%
y=1
Fori%=1Tox
y=y*