




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
江苏计算机二级VB等级考试题型解析
VB常用算法(一)累加和连乘
1、算法说明
累加形式:V=V+e
连乘形式:V=V*e
其中:V是变量,e是递增表达式。累加和连乘一般通过循环结构来实现。
注意:需在执行循环体前对变量V赋初值。一般的,累加时置初值0;连乘时置初值为1。
举例
求N!的结果。
PrivateSubCommandl_Click()
Dimn%,i%,s&
n=%l(InputBox("输入nn))
s=1
Fori=1Ton
s=s*i
Nexti
Prints
EndSub
错误的写法:
PrivateSubCommandl_Click()
Dimn%,i%,s&
n=%l(InputBox("输入n"))
Fori=1Ton
s=1初值语句位置不对!
s=s*i
Nexti
Prints=输出s的值为n,而不是n!
EndSub
应用举例
根据下列公式,求自然对数e的近似值。
,1111।/1
e-i+—+—+—++—=1+>-
1!2!3!nl=/!
要求:误差小于0.00001
PrivateSubCommandl_Click()
Dimi%,n&,t!,e!
e=2
i=1
t=1
DoWhilet>0.00001
i=i+1
t=t/i
e=e+t
Loop
Print"计算了";i;"项目和是:";e
PrintExp(l)=与上句输出值进行对比以证明算法的正确性
EndSub
解题技巧
1)由于这类题目往往是根据精度要求来求值,因此我们不能预知具体循环次数,所以这类题
目一般用Do循环,很少用For循环。设定循环变量和通项变量,注意各变量的初值;
2)分解通项表达式中各因子,并分别将各因子用循环变量表示;
3)如果步骤2中有的因子比较复杂,难以直接用变量表示,此时可以考虑使用Function过程;
4)根据步骤1、2、3,写出通项表达式;
5)根据精度要求(往往是通项小于10负多少次方这样一个关系表达式),写出一条满足精度
要求后跳出循环的语句。通常是用:if通项表达式>1(F(-N)thenexitdo,注意这句话一般
需放在累加或者连乘式之前。
实例说明
以2002年春上机试卷06编程题为例
根据X值计算:
(—1严、Ng)
Cos(X)=l--+--+[2(〃-1)]!+
2!4!
n=l,2,
要求:n项绝对值小于等于10-6为止。
1.由于循环次数不确定,因此确定用D。循环结构并定义循环变量用n表示(初值1);用户
输入的值用x表示;通项用dblCos表示;累加值用sum表示,初值为0;
2.分解通项式的组成
M+l2(M-1)
(-DV
[2(〃—1)]!
可以分解为三部分:
㈠严
可以表示为:(-1)A(n+1)
-ST)
可以表示为:xA(2*(n-l))
[2(〃—1)]!
比较复杂,难以直接表示
3.由于步骤2中复杂,此时考虑使用过程。
[2(7/-1)]!
于是定义过程,输入值是n,返回值是1」
于是有:
privateFunctioncomp(naslong)aslong
dimIaslong
dimresultaslong
result=l』匕处注意,由于是连乘,初值为1
for1=1to2*(n-l)
result二result*1
nextI
comp=result
EndFunction
注意:由于是参数按地址传递,因此对于本题,实参的值不能在过程中被改变!(也是改错题
常考的地方!!)
4.根据步骤1、2、3,写出通项dblCos的表达式:
dblCos=(—1)A(n+1)*xA(2*(n-l))/comp(n)
5.根据精度要求知:
Ifabs(dblCos)<=10A(-6)thenexitdo
最后程序为:
PrivateSubCommandl_Click()
DimnAsLong,dblCosAsDouble,xAsDouble
x=Vhl(Textl.Text)
n=1
Do
dblCos=(-1)A(n+1)*xA(2*(n-1))/comp(n)
IfAbs(dblCos)<=10A(-6)ThenExitDo
Sum=Sum+dblCos
n=n+1
Loop
PrintSum
EndSub
PrivateFunctioncomp(nAsLong)AsLong
Dim1AsLong
DimresultAsLong
result=1'此处注意,由于是连乘,初值为1
Forl=1To2*(n-1)
result=result*I
NextI
comp=result
EndFunction
注意:如果调试运行时死循环,可以按Ctrl+Break中断死循环,不需要重新启动机器。(或
者Ctrl+ScrollLock)
2、实战练习
1)补充代码(2003秋二(7))
本程序的功能是求下面数列前n项之和。
S(x,n)=x/2+2!*x八3/2*4+3!*x八5/2*4*6+..…+n!*x八2n-l/2*4*6...2n
OptionExplicit
PrivateSubCommandl_Click()
DimxAsSingle.sAsSingle
DimnAsInteger,!AsInteger
x=InputBox("输入X:“求数列和“,1)
n=InputBox("输入N:“,”求数列和“,1)
Fori=lTon
s=s+fun(x,i)
Nexti
Label1.Caption=—(1)—
Textl=s
EndSub
PrivateFunctionfun(xAsSingle,nAsInteger)AsSingle
P=1
Fori=lTon
Nexti
fun=xA(2*n-l)*p
EndFunction
2)编程题(2003春上机试卷03)
按下列公式编写求积分余弦函数值的程序。当通项绝对值小于10-5时停止计算。
/(.V)=hlX+=(-1)”可!z>0.
VB常用算法(二)最值问题--
1、算法说明
在若干数中求最大值,一般先取第一个数为最大值的初值(即假设第一个数为最大值),然后,
在循环体内将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,直到循环
结束。
求最小值的方法类同。
求若干数平均值,实质上就是先求和,再除以这些数的个数。
应用举例
随机产生n个1-100(包括1和100)的数,求它们的最大值、最小值和平均值。
PrivateSubCommandl_Click()
DimnAsInteger,iAsInteger,minAsInteger,maxAsInteger,averAsSingle,sAsInteger
n=Md(InputBox("输入个数:"))
s=Int(Rnd*100)+1
max=s
min=s
aver=s
Print”第1个数是:"&s
Fori=2Ton
s=Int(Rnd*100)+1
Print"第“&i&”个数是:”&s
Ifs>maxThenmax=s
Ifs<minThenmin=s
aver=aver4-s
Nexti
aver=aver/n
Print"max=";max;"min二";min;Haver=n;aver
EndSub
解题技巧
最大值、最小值、平均值类型题目往往和数组放在一起考!有的不仅求这些值,还要对具有
最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时
记录该值所在的行号和列号。
2、实战练习
1)补充代码(2000春二(9))
本程序的功能是在二维数组中查找鞍点元素,即该元素在所在行中为最大,且在所在列
中为最小。在一个数组中可能存在,也可能不存在这样的元素。数组各元素的值从文件data.txt
中读取。
PrivateSubForm_Click()
Dima(3,3)AsInteger,!AsInteger,jAsInteger
DimmaxvrAsInteger,colAsInteger,AsInteger
Opendata.txtForInputAs#1
Fori=lTo3
Forj=lTo3
Input#l,a(ij)
Printa(i,j);
Nextj
Nexti
Fori=lTo3
maxvr=(1)
col=l
Forj=2To3
Ifmaxvr<A(I,J)THEN
maxvr=(2)
col=j
EndIf
Nextj
Forj=lTo3
Ifmaxvr>a(j,col)Then(3)
Nextj
Ifj>3Then
Printa(;i;,;col;)=;a(i,col)
=1
EndIf
If(4)ThenPrint鞍点元素不存在
Nexti
EndSub
2)编程题(2002秋上机试卷05)
随机生成所有数组元素都是两位数的3x3的二维数组,找出其中不同行、不同列的三个
数组元素的乘积最大的一组,并将这三个元素显示在图片框中。
VB常用算法(三)素数一
1、算法说明
素数(质数):就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整
除的数。
判别某数m是否是素数的经典算法是:
对于m,从1=2,3,4,……,m—1依次判别能否被I整除,只要有一个能整除,m就不是
素数,否则m是素数。
PrivateFunctionsushu(ByVilnAsLong)AsBoolean
DimiAsLong
Fori=2Ton-1
If(nModi)=0ThenExitFor
NextI
IfI=nthensushu=True
EndFunction
很显然,实际上,我们可以改进上面
Fori=2Ton-1
为:
Fori=2Toint(sqr(m))
这样可以很好的提高效率。
以上判断是否为素数的代码务必识记!
应用举例
求100—200之内素数。
PrivateSubCommandl_Click()
DimjAsInteger
Forj=100To200
Ifsushu(j)=TrueThen
Printj
EndIf
Nextj
EndSub
解题技巧
识记判断素数的算法过程,根据题意,灵活调用!
实例说明
编程题(2002年春上机试卷04)
找出10000以内所有可以表示为两个平方数和的素数。
思路:
首先找10000以内的所有素数,对于每个素数判断其是否可以表示为两个平方数之和(即对
于任意小于该素数shu的数I,如果I和shu—I均为平方数,则说明其可以表示为两个平方
数之和。)
判断数I是否为平方数的方法:sqr(i)=int(sqr(i))
PrivateSubCommandl_Click()
DimjAsInteger
DimmAsLong,nAsLong
Forj=2To10000
Ifsushu(j)=TrueThen
Ifpf(j,m,n)=TrueThen
Listl.Additemj&"="&m&&n
EndIf
EndIf
Nextj
EndSub
PrivateFunctionpf(ByVilshuAsLong,mAsLong,nAsLong)AsBoolean
DimiAsLong
Fori=1Toshu-1
If(Sqr(i)=Int(Sqr(i)))And(Sqr(shu-i)=Int(Sqr(shu-i)))Then
pf=True
m=i
n=shu-i
ExitFunction
EndIf
Next
EndFunction
2、实战练习
1)补充代码(2002春二(7))
下列程序的功能是:查找四位正整数中的超级素数。超级素数的定义为:当一个素数从低位
到高位依次去掉一位数后剩下的数仍然是素数,则此数为超级素数。如数2333、233、23、2
均为素数,所以2333为超级素数。
OptionExplicit
PrivateSubCommand1_Click()
DimIAsInteger,flgAsBoolean
Forl=1001To9999Step2
Callsup_prime(I,flg)
IfflgThen
Debug.PrintI
EndIf
NextI
EndSub
PrivateSubsup_prime((1),FAsBoolean)
DimpAsInteger
F=True
DoWhileN>0
Ifprime(N)Then
(2)
Else
(3)
ExitSub
EndIf
Loop
EndSub
PublicFunctionprime(pAsInteger)AsBoolean
DimkAsInteger
Ifp=1Then
ExitFunction
Else
Fork=2ToSqr(p)
IfpModk=0ThenExitFunction
Nextk
(4)
EndIf
EndFunction
2)编程题(2004春上机试卷03)
随机生成15个两位正整数,从中找出所有的素数,并记下它是第几个数,再找出其中最
大的素数,并给出它的位置。
・找出最大素数及其序号均回区]
VB常用算法(四)进制转化--
1、算法说明
1)十进制正整数m转换为R(2-16)进制的字符串。
思路:将m不断除r取余数,直到商为0,将余数反序即得到结果。
算法实现:
PrivateFunctionTran(ByVilmAsInteger,ByVilrAsInteger)AsString
DimStrDtoRAsString,nAsInteger
DoWhilemoo
n=mModr
m=m\r
Ifn>9Then
StrDtoR=Chr(65+n-10)&StrDtoR
Else
StrDtoR=n&StrDtoR
EndIf
Loop
Tran=StrDtoR
EndFunction
2)R(2-16)进制字符串转换为十进制正整数。
思路:R进制数每位数字乘以权值之和即为十进制数。
算法实现:
PrivateFunctionTran(ByVilsAsString,ByVilrAsInteger)Asinteger
DimnAsInteger,decAsInteger
s=UCase(Trim(s))
Fori%=1ToLen(s)
IfMid(s,i,1)>="AHThen
n=Asc(Mid(s,i,1))-Asc(MA")+10
Else
n=Vil(Mid(s,i,1))
EndIf
dec=dec+n*rA(Len(s)-i)
Nexti
Tran=dec
EndFunction
解题技巧
进制转化的原理要清楚,同时编写代码时候要留意16进制中的A-F字符的处理。
2、实战练习
1)补充代码(2002秋二(9))
本程序是把给定的二进制整数转换为八进制整数。
PrivateSubCommandl_Click()
DimaAsString,bAsString,cAsString
DimLAsInteger,mAsInteger,nAsInteger
a=InputBox("请输入一个二进制数“,“输入框”)
(1)
a=String(L,n0")&a
(2)
Form=1Ton/3
b=Mid(a,3*m-2,3)
(3)
Nextm
Textl.Text=c
EndSub
PrivateFunctionzh(sAsString)AsString
DimiAsInteger,nAsInteger,pAsInteger
p=1
Fori=2To0Step-1
(4)
p=p+1
Nexti
zh=Str(n)
EndFunction
2)补充代码(2001春二(7))
下面程序是把给定的16进制正整数转换为10进制数。
OptionExplicit
PrivateSubForm_Click()
DimStAsInteger,DemAsLong
St=InputBox("输入一个十六进制数”)
Dem=Convert(St)
PrintSt;H>=";Dem
EndSub
PrivateFunctionConvert(SAsString)AsLong
DimNAsInteger,IAsInteger,SubstringAsString*1
DimPAslong,KAsLong,Asc1AsInteger
N=(1)
P=16AN
For1=1ToN
P=P/16
Substring=(2)
SelectCaseSubstring
Case"0”To"9"
K=K+P*Val(Substring)
Case(3)
Asc1=Asc(Substring)-Asc(,,A")+10
(4)
EndSelect
NextI
(5)
EndFunction
VB常用算法(五)约数因子--
1、算法说明
1)最大公约数:
用辗转相除法求两自然数m、n的最大公约数。
(1)首先,对于已知两数m、n,比较并使得m>n;
(2)m除以n得余数r;
(3)若r=0,则n为求得的最大公约数,算法结束;否则执行步骤(4)
(4)m<-nn<-r再重复执行(2)
譬如:10与5
分析步骤:m=10n=5
r=mmodn=0
所以n(n=5)为最大公约数
24与9
分析步骤:m=24n=9
r=mmodn=6
r^Om=9n=6
r=mmodn=3
#0m=6n=3
r=mmodn=0
所以n(n=3)为最大公约数
算法实现
循环实现
PrivateFunctionGCD(ByValmAsLong,ByVainAsLong)AsLong
DimtempAsLong
Ifm<nThentemp=m:m=n:n=temp
DimrAsLong
Do
r=mModn
Ifr=0ThenExitDo
m=n
n=r
Loop
GCD=n
EndFunction
递归实现
PrivateFunctionGCD(ByValmAsLong,ByVainAsLong)AsLong
DimtempAsLong
Ifm<nThentemp=m:m=n:n=temp
DimrAsLong
r=mModn
Ifr=0Then
GCD=n
Else
m=n
n=r
GCD=GCD(m,n)
EndIf
EndFunction
2)最小公倍数
mxn+最大公约数
3)互质数
最大公约数为1的两个正整数
解题技巧
该算法需要识记!
这种类型题目的扩展是约数和因子题型。
2、实战练习
1)补充代码(2003春二(9))
给定一个十进制正整数,找出小于它并与其互质的所有正整数(所谓互质数是指最大公
约数为1的两个正整数,下图是程序执行画面)。
OptionExplicit
PrivateFunctiongcd((1))AsInteger
DimrAsInteger
r=mModn
Ifr=0Then
gcd=n
Else
m=n:n=r
(2)
EndIf
EndFunction
PrivateSubCommandl_Click()
DimnAsInteger,pAsInteger
n=Vil(Text1)
Forp=n-1To2Step-1
If(3)ThenList1.Additemp
Nextp
EndSub
2)编程题(2002秋上机试卷01)
生成一个三行八列的二维数组A(3,8),其中前两行元素产生的方法是:
用初值X1=26及公式Xi+l=(25xXi+357)Mod1024,产生一个数列:XI、X2..X16。
其中X1~X8作为A的第一行元素;X9~X16作为A的第二行元素;A的第三行元素值取前
两行同列兀素的最大公约数。最后按图示格式显示在图片框中。
VB常用算法(六)排序
关键词:
1、算法说明
口选择法排序
(1)从n个数中选出最小数的下标,出了循环,将最小数与第一个数交换位置;
(2)除第一个数外,在剩下的n-1个数中再按方法(1)选出次小的数,与第二个数交换位
置;
(3)以此类推,最后构成递增序列。
譬如:
869327
第一轮交换后269387
第二轮交换后239687
第三轮交换后236987
第四轮交换后236789
第五轮无交换236789
程序代码如下:
PrivateSubxzPaiXu(a()AsDouble,shengAsBoolean)
'a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。
DimiAsInteger,jAsInteger
DimtempAsDouble
DimmAsInteger
Fori=LBound(a)ToUBound(a)-1,进行数组大小・1轮比较
m=i'在第i轮比较时,假定第
,i个元素为最值元素
Forj=i+1ToUBound(a),在剩下的元素中找出最
'值元素的下标并记录在m中
IfshengThen'若为升序,则m记录最小元素
'下标,否则记录最大元素下标
Ifa(j)<a(m)Thenm=j
Else
Ifa(j)>a(m)Thenm=j
EndIf
Nextj'将最值元素与第i个元素交换
temp=a(i)
a(i)=a(m)
a(m)=temp
Nexti
EndSub
调用该过程示例:
OptionBase1
PrivateSubCommandl_Click()
Dimb(6)AsDouble
b(l)=8
b(2)=6
b(3)=9
b(4)=3
b(5)=2
b(6)=7
CallxzPaiXu(b,True)
Fori%=1To6
Printb(i)
Next
EndSub
2)冒泡法排序
选择排序法在每一轮排序时找最值元素的下标,出了内循环(一轮排序结束),再交换最小数
的位置;而冒泡法在每一轮排序时将相邻的数比较,当次序不对就交换位置,出了内循环,
最值数已经冒出。
譬如:
869327
869327
869237
862937
826937
286937
238697
236879
236789
236789
程序代码如下:
PrivateSubmpPaiXu(a()AsDouble,shengAsBoolean)
匕为需要排序的数组,sheng为True则为升序排列,为False,则为降序排歹人
DimiAsInteger,jAsInteger
DimtempAsDouble
DimmAsInteger
Fori=LBound(a)ToUBound(a)-1,进行n-1轮比较
Forj=UBound(a)Toi+1Step-1'从n到i个元素两两进行比较
IfshengThen'若次序不对,马上进行交换
Ifa(j)<a(j-1)Then
temp=a(j)
a(j)=a(j-1)
a(j-1)=temp
EndIf
Else
Ifa(j)>a(j-1)Then
temp=a(j)
a(j)=a(j-1)
a(j-1)=temp
EndIf
EndIf
Nextj'出了内循环,一轮排序结束
'最值元素冒到最上边
Nexti
EndSub
调用该过程代码基本同上。
2、实战练习
1)补充代码(2003秋二(10))
下面是一个采用拉锯式排序法对数组元素按升序进行排序的程序,所谓市锯式排序法||
是这一遍把最小的元素从下到上送到最上的位置,下一遍则是从上到下把最大的元素送到最
下的位置。
OptionBase1
PrivateSubCommandl_Click()
Dima(10)AsInteger,!AsInteger
Fori=1To10
a(i)=Int(Rnd*10)+1
Textl=Textl&Str(a(i))
Nexti
Callshaker_sort(a)
Fori=1To10
Text2=Text2&Str(a(i))
Nexti
EndSub
PrivateSubShaker_sort(k()AsInteger)
DimiAsIntegersAsInteger,dAsInteger
DimtAsInteger
c=1
d=(1)
Do
For(2)Step-1
Ifk(i=l)>k(i)Then
t=k(i-l):k(i-l)=k(i):k(i)=t
EndIf
Nexti
(3)
Fori=c+1Tod
If(4)Then
t=k(i-l):k(i-l)=k(i):k(i)=t
EndIf
Nexti
d=d-l
LoopWhile(5)
EndSub
2)编程题(2002秋上机试卷04)
把文本框输入的字符串按降序添加到列表框中。
VB常用算法(七)数组元素插入删除--
1、算法说明
数组中元素的插入和删除一般是在已固定序列的数组中插入或删除一个元素,使得插入或删
除操作后的数组还是有序的。
基本思路:首先要找到插入位置或要删除的元素。
1)插入
代码如下:
PrivateSubCommandl_Click()
Dima(10)AsInteger
DimiAsInteger,kAsInteger
Fori=0To9,生成数组
a(i)=i*3+1
Printa(i);
Nexti
Print”插入14”
Fork=0To9,查找插入14在数组中的位置
If14<a(k)ThenExitFor
Nextk
Fori=9TokStep-「从最后元素开始逐个后移,腾出位置
a(i+1)=a(i)
Nexti
a(k)=14,插入数14
Fori=0To10
Printa(i);
Nexti
EndSub
2)
14710131619222528
删除
一
1410131619222528.
K。
代码如下:
Dima()asinteger
ReDima(lton)
Fori=k+1ton
a(i-l)=a(i)
NextI
Redimpreservea(lton-1)
2、实战练习
1)补充代码(2001秋二(8))
C盘根目录下文件Data4.txt的内容是:2,4,6,8,10,1,3,5,7,9。下面程序的
功能是将文件后半部分的奇数分别按序插入到前半部分的适当位置,得到的新数列是:1234
5678910o(实现方法:第一次调整后的数列是:12468103579第二次调整后的数列是:
12346810579)o
OptionExplict
PrivateSubForm_Click()
DimA(10)AsIntegersAsInteger,!AsInteger
Open"c:\Data4.txtnForInputAs#12
Do(1)
J=J+1
Input#12,A(J)
Loop
CallInsert(A)
Fori=lTo10
PrintA(i);
Nexti
Close#12
EndSub
PrivateSubInsert(A()AsInteger)
DimiAsInteger,PutpAsIntegerJAsInteger
DimGetpAsInteger,NAsInteger,TemAsInteger
N=UBound(A)/2
Putp=l
Getp=N+l
Fori=lToN
Tem=A(Getp)
ForJ=GetpToPutp+1Step-1
(2)
NextJ
A(Putp)=Tem
Getp=Getp+1
Putp=(3)
Nexti
EndSub
2)补充代码(2001春二(8))
下面程序得功能是将无序数组中相同得数只保留一个,其余得删除,并输出经过删除后
的数组元素,删除相同数是通过将该数组元素后面的元素在数组内依次前移替换前一个元素
的值实现的。数组各元素的值从文件data.txt中读取。
OptionExplict
OptionBase1
PrivateSubForm_Click()
DimIAsInteger,}AsInteger,KAsInteger
DimA()AsInteger,TAsInteger,MAsInteger
Open"c:\mydocuments\2000test\data.txtHForInputAs#1
DoWhile(1)
1=1+1
RedimPreserveA(I)
Input#1,A(I)
Loop
M=1:T=(2)
DoWhileM<T
I=M+1
DoWhileI<=T
IfA(I)=A(M)Then
ForJ=1To(3)
A(J)=A(J+1)
NextJ
T=T-1
Else
1=(4)
EndIf
Loop
M=M+1
Loop
RedimPreserveA(T)
For1=1ToT
PrintA(I);
NextI
EndSub
VB常用算法(八)查找一
i、算法说明
口顺序查找
逐个元素找,如果有,则记录位置,然后跳出循环;否则,查找失败。
代码如下:
PrivateSubSearch(a(),ByVilKey,IndexAsInteger)
Dimi%
Fori=LBound(a)ToUBound(a)
Ifa(i)=KeyThen'找到,将元素下标保存在index中并结束查找
Index=i
ExitSub
EndIf
Nexti
Index=-1,若没找到,则index值为
EndSub
2)二分法查找
顺序查找效率低下,当数组有序排列时,可以使用二分法查找提高效率。
算法思想:
代码如下:
PrivateSubbirSearch(a(),ByVailow%,ByVaihigh%,ByVaiKey,index%)
DimmidAsInteger
Iflow>highThen,没有查找到
index=-1
ExitSub
EndIf
mid=(low+high)\2,取查找区间的中点
IfKey=a(mid)Then,查找到,返回下标
index=mid
ExitSub
ElselfKey<a(mid)Then,查找区间在上半部分
high=mid-1
Else
low=mid+1'查找区间在下半部分
EndIf
CallbirSearch(a,low,high,Key,index厂递归调用查找函数
EndSub
调用方法:
PrivateSubCommandl_Click()
Dima(ll)
a(l)=5:a(2)=13:a(3)=19:a(4)=21:a(5)=37
a(6)=56:a(7)=64:a(8)=75:a(9)=80:a(10)=88:a(ll)=92
DimindAsInteger
CallbirSearch(a,LBound(a),UBound(a),21,ind)
Printind
EndSub
2、实战练习
补充代码(2002春二(9))
C盘根目录下stu.txt文件中以下的格式保存着学生姓名及班号信息。本程序的功能是:
读取该文件中的数据,再利用InputvBox输入要查找的学生姓名,通过顺序查找,给出找到
或找不到的信息。附图是某同学被找到时显示的信息窗口。
张文,机械01
李明,机械01
王文卉,机械01
何宇宙,电子02
OptionExplicit
OptionBase1
PrivateSubForm_click()
Dimstu()AsString,glass()AsString,iAsInteger
DimnAsInteger,nameAsString,kAsInteger
Open"c:\stu\stu.txt"ForInputAs#11
DoWhile(1)
(2)
ReDimPreservestu(n),glass(n)
Input#11,stu(n),glass(n)
Loop
name=InputBox("输入欲查找的学生姓名:,,)
Callsearch(name,stu,k)
Ifk<=nThen
MsgBox(3)
Else
MsgBox”无此人。”
EndIf
Close#11
EndSub
PrivateSubsearch(nameAsString,stu()AsString,kAsInteger)
DimiAsInteger
Fori=1ToUBound(stu)
Ifname=stu(i)Then
(4)
EndIf
Nexti
(5)
EndSub
VB常用算法(九)数学应用--
1、算法说明
1)初等数学
递推法
又称为卷代法II,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重
复都在旧值的基础上递推出新值,并由新值代替旧值。
问题:猴子吃桃子
小猴子有若干桃子,第一天吃掉一半多一个;第二天吃掉剩下的一半多一,个;如此,到第
七天早上要吃时,只剩下一个桃子。问小猴子-开始共有多少桃子?
分析:可以最后一天桃子数推出倒数第二天的桃子数;再从倒数第二天推出倒数第三天桃子
数
设第n天桃子数为xn,前一天桃子数是:xn-1,则有关系:
xn=xn—1/2-1
程序如下:
PrivateSubCommandl_Click()
Dimn%,i%
x=1'第七天桃子数
Print"第七天桃子数:1只”
Fori=6To1Step-1
x=(x+1)*2
Print"第“&i&”天桃子数:“&x&"只"
Nexti
EndSub
穷举法
又称枚举法,即将所有可能情况-一测试,判断是否满足条件,一般用循环实现。
问题:百元买鸡问题。
假定小鸡每只5角;公鸡每只2元;母鸡每只3元。现在有100元,要求买100只鸡,
编程列出所有可能的购鸡方案。
分析:
设母鸡、公鸡、小鸡分别x、y、z只,则有:
x+y+z=100
3x+2y+0.5z=100
程序-•:
PrivateSubCommand1_Click()
Dimx%,y%,z%
Forx=0To100
Fory=0To100
Forz=0To100
Ifx+y+z=100And3*x+2*y+0.5*z=100Then
Printx,y,z
EndIf
Nextz
Nexty
Nextx
EndSub
程序二(优化)
PrivateSubCommandl_Click()
Dimx%,y%
Forx=0To33
Fory=0To50
If3*x+2*y+0.5*(100-x-y)=100Then
Printx,y100-x-y
EndIf
Nexty
Nextx
EndSub
2)高等数学
求积分
近似计算积分:s=J13(x3+2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论