




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第3章VisualBasic語言進階3.1基本控制結(jié)構(gòu)3.2數(shù)組3.3用戶定義類型3.4算法及舉例13.1基本控制結(jié)構(gòu)3.1.1順序結(jié)構(gòu)3.1.2分支結(jié)構(gòu)3.1.3循環(huán)結(jié)構(gòu)23.1.1順序結(jié)構(gòu)
順序結(jié)構(gòu)就是整個程序按書寫順序依次自上而下執(zhí)行。前面兩章設(shè)計和編寫的程序都是順序結(jié)構(gòu)的。順序結(jié)構(gòu)如圖所示,先執(zhí)行A,再執(zhí)行B,即自上而下依次運行。圖(左)圖為框式流程圖,圖(右)為N-S流程圖,又稱為盒圖。33.1.2分支結(jié)構(gòu)分支結(jié)構(gòu)用于判斷并分支,又稱為選擇結(jié)構(gòu)。如圖所示,E代表條件,當E條件成立(True)時執(zhí)行A,否則(False)執(zhí)行B,兩條分支匯合在一起為一個出口。分支結(jié)構(gòu)有幾種形式:If...Then...Else結(jié)構(gòu)、SelectCase結(jié)構(gòu)和IIf函數(shù)。43.1.2分支結(jié)構(gòu)1.If...Then...Else結(jié)構(gòu)If...Then...Else結(jié)構(gòu)表示“如果...就...否則”。語法:
If條件Then語句或者:
If條件1Then
語句塊1 [ElseIf
條件2Then
語句塊2]... ... [Else
語句塊n] EndIf條件可以為各種表達式,都要轉(zhuǎn)換為Boolean型,即所有非零的數(shù)值、字符等都轉(zhuǎn)換為True,而0、"0"值則轉(zhuǎn)換為False。當If...Then...Else結(jié)構(gòu)只有單獨的If語句時,可以沒有EndIf語句。首先測試條件1,如果為False,就測試條件2,依此類推,直到找到一個為True的條件就執(zhí)行Then后面的語句塊。當只有一個條件而且執(zhí)行的是單個語句時,If...Then...Else結(jié)構(gòu)可以簡化成If...Then語句。53.1.2分支結(jié)構(gòu)【例3-1】使用If...Then語句查詢學(xué)生的成績,大于等于60分的為及格,其余為不及格。界面設(shè)計:在窗體界面中創(chuàng)建兩個文本框(Text1、Text2)、兩個標簽(Label1、Label2)和一個按鈕(Command1)。文本框Text1輸入分數(shù),單擊按鈕Command1則在文本框Text2中顯示成績。63.1.2分支結(jié)構(gòu)程序代碼如下:PrivateSubCommand1_Click()'單擊按鈕顯示成績
DimxAsSingleDimyAsStringx=Val(Text1.Text)y="不及格"Ifx>=60Theny="及格"Text2.Text=yEndSub程序分析:使用If...Then語句,當滿足條件“x>=60”就執(zhí)行Then后面的語句“y="及格"”,否則就執(zhí)行If...Then語句后面的語句。
73.1.2分支結(jié)構(gòu)【例3-2】使用If...Then...Else結(jié)構(gòu)查詢學(xué)生的成績,大于等于60分的為及格,其余為不及格。界面設(shè)計和功能要求與【例3-1】相同,程序流程圖如圖所示。程序代碼如下:PrivateSubCommand1_Click()'單擊按鈕顯示成績
DimxAsSingleDimyAsStringx=Val(Text1.Text)Ifx>=60Theny="及格"Elsey="不及格"EndIfText2.Text=yEndSub
83.1.2分支結(jié)構(gòu)【例3-3】使用多個條件的If...Then...Else結(jié)構(gòu)查詢學(xué)生的成績,將成績分成優(yōu)、良、中、及格和不及格,90~100為優(yōu),80~90為良,70~80為中,60~70為及格,60以下為不及格。93.1.2分支結(jié)構(gòu)程序代碼如下:PrivateSubCommand1_Click()'單擊按鈕顯示成績
DimxAsSingleDimyAsStringx=Val(Text1.Text)Ifx>=90Theny="優(yōu)"
ElseIfx>=80Then
y="良"
ElseIfx>=70Theny="中"
ElseIfx>=60Theny="及格"Elsey="不及格"EndIfText2.Text=yEndSub程序分析:使用有多個條件的If...Then...Else結(jié)構(gòu),判斷的順序是“x>=90”“x>=80”“x>=70”“x>=60”剩下的就是“x<60”。103.1.2分支結(jié)構(gòu)2.SelectCase結(jié)構(gòu)
SelectCase結(jié)構(gòu)與If...Then...Else結(jié)構(gòu)類似,但對多條件選擇時,有時用SelectCase語句代碼效率更高,更易讀。語法:
SelectCase變量|表達式
Case值1
語句塊1[Case值2
語句塊2]...[CaseElse
語句塊n]EndSelect113.1.2分支結(jié)構(gòu)說明:(1)SelectCase只計算一次變量或表達式的值,然后與每個Case的值1、值2等進行比較,如果相等,就執(zhí)行該case后對應(yīng)的語句塊;如果沒有相匹配的,則執(zhí)行CaseElse中的語句塊。(2)值1、值2等可以取以下幾種形式:具體常數(shù)。例如,1、2、“a”等。連續(xù)的數(shù)據(jù)范圍。例如,1to100、atoz等。滿足某個條件的表達式。例如,I>0等。也可以是幾種不同形式的組合,用逗號(,)將它們分隔開。例如,-10,1to100。(3)SelectCase和EndSelect必須成對出現(xiàn)。123.1.2分支結(jié)構(gòu)【例3-4】使用SelectCase結(jié)構(gòu)實現(xiàn)學(xué)生成績的查詢,將成績分成優(yōu)、良、中、及格和不及格,90~100為優(yōu),80~90為良,70~80為中,60~70為及格,60以下為不及格。
Case70To79y="中"Case60To69y="及格"CaseElsey="不及格"EndSelectText2.Text=yEndSubPrivateSubCommand1_Click()'單擊按鈕顯示成績
DimxAsSingleDimyAsStringx=Int(Text1.Text)SelectCasexCase90To100y="優(yōu)"Case80To89y="良"程序分析:
x=Int(Text1.Text)用來將分數(shù)取整,因為分數(shù)可能是小數(shù)?!癈ase90To100”后面的值使用連續(xù)的范圍表示90~100。133.1.2分支結(jié)構(gòu)3.IIf函數(shù)If...Then...Else結(jié)構(gòu)當只有一個條件時還可以使用IIf函數(shù)來實現(xiàn),用IIf函數(shù)語句可以說是If...Then...Else結(jié)構(gòu)的簡寫版本。語法: 變量=IIF(條件,真部分,假部分)說明:IIf函數(shù)的步驟是先判斷條件,當條件為True時執(zhí)行真部分,否則就執(zhí)行假部分。在【例3-2】中當分數(shù)>=60為及格,否則為不及格的關(guān)系可以用IIf函數(shù)表示為:y=IIf(x>=60,"及格","不及格")143.1.2分支結(jié)構(gòu)4.嵌套嵌套是指把一個結(jié)構(gòu)嵌入另一個結(jié)構(gòu)之內(nèi)。即If和EndIf、SelectCase和EndSelect對都嵌入,不能有交叉,因此在讀程序時,與If或SelectCase匹配的是最近的EndIf或EndSelect。
如圖所示為三層If嵌套的結(jié)構(gòu),If與最近的EndIf匹配成對,而且在書寫時應(yīng)養(yǎng)成每層縮進的習(xí)慣便于程序的閱讀。153.1.2分支結(jié)構(gòu)例3-5,解一元二次方程ax2+bx+c=0。一元二次方程的解的情況有下列幾種可能:a=0,不是二次方程;b2-4ac=0,有兩個相等實根:b2-4ac>0,有兩個不等實根:
b2-4ac<0,有兩個共軛虛根。163.1.2分支結(jié)構(gòu)
a=0輸出“非二次方程”b2-4ac=0輸出兩個相等實根:ab2-b2-4ac>0計算復(fù)根的實部p和虛部q:輸出兩個復(fù)根:p+q,p-q輸出兩個實根:x1,x2aacbbx2422---=aacbbx2412-+-=abp2-=aacbq2)4(2--=真真真假假假173.1.3循環(huán)結(jié)構(gòu)
1.Do…Loop結(jié)構(gòu)Do循環(huán)有兩種形式。即“當型”循環(huán)(
While結(jié)構(gòu))和“直到型”(
DoWhile結(jié)構(gòu))循環(huán)。當E為真
A
False
ETrueA
“當型”循環(huán)結(jié)構(gòu)的程序流程圖
A直到E為真TrueEFalseA“直到型”循環(huán)結(jié)構(gòu)的程序流程圖
183.1.3循環(huán)結(jié)構(gòu)
“當型”循環(huán)的語法:Do[While|Until條件]
語句塊
[ExitDo] [語句塊]Loop
“直到型”循環(huán)的語法:Do
語句塊
[ExitDo] [語句塊]Loop[While|Until條件]193.1.3循環(huán)結(jié)構(gòu)說明:“直到型”循環(huán)與“當型”循環(huán)所不同的是先執(zhí)行語句塊,然后測試條件,只要條件為True就循環(huán)語句塊;如果條件為False,則跳過循環(huán)體。這種“直到型”循環(huán)保證語句塊至少被執(zhí)行一次。注意:在Do...Loop結(jié)構(gòu)中Until和While不同,判斷條件正好相反。Until結(jié)構(gòu)是只要條件為False(而不是True),就執(zhí)行循環(huán)的語句塊,否則跳出循環(huán)體。203.1.3循環(huán)結(jié)構(gòu)【例3-6】用“當型”循環(huán)計算1到100的和。界面設(shè)計:在窗體界面中放置一個文本框Text1、一個標簽和一個按鈕Command1,單擊按鈕Command1開始計算1~100的和。213.1.3循環(huán)結(jié)構(gòu)序代碼如下:PrivateSubCommand1_Click()'單擊按鈕開始計算
DimiAsInteger,SumAsIntegerSum=0:i=1DoWhilei<=100Sum=Sum+ii=i+1LoopText1.Text=SumEndSub223.1.3循環(huán)結(jié)構(gòu)【例3-7】用“直到型”循環(huán)While計算1到100的和。界面設(shè)計與【例3-6】相同,程序代碼如下:
PrivateSubCommand1_Click()'單擊按鈕開始計算
DimiAsInteger,SumAsIntegerSum=0:i=1DoSum=Sum+ii=i+1LoopWhilei<=100Text1.Text=SumEndSub(自學(xué))233.1.3循環(huán)結(jié)構(gòu)如果將循環(huán)體外的置初始值語句由“i=1”改為“i=101”,則兩種不同的Do...Loop結(jié)構(gòu)結(jié)果就不同了:【例3-6】判斷條件后直接跳出循環(huán),Sum的結(jié)果是0;【例3-7】進入循環(huán)體一次后判斷條件跳出循環(huán),Sum的結(jié)果是101。(自學(xué))243.1.3循環(huán)結(jié)構(gòu)2.For…Next結(jié)構(gòu)如果已經(jīng)知道了循環(huán)的次數(shù),使用For…Next循環(huán)比Do…Loop循環(huán)更方便。語法:For計數(shù)器
=初始值
To終止值
[Step步長]
語句塊
[ExitFor]Next[計數(shù)器]253.1.3循環(huán)結(jié)構(gòu)For…Next循環(huán)的步驟:(1)設(shè)置計數(shù)器等于初始值。(2)如果步長(缺省值為1)為正值,則判斷計數(shù)器是否大于終止值,如果大于則跳出循環(huán)。如果步長為負數(shù)則判斷計數(shù)器是否小于終止值。(3)執(zhí)行語句塊。(4)計數(shù)器=計數(shù)器±步長。(5)循環(huán)執(zhí)行步驟(2)~(5)。
For…Next循環(huán)步長為正值的程序流程圖263.1.3循環(huán)結(jié)構(gòu)【例3-8】用For…Next循環(huán)結(jié)構(gòu)來計算1到100的和,步長為1。
PrivateSubCommand1_Click()'單擊按鈕開始計算
DimiAsInteger,SumAsIntegerSum=0Fori=1To100 '步長默認為1Sum=Sum+iNextiText1.Text=SumEndSub273.1.3循環(huán)結(jié)構(gòu)【例3-9】For…Next循環(huán)結(jié)構(gòu)計算1到100的和,步長-1。
PrivateSubCommand1_Click()‘單擊按鈕開始計算
DimiAsInteger,SumAsIntegerSum=0Fori=100To1Step-1 '步長為-1Sum=Sum+iNextiText1.Text=SumEndSub(快講)283.1.3循環(huán)結(jié)構(gòu)3.退出循環(huán)結(jié)構(gòu)用Exit語句可以直接退出For…Next循環(huán)和Do…Loop循環(huán)?!癊xitFor”為退出For…Next循環(huán),“ExitDo”為退出Do…Loop循環(huán)。程序執(zhí)行時遇到Exit語句,就不再執(zhí)行循環(huán)結(jié)構(gòu)中的任何語句立即跳出循環(huán),跳轉(zhuǎn)到循環(huán)結(jié)構(gòu)的下一句執(zhí)行。Exit語句幾乎總是出現(xiàn)在循環(huán)體內(nèi)嵌套的If語句或SelectCase語句中。注意:當運行程序進入死循環(huán)時,按Ctrl+break鍵可以終止程序的運行。293.1.3循環(huán)結(jié)構(gòu)【例3-10】
用For…Next循環(huán)結(jié)構(gòu)來計算1到100的和,當和大于等于3000時終止循環(huán)。運行界面如圖所示。PrivateSubCommand1_Click()'單擊按鈕開始計算
DimiAsInteger,SumAsIntegerSum=0Fori=1To100Sum=Sum+iIfSum>=3000ThenExitForNextiText1.Text=SumEndSub
303.1.3循環(huán)結(jié)構(gòu)4.嵌套各種循環(huán)結(jié)構(gòu)中都可以嵌套其他任何循環(huán)結(jié)構(gòu),也可以嵌套分支結(jié)構(gòu)。各種結(jié)構(gòu)在嵌套時必須是完整地嵌入,不能交叉。【例3-11】計算九九乘法表。創(chuàng)建一個空白的窗體,在單擊窗體時計算并顯示九九乘法表。313.1.3循環(huán)結(jié)構(gòu)程序代碼如下:PrivateSubForm_Click()'單擊窗體顯示乘法表
DimiAsInteger,jAsIntegerFori=1To9Forj=1ToiPrintTab((j-1)*10+1);j&"×"&i&"="&i*j;NextjNextiEndSub
程序分析:由于九九乘法表有九行,每行不同列,因此必須使用雙重循環(huán)來實現(xiàn)。外循環(huán)為九九乘法表的行循環(huán),內(nèi)循環(huán)為每行的列循環(huán)。內(nèi)循環(huán)的次數(shù)每次都不同為1~i。使用Print語句在窗體上顯示,使用Tab格式每列間隔10個字符。323.2數(shù)組3.2.1聲明數(shù)組 3.2.2數(shù)組的操作 3.2.3靜態(tài)數(shù)組和動態(tài)數(shù)組 3.2.4多維數(shù)組333.2.1聲明數(shù)組
1.數(shù)組的概念(1)數(shù)組數(shù)組是同類變量的一個有序集合。數(shù)組名的命名規(guī)則與變量相同,但數(shù)組名代表的是一組變量,而不是一個變量。(2)數(shù)組元素數(shù)組中的元素稱為數(shù)組元素,數(shù)組元素具有相同名字和數(shù)據(jù)類型,通過下標來識別它們。數(shù)組元素的表示: 數(shù)組名(下標1[,下標2,…])說明:下標表示數(shù)組元素在數(shù)組中的位置。數(shù)組的運算是對數(shù)組中的元素進行運算,可以使用變量的地方都可以使用數(shù)組,數(shù)組元素可以進行賦值、運算等操作。343.2.1聲明數(shù)組2.聲明數(shù)組在使用數(shù)組前必須聲明數(shù)組,是用來指明數(shù)組的數(shù)據(jù)類型和每一維的上下界。語法:[Private|Public|Dim]數(shù)組名(第一維上下界,…)As數(shù)據(jù)類型說明:數(shù)組元素每一維的上下界表示為“下界To上界”,上下界不得超過Long數(shù)據(jù)類型的范圍,省略下界時取值為0,下界≤上界,當上下界為小數(shù)時會自動進行四舍五入。353.2.1聲明數(shù)組數(shù)組元素的個數(shù)為(第一維上界-下界+1)*(第二維上界-下界+1)*…。數(shù)組中所有元素具有相同的數(shù)據(jù)類型。但當數(shù)據(jù)類型為Variant型時,各元素能夠包含不同類型的數(shù)據(jù),例如數(shù)值型、字符串型等。例如:dima(10)asinteger dima(-2to3)asintegerdima(2,3)asintegerdima(-3to3,4)asinteger363.2.1聲明數(shù)組3.OptionBase語句當聲明數(shù)組時下界省略,則表示從0開始,如果用戶希望數(shù)組下標從1開始,就可以使用OptionBase語句來聲明數(shù)組下標的默認下界。語法:
OptionBase0|1說明:OptionBase語句必須在代碼編輯器窗口的“通用”部分聲明,表示本模塊的所有數(shù)組的默認下界??梢月暶鲾?shù)組的默認下界為0或1。373.2.1聲明數(shù)組例如,在模塊中使用OptionBase語句:OptionBase1 '將的數(shù)組下標默認設(shè)為1PrivateSubCommand1_Click()Dima(5)AsInteger '從a(1)到a(5)共5個元素
Dimb(-1to5)AsInteger '從b(-1)到b(5)共7個元素
Dimc(2,3)AsInteger '從c(1,1)到c(2,3)共2*3為6個元素
……EndSub
一個模塊中只能出現(xiàn)一次OptionBase語句,而且必須位于本模塊的“通用”部分。383.2.2數(shù)組的操作數(shù)組元素的賦值由于數(shù)組是一組有序的元素組成,因此賦值時有三種方法:象變量一樣一個個賦值,通過循環(huán)賦值和使用Array函數(shù)賦值。(1)用賦值語句對每個元素賦值用賦值語句對每個元素賦值,就是用賦值語句對數(shù)組中的每個元素分別賦值。(快講)393.2.2數(shù)組的操作【例3-12】對數(shù)組a(5)的6個元素賦值為1,2,3,4,5,6,并用Print語句顯示,運行界面如圖所示。在單擊按鈕Command1時運行程序:PrivateSubCommand1_Click()Dima(5)AsIntegera(0)=1a(1)=2a(2)=3a(3)=4a(4)=5a(5)=6Printa(0);a(1);a(2);a(3);a(4);a(5)EndSub
403.2.2數(shù)組的操作(2)通過循環(huán)賦值當數(shù)組的元素個數(shù)較多時,單獨對每個元素賦值工作量就很大,可以使用循環(huán)結(jié)構(gòu)進行賦值?!纠?-13】使用循環(huán)結(jié)構(gòu)對a(5)的6個元素賦值為1,2,3,4,5,6,并用Print語句顯示。PrivateSubCommand1_Click()Dima(5)AsIntegerDimiAsIntegerFori=0To5 '使用循環(huán)賦值
a(i)=i+1NextiFori=0To5 '使用循環(huán)顯示
Printa(i);NextiEndSub413.2.2數(shù)組的操作(3)使用Array函數(shù)賦值使用Array函數(shù)可以把數(shù)據(jù)集一次賦值給一個Variant型一維數(shù)組變量。語法: 變量名=Array(數(shù)據(jù)列表)說明:變量名只能是Variant型。數(shù)據(jù)列表是用逗號“,”分隔的一系列數(shù)據(jù)。如果不提供數(shù)據(jù)列表,則創(chuàng)建一個長度為0的數(shù)組。數(shù)組的下界默認為0,使用OptionBase語句指定下界也可以。數(shù)組的上界由數(shù)據(jù)列表的元素個數(shù)決定。423.2.2數(shù)組的操作【例3-14】使用Array函數(shù)對數(shù)組a(5)的6個元素賦值為1,2,3,4,5,6,并用Print語句顯示。
PrivateSubCommand1_Click()Dimaa=Array(1,2,3,4,5,6)Fori=0To5Printa(i);NextiEndSub
程序分析:聲明變量a時,不說明數(shù)組的上下界?!癉ima”語句表示a為Variant型變量。數(shù)組a用Array函數(shù)賦值后,上界為5,下界為0。433.2.2數(shù)組的操作2.數(shù)組函數(shù)(1)LBound和UBound
函數(shù)
LBound
函數(shù)用于指定的數(shù)組某維可用的最小下標(下界),UBound函數(shù)則用于指定的數(shù)組某維可用的最大下標(上界)。語法:
Ubound(數(shù)組名[,維])
Lbound(數(shù)組名[,維])說明:維是指定某一維,省略時為1表示第一維,2表示第二維,依此類推。例如,返回數(shù)組的上下界:Dima(1To10,5To15)AsIntegerDimLAsInteger,UAsIntegerL=LBound(a,1) '返回1U=UBound(a,2) '返回15443.2.2數(shù)組的操作(2)IsArray函數(shù)IsArray函數(shù)用來判斷是否為數(shù)組。語法:IsArray(變量名)說明:變量如果是數(shù)組,則返回True,否則就返回False。例如,使用IsArray函數(shù)判斷變量是否為數(shù)組:
Dimaa=1PrintIsArray(a)a=Array(1,2,3,4,5)PrintIsArray(a)程序分析:當變量a=1時,IsArray(a)得出為False;用Array函數(shù)賦值后,IsArray(a)得出為True。453.2.2數(shù)組的操作3.ForEach…Next語句ForEach…Next語句類似于循環(huán)結(jié)構(gòu)For…Next,都是重復(fù)執(zhí)行語句塊直到循環(huán)結(jié)束。但ForEach…Next語句是專門針對數(shù)組或?qū)ο蠹隙O(shè)置的。語法:
ForEach成員In數(shù)組|集合 語句塊
[ExitFor] Next[成員](自學(xué))463.2.2數(shù)組的操作3.ForEach…Next語句說明:對于數(shù)組成員只能是Variant型變量,代表數(shù)組中每個元素。對于集合,成員可以是Variant變量、Object變量、或?qū)ο蟆3蓡T類似于For…Next循環(huán)中的循環(huán)控制變量,但不需要為其提供初值和終值。循環(huán)的次數(shù)由數(shù)組的元素個數(shù)或集合的成員個數(shù)決定。語句塊就是循環(huán)體。473.2.2數(shù)組的操作【例3-15】數(shù)組a(5)的6個元素已經(jīng)賦值為1,2,3,4,5,6,使用ForEach…Next語句用Print語句顯示。PrivateSubCommand1_Click()DimxDimiAsIntegerDima(5)AsIntegerFori=0To5 '給數(shù)組賦值
a(i)=i+1NextiForEachxIna'顯示數(shù)組
Printx;NextxEndSub程序分析:x必須是Variant變量。x的值是處于不斷的變化之中,開始執(zhí)行時,x是數(shù)組第1個元素的值,執(zhí)行完一次循環(huán)體后,x變?yōu)閿?shù)組第2個元素的值……,當x為最后一個元素的值時結(jié)束循環(huán)。483.2.3靜態(tài)數(shù)組和動態(tài)數(shù)組靜態(tài)數(shù)組是固定大小的數(shù)組,維數(shù)和大小都不能改變,前面介紹的數(shù)組都是靜態(tài)數(shù)組。動態(tài)數(shù)組是在運行時大小可以改變的數(shù)組。1.定義動態(tài)數(shù)組在編程時,如果需要一個在運行過程中能夠改變元素個數(shù)的數(shù)組,使用靜態(tài)數(shù)組只能定義一個足夠大的數(shù)組,當元素個數(shù)較少時就使用較少的元素,而元素個數(shù)較多時,就使用較多的元素,這種方法會導(dǎo)致占用大量內(nèi)存,使操作速度變慢。使用動態(tài)數(shù)組可以在運行時根據(jù)需要改變數(shù)組的大小,使用動態(tài)數(shù)組靈活、方便,并有助于有效管理內(nèi)存。493.2.3靜態(tài)數(shù)組和動態(tài)數(shù)組定義動態(tài)數(shù)組的語法:
Dim數(shù)組名()[As數(shù)據(jù)類型]
ReDim
數(shù)組名(第一維上下界,…) 說明:ReDim語句是一條可執(zhí)行語句,可反復(fù)執(zhí)行;使用ReDim可以反復(fù)改變數(shù)組大小,但不能改變數(shù)組的數(shù)據(jù)類型。每次執(zhí)行ReDim語句后,當前數(shù)組中的值會全部丟失,數(shù)值將重新初始化。503.2.3靜態(tài)數(shù)組和動態(tài)數(shù)組
例1:
Dima()Asinteger
ReDima(4,3)
例2:
Dima()Asinteger
ReDima(3,3)……
ReDima(10)……513.2.3靜態(tài)數(shù)組和動態(tài)數(shù)組【例3-16】求Fibonacci斐波納契數(shù)列:1,1,2,3,5,8,……,F(xiàn)ibonacci數(shù)列滿足以下關(guān)系:
F1=1 F2=1 Fn=Fn-1+Fn-2功能要求:單擊窗體Form時,用InputBox輸入框輸入要計算Fibonacci數(shù)列的個數(shù),并用Print語句在窗體上顯示。523.2.3靜態(tài)數(shù)組和動態(tài)數(shù)組2.保留數(shù)組元素值使用具有Preserve關(guān)鍵字的ReDim語句既可以改變數(shù)組大小又不丟失數(shù)組中的數(shù)據(jù)。語法: ReDimPreserve數(shù)組名(第一維上下界,…)說明:當改變原有數(shù)組最末維的大小時,使用Preserve關(guān)鍵字可以保留數(shù)組中原來的數(shù)據(jù)。如果改變數(shù)組的維數(shù)或其他維界則會產(chǎn)生錯誤。當重新定義的數(shù)組大小比原來小,則釋放多余的存儲單元,如果重新定義的數(shù)組大小比原來大,則將新增的元素單元賦該數(shù)據(jù)類型對應(yīng)的初始值。533.2.3靜態(tài)數(shù)組和動態(tài)數(shù)組例:Dima()Asinteger,iasinteger
ReDima(5)fori=0to5a(i)=inexti
ReDimPreservea(6)a(6)=6fori=0to6printa(i);nexti結(jié)果:0123456543.2.3靜態(tài)數(shù)組和動態(tài)數(shù)組3.Erase語句Erase語句用于重新初始化靜態(tài)數(shù)組的元素,或者釋放動態(tài)數(shù)組的存儲空間。語法:
Erase數(shù)組1,數(shù)組2,…說明:數(shù)組1,數(shù)組2,…可以是靜態(tài)數(shù)組名或動態(tài)數(shù)組名。Erase語句對靜態(tài)數(shù)組設(shè)置初始值,對動態(tài)數(shù)組則釋放存儲空間,使其成為沒有存儲單元的空數(shù)組。553.2.3靜態(tài)數(shù)組和動態(tài)數(shù)組例:Dima()Asinteger,iasinteger
ReDima(5)fori=0to5a(i)=inexti Erasea’釋放動態(tài)數(shù)組的存儲空間
……563.2.4多維數(shù)組
1.二維數(shù)組二維數(shù)組中元素的存儲順序是按行存儲的,即下標先變列后變行。2.三維數(shù)組三維數(shù)組要用三個下標表示。例如,a(2,3,4)中的第一個下標表示行,第二個下標表示列,第三個下標表示頁,元素總數(shù)為三個維數(shù)的乘積3×4×5為60個。573.2.4多維數(shù)組
【例3-17】根據(jù)4名學(xué)生的語文、數(shù)學(xué)和英語成績,計算并顯示每人的平均成績和每門課程的平均成績。學(xué)生的信息如下表所示。姓名語文數(shù)學(xué)英語平均成績李小明988489王強828679趙雷767972陳敏667269平均成績功能要求:單擊窗體,輸入學(xué)生分數(shù)并計算每人平均成績和每門課程的平均成績,并用Print語句顯示在窗體上。583.3用戶定義類型
用戶定義類型將不同的數(shù)據(jù)類型按需要組合起來,創(chuàng)建自定義的數(shù)據(jù)類型,也稱為記錄類型。在【例3-17】中學(xué)生的姓名為字符型,而成績則為數(shù)值型,必須使用Student和Score兩個數(shù)組來表示,如果再增加學(xué)號和性別,就又必須增加數(shù)組。(自學(xué))593.3用戶定義類型
創(chuàng)建用戶定義類型的格式:
[Private|Public]Type用戶定義類型名 用戶定義類型元素As數(shù)據(jù)類型
[用戶定義類型元素As數(shù)據(jù)類型
……] EndType元素的表示形式:用戶類型變量名.用戶類型元素603.3用戶定義類型
例題:定義一個有關(guān)職工信息的自定義類型:TypeClient_Record
cltNameasString*16
cltPasswordasString*8
cltDepositasCurrencyEndType注意:(1)自定義類型必須在標準模塊或窗體模塊的聲明部分定義,在標準模塊中定義時默認為全局變量(Public)。在窗體模塊定義時在關(guān)鍵字Type前應(yīng)加上Private關(guān)鍵字。(2)自定義類型元素類型如果有字符串,則必須是定長字符串,即應(yīng)該使用形式為:strNameAsString*常數(shù)613.3用戶定義類型
【例3-18】建立一個學(xué)生成績處理程序,每個學(xué)生的記錄由姓名、語文成績、數(shù)學(xué)成績、英語成績和平均成績組成。學(xué)生的信息如下表所示。姓名語文數(shù)學(xué)英語平均成績李小明988489王強828679趙雷767972陳敏667269功能要求:單擊窗體時運算并顯示每個學(xué)生的平均成績,并用Print語句顯示在窗體上。623.4算法及舉例3.4.1算法分析 3.4.2算法舉例 633.4.1算法分析算法就是解決某個特定問題的方法和步驟。1.算法的特點作為算法應(yīng)具有以下特點:(1)確定性算法的確定性是指每個步驟都應(yīng)準確無誤,沒有歧義性。(快講)643.4.1算法分析(2)可行性算法的可行性是指算法都是計算機能夠有效執(zhí)行的、可以實現(xiàn)的,并能夠得到確定的結(jié)果的。針對VB的算法應(yīng)是VB的語言功能可以實現(xiàn)的算法。
(3)有窮性一個算法的步驟必須是有限的,是計算機能夠在合理的時間內(nèi)完成的。程序的循環(huán)不會進入死循環(huán),有循環(huán)的結(jié)束條件。653.4.1算法分析(4)輸入性算法可以有多個輸入,也可以沒有輸入,算法的輸入必須是計算機可以執(zhí)行的。如果由計算機自己產(chǎn)生數(shù)據(jù)輸入則表示沒有輸入。(5)輸出性算法必須有一個或多個輸出,因為算法是計算機用于解題的方法,必須將結(jié)果輸出,否則沒有意義,因此算法必須具有輸出的功能。663.4.1算法分析2.算法的分類計算機算法可以分為兩大類:(1)數(shù)值算法數(shù)值算法主要用于解決一般數(shù)學(xué)解析方法難以處理的一些數(shù)學(xué)問題,如解方程的根、求定積分、解微分方程等。(2)非數(shù)值算法非數(shù)值算法解決某些非數(shù)值問題的特定方法,如對數(shù)據(jù)的排序、查找等。673.4.1算法舉例1.用牛頓迭代法解方程算法說明:牛頓迭代法是求解一元超越方程根的常用算法,已知精確解在初始解x0
附近,則根據(jù)牛頓迭代公式:輸入:初始解x0。輸出:精確解xn+1。
(自學(xué))683.4.1算法舉例【例3-19】用牛頓迭代法求方程2x3-4x2+3x-6=0在x0=3的準確解x,誤差ε小于等于0.0001。計算步驟:(1)先計算f(x0)=2x3-4x2+3x-6和f’(x0)=6x2-8x+3。(2)再根據(jù)迭代公式計算出x1
。(3)當|xn+1-xn|≤0.0001時,xn+1為所求的方程根;否則,繼續(xù)計算x2
、x3…
xn。693.4.1算法舉例功能要求:單擊窗體時,用牛頓迭代法計算方程的根,并用Print方法顯示。程序流程圖如圖,運行結(jié)果如圖,計算出方程的根為2。703.4.1算法舉例程序代碼如下:PrivateSubForm_Click()'用牛頓迭代法解方程
DimxAsSingle,x0AsSingle,fAsSingle,f1AsSinglex0=3:x=x0Dox0=xf=((2*x0-4)*x0+3)*x0-6f1=(6*x0-8)*x0+3x=x0-f/f1LoopWhileAbs(x-x0)>=0.00001PrintPrintTab(8);"解方程
2x^3-4x^2+3x-6=0"PrintTab(8);"方程的解="&xEndSub程序分析:采用Do循環(huán),當“Abs(x-x0)>=0.00001”為True時執(zhí)行循環(huán)。
713.4.1算法舉例2.矩陣相乘算法說明:矩陣A(m,k)為m行k列的矩陣,矩陣B(k,n)為k行n列的矩陣才能相乘,得出乘積C(m,n)為m行n列的矩陣。則矩陣C的元素為:
Cij=Ai1·B1j+Ai2·B2j+…+Aik·Bkj輸入:矩陣A和B。輸出:矩陣C。循環(huán)結(jié)束條件:循環(huán)次數(shù)為矩陣的行列數(shù)。(自學(xué))723.4.1算法舉例【例3-20】計算矩陣a和b的乘積。
功能要求:單擊窗體,計算矩陣a和b的乘積,并用print語句將矩陣a、矩陣b和矩陣c顯示出來。
733.4.1算法舉例3.折半查找法算法說明:折半查找法是在已經(jīng)排序的數(shù)組中查找一個數(shù)。查找的數(shù)用Num表示,排序組用a,最小值位置用Min表示,最大值位置用Max表示,中間值位置用Mid表示。查找步驟如下:(1)判斷Num是否在要查找的數(shù)組范圍內(nèi);(2)計算得出Mid=int((Min+Max)/2);(3)判斷a(Mid)與Num的大小; 如果相等,則找到; 如果a(Mid)<Num,則Min=Mid+1;
如果a(Mid)>Num,則Max=Mid-1;(4)循環(huán)執(zhí)行(2)~(3)步驟;(5)當Min>Max,則沒有該數(shù)。743.4.1算法舉例例如:key=64
的查找過程如下minmaxmidmin
mid
max
midmin
指示查找區(qū)間的下界;max
指示查找區(qū)間的上界;mid=int((min+max)/2)。753.4.1算法舉例輸入:查找數(shù)據(jù)Num和排序數(shù)組a。輸出:數(shù)據(jù)Num在數(shù)組a的位置。循環(huán)結(jié)束條件:找到數(shù)據(jù)或Min>Max。【例3-21】
已經(jīng)排序的數(shù)組為10個數(shù):0、3、15、28、32、53、74、84、145、268,輸入要查找的數(shù)據(jù),顯示其在數(shù)組中的位置。763.4.1算法舉例4.起泡法排序算法說明:起泡法排序就是每次將兩兩相鄰的數(shù)進行比較,如果從小到大排列,就將小的調(diào)換到前面,大的放在后面,就象氣泡,重的沉在下面。數(shù)組用a表示,起泡法排序的步驟如下:(1)第一輪將數(shù)據(jù)兩兩比較將較大的調(diào)換到后面,a(1)與a(2)比較后調(diào)換,a(2)與a(3)比較后調(diào)換…..,直到最后一個數(shù)a(N),這樣就將最大的調(diào)換到最后面。773.4.1算法舉例4.起泡法排序(2)第二輪再將數(shù)據(jù)兩兩比較將較大的調(diào)換到后面,a(1)與a(2)比較后調(diào)換,a(2)與a(3)比較后調(diào)換…..,直到倒數(shù)第二個數(shù)a(N-1),這樣就將第二大的調(diào)換到倒數(shù)第二位置?!?)第N-1輪比較并調(diào)換,只剩下a(1)與a(2)兩個數(shù)需要比較后調(diào)換。輸入:未排序的數(shù)組。輸出:排好序的數(shù)組。循環(huán)結(jié)束條件:外循環(huán)為N-1次。783.4.1算法舉例例4938659776132730初始數(shù)值3849657613273097第一趟38496513273076第二趟384913273065第三趟3813273049第四趟13273038第五趟132730第六趟38497697139727973097137676762730136527653065131349493049273827383038【例3-22】79小結(jié)1.區(qū)分三種條件語句的差異;2.IIf函數(shù);3.For…Next循環(huán)應(yīng)用場合與循環(huán)次數(shù)計算:
Int(循環(huán)次數(shù)=(終值-初值)/步長+1)4.靈活的Do循環(huán);5.數(shù)組的定義;6.數(shù)組的輸出(循環(huán)Print方法);7.靜態(tài)與動態(tài)數(shù)組的區(qū)別;8.數(shù)組的初始化與運行中賦值;9.數(shù)組的應(yīng)用(常用算法)。80習(xí)題
一選擇題1.結(jié)構(gòu)化程序設(shè)計方法的核心規(guī)定了三種基本結(jié)構(gòu):順序結(jié)構(gòu),______結(jié)構(gòu),循環(huán)結(jié)構(gòu)。A.條件B.分支C.當形D.邏輯2.若要退出For循環(huán),可使用的語句為________。A.ExitB.ExitDoC.ExitSubD.ExitFor3.對Do循環(huán)結(jié)構(gòu)作用說明正確的是:________。A.不能用Do循環(huán)設(shè)計出預(yù)先知道循環(huán)次數(shù)的循環(huán)B.While和Until關(guān)鍵字必須選擇其中之一C.While和Until關(guān)鍵字可以同時使用D.While和Until關(guān)鍵字的作用相反4.執(zhí)行下面的程序后,x的值是________。
x=5 Fori=1To20Step2 x=x+i\5 NextiA.21B.22C.23D.2481習(xí)題5.Do循環(huán)的語法結(jié)構(gòu)如下:
DoWhile條件 語句塊
________A.EndDoB.LoopC.NextD.EndWhile6.在窗體放置一個命令按鈕Command1,并編寫如下程序:
PrivateSubCommand1_Click() Fori=1To20 x=x+i Nexti Printx EndSub單擊按鈕后,窗體顯示的結(jié)果是________。A.34B.50C.150D.21082習(xí)題7.在窗體放置一個命令按鈕Command1和一個文本框Text1,并編寫如下程序:
PrivateSubCommand1_Click() x="A":y="B":z="C" Fori=1To2 x=y:y=z:z=x Nexti Text1.Text=x+y+z EndSub單擊按鈕后,文本框顯示的結(jié)果是________。A.CBAB.BCAC.BCBD.CBC83習(xí)題8.以下敘述正確的是________。A.SelectCase語句中的測試表達式可以是任何形式的表達式B.SelectCase語句中的測試表達式只能是數(shù)值表達式或字符表達式C.在執(zhí)行SelectCase語句時,所有的Case子句都按出現(xiàn)的次序被順序執(zhí)行D.SelectCase的測試表達式會多次計算84習(xí)題9.在窗體放置一個命令按鈕Command1和一個文本框Text1,并編寫如下程序:
PrivateSubCommand1_Click() DimiAsInteger,nAsInteger Fori=0To50 i=i+3 n=n+1 Ifi>10ThenExitFor Nexti Text1.Text=Str(n) EndSub單擊按鈕后,文本框顯示的結(jié)果是________。A.2 B.3 C.4 D.585習(xí)題10.要創(chuàng)建一個用戶自定義類型,由學(xué)生的學(xué)號、姓名和三門課程的成績組成,則下面定義正確的是________。 86習(xí)題二.填空題1.當程序進入循環(huán)結(jié)構(gòu)時,出現(xiàn)死循環(huán)按_______鍵可以終止程序運行。2.以下循環(huán)結(jié)構(gòu)循環(huán)執(zhí)行了______次。
j=10 Dowhilej>=1 j=j-1 Loop3.運行下面的程序,單擊窗體后在窗體上顯示的內(nèi)容是________。
PrivateSubForm_Click() Fori=1To10Step2 Printi; Nexti EndSub87
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025財務(wù)人員合同書范本
- 2025年上海企業(yè)(事業(yè))單位勞動合同
- 2025勞動合同書(示范文本)
- 2025二手房買賣合同全文版
- 2025餐廳臨時廚師勞動合同
- 2025水利工程建筑施工合同(范本)
- 《貓咪與花園:互動教學(xué)課件》
- 2025標準別墅裝修合同范本
- 大學(xué)生職業(yè)規(guī)劃190
- 申請甲方盡快簽合同協(xié)議
- 我們愛運動(課件)冀美版美術(shù)二年級下冊
- 水泥罐車崗位安全操作規(guī)程(4篇)
- 《國際物流與供應(yīng)鏈管理》課程綜述論文:跨境電商供應(yīng)鏈管理研究的文獻綜述4100字
- 數(shù)控車削編程與加工 課件 3.5軸類零件綜合
- 醫(yī)療設(shè)備采購與評估方法
- 《三福百貨營銷環(huán)境PEST、SWOT研究及其營銷策略研究》11000字(論文)
- DB37T 4515-2022 罰沒物品分類與代碼
- 中國傳統(tǒng)文化(西安交通大學(xué))知到智慧樹章節(jié)測試課后答案2024年秋西安交通大學(xué)
- 港口與航道工程管理與實務(wù)一級建造師考試試題與參考答案(2024年)
- 醫(yī)學(xué)倫理學(xué)人衛(wèi)練習(xí)題庫(附參考答案)
- 新課標I、Ⅱ卷 (2024-2020) 近五年高考英語真題滿分作文
評論
0/150
提交評論