江苏计算机二级VB等级考试题型解析_第1页
江苏计算机二级VB等级考试题型解析_第2页
江苏计算机二级VB等级考试题型解析_第3页
江苏计算机二级VB等级考试题型解析_第4页
江苏计算机二级VB等级考试题型解析_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

江苏计算机二级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

Print

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

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

Print

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

Print

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

Print

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

提交评论