教學(xué)材料《VB導(dǎo)論》-6.3_第1頁(yè)
教學(xué)材料《VB導(dǎo)論》-6.3_第2頁(yè)
教學(xué)材料《VB導(dǎo)論》-6.3_第3頁(yè)
教學(xué)材料《VB導(dǎo)論》-6.3_第4頁(yè)
教學(xué)材料《VB導(dǎo)論》-6.3_第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

復(fù)習(xí)數(shù)組的賦值、輸出、使用

array函數(shù)使用特點(diǎn)特殊字符法分解子串的算法思想求最值的算法思想動(dòng)態(tài)數(shù)組的概念、聲明語(yǔ)句及注意事項(xiàng)

復(fù)習(xí)題1.下列語(yǔ)句中()可以用來(lái)正確的聲明一個(gè)動(dòng)態(tài)數(shù)組(00spring)A:Privatea(n)asintegerB:dima()asintegerC:dima(,)asintegerD:dima(1to10)asintegerB2.在窗體的通用聲明處有語(yǔ)句dima()assingle,以下在某事件過程中重定義此數(shù)組的一組正確語(yǔ)句是()DA:redima(3,3)Redimpreservea(4,3)asintegerB:redima(3,3)Redimpreservea(4,4)asintegerC:redima(3)Redimpreservea(3,3)asintegerD:redima(3,3)Redimpreservea(3,4)asinteger動(dòng)態(tài)數(shù)組的典型應(yīng)用:判斷完數(shù)

所謂完數(shù),是指一個(gè)數(shù)恰好等于它的因子之和。一個(gè)數(shù)的因子是指除該數(shù)本身以外能夠被其整數(shù)的數(shù)。解題思路:1、什么算法2、如何輸出3、使用數(shù)組存放因子,數(shù)組大小確定嗎?PrivateSubCommand1_Click()DimmAsInteger,iAsInteger,jAsInteger,kAsIntegerDima()m=Text1.TextFori=1ToIfmModi=0Thenk=k+ij=j+1a(j)=iEndIfNexti

IfThenPicture1.Printm&"是完數(shù),因?yàn)?Picture1.Printm;"=";Fori=1ToPicture1.Printa(i);"+";NextiPicture1.Printa(i)ElsePicture1.Printm&"不是完數(shù)"EndIfEndSubReDimPreservea(j)m/2m=kUBound(a)-13、動(dòng)態(tài)數(shù)組的應(yīng)用題1

用戶在text1中輸入任意的句子,由單詞和空格組成。在list1中輸出所有單詞,在text2中輸出最長(zhǎng)的單詞。4、動(dòng)態(tài)數(shù)組的應(yīng)用題2

用戶在text1中輸入任意的句子,由單詞和空格組成,最后一個(gè)單詞后以“.”結(jié)束。在list1中輸出所有單詞,在text2中輸出最長(zhǎng)的單詞。PrivateSubCommand1_Click()Dimword()AsString,sAsStringDimnAsInteger,kAsInteger,maxwAsStrings=Text1.TextDon=InStr(s,"")Ifn<>0Thenk=k+1word(k)=List1.AddItemword(k)s=EndIfLoopUntiln=0ReDimPreserveword(k+1)word(k+1)=Left(s,Len(s)-1)List1.AddItemword(k+1)Forn=2ToUBound(word)IfLen(maxw)<Len(word(n))Thenmaxw=word(n)EndIfNextnText2=maxwReDimPreserveword(k)Left(s,n-1)Right(s,Len(s)-n)maxw=word(1)6.4.1基本概念:

由一組具有相同name屬性和相同類型的控件組成,數(shù)組中的每一控件共享同樣的事件過程。當(dāng)建立控件數(shù)組時(shí),系統(tǒng)給每個(gè)元素賦一個(gè)唯一的索引號(hào)(Index),通過屬性窗口的Index屬性,可以知道該控件的下標(biāo)是多少,第1個(gè)下標(biāo)是0。6.4控件數(shù)組

6.4.2控件數(shù)組建立的方法:1、創(chuàng)建同名控件2、復(fù)制現(xiàn)存控件

例:教材P102例6-2PrivateSubCheck1_Click(IndexAsInteger)SelectCaseIndexCase0IfCheck1(0).Value=1ThenText1.Font.Italic=FalseText1.Font.Bold=FalseCheck1(1).Value=0Check1(2).Value=0

EndIfCase1Check1(0).Value=0IfCheck1(Index).Value=1ThenText1.Font.Italic=True

ElseText1.Font.Italic=False

EndIfCase2Check1(0).Value=0IfCheck1(Index).Value=1ThenText1.Font.Bold=TrueElseText1.Font.Bold=False

EndIf

EndSelectEndSub6.5程序示例常用算法排序算法:選擇排序法直接排序法冒泡法查找算法:順序查找二分查找6.5程序示例選擇排序法(以升序?yàn)槔?/p>

設(shè)在數(shù)組sort中存放n個(gè)無(wú)序的數(shù)

第1輪比較:用sort(1)與sort(2)進(jìn)行比較,若sort(1)>sort(2),則交換這兩個(gè)元素中的值,然后繼續(xù)用sort(1)與sort(3)比較,若sort(1)>sort(3),則交換這兩個(gè)元素中的值……依次類推,直到sort(1)與sort(n)進(jìn)行比較后,sort(1)中就存放了這n個(gè)數(shù)中最小的數(shù).

第2輪比較:用sort(2)依次與sort(3)、sort(4)…..sort(n)比較,處理方法相同,每次比較總是取小的數(shù)列放到sort(2)中,這一輪結(jié)束后,sort(2)中就存放了n個(gè)數(shù)中次小的數(shù).……..

第n-1輪比較:用sort(n-1)與sort(n)比較,取小者放到sort(n-1)中,sort(n)中則是n個(gè)數(shù)中最大的數(shù).經(jīng)過n-1輪比較后,n個(gè)數(shù)已按從小到大的次序排好.fori=forj= ifthen

EndifNextjNextI 1ton-1i+1tontemp=Sort(i) Sort(i)=Sort(j) Sort(j)=temp>

選擇排序法算法(以升序?yàn)槔?/p>

Sort(i)Sort(j)例6-6代碼解析OptionExplicitOptionBase1PrivateSubCommand1_Click()Dimsort%(10),temp%,i%,j%RandomizeFori=1To10sort(i)=Int(Rnd*99)+1Text1=NextiFori=Forj=Ifsort(i)>sort(j)Thentemp=sort(i)sort(i)=sort(j)sort(j)=tempEndIfNextjText2=NextiText2=EndSub

使用循環(huán)賦值,并在文本框text1中輸出數(shù)組sort元素的值

用選擇排序法排序并且在text2中輸出排序后的各元素的值Text1&Str(sort(i))1To9i+1To10Text2&Str(sort(i))Text2&Str(sort(i))選擇排序法優(yōu)點(diǎn):算法簡(jiǎn)單,容易想到;缺點(diǎn):比較次數(shù)多,為n*(n-1)/22、直接排序法

是在選擇排序法的基礎(chǔ)上改進(jìn)得到的一種排序方法。目的是減少數(shù)據(jù)交換次數(shù),提高交換效率。算法思想(以升序排列為例)

n個(gè)數(shù)需要進(jìn)行n-1輪比較。

設(shè)置1個(gè)變量(Pointer)來(lái)記錄下標(biāo),在每輪比較開始前,首先將外循環(huán)變量的值賦給它。然后開始比較,比較過程中,用sort(Pointer)與其后的元素進(jìn)行比較,當(dāng)需要交換兩數(shù)時(shí),不立刻交換,只是將另一個(gè)數(shù)組元素的下標(biāo)賦給Pointer。

每一輪比較結(jié)束后,判斷此刻的Pointer與它的初始值是否相等。若相等,則不需交換;否則,用s(i)與s(Pointer)交換。如此重復(fù),直到n-1輪結(jié)束。直接排序法的算法表示(以升序?yàn)槔?(待排序的數(shù)放在Sort數(shù)組中)Fori=1to

‘初始化pointer,在每輪比較開始處

for

j=i+1toNifSort(pointer)>Sort(j)

then

nextj ifthen temp=Sort(i) ‘交換

Sort(i)=Sort(pointer) Sort(pointer)=temp endifNexti n-1pointer=ipointer=ji<>pointer例6-6法2—直接排序法代碼解析Fori=1To9pointer=i

Forj=i+1To10Ifsort(pointer)>sort(j)Then pointer=j

NextjIfi<>pointerThentemp=sort(i)sort(i)=sort(pointer)sort(pointer)=tempEndIfText2=Text2&Str(sort(i))NextiText2=Text2&Str(sort(i))EndSub3、冒泡法排序算法思想(以升序?yàn)槔?/p>

n個(gè)數(shù)需要進(jìn)行n-1輪比較。第1輪:將相鄰兩個(gè)數(shù)比較,把小數(shù)對(duì)調(diào)到前邊,如此進(jìn)行一輪后,就會(huì)把最大的數(shù)互換到最后;第2輪:除最大數(shù)外,從頭到尾再重復(fù)第1輪的操作,則會(huì)把次大數(shù)排在倒數(shù)第二的位置上。第3輪:除上2輪得到的最大數(shù)、次大數(shù)外,從頭到尾再重復(fù)相同的操作。……

第n-1輪整個(gè)數(shù)列即可排好。在這種排序過程中,小數(shù)如同氣泡一樣逐層上浮,而大數(shù)逐個(gè)下沉,因此,被形象的喻為“冒泡”。冒泡法的算法表示:Fori=1ton-1 forj= ifthen t=S(j) S(j)=S(j+1) S(j+1)=t ‘立即互換

endif nextjnexti1to

n-iS(j)>S(j+1)實(shí)驗(yàn)7-9:用冒泡法對(duì)10個(gè)隨機(jī)整數(shù)排序dima(10)AsIntegerDimiAsInteger,jAsInteger,tempAsIntegerRandomizePrint"排序前"Fori=1To10a(i)=Int(90*Rnd+10)Printa(i);NextiFori=1To9Forj=1To10-iIfa(j)>a(j+1)Thentemp=a(j)aj)=a(j+1)a(j+1)=tempEndIfNextjNextiPrintPrint"排序后:"Fori=1To10Printa(i);NextiPrint①生成數(shù)組并輸出②冒泡排序③輸出排列好的數(shù)組元素選擇排序與冒泡排序?qū)Ρ缺容^元素第i次確定的元素是選擇排序冒泡排序s(i)與s(j)s(j)與s(j+1)第i個(gè)元素第(n+1-i)個(gè)元素常用的查找算法原始數(shù)據(jù):1,4,3,6,5查找“6”在第幾位?查找“2”在第幾位?常用的查找算法1、順序查找的算法思想總體思想:把待查找的數(shù)與數(shù)組中的數(shù)從頭到尾逐一比較;實(shí)現(xiàn)過程:

用一變量i來(lái)表示當(dāng)前比較的位置,它的初值為1。若待查找的數(shù)與數(shù)組中i位置的元素相等,查找就結(jié)束。否則i=i+1,繼續(xù)比較;當(dāng)i大于數(shù)組的最大長(zhǎng)度,查找也結(jié)束。

注意退出的兩種情況,分別為找到和未找到(i大于數(shù)組的最大長(zhǎng)度)。順序查找的算法表示(x為待查找的數(shù),search為數(shù)組名):Fori=1to ifsearch(i)=xthenexitfornexti‘退出的兩種情況Ifthen print”找到了X“else

print”沒找到X“endif Ubound(search)i<=ubound(search)例6-7代碼解析OptionExplicitOptionBase1DimsearchAsVariantPrivateSubCommand1_Click()Dimi%,elementAsVariantsearch=Array(34,12,56,81,74,59,83,91,26,57)ForEachelementInsearchText1=Text1&Str(element)NextelementEndSub定義模塊級(jí)變體變量使用array給變體變量賦值,把它創(chuàng)建成一維數(shù)組使用for–each-next語(yǔ)句在文本框中輸出數(shù)組元素.PrivateSubCommand2_Click()DimiAsInteger,findAsIntegerText2=""find=InputBox("輸入要查找的數(shù)")Fori=1ToUBound(search)Ifsearch(i)=findThenExitForNextiIfi<=UBound(search)ThenText2="要查找的數(shù)"&Str(search(i))&"是search("&Str(i)&")"ElseText2="在數(shù)列中沒有找到"&Str(i)EndIfEndSub在數(shù)組中逐個(gè)查找,如果找到結(jié)束循環(huán)思考:

123456……1000250在第幾個(gè)?1001在第幾個(gè)?

順序查找的方法雖然簡(jiǎn)單,當(dāng)數(shù)組很大時(shí),這種查找方法效率較低。用順序查找的方法找2、二分(折半)查找leftrightmid

折半查找法是對(duì)有序數(shù)列進(jìn)行查找的一種高效查找辦法。其基本思想是逐步縮小查找范圍。因?yàn)槭怯行驍?shù)列,所以采取半分作為分割范圍可使比較次數(shù)最少。

設(shè)left代表查找區(qū)間的左端位置,初值為1;

right代表查找區(qū)間的右端位置,初值為數(shù)組的上界;mid代表查找區(qū)間的中部位置,Mid=(left+right)/2。要查找的數(shù)存放在變量find中。1、計(jì)算出中間元素的位置mid,判斷要查找的數(shù)find與S(Mid)是否相等。若相等,則要查找的數(shù)已經(jīng)找到,位置就是Mid,否則進(jìn)行下面的判斷。2、如果find小于S(Mid),因?yàn)槭怯行驍?shù)列,則X必定落在left和Mid的范圍之內(nèi),下一步查找只需在此范圍之內(nèi)進(jìn)行即可。即left位置不動(dòng)right變?yōu)镸id-1。重復(fù)1即可。3、如果X大于S(Mid),則X必定落在Mid+1和right之間,下一步查找范圍應(yīng)該是left=Mid+1和right,設(shè)定完left后即可轉(zhuǎn)到1繼續(xù)判斷。leftrightrightleft二分法的算法如下:注意:

在此循環(huán)過程中,left,right,mid都是表示位置的整數(shù),如果循環(huán)到left>right,則表明此數(shù)列中沒有要找的數(shù),應(yīng)該退出循環(huán)。比如:在數(shù)組S:2810121880中找100第1次查找:Left=1,right=6,mid=4因?yàn)?00>s(4),所以將left修改為mid+1=5,開始第2次查找。第2次查找:Left=5,right=6,mid=6因?yàn)?00>s(6),所以將left修改為mid+1=7,此時(shí)left>right了,表示查找結(jié)束,沒有找到。flg=False left= right=DoWhile mid=(left+right)/2 IfX=S(mid)Then flag=True exitdo ElseIfX>S(mid)Then

Else

EndIfLoop 二分查找的算法表示:1ubound(s)left<=rightleft=mid+1 right=mid-1例6-8OptionExplicitOptionBase1DimsearchAsVariantPrivateSubcmd生成數(shù)組_Click()DimvAsVariantsearch=Array(12,17,23,30,39,41,46,57,61,78,83,85,89,93)

ForEachvInsearchText1=Text1&Str(v)NextvEndSub

用array函數(shù)給變體變量search賦值用for—each-next語(yǔ)句在text1中輸出數(shù)組元素代碼解析PrivateSubCmd二分查找_Click()Dimleft%,right%,mid%,flgAsBooleanDimfindAsIntegerfind=InputBox("輸入要查找的數(shù)")left=1:right=UBound(search)flg=FalseDoWhileleft<=rightmid=(right+left)/2Ifsearch(mid)=findThenflg=TrueExitDoElseIffind>search(mid)Thenleft=mid+1Elseright=mid-1EndIfLoopIfflgThenText2="要查找的數(shù)"&Str(find)&"在search("&Str(mid)&")中"ElseText2=Str(find)&"不在數(shù)組中"EndIfEndSub初始化二分查找輸出查找結(jié)果例6-3題目:隨機(jī)生成20個(gè)10—50之間的互不相同的整數(shù),并求出它們的平均值.程序要點(diǎn):1)10—50之間的整數(shù)用int(41*rnd+10)2)20個(gè)整數(shù)用for循環(huán)實(shí)現(xiàn)

3)注意:隨機(jī)函數(shù)生成指定范圍內(nèi)的整數(shù)時(shí),會(huì)有重復(fù)的數(shù)字產(chǎn)生.4)思考:如何剔除重復(fù)的數(shù)字?以10個(gè)為例

剔除重復(fù)數(shù)采用的方法是:每當(dāng)用隨機(jī)函數(shù)生成一個(gè)新的整數(shù)時(shí),都要用這個(gè)數(shù)與前面已生成的數(shù)進(jìn)行比較,若與前面的數(shù)相同則將其丟棄,否則把它存入到數(shù)組中。由于在產(chǎn)生過程中無(wú)法預(yù)知會(huì)產(chǎn)生多少個(gè)重復(fù)的數(shù),所以用do循環(huán)實(shí)現(xiàn)剔除。OptionExplicitOptionBase1PrivateSubCommand1_Click()Dima(20)AsInteger,kAsInteger,jAsInteger,sum%,idx%k=Int(41*Rnd)+10:idx=1a(idx)=k

Do

k=Int(41*Rnd)+10Forj=1ToidxIfk=a(j)ThenExitFor

Nextj

Ifj>idxThenidx=idx+1a(idx)=ksum=sum+a(idx)Text1=Text1&Str(a(idx))

IfidxMod10=0ThenText1=Text1&vbCrLf

EndIfLoopuntilindx=20Text2="平均值為:"&sum/20例6-4找出100以內(nèi)的素?cái)?shù),存放在數(shù)組Prime,并將找到的素?cái)?shù),按每行10個(gè)的形式顯示在窗體上。OptionBase1OptionExplicitPrivateSubForm_Click()Dimprime(50)AsInteger'不知有多少素?cái)?shù),有意識(shí)將數(shù)組放大

DimiAsInteger,mAsInteger,jAsInteger,kAsIntegerprime(1)=2'最小的素?cái)?shù)是2m=1‘變量m代表數(shù)組下標(biāo),也代表素?cái)?shù)的個(gè)數(shù)

Fori=3To99Step2'偶數(shù)除2外都不是素?cái)?shù),所以不用判斷

Forj=2ToSqr(i)'內(nèi)循環(huán)判斷i能否被j整除,如果能整除則i不是素?cái)?shù),退出內(nèi)循環(huán);否則i是素?cái)?shù)

IfiModj=0ThenExitForNextjIfj>Sqr(i)Thenm=m+1prime(m)=iEndIfNexti

初始化退出for循環(huán)有兩種情況,如果循環(huán)正常結(jié)束時(shí),則i是素?cái)?shù)i是素?cái)?shù),把它放到數(shù)組prime中.6-4代碼解析k=0‘以下代碼輸出100以內(nèi)的素?cái)?shù),每行10個(gè)

Forj=1Tomk=k+1Printprime(j);IfkMod10=0ThenPrintNextjEndSub10個(gè)素?cái)?shù)一行變量k用來(lái)計(jì)數(shù)Dimprime()AsIntegerDimiAsInteger,mAsInteger,jAsInteger,kAsIntegerprime(1)=2m=1Fori=3To99Step2Forj=2ToSqr(i)IfiModj=0ThenExitForNextjIfj>Sqr(i)Thenm=m+1prime(m)=iEndIfNextiReDimprime(1)用動(dòng)態(tài)數(shù)組修改例6-4ReDimPreserveprime(m)例6-10求出裴波拉契數(shù)列的前18項(xiàng),并按順序?qū)⑺鼈冿@示在一個(gè)文本框。 1 n=1F(n)= 1 n=2 F(n-2)+F(n-1) n≥33411235813215589…Fb(1)Fb(2)Fb(3)Fb(4)Fb(5)Fb(6)Fb(7)Fb(8)Fb(9)Fb(10)Fb(11)利用未知項(xiàng)與已知項(xiàng)之間存在的某種關(guān)系,從已知項(xiàng)出發(fā)能一項(xiàng)項(xiàng)推出未知項(xiàng)的方法叫遞推法.已知項(xiàng)是初始條件.OptionBase1OptionExplicitPrivateSubForm_Click()Dimfb(18)AsInteger,i%fb(1)=1:fb(2)=1Fori=3To18fb(i)=fb(i-1)+fb(i-2)Nexti

Fori=1To18Text1=Text1&Str(fb(i))&""

NextIEndsub前兩項(xiàng)初值遞推在文本框中輸出例6-11統(tǒng)計(jì)字母(不分大小寫)在文本中出現(xiàn)的次數(shù)?;仡櫍簆82,題2n1=0:n2=0:n3=0Fori=1To100a=10+Int(Rnd*90)SelectCaseaCaseIs<=40

n1=n1+1CaseIs<=70

n2=n2+1CaseElse

n3=n3+1EndSelectNextiPrintn1,n2,n3聯(lián)系本題:n1=0:n2=0:n3=0:…….n26=0Fori=1Tolen(s)zimu=mid(s,i,1)SelectCasezimuCaseIs=“a”

n1=n1+1CaseIs=“b”

n2=n2+1………CaseElse

n26=n26+1EndSelectNextiPrintn1,n2,n3,…..n26要定義26個(gè)變量呀,自然想到用變量的集合---數(shù)組用數(shù)組元素的值表示字母的個(gè)數(shù)。比如a(0)表示字母a的個(gè)數(shù),a(1)表示字母b的個(gè)數(shù),a(2)表示字母c的個(gè)數(shù)……

算法說明:因?yàn)橐粋€(gè)大寫字母對(duì)”A”,或一個(gè)小寫字母對(duì)”a”的位移量都在0—25之間,所以可以定義一個(gè)一維數(shù)組,它的下標(biāo)取值范圍在0-25之間。讓數(shù)組元素下標(biāo)值與字母A—Z一一對(duì)應(yīng)起來(lái).即A(0)記錄字母A在文本中出現(xiàn)的次數(shù),A(1)記錄字母B在文本中出現(xiàn)的次數(shù),…..A(25)記錄字母Z在文本中出現(xiàn)的次數(shù).

統(tǒng)計(jì)字母在文本中出現(xiàn)的次數(shù)的方法:每次順序取出文本中的一個(gè)字母,若是大寫字母,用該字母的ascii減去A的;若是小寫字母,則減a的,這樣就得到與這個(gè)字母

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論