中国海洋大学VB上级考试完美无缺答案.docx
《中国海洋大学VB上级考试完美无缺答案.docx》由会员分享,可在线阅读,更多相关《中国海洋大学VB上级考试完美无缺答案.docx(34页珍藏版)》请在冰点文库上搜索。
中国海洋大学VB上级考试完美无缺答案
1.某数组有20个元素,其值为随机产生的两位整数。
现要求将前10个元素与后10个元素对换。
即第1个元素与第20个元素互换,第2个数与第19个元素互换,…,第10个元素与第11个元素互换。
在窗体上输出数组原来各元素的值与对换后各元素的值。
OptionExplicit:
OptionBase1
Dima(20)AsInteger,iAsInteger,tAsInteger
PrivateSubForm_Click()
Print"原始数组是:
"
Randomize
Fori=1To20
a(i)=Int(Rnd*90)+10
Printa(i);
IfiMod10=0ThenPrint
Nexti
Print"现在数组是:
"
Fori=1To10
t=a(i):
a(i)=a(21-i):
a(21-i)=t
Nexti
Fori=1To20
Printa(i);
IfiMod10=0ThenPrint
Nexti
EndSub
2.从数组中删除一个数。
先定义一个一维数组,大小、数组的值自定。
从键盘上输入一个数,若这个数在数组当中,就把它删除;若这个数不在数组中,提示“该数不在数组中”
注意:
1)如果数组中存在多个与该数相同的元素,每一个都能删除;
2)能实现多次删除
OptionExplicit
Dima()AsInteger
PrivateSubCommand1_Click()
DimiAsInteger
ReDima(9)AsInteger
Print"原来数组定为:
"
Randomize
Fori=0To9
a(i)=Int(Rnd*15)
Printa(i);
Nexti
Print
EndSub
PrivateSubCommand2_Click()
DimiAsInteger,jAsInteger,nAsInteger,kAsInteger,flagAsBoolean
n=InputBox("查找的数是:
")
flag=False
Do
Ifa(i)=nThen
j=i:
flag=True
Fork=jToUBound(a)-1
a(k)=a(k+1)
Nextk
ReDimPreservea(UBound(a)-1)
i=i-1
EndIf
i=i+1
LoopWhile(i<=UBound(a))
Ifflag=FalseThen
MsgBoxn&"不在该数组中"
Else
Print"删除"&n&"后的数组是:
"
Fori=0ToUBound(a)
Printa(i);
Nexti
Print
EndIf
EndSub
3.数组a中存放着升序排列的数据,使用array赋值,将inputbox输入的新数插入到数组中,插入后数组仍有序。
注意:
要求利用动态数组,能够实现多次插入
OptionExplicit:
OptionBase1
Dima()
PrivateSubCommand1_Click()
DimiAsInteger
a=Array(8,18,28,38,48,58,68,78,88,98)
Print"原始数组a(i)定为:
";
Fori=1To10
Printa(i);
Next
Print
EndSub
PrivateSubCommand2_Click()
DimXAsInteger,nAsInteger,iAsInteger
Randomize
X=Int(Val(InputBox("插入值X","输入",Int(Rnd*90+10))))
Print"插入";X;"后数组为:
";
n=UBound(a)
ReDimPreservea(n+1)
Fori=nTo1Step-1
Ifa(i)>XThen
a(i+1)=a(i)
Else
a(i+1)=X
ExitFor
EndIf
Next
Ifi=0Thena
(1)=X
Fori=1ToUBound(a)
Printa(i);
Next
Print
EndSub
4.6个评委为4位歌手打分,分数介于1-100之间。
去掉一个最高分,一个最低分,求出每位选手的最后得分。
将4位歌手得分从高到低排列输出,同时输出该选手的编号。
如:
歌手395分
歌手187分
歌手480分
歌手270分
OptionExplicit:
OptionBase1
Dima(4,6)
PublicTypecandidates
numberAsString*3
scoreAsString*3
EndType
PrivateSubCommand1_Click()
Dimb(4)Ascandidates,iAsInteger,jAsInteger,maxAsInteger,minAsInteger,sumAsInteger,tAscandidates
Fori=1To4
sum=0
max=a(i,1)
min=a(i,1)
Forj=1To6
Ifa(i,j)>maxThenmax=a(i,j)
Ifa(i,j)sum=sum+a(i,j)
Nextj
sum=(sum-max-min)/(6-2)
b(i).number="歌手"&i:
b(i).score=sum&"分"
Nexti
Fori=1To3
Forj=i+1To4
Ifb(i).score
t=b(i):
b(i)=b(j):
b(j)=t
EndIf
Nextj
Nexti
Picture1.Print"选手的得分由高到低为:
"
Fori=1To4
Picture1.Printb(i).number,b(i).score
Nexti
EndSub
PrivateSubForm_Load()
DimiAsInteger,jAsInteger
Randomize
Fori=1To4
Forj=1To6
a(i,j)=Int(31*Rnd+70)
Nextj
Nexti
Command1.Caption="评委打分"
Picture1.FontSize=16
EndSub
5.编写函数求一元二次方程ax^2+bx+c=0的解。
注意:
要求考虑方程有两相等实根、两不等实根和两个虚根的情况。
OptionExplicit
PrivateSubCommand1_Click()
DimaAsSingle,bAsSingle,cAsSingle
a=Val(Text1.Text)
b=Val(Text2.Text)
c=Val(Text3.Text)
Printgetresult(a,b,c)
EndSub
PublicFunctiongetresult(ByValaAsSingle,ByValbAsSingle,ByValcAsSingle)AsString
DimxAsSingle,mAsSingle,yAsSingle
x=-b/(2*a)
m=b^2-4*a*c
y=Sqr(Abs(m))/2/a
SelectCasem
CaseIs>0
getresult="x1="&x+y&Chr(13)&"x2="&x-y
CaseIs=0
getresult="x1=x2="&x
CaseIs<0
getresult="x1="&x&"+"&y&"i"&Chr(13)&"x2="&x&"-"&y&"i"
EndSelect
EndFunction
PrivateSubForm_Load()
Text1.Text="":
Text2.Text="":
Text3.Text=""
EndSub
6.任意输入一组字符,统计出大写字母多少个,小写字母多少个,数字多少个?
要求用过程实现。
OptionExplicit
PrivateSubCommand1_Click()
DimSAsString
S=Text1.Text
Printstatistics(S)
EndSub
PublicFunctionstatistics(SAsString)AsString
DimiAsInteger,largeAsInteger,smallAsInteger,numAsInteger
Fori=1ToLen(S)
IfAsc(Mid(S,i,1))>=Asc("A")AndAsc(Mid(S,i,1))<=Asc("Z")Then
large=large+1
Else
IfAsc(Mid(S,i,1))>=Asc("a")AndAsc(Mid(S,i,1))<=Asc("z")Then
small=small+1
Else
IfAsc(Mid(S,i,1))>=48AndAsc(Mid(S,i,1))<=57Then
num=num+1
EndIf
EndIf
EndIf
Nexti
statistics="大写字母:
"&large&"个"&Chr(13)&"小写字母:
"&small&"个"&Chr(13)&"数字:
"&num&"个"
EndFunction
7.随机产生一个5*5的矩阵,将主对角线和次对角线元素都置为1,并求出矩阵的四周元素之和,显示在列表框中。
OptionExplicit:
OptionBase1
PrivateSubForm_Click()
DimA(5,5)AsInteger,iAsInteger,jAsInteger
DimsAsInteger,s1AsInteger,s2AsInteger,s3AsInteger,s4AsInteger
Randomize
Fori=1To5
Forj=1To5
Ifi=jOri+j=6Then
A(i,j)=1
Else
A(i,j)=Int(Rnd*8+2)
EndIf
Nextj
Nexti
Fori=1To5
Forj=1To5
PrintA(i,j);
Nextj
Print
Nexti
Print
Fori=1To5
s1=s1+A(i,1)
s2=s2+A(i,5)
Nexti
Forj=2To4
s3=s3+A(1,j)
s4=s4+A(5,j)
Nextj
s=s1+s2+s3+s4
Print"四周元素之和是:
"&s
EndSub
8.编写一个函数,能将字母按下列规律译成密码:
A<-->Za<-->z
B<-->Yb<-->y
即第1个字母与第26个字母互换,第i个字母与第(26-i+1)个字母互换。
在文本框中任意输入一个字符串,调用该函数将密码显示在另一个文本框中。
OptionExplicit
PrivateSubCommand1_Click()
DimSAsString
S=Text1.Text
Text2.Text=encrypt(S)
EndSub
PrivateFunctionencrypt(SAsString)AsString
DimiAsInteger,aAsString,bAsString
Fori=1ToLen(S)
a=Mid(S,i,1)
IfAsc(a)>=97AndAsc(a)<=122Then
b=Chr(219-Asc(a))
ElseIfAsc(a)>=65AndAsc(a)<=90Then
b=Chr(155-Asc(a))
EndIf
encrypt=encrypt&b
Nexti
EndFunction
9.编写2个函数,分别求两个正整数的最大公约数和最小公倍数,用户任意输入两个数,采用函数嵌套调用,该函数将它们在窗体显示。
PrivateSubForm_Click()
DimAAsInteger,BAsInteger
Do
A=InputBox("请输入第一个数:
")
IfA<=0ThenMsgBox"请输入正整数"
LoopUntilA>0
Do
B=InputBox("请输入第二个数:
")
IfB<=0ThenMsgBox"请输入正整数"
LoopUntilB>0
Print"两个数分别为:
";A;B
Print"最大公约数为:
";GCD(A,B)
Print"最小公倍数为:
";LCM(A,B)
EndSub
PrivateFunctionGCD(AAsInteger,BAsInteger)AsInteger
DimXAsInteger,YAsInteger,rAsInteger
X=IIf(A>=B,A,B)
Y=IIf(A<=B,A,B)
Do
r=XModY
Ifr=0ThenExitDo
X=Y:
Y=r
Loop
GCD=Y
EndFunction
PrivateFunctionLCM(AAsInteger,BAsInteger)AsInteger
LCM=A*B/GCD(A,B)
EndFunction
10.编写计算阶乘的Function过程,利用ex的下列公式计算e(直到最后一项小于10-6为止)的近似值。
ex≈1+x/1!
+x2/2!
+x3/3!
+…+xn/n!
OptionExplicit
PrivateSubForm_Click()
DimxAsInteger,nAsInteger,sAsDouble
x=InputBox("请输入一个0.5~1.5的数x:
")
Ifx>=1.5Orx<=0.5ThenMsgBox"数据溢出"
Do
s=s+(x^n)/(fact(n))
n=n+1
LoopUntilx^n/(fact(n))<10^(-6)
Prints
EndSub
PublicFunctionfact(nAsInteger)AsLong
DimiAsInteger,sAsLong
s=1
Fori=1Ton
s=s*i
Nexti
fact=s
EndFunction
11.输入整数N,显示具有N行的杨辉三角形,要求按正三角形的形式在图片框中显示。
OptionExplicit
PrivateSubForm_click()
Dima()AsInteger,b()AsString,iAsInteger,jAsInteger,nAsInteger,kAsInteger
n=InputBox("请输入图形行数")
ReDima(n+1,n+1),b(n+1,n+1)
k=6
Fori=1Ton
PrintString((n-i)*k/2+1,"");
Forj=1Toi
a(i,1)=1
a(i,i)=1
a(i+1,j+1)=a(i,j)+a(i,j+1)
b(i,j)=Trim(Str(a(i,j)))
Printb(i,j);String(k-Len(b(i,j)),"");
Nextj
Print
Nexti
EndSub
12.编写一个过程,输出以下菱形图形:
A
BBB
CCCCC
DDDDDDD
CCCCC
BBB
A
主程序输入一个奇数(>=3),调用过程在窗体上输入图形。
OptionExplicit
PrivateSubCommand1_Click()
DimnAsInteger
n=InputBox("请输入行数n")
IfnMod2=0Orn<2Then
MsgBox"请输入大于2的奇数"
Else
Calldiamond(n)
EndIf
EndSub
PrivateSubdiamond(xAsInteger)
DimiAsInteger,mAsInteger,tAsInteger
m=30
Fori=1To(x+1)/2
m=m-1
t=i
PrintTab(m);String(2*t-1,Chr(64+t))
Nexti
Fori=(x+1)/2+1Tox
m=m+1
t=x+1-i
PrintTab(m);String(2*t-1,Chr(64+t))
Nexti
EndSub
13.编写一个将十进制转换为二进制字符串输出的函数。
调用函数计算用户输入一个十进制数,在文本框中输出二进制值。
注意:
输入数据为负数,应该将符号位输出
如-13结果-1101
OptionExplicit
PrivateSubCommand1_Click()
Dimn%
n=Val(Text1.Text)
Text2.Text=Bid(n)
EndSub
PublicFunctionBid(xAsInteger)AsString
DimrAsInteger,mAsInteger
m=IIf(x>=0,x,-x)
r=mMod2
DoWhilem>=1
Bid=Str(r)&Bid
m=m\2
r=mMod2
Loop
Ifx<0ThenBid="-"&Bid
EndFunction
14.输入一个整数N,产生N个随机数(范围1—10*N),然后采用任何2种算法实现由小到大的排序。
将排序前后的数据显示出来。
OptionExplicit:
OptionBase1
Dima()AsInteger,nAsInteger
PrivateSubCommand1_Click()
DimiAsInteger
n=InputBox("请输入正整数n")
ReDima(n)
Print"排序前:
"
Fori=1Ton
a(i)=Int(Rnd*(10*n)+1)
Printa(i);
Nexti
Print
EndSub
PrivateSubCommand2_Click()
DimiAsInteger,jAsInteger,tAsInteger
Print"用比较交换法排序:
"
Fori=1Ton-1
Forj=i+1Ton
Ifa(j)t=a(i):
a(i)=a(j):
a(j)=t
EndIf
Nextj
Printa(i);
Nexti
Printa(n)
EndSub
PrivateSubCommand3_Click()
DimiAsInteger,jAsInteger,tAsInteger
Print"用冒泡法排序:
"
Fori=1Ton-1
Forj=1Ton-i
Ifa(j)>a(j+1)Then
t=a(j):
a(j)=a(j+1):
a(j+1)=t
EndIf
Nextj
Nexti
Fori=1Ton
Printa(i);
Nexti
EndSub
15.
编写程序,在窗体上输出3~100之间的所有素数。
要求每行显示4个数
OptionExplicit
PrivateSubCommand1_Click()
Print"3-100之间的所有素数为:
"
DimnAsInteger
Forn=3To100
Ifisprime(n)ThenCallprtprime(n)
Nextn
EndSub
PrivateFunctionisprime(aAsInteger)AsBoolean
DimiAsInteger
isprime=True
Fori=2ToCInt(Sqr(a))
IfaModi=0Then
isprime=False
ExitFor
EndIf
Nexti
EndFunction
PrivateSubprtprime(bAsInteger)
StaticcntAsInteger
Printb;
cnt=cnt+1
IfcntMod4=0ThenPrint
EndSub