常用算法介绍_第1页
常用算法介绍_第2页
常用算法介绍_第3页
常用算法介绍_第4页
常用算法介绍_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

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

文档简介

关于常用算法介绍第一页,共七十七页,2022年,8月28日算法1:累加和累乘累加形式:V=V+e连乘形式:V=V*e其中:V是变量,e是递增表达式。累加和连乘一般通过循环结构来实现。注意:需在执行循环体前对变量V赋初值。一般的,累加时置初值0;连乘时置初值为1。第二页,共七十七页,2022年,8月28日例如求N!的结果。PrivateSubCommand1_Click()Dimn%,i%,s&n=Val(InputBox("输入n"))s=1Fori=1Tons=s*iNextiPrintsEndSub第三页,共七十七页,2022年,8月28日错误的例子PrivateSubCommand1_Click()Dimn%,i%,s&n=Val(InputBox("输入n"))Fori=1Tons=1‘赋初值语句位置不对!s=s*iNextiPrints‘输出s的值为n,而不是n!EndSub第四页,共七十七页,2022年,8月28日根据下列公式,求自然对数e的的近似值。要求:误差小于0.00001PrivateSubCommand1_Click()Dimi%,n&,t!,e!e=2i=1t=1DoWhilet>0.00001i=i+1t=t/ie=e+tLoopPrint"计算了";i;"项目和是:";ePrintExp(1)‘与上句输出值进行对比以证明算法的正确性EndSub第五页,共七十七页,2022年,8月28日解题技巧1)

由于这类题目往往是根据精度要求来求值,因此我们不能预知具体循环次数,所以这类题目一般用Do循环,很少用For循环。设定循环变量和通项变量,注意各变量的初值;2)

分解通项表达式中各因子,并分别将各因子用循环变量表示;3)

如果步骤2中有的因子比较复杂,难以直接用变量表示,此时可以考虑使用Function过程;4)

根据步骤1、2、3,写出通项表达式;5)

根据精度要求(往往是通项小于10负多少次方这样一个关系表达式),写出一条满足精度要求后跳出循环的语句。通常是用:if通项表达式>10^(-N)thenexitdo,注意这句话一般需放在累加或者连乘式之前。第六页,共七十七页,2022年,8月28日根据X值计算:n=1,2,……要求:n项绝对值小于等于10-6为止。注意:如果调试运行时死循环,可以按Ctrl+Break中断死循环,不需要重新启动机器。(或者Ctrl+ScrollLock)第七页,共七十七页,2022年,8月28日 privateFunctioncomp(naslong)aslong dimIaslong dimresultaslong result=1‘此处注意,由于是连乘,初值为1 forI=1to2*(n-1) result=result*I nextI comp=result EndFunction第八页,共七十七页,2022年,8月28日PrivateSubCommand1_Click()DimnAsLong,dblCosAsDouble,xAsDoublex=Val(Text1.Text)n=1DodblCos=(-1)^(n+1)*x^(2*(n-1))/comp(n)IfAbs(dblCos)<=10^(-6)ThenExitDoSum=Sum+dblCosn=n+1LoopPrintSumEndSubPrivateFunctioncomp(nAsLong)AsLongDimIAsLongDimresultAsLongresult=1'此处注意,由于是连乘,初值为1ForI=1To2*(n-1)result=result*INextIcomp=resultEndFunction第九页,共七十七页,2022年,8月28日2、实战练习1)

补充代码(2003秋二(7))本程序的功能是求下面数列前n项之和。S(x,n)=x/2+2!*x^3/2*4+3!*x^5/2*4*6+.....+n!*x^2n-1/2*4*6...2nOptionExplicitPrivateSubCommand1_Click()

DimxAsSingle,sAsSingle

DimnAsInteger,iAsInteger

x=InputBox("输入X:","求数列和",1)

n=InputBox("输入N:","求数列和",1)

Fori=1Ton

s=s+fun(x,i)

Nexti

Label1.Caption=_(1)_

Text1=sEndSubPrivateFunctionfun(xAsSingle,nAsInteger)AsSingle

__(2)__

p=1

Fori=1Ton

__(3)___

Nexti

fun=x^(2*n-1)*pEndFunction第十页,共七十七页,2022年,8月28日2)

编程题(2003春上机试卷03)按下列公式编写求积分余弦函数值的程序。当通项绝对值小于10-5时停止计算。

第十一页,共七十七页,2022年,8月28日VB常用算法(二)最值问题算法说明在若干数中求最大值,一般先取第一个数为最大值的初值(即假设第一个数为最大值),然后,在循环体内将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,直到循环结束。求最小值的方法类同。求若干数平均值,实质上就是先求和,再除以这些数的个数。

第十二页,共七十七页,2022年,8月28日应用举例随机产生n个1-100(包括1和100)的数,求它们的最大值、最小值和平均值。PrivateSubCommand1_Click()DimnAsInteger,iAsInteger,minAsInteger,maxAsInteger,averAsSingle,sAsIntegern=Val(InputBox("输入个数:"))s=Int(Rnd*100)+1max=smin=saver=sPrint"第1个数是:"&sFori=2Tons=Int(Rnd*100)+1Print"第"&

i&"个数是:"&sIfs>maxThenmax=sIfs<minThenmin=saver=aver+sNextiaver=aver/nPrint"max=";max;"min=";min;"aver=";averEndSub第十三页,共七十七页,2022年,8月28日解题技巧

最大值、最小值、平均值类型题目往往和数组放在一起考!有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。第十四页,共七十七页,2022年,8月28日实战练习1)

补充代码(2000春二(9)) 本程序的功能是在二维数组中查找鞍点元素,即该元素在所在行中为最大,且在所在列中为最小。在一个数组中可能存在,也可能不存在这样的元素。数组各元素的值从文件data.txt中读取。

PrivateSubForm_Click() Dima(3,3)AsInteger,iAsInteger,jAsInteger DimmaxvrAsInteger,colAsInteger,AsInteger Opendata.txtForInputAs#1 Fori=1To3 Forj=1To3 Input#1,a(i,j) Printa(i,j); Nextj Print Nexti Fori=1To3 maxvr=

(1)

col=1 Forj=2To3 Ifmaxvr<A(I,J)THEN maxvr=

(2)

col=j EndIf Nextj Forj=1To3 Ifmaxvr>a(j,col)Then

(3)

Nextj Ifj>3Then Printa(;i;,;col;)=;a(i,col) =1 EndIf If

(4)

ThenPrint鞍点元素不存在

Nexti EndSub第十五页,共七十七页,2022年,8月28日2)

编程题(2002秋上机试卷05) 随机生成所有数组元素都是两位数的3×3的二维数组,找出其中不同行、不同列的三个数组元素的乘积最大的一组,并将这三个元素显示在图片框中。

第十六页,共七十七页,2022年,8月28日VB常用算法(三)素数

算法说明素数(质数):就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整除的数。判别某数m是否是素数的经典算法是:对于m,从I=2,3,4,……,m-1依次判别能否被I整除,只要有一个能整除,m就不是素数,否则m是素数。

第十七页,共七十七页,2022年,8月28日PrivateFunctionsushu(ByValnAsLong)AsBooleanDimiAsLongFori=2Ton-1If(nModi)=0ThenExitForNextIIfI=nthensushu=TrueEndFunction很显然,实际上,我们可以改进上面Fori=2Ton–1为:Fori=2Toint(sqr(m))这样可以很好的提高效率。以上判断是否为素数的代码务必识记!第十八页,共七十七页,2022年,8月28日应用举例求100-200之内素数。PrivateSubCommand1_Click()DimjAsIntegerForj=100To200Ifsushu(j)=TrueThenPrintjEndIfNextj

EndSub解题技巧识记判断素数的算法过程,根据题意,灵活调用!第十九页,共七十七页,2022年,8月28日实例说明 编程题(2002年春上机试卷04) 找出10000以内所有可以表示为两个平方数和的素数。思路:首先找10000以内的所有素数,对于每个素数判断其是否可以表示为两个平方数之和(即对于任意小于该素数shu的数I,如果I和shu-I均为平方数,则说明其可以表示为两个平方数之和。)判断数I是否为平方数的方法:sqr(i)=int(sqr(i))

PrivateSubCommand1_Click()DimjAsIntegerDimmAsLong,nAsLongForj=2To10000Ifsushu(j)=TrueThenIfpf(j,m,n)=TrueThenList1.AddItemj&"="&m&"+"&nEndIfEndIfNextjEndSub

PrivateFunctionpf(ByValshuAsLong,mAsLong,nAsLong)AsBooleanDimiAsLongFori=1Toshu-1If(Sqr(i)=Int(Sqr(i)))And(Sqr(shu-i)=Int(Sqr(shu-i)))Thenpf=Truem=in=shu-iExitFunctionEndIfNextEndFunction第二十页,共七十七页,2022年,8月28日2、实战练习1)

补充代码(2002春二(7))下列程序的功能是:查找四位正整数中的超级素数。超级素数的定义为:当一个素数从低位到高位依次去掉一位数后剩下的数仍然是素数,则此数为超级素数。如数2333、233、23、2均为素数,所以2333为超级素数。

OptionExplicit

PrivateSubCommand1_Click() DimIAsInteger,flgAsBoolean ForI=1001To9999Step2 Callsup_prime(I,flg) IfflgThen PrintI EndIf NextI EndSub

第二十一页,共七十七页,2022年,8月28日PrivateSubsup_prime(

(1)

,FAsBoolean) DimpAsInteger F=True DoWhileN>0 Ifprime(N)Then

(2)

Else

(3)

ExitSub EndIf LoopEndSub

PublicFunctionprime(pAsInteger)AsBoolean DimkAsInteger Ifp=1Then ExitFunction Else Fork=2ToSqr(p) IfpModk=0ThenExitFunction Nextk

(4)

EndIfEndFunction第二十二页,共七十七页,2022年,8月28日2)

编程题(2004春上机试卷03) 随机生成15个两位正整数,从中找出所有的素数,并记下它是第几个数,再找出其中最大的素数,并给出它的位置。

第二十三页,共七十七页,2022年,8月28日VB常用算法(四)进制转化算法说明1)

十进制正整数m转换为R(2-16)进制的字符串。 思路:将m不断除r取余数,直到商为0,将余数反序即得到结果。 算法实现:PrivateFunctionTran(ByValmAsInteger,ByValrAsInteger)AsStringDimStrDtoRAsString,nAsIntegerDoWhilem<>on=mModrm=m\rIfn>9ThenStrDtoR=Chr(65+n-10)&StrDtoRElseStrDtoR=n&StrDtoREndIfLoopTran=StrDtoREndFunction

第二十四页,共七十七页,2022年,8月28日2)

R(2-16)进制字符串转换为十进制正整数。 思路:R进制数每位数字乘以权值之和即为十进制数。 算法实现:PrivateFunctionTran(ByValsAsString,ByValrAsInteger)AsintegerDimnAsInteger,decAsIntegers=UCase(Trim(s))Fori%=1ToLen(s) IfMid(s,i,1)>="A"Then n=Asc(Mid(s,i,1))-Asc("A")+10 Else n=Val(Mid(s,i,1)) EndIf dec=dec+n*r^(Len(s)-i)NextiTran=decEndFunction解题技巧 进制转化的原理要清楚,同时编写代码时候要留意16进制中的A-F字符的处理。第二十五页,共七十七页,2022年,8月28日2、实战练习1)

补充代码(2002秋二(9)) 本程序是把给定的二进制整数转换为八进制整数。

PrivateSubCommand1_Click() DimaAsString,bAsString,cAsString DimLAsInteger,mAsInteger,nAsInteger a=InputBox("请输入一个二进制数","输入框")

(1)

a=String(L,"0")&a

(2)

Form=1Ton/3 b=Mid(a,3*m-2,3)

(3)

Nextm Text1.Text=c EndSub第二十六页,共七十七页,2022年,8月28日 PrivateFunctionzh(sAsString)AsString DimiAsInteger,nAsInteger,pAsInteger p=1 Fori=2To0Step-1

(4)

p=p+1 Nexti zh=Str(n) EndFunction第二十七页,共七十七页,2022年,8月28日2)

补充代码(2001春二(7)) 下面程序是把给定的16进制正整数转换为10进制数。

OptionExplicit

PrivateSubForm_Click() DimStAsInteger,DemAsLong St=InputBox("输入一个十六进制数") Dem=Convert(St) PrintSt;">=";Dem EndSub

PrivateFunctionConvert(SAsString)AsLong DimNAsInteger,IAsInteger,SubstringAsString*1 DimPAslong,KAsLong,Asc1AsInteger N=

(1)

P=16^N ForI=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

第二十八页,共七十七页,2022年,8月28日VB常用算法(五)约数因子算法说明1)

最大公约数: 用辗转相除法求两自然数m、n的最大公约数。(1)

首先,对于已知两数m、n,比较并使得m>n;(2)

m除以n得余数r;(3)

若r=0,则n为求得的最大公约数,算法结束;否则执行步骤(4)(4)

mnnr再重复执行(2)第二十九页,共七十七页,2022年,8月28日算法实现循环实现PrivateFunctionGCD(ByValmAsLong,ByValnAsLong)AsLongDimtempAsLongIfm<nThentemp=m:m=n:n=tempDimrAsLongDor=mModnIfr=0ThenExitDom=nn=rLoopGCD=n EndFunction第三十页,共七十七页,2022年,8月28日递归实现PrivateFunctionGCD(ByValmAsLong,ByValnAsLong)AsLongDimtempAsLongIfm<nThentemp=m:m=n:n=tempDimrAsLongr=mModnIfr=0ThenGCD=nElsem=nn=rGCD=GCD(m,n)EndIfEndFunction第三十一页,共七十七页,2022年,8月28日2)

最小公倍数

m×n÷最大公约数3)

互质数 最大公约数为1的两个正整数解题技巧该算法需要识记!这种类型题目的扩展是约数和因子题型。第三十二页,共七十七页,2022年,8月28日2、实战练习

1)

补充代码(2003春二(9)) 给定一个十进制正整数,找出小于它并与其互质的所有正整数(所谓互质数是指最大公约数为1的两个正整数,下图是程序执行画面)。第三十三页,共七十七页,2022年,8月28日 OptionExplicit PrivateFunctiongcd((1))AsInteger DimrAsInteger r=mModn Ifr=0Then gcd=n Else m=n:n=r

(2)

EndIf EndFunction PrivateSubCommand1_Click() DimnAsInteger,pAsInteger n=Val(Text1) Forp=n-1To2Step-1 If

(3)

ThenList1.AddItemp Nextp EndSub第三十四页,共七十七页,2022年,8月28日2)

编程题(2002秋上机试卷01) 生成一个三行八列的二维数组A(3,8),其中前两行元素产生的方法是:用初值X1=26及公式Xi+1=(25×Xi+357)Mod1024,产生一个数列:X1、X2、......、X16。其中X1~X8作为A的第一行元素;X9~X16作为A的第二行元素;A的第三行元素值取前两行同列元素的最大公约数。最后按图示格式显示在图片框中。第三十五页,共七十七页,2022年,8月28日VB常用算法(六)排序1、算法说明1)

选择法排序

(1)

从n个数中选出最小数的下标,出了循环,将最小数与第一个数交换位置;(2)

除第一个数外,在剩下的n-1个数中再按方法(1)选出次小的数,与第二个数交换位置;(3)

以此类推,最后构成递增序列。第三十六页,共七十七页,2022年,8月28日程序代码如下:PrivateSubxzPaiXu(a()AsDouble,shengAsBoolean)'a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。

DimiAsInteger,jAsIntegerDimtempAsDoubleDimmAsIntegerFori=LBound(a)ToUBound(a)-1'进行数组大小-1轮比较

m=i'在第i轮比较时,假定第

'i个元素为最值元素

Forj=i+1ToUBound(a)'在剩下的元素中找出最

'值元素的下标并记录在m中

IfshengThen'若为升序,则m记录最小元素

'下标,否则记录最大元素下标

Ifa(j)<a(m)Thenm=jElseIfa(j)>a(m)Thenm=jEndIfNextj'将最值元素与第i个元素交换

temp=a(i)a(i)=a(m)a(m)=tempNextiEndSub第三十七页,共七十七页,2022年,8月28日2)

冒泡法排序选择排序法在每一轮排序时找最值元素的下标,出了内循环(一轮排序结束),再交换最小数的位置;而冒泡法在每一轮排序时将相邻的数比较,当次序不对就交换位置,出了内循环,最值数已经冒出。第三十八页,共七十七页,2022年,8月28日PrivateSubmpPaiXu(a()AsDouble,shengAsBoolean)'a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。

DimiAsInteger,jAsIntegerDimtempAsDoubleDimmAsIntegerFori=LBound(a)ToUBound(a)-1'进行n-1轮比较

Forj=UBound(a)Toi+1Step-1'从n到i个元素两两进行比较

IfshengThen'若次序不对,马上进行交换

Ifa(j)<a(j-1)Thentemp=a(j)a(j)=a(j-1)a(j-1)=tempEndIfElseIfa(j)>a(j-1)Thentemp=a(j)a(j)=a(j-1)a(j-1)=tempEndIfEndIfNextj'出了内循环,一轮排序结束

'最值元素冒到最上边

NextiEndSub第三十九页,共七十七页,2022年,8月28日实战练习1)

补充代码(2003秋二(10)) 下面是一个采用拉锯式排序法对数组元素按升序进行排序的程序,所谓“拉锯式排序法”是这一遍把最小的元素从下到上送到最上的位置,下一遍则是从上到下把最大的元素送到最下的位置。

OptionBase1 PrivateSubCommand1_Click()

Dima(10)AsInteger,iAsInteger

Fori=1To10

a(i)=Int(Rnd*10)+1

Text1=Text1&Str(a(i))

Nexti

Callshaker_sort(a)

Fori=1To10

Text2=Text2&Str(a(i))

Nexti EndSub第四十页,共七十七页,2022年,8月28日PrivateSubShaker_sort(k()AsInteger)

DimiAsInteger,cAsInteger,dAsInteger

DimtAsInteger

c=1

d=

(1)

Do

For

(2)

Step-1

Ifk(i-1)>k(i)Then

t=k(i-1):k(i-1)=k(i):k(i)=t

EndIf

Nexti

(3)

Fori=c+1Tod

If

(4)Then

t=k(i-1):k(i-1)=k(i):k(i)=t

EndIf

Nexti

d=d-1

LoopWhile

(5)

EndSub第四十一页,共七十七页,2022年,8月28日2)

编程题(2002秋上机试卷04) 把文本框输入的字符串按降序添加到列表框中。第四十二页,共七十七页,2022年,8月28日VB常用算法(七)

数组元素插入删除

算法说明

数组中元素的插入和删除一般是在已固定序列的数组中插入或删除一个元素,使得插入或删除操作后的数组还是有序的。

基本思路:首先要找到插入位置或要删除的元素。1)

插入

第四十三页,共七十七页,2022年,8月28日代码如下:PrivateSubCommand1_Click()Dima(10)AsIntegerDimiAsInteger,kAsIntegerFori=0To9'生成数组

a(i)=i*3+1Printa(i);NextiPrintPrint"插入14"Fork=0To9'查找插入14在数组中的位置

If14<a(k)ThenExitForNextkFori=9TokStep-1'从最后元素开始逐个后移,腾出位置

a(i+1)=a(i)Nextia(k)=14'插入数14Fori=0To10Printa(i);NextiPrintEndSub第四十四页,共七十七页,2022年,8月28日2)

14710131619222528第四十五页,共七十七页,2022年,8月28日代码如下:Dima()asinteger….ReDima(1ton)…Fori=k+1tona(i-1)=a(i)NextIRedimpreservea(1ton-1)第四十六页,共七十七页,2022年,8月28日实战练习1)

补充代码(2001秋二(8))

C盘根目录下文件Data4.txt的内容是:2,4,6,8,10,1,3,5,7,9。下面程序的功能是将文件后半部分的奇数分别按序插入到前半部分的适当位置,得到的新数列是:12345678910。(实现方法:第一次调整后的数列是:12468103579第二次调整后的数列是:12346810579)。第四十七页,共七十七页,2022年,8月28日OptionExplict PrivateSubForm_Click() DimA(10)AsInteger,iAsInteger,JAsInteger Open"c:\Data4.txt"ForInputAs#12 Do

(1)

J=J+1 Input#12,A(J) Loop CallInsert(A) Fori=1To10 PrintA(i); Nexti Print Close#12 EndSub第四十八页,共七十七页,2022年,8月28日PrivateSubInsert(A()AsInteger) DimiAsInteger,PutpAsInteger,JAsInteger DimGetpAsInteger,NAsInteger,TemAsInteger N=UBound(A)/2 Putp=1 Getp=N+1 Fori=1ToN Tem=A(Getp) ForJ=GetpToPutp+1Step-1

(2)

NextJ A(Putp)=Tem Getp=Getp+1 Putp=

(3)

Nexti EndSub第四十九页,共七十七页,2022年,8月28日2)

补充代码(2001春二(8)) 下面程序得功能是将无序数组中相同得数只保留一个,其余得删除,并输出经过删除后的数组元素,删除相同数是通过将该数组元素后面的元素在数组内依次前移替换前一个元素的值实现的。数组各元素的值从文件data.txt中读取。第五十页,共七十七页,2022年,8月28日OptionExplict OptionBase1 PrivateSubForm_Click() DimIAsInteger,JAsInteger,KAsInteger DimA()AsInteger,TAsInteger,MAsInteger Open"c:\mydocuments\2000test\data.txt"ForInputAs#1 DoWhile

(1)

I=I+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 I=

(4)

EndIf Loop M=M+1 Loop RedimPreserveA(T) ForI=1ToT PrintA(I); NextI PrintEndSub第五十一页,共七十七页,2022年,8月28日VB常用算法(八)查找算法说明1)

顺序查找 逐个元素找,如果有,则记录位置,然后跳出循环;否则,查找失败。 代码如下:

PrivateSubSearch(a(),ByValKey,IndexAsInteger) Dimi% Fori=LBound(a)ToUBound(a) Ifa(i)=KeyThen'找到,将元素下标保存在index中并结束查找

Index=i ExitSub EndIf Nexti Index=-1'若没找到,则index值为-1 EndSub第五十二页,共七十七页,2022年,8月28日2)

二分法查找

顺序查找效率低下,当数组有序排列时,可以使用二分法查找提高效率。

算法思想:第五十三页,共七十七页,2022年,8月28日代码如下:

PrivateSubbirSearch(a(),ByVallow%,ByValhigh%,ByValKey,index%) DimmidAsInteger Iflow>highThen'没有查找到

index=-1 ExitSub EndIf mid=(low+high)\2'取查找区间的中点

IfKey=a(mid)Then'查找到,返回下标

index=mid ExitSub ElseIfKey<a(mid)Then'查找区间在上半部分

high=mid-1 Else low=mid+1'查找区间在下半部分

EndIf CallbirSearch(a,low,high,Key,index)'递归调用查找函数

EndSub第五十四页,共七十七页,2022年,8月28日调用方法:PrivateSubCommand1_Click()Dima(11) a(1)=5:a(2)=13:a(3)=19:a(4)=21:a(5)=37a(6)=56:a(7)=64:a(8)=75:a(9)=80:a(10)=88:a(11)=92DimindAsIntegerCallbirSearch(a,LBound(a),UBound(a),21,ind)PrintindEndSub第五十五页,共七十七页,2022年,8月28日实战练习

补充代码(2002春二(9))

C盘根目录下stu.txt文件中以下的格式保存着学生姓名及班号信息。本程序的功能是:读取该文件中的数据,再利用InputvBox输入要查找的学生姓名,通过顺序查找,给出找到或找不到的信息。附图是某同学被找到时显示的信息窗口。张文,机械01

李明,机械01

王文卉,机械01…

何宇宙,电子02第五十六页,共七十七页,2022年,8月28日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第五十七页,共七十七页,2022年,8月28日PrivateSubsearch(nameAsString,stu()AsString,kAsInteger) DimiAsInteger Fori=1ToUBound(stu) Ifname=stu(i)Then

(4)

EndIf Nexti

(5)

EndSub第五十八页,共七十七页,2022年,8月28日VB常用算法(九)数学应用算法说明1)

初等数学

递推法又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都在旧值的基础上递推出新值,并由新值代替旧值。问题:猴子吃桃子小猴子有若干桃子,第一天吃掉一半多一个;第二天吃掉剩下的一半多一个…..;如此,到第七天早上要吃时,只剩下一个桃子。问小猴子一开始共有多少桃子?分析:可以最后一天桃子数推出倒数第二天的桃子数;再从倒数第二天推出倒数第三天桃子数………..设第n天桃子数为xn,前一天桃子数是:xn-1,则有关系:xn=xn-1/2-1第五十九页,共七十七页,2022年,8月28日程序如下:PrivateSubCommand1_Click()Dimn%,i%x=1'第七天桃子数

Print"第七天桃子数:1只"Fori=6To1Step-1x=(x+1)*2Print"第"&i&"天桃子数:"&x&"只"NextiEndSub

第六十页,共七十七页,2022年,8月28日穷举法

又称枚举法,即将所有可能情况一一测试,判断是否满足条件,一般用循环实现。 问题:百元买鸡问题。 假定小鸡每只5角;公鸡每只2元;母鸡每只3元。现在有100元,要求买100只鸡,编程列出所有可能的购鸡方案。分析:设母鸡、公鸡、小鸡分别x、y、z只,则有:x+y+z=1003x+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第六十一页,共七十七页,2022年,8月28日程序二(优化) PrivateSubCommand1_Click() Dimx%,y% Forx=0To33 Fory=0To50 If3*x+2*y+0.5*(100-x-y)=100Then Printx,y,100-x-y EndIf Nexty Nextx EndSub第六十二页,共七十七页,2022年,8月28日2)

高等数学 求积分 近似计算积分:s=∫13(x3+2x+5)dx

代码如下:

PublicFunctionf(ByValx!)'被积函数

f=x*(x*x+2)+5 EndFunction第六十三页,共七十七页,2022年,8月28日PublicFunctiontrapez(ByVala!,ByValb!,ByValn%)AsSingle 'b、a分别为积分上下限,n为等分数

Dimsum!,h!,x! h=(b-a)/n sum=(f(a)+f(b))/2 Fori=1Ton-1 x=a+i*h sum=sum+f(x) Nexti trapez=sum*h EndFunction

调用:

PrivateSubCommand1_Click() Printtrapez(1,3,30) EndSub第六十四页,共七十七页,2022年,8月28日数论综合题 此类题目比较广泛,必须给以足够重视。 历年题目有:平方数、零巧数、拟互满数、回文数、酉完数、完数、幸运数、逆序数以及无暇素数、超级素数、因子和等。第六十五页,共七十七页,2022年,8月28日实战练习

1)

补充代码(2002秋二(10))

找出由两个不同数字组成的平方数,并将结果按图中的格式显示在列表框List1中。第六十六页,共七十七页,2022年,8月28日OptionExplicit PrivateSubCommand1_Click() DimIAsLong,NAsLong ForI=11To300

(1)

IfVerify(N)Then

(2)

EndIf NextI EndSub第六十七页,共七十七页,2022年,8月28日PrivateFunctionVerify(

(3))AsBoolean DimA(0To9)AsInteger,IAsInteger,JsAsInteger DoWhileN<>0

(4)

N=N\10 Loop ForI=0To9 Js=Js+A(I) NextI

(5)

EndFunction第六十八页,共七十七页,2022年,8月28日1)

编程题(2004秋上机试卷08) 一个正整数被称为奇妙平方数,如果此数的平方与它的逆序数的平方互为逆序数。例如,

12^2=144,21^2=441,12与

21互逆

,144与

441互逆

,12就是奇妙平方数。找出

1-300以内所有的奇妙平方数。

第六十九页,共七十七页,2022年,8月28日VB常用算法(十)

字符处理(统计与加密)算法说明

1)

加密解密

最简单的加密方法是:将每个字母加一序数,例如5,这时:“A”→”F”,”a”→”f”,”B”→”G”,”b”→”g”……”Y”→”D”,”y”→”d”,”Z”→”E”,”z”→”e”解密是加密的逆操作。

界面如下:

第七十页,共七十七页,2022年,8月28日代码如下: OptionExplicit PrivateSubCommand1_Click() DimstrInput$,Code$,Record$,cAsString*1 Dimi%,length%,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论