VB编程题讲解39.docx
《VB编程题讲解39.docx》由会员分享,可在线阅读,更多相关《VB编程题讲解39.docx(19页珍藏版)》请在冰豆网上搜索。
VB编程题讲解39
1.输入100个数,统计其中负数、零及正数的个数。
PrivateSubForm_Click()
Dimi%,k%,fs%,ns%,zs%:
Remfs表示负数个数
Fori=1To100
k=Val(InputBox("输入一个数据"))
Ifk>0Then
zs=zs+1
ElseIfk<0Then
fs=fs+1
Else
ns=ns+1:
Remns表示正数个数
EndIf
Nexti
Print"负数、零及正数的个数分别是:
";fs,ns,zs
EndSub
2.PrivateSubForm_Click()
DimxAsSingle,IAsInteger
DimnAsInteger
e=1
n=0
Do
n=n+1
Item=1/fact(n)
e=e+Item
LoopWhileItem>=0.00000001
Form1.Print"e=";e
EndSub
PrivateFunctionfact(mAsInteger)AsSingle'求m!
的函数
DimxAsSingle,IAsInteger
x=1
ForI=1Tom
x=x*I
NextI
fact=x
EndFunction
3.计算s=1+2+2^2+2^3+……,直至s超过1E+16
DimsAsSingle
DimiAsInteger
s=1
i=1
DoWhiles<=1E+16
s=s+2^i
i=i+1
Loop
Form1.Print"s=";s
EndSub
4.打印由数字组成的如下所示金字塔图案
'9
'888
'77777
'6666666
'555555555
'44444444444
'3333333333333
'222222222222222
'111111*********11
DimiAsInteger,jAsInteger
Fori=1To9
Form1.PrintTab(10-i);
Forj=1To2*i-1
Form1.PrintChr(58-i);
Nextj
Form1.Print
Nexti
5、编一子程序验证哥德巴赫猜想:
一个大于等于6的偶数可以表示为两个素数之和。
如:
6=3+38=3+510=3+7
方法1:
PrivateSubForm_load()
Dimn%,n1%,n2%,i%,k%,t1AsBoolean,t2AsBoolean
n=Val(InputBox("输入大于6的正整数"))
Forn1=3ton\2step2
t1=True
Fork=2ton1\2‘判断n1是否是素数
IFn1modk=0thent1=False:
ExitFor
Nextk
IFT1then‘如果n1为素数,将n分解为n1+n2
n2=n-n1:
t2=True
Fork=2ton2\2‘判断n2是否是素数
IFn2modk=0thent2=False:
ExitFor
Nextk
EndIF
‘n1,n2同时为素数时打印输出
Ift1Andt2thenPrintn&"="&n1&"+"&n2:
ExitFor
Nextn1
EndSub
方法2:
将判断一个整数是不是素数写函数过程。
PrivateSubForm_load()
Dimn%,n1%,n2%
n=Val(InputBox("输入大于6的正整数"))
Forn1=3ton\2step2
n2=n-n1
Ifprime(n1)Andprime(n2)then
Printn&"="&n1&"+"&n2
ExitFor'结束循环
Endif
Nextn1
EndSub
PrivateFunctionPrime(n%)AsBoolean
Dimk%,YesAsBoolean
Yes=True
Fork=2ton\2
IFnmodk=0thenYes=False:
ExitFor
Nextk
Prime=Yes
EndFunction
6.y=0(x=0)
-1(x>0)
编程计算下列分段函数值:
PrivateSubCommand1_Click()
DimxAsSingle,yAsSingle
x=Val(InputBox("x=?
"))
Ifx<0Andx<>-3Then
y=x*x+x-6
ElseIfx>=0Andx<10Andx<>2Andx<>3Then
y=x*x-5*x+6
Else
y=x*x-x-1
EndIf
Print"y=";y
EndSub
7.编程序求表达式s=x/2!
+x^3/4!
+…+x^(2n-1)/(2n)!
的值,并在窗体上输出。
要求如下:
(1)变量x与n的值在窗体单击事件中用InputBox()函数输入,通过调用函数过程s实现题目要求。
(2)求表达式的值用函数过程Functions(n%,x!
)AsSingle完成。
OptionExplicit
PrivateFunctions(n%,x!
)AsSingle
Dimi%,k%,t#,f#
f=0#:
k=x:
t=1#
Fori=2To2*nStep2
t=t*i*(i-1)
f=f+k/t
k=k*x*x
Nexti
s=f
EndFunction
PrivateSubForm_Click()
Dimn%,x!
x=InputBox("x=")
n=InputBox("n=")
Print"s=";s(n,x)
EndSub
8.迭代法求
。
求立方根的迭代公式为:
提示:
初值
可取为a,精度为0.000001。
a值由键盘输入。
方法一
PrivateSubForm_click()
Dima!
x1!
x0!
a=InputBox("输入一个数A=?
","输入框")
x0=a/3'先给x0赋一初值
x1=2/3*x0+a/(3*x0*x0)'通过迭代公式求得到一个新的值x1
DoWhileAbs(x1-x0)>0.000001
x0=x1'将x1赋值给x0
x1=2/3*x0+a/(3*x0*x0)'再通过迭代公式求得到一个新的值x1
Loop
Printa;"的立方根是:
";x1
EndSub
方法二
PrivateSubForm_click()
Dima!
x1!
x0!
a=InputBox("输入一个数A=?
","输入框")
x1=a/3'先给x1赋一初值,
Do
x0=x1'将x1赋值给x0
x1=2/3*x0+a/(3*x0*x0)'通过迭代公式求得到一个新的值x1
LoopUntilAbs(x1-x0)<0.000001
Printa;"的立方根是:
";x1
EndSub
9.有1分、2分、5分硬币若干枚,从中取出20枚硬币使其总值为60分,求出取法的数量以及每一种取法的1分、2分、5分硬币个数。
解:
本题属于“穷举”问题,它的基本思想是:
一一列举各种可能的情况,并判断哪一种可能是符合要求的解,这种算法称为穷举法(又称“枚举法”)。
PrivateSubForm_Click()
Dimi%,j%,k%,m%,n%'用i,j,k分别代表1分、2分、5分枚数
n=0'n代表取法总数
Fori=1To20
Forj=1To20
k=20-i-j
m=i+2*j+5*k'用m代表取出20枚硬币的总值
Ifm=60Then'当20枚硬币的总值等60分,则输出
Print"1分:
";i,"2分:
";j,"5分:
",k
n=n+1
EndIf
Nextj
Nexti
Print"------------------------------------"
Print"总共有:
";n;"取法"
EndSub
方法二、
Dimi%,j%,k%,m%,n%'用i,j,k分别代表1分、2分、5分枚数
n=0'n代表取法总数
Fori=1To20
Forj=1To20
Fork=1To20
m=i+2*j+5*k'用m代表取出20枚硬币的总值
Ifm=60Andi+j+k=20Then'当硬币数为20枚,且总值等60分,则输出
Print"1分:
";i,"2分:
";j,"5分:
",k
n=n+1
EndIf
Nextk
Nextj
Nexti
Print"------------------------------------"
Print"总共有:
";n;"取法"
EndSub
10.打印如下图所示的杨辉三角形(杨辉三角形为一个下三角矩阵,每一行第一个和主对角线上元素都为1,其余每一个数正好等于它上面一行的同一列与前一列数之和)。
PrivateSubForm_click()
Dimi%,j%
Constn=7
Dima(n,n)AsInteger'将定义为n×n的数组
Fori=1Ton'给第一列和主对角线上的元素赋值1
a(i,i)=1
a(i,1)=1
Nexti
Fori=3Ton
Forj=2Ton-1
a(i,j)=a(i-1,j-1)+a(i-1,j)'计算除第一列和主对角线上之外元素的值
Nextj
Nexti
Fori=1Ton
RemPrintTab(30-i*3);'定位每一行第一个元素输出位置
Forj=1Toi
Printa(i,j);
Ifa(i,j)<10Then'打印格式的设置
PrintSpace(3);
Else
PrintSpace
(2);
EndIf
Nextj
Print
Nexti
EndSub
11.编一程序,用InputBox函数输入12个整数,赋值给3*4的二维数组,求出其中最大元素及它的行、列坐标,并将数组按行(矩阵形式)输出到窗体,最大元素及行、列下标输出在数组的下方。
PrivateSubForm_Click()
Dima(3,4)AsInteger
Dimi%,j%,t%,max%,ir%ic%
Fori=1To3'输入数组元素
Forj=1To4
a(i,j)=InputBox("请输入"&"A("&i&","&j&")=")
Nextj
Nexti
ir=1:
ic=1:
max=a(1,1)'赋初值
Fori=1To3'将数组转置
Forj=1To4
IfmaxMax=a(i,j):
ir=i:
ic=j
EndIf
Nextj
Nexti
Fori=1To3'在窗体上输出数组元素
Forj=1To4
Printa(i,j);Spc
(2);
Nextj
Print
NextI
Print
Print"a(";ir";",";ic;")=";a(ir,ic)
EndSub
12.编写一个加密程序,界面下图所示。
要求:
(1)在原文本框中输入任何文本,立即在密文文本框中显示出加密结果。
(2)加密思想:
将每个字母向后顺序移动5个位置,如“A”→“F”、“B”→“G”、“a”→“f”、“b”→“g”、“Z”→“E”。
对于非字母字符原样输出。
PrivateSubText1_KeyPress(KeyAsciiAsInteger)
Dimstr$,Iasc%
str=Chr$(KeyAscii)
If(str>="A"Andstr<="Z")Then
Iasc=Asc(str)+5
IfIasc>Asc("Z")ThenIasc=Iasc-26
st=Chr$(Iasc)
ElseIf(str>="a"Andstr<="z")Then
Iasc=Asc(str)+5
IfIasc>Asc("z")ThenIasc=Iasc-26
st=Chr$(Iasc)
Else
st=str
EndIf
Text2.Text=Text2.Text+st
EndSub
13.编一程序统计文本框(Text1)中英文单词的个数。
设计单词的分隔符是空格,程序代码写在窗体单击事个中,结果输出到文本框(Text2)中。
PrivateSubForm_Click()
Dimn%,k%,str$,sp$
sp=""
n=0
str=Trim(Text1.Text)
k=InStr(str,sp)'查找第一个空格的位置
DoWhilek<>0
n=n+1'单词数加1
str=Mid$(str,k+1)'从str中去掉开始的第一个单词
str=Trim(str)
k=InStr(str,sp)'再次查找第一个空格的位置
Loop
n=n+1'加中最后一个单词数
Text2.text="单词个数为&n
EndSub
14.产生30个1--100之间的随机整数,计算这30个数的平均值,找出30个数中数值在平均值之上的数据,并统计出这些数据的个数。
PrivateSubCommand1_Click()
Dimx(30)AsInteger
DimsumAsInteger,aveAsInteger'平均值取整数
DimiAsInteger
DimcountAsInteger'在平均值之上的数据个数
Open"c:
\mydir\res.txt"ForOutputAs#1
Randomize
Fori=1To30
x(i)=Int(Rnd*100)+1
Nexti
sum=0
Fori=1To30
sum=sum+x(i)
Nexti
ave=sum/30
'5个一行打印出原始数据,打印平均值
Fori=1To30
Print#1,x(i);Space
(2);
IfiMod5=0ThenForm1.Print
Nexti
Print#1,"平均值:
";ave
'找出并5个一行打印在平均值之上的数据,打印统计的个数
Print#1,"在平均值之上的数据是:
"
Fori=1To30
Ifx(i)>aveThen
count=count+1
Print#1,x(i);Space
(2);
IfcountMod5=0ThenForm1.Print
EndIf
Nexti
Form1.Print
Print#1,"共有";count;"个在平均值之上."
Close#1
EndSub
15.编写函数Insertfun(a%(),y%),它的功能是:
把y值插入到有序(升序)数组a中,插入后数组中的数仍然有序。
PrivateSubInstert(a()AsSingle,yAsSingle)
Dimp%,n%,i%
n=UBound(a)
Printn
ReDimPreservea(n+1)
p=0
DoWhiley>a(p)Andpp=p+1
Loop
Printp
Fori=nTopStep-1
a(i+1)=a(i)
Nexti
a(p)=y
EndSub
16.输入一个5行、6列的数组,先以5行6列的格式输出该数组,然后找出该数组中值最小的元素,输出该元素及其两个下标。
PrivateSubForm_Click()
Dimi%,j%,row%,col%,max%,A(5,6)AsInteger
Fori=1To5
Forj=1To6
A(i,j)=Val(InputBox("A("&i&","&j&")"))
PrintA(i,j);
Nextj
Print
Nexti
Print
max=A(1,1):
row=1:
col=1
Fori=1To5
Forj=1To6
Ifmaxmax=A(i,j):
row=i:
col=j
EndIf
Nextj
Nexti
Print"max=";max,"row=";row,"col=";col
EndSub
17.产生100个[0,99]范围内的随机整数,每行10个打印出来,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数,并将统计结果保存在数组x
(1),x
(2),...,x(10)中,将统计结果打印出来。
PrivateSubCommand1_Click()
Dima(1To100)AsInteger
Dimb(0To9)AsInteger
DimiAsInteger,kAsInteger
Fori=1To100
a(i)=Int(Rnd*100)
k=a(i)Mod10
b(k)=b(k)+1
Nexti
Fork=0To9
Print"个位数是"&k&"有";b(k)&"个"
Nextk
EndSub
18.从键盘上输入一个任意的字符串,将该字符串的所有组成字符拆分开,再按照字符ASCII码从小到大的顺序将这些字符重新组成新的字符串。
例如输入a4fkze5,重新组合的字符串为45aefkz。
PrivateSubCommand1_Click()
DimxAsString'原始字符串
DimyAsString'重新组合的字符串
Dimc()AsString'拆分出的字符
DimlAsInteger'字符串长度
DimiAsInteger,jAsInteger
DimtempAsString
x=InputBox("输入一个字符串")
l=Len(x)
ReDimc(l)AsString
'字符串拆分
Fori=1Tol
c(i)=Mid(x,i,1)
Nexti
'字符排序
Fori=1Tol-1
Forj=i+1Tol
Ifc(i)>c(j)Then
temp=c(i)
c(i)=c(j)
c(j)=temp
EndIf
Nextj
Nexti
'排序后的字符组成新字符串
y=""
Fori=1Tol
y=c(i)+y
Nexti
Form1.Print"原始字符串";x
Form1.Print"重新组合的字符串";y
EndSub
19.采用连除2取余数的方法,将一个十进制数转换为二进制数。
DimDecAsInteger'输入一个十进制数
DimBinAsString'转换为二进制表示
DimresAsInteger
DimiAsInteger
Dec=Val(InputBox("x="))
Form1.Print"十进制数:
";Dec
Do
res=DecMod2'求出除以2的余数
Bin=res&Bin
Dec=Dec\2
LoopWhileDec<>0
Form1.Print"转换为二进制数为:
";Bin
20.编一函数将二进制字符串转换成十进制数
FunctionTransfer(binAsString)AsDouble
DimDecAsDouble'十进制数
DimtempAsString
DimiAsInteger
DimnAsInteger
n=Len(bin)
i=0
Do
temp=Mid(bin,n-i,1)
Dec=Dec+Val(temp)*2^i
i=i+1
LoopWhileiTransfer=Dec
EndFunction