VB第5章(分支與循環(huán))_第1頁
VB第5章(分支與循環(huán))_第2頁
VB第5章(分支與循環(huán))_第3頁
VB第5章(分支與循環(huán))_第4頁
VB第5章(分支與循環(huán))_第5頁
已閱讀5頁,還剩105頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章選擇分支與循環(huán)

選擇分支與循環(huán)是非常重要的兩種算法結(jié)構(gòu)。選擇分支可依據(jù)判決條件的滿足與否,執(zhí)行不同的操作;循環(huán)可依據(jù)循環(huán)控制條件重復(fù)執(zhí)行給定的操作。他們又統(tǒng)稱為“控制結(jié)構(gòu)”。 VB提供了實現(xiàn)選擇分支與循環(huán)的相關(guān)語句。5.1分支結(jié)構(gòu)語句

1.If--Then結(jié)構(gòu)

格式一:

If

<條件>

Then

<語句>

示例:

判斷口令字。如果口令不符,打印出錯信息。條件語句假(0)真(非0)格式二:

If

<條件>

Then

<語句>

EndIf示例:

判斷口令字。如果口令不符,以對話框方式輸出出錯信息。

2.If---Then---Else結(jié)構(gòu)

條件語句1語句2真(非0)假(0)

格式一:

If<條件>

Then

<語句1>

Else

<語句2>

示例:假設(shè)有兩個變量a,b,輸出兩個中較大的。格式二:

If<條件>

Then

<語句1>

Else

<語句2>

EndIf示例:求解計算三角形面積

由文本框輸入三條線段的長度,求這三條線段所構(gòu)成的三角形面積。a,b,c是否均大于0判斷兩邊之和大于第三邊輸入三線段長度:a,b,c根據(jù)公式求三角形面積輸出三角形面積結(jié)束YY打印“無解”NN公式:

3.If---Then---ElseIf

格式:

If<條件1>Then

<語句1>

ElseIf<條件2>Then

<語句2>

ElseIf<條件3>Then

<語句3>

……

Else

<語句>

EndIf條件2條件1語句2語句1條件3語句3語句4真假真假真假示例:測試一下你的體形是否標(biāo)準(zhǔn)。輸入你的體重(單位為公斤)和身高(厘米),計算體形參數(shù)P,公式為:示例:計算下列分段函數(shù)的值,并在窗體上顯示計算結(jié)果.4.SelectCase--EndSelect結(jié)構(gòu)語句格式:

Select

Case變量或測試表達式

Case

測試值列表1 <語句1>

Case測試值列表2 <語句2>……

CaseElse <語句n>

EndSelect執(zhí)行Selectcase語句的一般過程如下:首先計算測試表達式的值,然后與語句中每個case子句的表達式的值進行比較。如果相等,就執(zhí)行與該Case相關(guān)聯(lián)的語句,接著執(zhí)行SelectCase語句的后繼語句。如果沒有一個case子句的表達式的值與測試表達式的值相等,則執(zhí)行caseElse部分的語句,接著執(zhí)行selectcase語句的后繼語句。若無cascElse部分,則直接執(zhí)行SelectCase語句的后繼語句。計算測試表達式與測試值1相同嗎?語句1與測試值2相同嗎?語句2語句nSelectCase語句的下一條語句是不是是都不是注意:

(1)測試表達式必須為數(shù)值型或字符型數(shù)據(jù)(2)測試值列表必須與測試表達式的值的類型

一致(3)測試值列表有以下三種類型

A枚舉型如:case1,5,7,9

case"a","b","C","d"

B范圍型如:case1to9case"a"to"z"

C關(guān)系表達式型如:caseIs<100caseIs>"a"再次提醒:用關(guān)鍵字To來指定一個范圍時,必須把較小的值寫在前面,較大的值寫在后面,字符串常量的范圍必須按字母順序?qū)懗?。如果同一個域值的范圍在多個Case子句中出現(xiàn),則只執(zhí)行符合要求的第一個Case子句的語句塊,這時Case子句的順序?qū)?zhí)行結(jié)果有影響。因此,在編程時,一般都使各個Case子句是“互斥”的(即只有一個子句的范圍滿足)。機票優(yōu)惠

某航空公司規(guī)定在旅游旺季5-10月份,如果訂票數(shù)超過20張,優(yōu)惠票價的15%,20張以下,優(yōu)惠5%;在旅游淡季1-4月份、11月份,訂票超過20張,優(yōu)惠30%,20張以下,優(yōu)惠20%。

設(shè)計一個程序,能根據(jù)月份和旅客訂票張數(shù)決定優(yōu)惠率。個人收入調(diào)節(jié)稅示例:根據(jù)職稱顯示不同的信息示例:計算下列分段函數(shù)的值,并在窗體上顯示計算結(jié)果.5.If語句的嵌套

在If語句中又包含—個或者多個If語句,稱為語句的嵌套。

If<條件>

Then

<語句1>Else

<語句2>EndIf示例:假設(shè)有三個變量a,b,c,輸出其中的最大數(shù)。

只要滿足結(jié)構(gòu)規(guī)則,If語句可以有任意多的嵌套。在編寫嵌套程序的時候,需要注意If與ELse的配對關(guān)系。配對的原則是:先從最內(nèi)層的E1se開始找,Else總是與離它最近的而且在它前面未配對的If配對,如此逐層配對。按照鋸齒形的書寫格式書寫,容易看出各層的嵌套關(guān)系。示例:輸入自變量x和z,求一個雙變量的分段函數(shù)。

對比一下可以看出,SelectCase語句只在語句開頭計算一次表達式的值,然后用這個值依次去與Case后面的表達式值列表中列出的值進行比較,即可作出判定,而If_Then_E1seIf語句每次都要計算條件表達式的值,然后再去進行比較和判定。這是這兩個多重選擇語句的不同之處。

但正是由于Selectcase語句只計算一個表達式的值,而If_Then_ElseIf語句要計算多個表達式的值,所以只有在If和每一個ElseIf涉及的是相同表達式時,才能用SelectCase語句替換If_Then_ElseIf語句。也就是說,對于多重選擇而言,If_Then_ElseIf語句的適應(yīng)性比SelectCase要強,使用范圍更廣。5.2循環(huán)結(jié)構(gòu)與循環(huán)結(jié)構(gòu)語句

在實際工作中,常遇到一些操作過程不太復(fù)雜,但又需要反復(fù)進行相同處理的問題,比如,統(tǒng)計本單位所有人員的工資,求全班同學(xué)各科的平均成績等等。這些問題的解決邏輯上并不復(fù)雜,但如果單純用順序結(jié)構(gòu)來處理,那將得到一個非常乏味且冗長的程序。例如:計算1~100所有奇數(shù)的平方和,如果用順序結(jié)構(gòu)來解決這個問題,我們就會給出下面的程序:

由上面的例子不難看出,程序的絕大部分是在反復(fù)執(zhí)行兩條語句x=x+2和s=s+x^2,不同的是x的值在變化。程序當(dāng)然非常簡單易懂,但缺乏最基本的編程技巧。要想方便地解決這類問題,最好的辦法就是用循環(huán)語句。

所謂循環(huán)就是重復(fù)地執(zhí)行一組語句。

我們用循環(huán)語句解決上面的問題,程序非常簡短:

VB提供了三種不同風(fēng)格的循環(huán)語句,它們分別是:(1)Do…Loop語句。(2)For…Next語句; (3)While…Wend語句;我們將對前2種循環(huán)語句作一介紹。

(1)Do---Loop循環(huán)

格式一:

DoWhile<條件>

<語句塊>[ExitDo]<語句塊>Loop True條件語句False求n=1:s=0n<=100s=s+n:n=n+1是否循環(huán)初始部分循環(huán)條件循環(huán)體DoUntil

<條件>

<語句塊>[ExitDo]<語句塊>

Loop

False條件語句True

(1)Do---Loop循環(huán)

格式二:

求n=1:s=0n>100s=s+n:n=n+1否是循環(huán)初始部分循環(huán)條件循環(huán)體Do

<語句塊>[ExitDo]<語句塊>LoopWhile<條件>

語句條件TrueFalse求Do

<語句塊>[ExitDo]<語句塊>

LoopUntil<條件>語句條件FalseTrue求

比較這兩段小程序,區(qū)別只是把“Whilen<=100”的位置移動了一下。但我們不要因此以為兩種形式是多余的,有時候,代碼細微的變動會給編寫程序帶來很大的方便。DoWhile__Loop循環(huán)的特點:

先判斷條件,后執(zhí)行循環(huán)體。

循環(huán)體有可能一次也不執(zhí)行Do__LoopWhile循環(huán)的特點:

先執(zhí)行循環(huán)體,后判斷條件。

至少執(zhí)行一次循環(huán)體Do_Loopwhile可轉(zhuǎn)化成Dowhile__Loop結(jié)構(gòu)(2)For---Next循環(huán)

格式:

For循環(huán)變量=初值To終值[

step步長] <語句塊>

[ExitFor

]<語句塊>

Next

[循環(huán)變量]正常情況下,執(zhí)行的次數(shù)為:Int((終值-初值)/步長)+1注意:循環(huán)變量:亦稱“循環(huán)控制變量”、“控制變量”或“循環(huán)計數(shù)器”。它是一個數(shù)值型變量。初值:循環(huán)變量的初值,它是一個數(shù)值表達式。

終值:循環(huán)變量的終值,它是一個數(shù)值表達式。

步長:循環(huán)變量的增量,是一個數(shù)值表達式。其值可以是正數(shù)(遞增循環(huán))或負數(shù)(遞減循環(huán)),但不能為0。如果步長為1,則Stepl可略去不寫。循環(huán)體:在For語句和Next語句之間的語句序列,可以是一個或多個語句。

ExitFor:退出循環(huán)。這是中途退出循環(huán)的語句。用ExitFor只能退出當(dāng)前循環(huán),即它所在的最內(nèi)層循環(huán)。

Next:循環(huán)終端語句,在Next后面的“循環(huán)變量”與For語句中的“循環(huán)變量”必須相同。Next后的“循環(huán)變量”可以省略。計算初值、終值、步長循環(huán)變量=初值循環(huán)變量超過終值?循環(huán)體語句循環(huán)變量=循環(huán)變量+步長FalseTrue這里所說的“超過”有兩種含義:當(dāng)步長為正值時,檢查循環(huán)變量是否大于終值;當(dāng)步長為負值時,判斷循環(huán)變量的值是否小于終值。For循環(huán)變量=初值To終值[

step步長] <語句塊>Next

[循環(huán)變量]求例:

用for循環(huán)求

所謂“水仙花數(shù)”是指一個3位數(shù),其各位數(shù)字的立方和等于該數(shù)本身。例如:因為153=13+53+33所以153是一個“水仙花數(shù)”。同樣370、371、407也是水仙花數(shù)。開始m=100a=m\100,b=(mmod100)\10,(b=m\10mod10)c=mmod10a3+b3+c3=m打印結(jié)果Ym=m+1m<=999結(jié)束NNY請分別用DoWhile和ForNext循環(huán)語句解決上面的問題。

使用For-Next循環(huán)應(yīng)注意的問題:

(a)循環(huán)出口問題 正常出口非正常出口

判斷素數(shù)素數(shù)就是除過1和自身之外,沒有其他因子的自然數(shù)。試編程,輸入任意一個正整數(shù)n,判斷n是否是素數(shù)。I=2輸入nI>n-1nModI=0I=I+1TFTFPrivateSubcalculate_Click()DimnAsInteger,IAsIntegern=Text1ForI=2Ton-1IfnModI=0ThenExitForNextIIfI>n-1ThenMsgBoxn&"是素數(shù)"ElseMsgBoxn&"不是素數(shù)"EndIfEndSub(b)循環(huán)參數(shù)的類型問題例:DimIAsIntegerForI=1.0To10.5Step1.5…NextI…上述循環(huán)如何執(zhí)行??循環(huán)參數(shù)在循環(huán)體中的變化問題。例:DimIAsInteger,yAsIntegery=2ForI=1Toy+8Stepy…y=y+2…NextI上述循環(huán)如何執(zhí)行?循環(huán)的嵌套

一個循環(huán)體內(nèi)又包括另外一個完整的循環(huán)體結(jié)構(gòu),稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)體中還可以嵌套循環(huán),這就是多層循環(huán)。循環(huán)嵌套的概念對各種語言都是一樣的。單循環(huán)可以解決一些簡單的問題,但實際上有許多問題需要用兩層,甚至多層循環(huán)解決。示例:用多重循環(huán)求水仙花數(shù)。

同一種循環(huán)和不同循環(huán)之間都列以相互嵌套,例如下列循環(huán)嵌套都是合法的:必須注意:小循環(huán)一定要完整地被包含在大循環(huán)之內(nèi),不得相互交叉。在多重循環(huán)中,各層循環(huán)的循環(huán)控制變量不能同名。示例:打印乘法口訣表

基本算法

算法是問題求解過程的精確描述,一個算法由有限條可完全機械地執(zhí)行的、有確定結(jié)果的指令組成。通常求解一個問題可能會有多種算法可供選擇,選擇的主要標(biāo)準(zhǔn)是算法的正確性和可靠性,簡單性和易理解性。其次是算法所需要的存儲空間少和執(zhí)行更快等。

經(jīng)常采用的算法設(shè)計技術(shù)主要有迭代法、遞推法、窮舉搜索法、貪婪法、回溯法、分治法、動態(tài)規(guī)劃法等等。

在計算機數(shù)值程序設(shè)計中,迭代與遞推是兩個重要的基礎(chǔ)算法。

一、迭代

許多的實際問題都能轉(zhuǎn)化為解方程F(x)=0的實數(shù)解的問題。求根可以直接從方程出發(fā),逐步縮小根的存在區(qū)間,把根的近似值逐步精確到要以滿足具體實際問題的需要為止,該算法稱為迭代。

迭代的一般原則可以用一個數(shù)學(xué)模型來描述,要求出方程F(x)=0的解。

先設(shè)F(x)=G(x)-x

則方程F(x)=0可化為x=G(x)

這就產(chǎn)生了一個迭代算法的數(shù)學(xué)模型

Xn+1=G(Xn)

從某一個數(shù)X0出發(fā),按此迭代模型,求出一個序列:

{X0,X1,X2,X3,……,Xn-2,Xn-1,Xn}

當(dāng)Xn-Xn-1小于一個特定值(誤差許可值)時,X≈Xn-1≈Xn,這時可認(rèn)定x=G(x)。也就是說,求出的Xn已經(jīng)可以作為原方程f(x)=0

根的

近似值了。迭代法有精確迭代法和近似迭代法。所謂精確迭代是指算法本身提供了問題的精確解。如對N個數(shù)求和、求均值、求方差等,這些問題都適合使用精確迭代法解決。

迭代算法的三個環(huán)節(jié)迭代初始值迭代公式迭代終止條件

迭代法的特點是:把一個復(fù)雜問題的求解過程轉(zhuǎn)化為相對簡單的迭代算式,然后重復(fù)執(zhí)行這個簡單的算式,直到得到最終解。例:高次方程求根其中:f'(xi)是f(xi)的導(dǎo)數(shù),當(dāng)

|xi+1–xi|≤ε時xi+1就是方程的近似根。牛頓切線法的思想:

對方程f(x)給定一個初值x0作為方程的近似根,經(jīng)過若干次迭代后,得到方程較高精度的近似根。牛頓切線法迭代公式為:f(x0)x0

(初值)x1x2牛頓切線法的幾何意義x3f(x1)f(x)f(x2)x0,x1,x2,x3,x4,x*…,x*xn,n→∞示例:編寫程序,利用牛頓迭代法求方程(書p78,例4-9)例:給定兩個正整數(shù)m和n,求它們的最大公約數(shù)。

求最大公約數(shù)的問題一般用輾轉(zhuǎn)相除法(也稱歐幾里德算法)求解。例如:設(shè)m=35,n=15它們的最大公約數(shù)的求法如下:r=35Mod15(余數(shù)為5)m=15:n=5(m=15,n=5)

r≠0

(r=5)r=15Mod5(余數(shù)為0)

r=0

所以

5就是最大公約數(shù)二、遞推

對于一個數(shù)列來說,如果已知它的通項公式,那么,要求出數(shù)列中某項之值是十分容易的。但是,在許多情況下,要得到數(shù)列的通項公式是很困難的,甚至無法得到。然而,一個有規(guī)律的數(shù)列的相鄰位置上的數(shù)項之間通常存在著一定的關(guān)系,我們可以借助已知的項,利用特定的關(guān)系逐項推算出它的后繼項的值……,如此反復(fù),直到找到所需的那一項為止,這樣的方法稱為遞推算法。

遞推算法的首要問題是得到相鄰的數(shù)據(jù)項間的關(guān)系(即遞推關(guān)系)。遞推算法避開了求通項公項的麻煩,把一個復(fù)雜的問題的求解,分解成了連續(xù)的若干步簡單運算。一般說來,可以將遞推算法看成是一種特殊的迭代算法。

所謂遞推法,是指利用遞推公式,由簡到繁逐次迭代求解。

例.斐波那契(Fibonacci)數(shù)列公元1202年,商人出身的意大利數(shù)學(xué)家斐波那契(1170~1250),完成了一部偉大的論著《算法之書》。這部中世紀(jì)的名著,把當(dāng)時發(fā)達的阿拉伯和印度的數(shù)學(xué)方法,經(jīng)過整理和發(fā)展之后介紹到歐洲。在斐波那契的書中,曾提出下列有趣的問題:

假定一對剛出生的小兔一個月就能長成大兔,再過一個月便能生下一對小兔,并且此后每個月都生一對小兔,一年內(nèi)沒有發(fā)生死亡。問一對剛出生的兔子,一年內(nèi)繁殖成多少對兔子?

假定一對剛出生的小兔一個月就能長成大兔,再過一個月便能生下一對小兔,并且此后每個月都生一對小兔,一年內(nèi)沒有發(fā)生死亡。問一對剛出生的兔子,一年內(nèi)繁殖成多少對兔子?逐月推算,可得數(shù)列:

1,1,2,3,5,8,13,21,34,55,89,144,233。

這個數(shù)列后來便以斐波那契的名字命名。數(shù)列中的每一項,則稱為“斐波那契數(shù)”。第十三位的斐波那契數(shù),即為一對剛出生的小兔,一年內(nèi)所能繁殖成的兔子的對數(shù),這個數(shù)字為233。

斐波那契數(shù)列有許多奇妙的性質(zhì),其中有一個性質(zhì)是這樣的:奇妙的數(shù)學(xué)魔術(shù)

涉及到的數(shù)據(jù)1,1,2,3,5,8,13恰是斐波那契數(shù)列的前七項。

在現(xiàn)實的自然世界中,《算法之書》里那樣的神奇兔子自然是找不到的,但是這并不妨礙大自然使用斐波那契數(shù)列。例如:植物“薊”,它們的頭部幾乎呈球狀。在下面這個圖里,標(biāo)出了兩條不同方向的螺旋。我們可以數(shù)一下,順時針旋轉(zhuǎn)的螺旋一共有13條,而逆時針旋轉(zhuǎn)的則有21條。以這樣的形式排列種子、花瓣或葉子的植物還有很多(最容易讓人想到的是向日葵),事實上許多常見的植物,我們食用的蔬菜如花菜,包心菜,等的排列也具有這個特性,只是不容易觀察清楚。盡管這些順逆螺旋的數(shù)目并不固定,但它們也并不隨機,它們是斐

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論