版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第5章選擇分支與循環
選擇分支與循環是非常重要的兩種算法結構。選擇分支可依據判決條件的滿足與否,執行不同的操作;循環可依據循環控制條件重復執行給定的操作。他們又統稱為“控制結構”。 VB提供了實現選擇分支與循環的相關語句。5.1分支結構語句
1.If--Then結構
格式一:
If
<條件>
Then
<語句>
示例:
判斷口令字。如果口令不符,打印出錯信息。條件語句假(0)真(非0)格式二:
If
<條件>
Then
<語句>
EndIf示例:
判斷口令字。如果口令不符,以對話框方式輸出出錯信息。
2.If---Then---Else結構
條件語句1語句2真(非0)假(0)
格式一:
If<條件>
Then
<語句1>
Else
<語句2>
示例:假設有兩個變量a,b,輸出兩個中較大的。格式二:
If<條件>
Then
<語句1>
Else
<語句2>
EndIf示例:求解計算三角形面積
由文本框輸入三條線段的長度,求這三條線段所構成的三角形面積。a,b,c是否均大于0判斷兩邊之和大于第三邊輸入三線段長度:a,b,c根據公式求三角形面積輸出三角形面積結束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真假真假真假示例:測試一下你的體形是否標準。輸入你的體重(單位為公斤)和身高(厘米),計算體形參數P,公式為:示例:計算下列分段函數的值,并在窗體上顯示計算結果.4.SelectCase--EndSelect結構語句格式:
Select
Case變量或測試表達式
Case
測試值列表1 <語句1>
Case測試值列表2 <語句2>……
CaseElse <語句n>
EndSelect執行Selectcase語句的一般過程如下:首先計算測試表達式的值,然后與語句中每個case子句的表達式的值進行比較。如果相等,就執行與該Case相關聯的語句,接著執行SelectCase語句的后繼語句。如果沒有一個case子句的表達式的值與測試表達式的值相等,則執行caseElse部分的語句,接著執行selectcase語句的后繼語句。若無cascElse部分,則直接執行SelectCase語句的后繼語句。計算測試表達式與測試值1相同嗎?語句1與測試值2相同嗎?語句2語句nSelectCase語句的下一條語句是不是是都不是注意:
(1)測試表達式必須為數值型或字符型數據(2)測試值列表必須與測試表達式的值的類型
一致(3)測試值列表有以下三種類型
A枚舉型如:case1,5,7,9
case"a","b","C","d"
B范圍型如:case1to9case"a"to"z"
C關系表達式型如:caseIs<100caseIs>"a"再次提醒:用關鍵字To來指定一個范圍時,必須把較小的值寫在前面,較大的值寫在后面,字符串常量的范圍必須按字母順序寫出。如果同一個域值的范圍在多個Case子句中出現,則只執行符合要求的第一個Case子句的語句塊,這時Case子句的順序對執行結果有影響。因此,在編程時,一般都使各個Case子句是“互斥”的(即只有一個子句的范圍滿足)。機票優惠
某航空公司規定在旅游旺季5-10月份,如果訂票數超過20張,優惠票價的15%,20張以下,優惠5%;在旅游淡季1-4月份、11月份,訂票超過20張,優惠30%,20張以下,優惠20%。
設計一個程序,能根據月份和旅客訂票張數決定優惠率。個人收入調節稅示例:根據職稱顯示不同的信息示例:計算下列分段函數的值,并在窗體上顯示計算結果.5.If語句的嵌套
在If語句中又包含—個或者多個If語句,稱為語句的嵌套。
If<條件>
Then
<語句1>Else
<語句2>EndIf示例:假設有三個變量a,b,c,輸出其中的最大數。
只要滿足結構規則,If語句可以有任意多的嵌套。在編寫嵌套程序的時候,需要注意If與ELse的配對關系。配對的原則是:先從最內層的E1se開始找,Else總是與離它最近的而且在它前面未配對的If配對,如此逐層配對。按照鋸齒形的書寫格式書寫,容易看出各層的嵌套關系。示例:輸入自變量x和z,求一個雙變量的分段函數。
對比一下可以看出,SelectCase語句只在語句開頭計算一次表達式的值,然后用這個值依次去與Case后面的表達式值列表中列出的值進行比較,即可作出判定,而If_Then_E1seIf語句每次都要計算條件表達式的值,然后再去進行比較和判定。這是這兩個多重選擇語句的不同之處。
但正是由于Selectcase語句只計算一個表達式的值,而If_Then_ElseIf語句要計算多個表達式的值,所以只有在If和每一個ElseIf涉及的是相同表達式時,才能用SelectCase語句替換If_Then_ElseIf語句。也就是說,對于多重選擇而言,If_Then_ElseIf語句的適應性比SelectCase要強,使用范圍更廣。5.2循環結構與循環結構語句
在實際工作中,常遇到一些操作過程不太復雜,但又需要反復進行相同處理的問題,比如,統計本單位所有人員的工資,求全班同學各科的平均成績等等。這些問題的解決邏輯上并不復雜,但如果單純用順序結構來處理,那將得到一個非常乏味且冗長的程序。例如:計算1~100所有奇數的平方和,如果用順序結構來解決這個問題,我們就會給出下面的程序:
由上面的例子不難看出,程序的絕大部分是在反復執行兩條語句x=x+2和s=s+x^2,不同的是x的值在變化。程序當然非常簡單易懂,但缺乏最基本的編程技巧。要想方便地解決這類問題,最好的辦法就是用循環語句。
所謂循環就是重復地執行一組語句。
我們用循環語句解決上面的問題,程序非常簡短:
VB提供了三種不同風格的循環語句,它們分別是:(1)Do…Loop語句。(2)For…Next語句; (3)While…Wend語句;我們將對前2種循環語句作一介紹。
(1)Do---Loop循環
格式一:
DoWhile<條件>
<語句塊>[ExitDo]<語句塊>Loop True條件語句False求n=1:s=0n<=100s=s+n:n=n+1是否循環初始部分循環條件循環體DoUntil
<條件>
<語句塊>[ExitDo]<語句塊>
Loop
False條件語句True
(1)Do---Loop循環
格式二:
求n=1:s=0n>100s=s+n:n=n+1否是循環初始部分循環條件循環體Do
<語句塊>[ExitDo]<語句塊>LoopWhile<條件>
語句條件TrueFalse求Do
<語句塊>[ExitDo]<語句塊>
LoopUntil<條件>語句條件FalseTrue求
比較這兩段小程序,區別只是把“Whilen<=100”的位置移動了一下。但我們不要因此以為兩種形式是多余的,有時候,代碼細微的變動會給編寫程序帶來很大的方便。DoWhile__Loop循環的特點:
先判斷條件,后執行循環體。
循環體有可能一次也不執行Do__LoopWhile循環的特點:
先執行循環體,后判斷條件。
至少執行一次循環體Do_Loopwhile可轉化成Dowhile__Loop結構(2)For---Next循環
格式:
For循環變量=初值To終值[
step步長] <語句塊>
[ExitFor
]<語句塊>
Next
[循環變量]正常情況下,執行的次數為:Int((終值-初值)/步長)+1注意:循環變量:亦稱“循環控制變量”、“控制變量”或“循環計數器”。它是一個數值型變量。初值:循環變量的初值,它是一個數值表達式。
終值:循環變量的終值,它是一個數值表達式。
步長:循環變量的增量,是一個數值表達式。其值可以是正數(遞增循環)或負數(遞減循環),但不能為0。如果步長為1,則Stepl可略去不寫。循環體:在For語句和Next語句之間的語句序列,可以是一個或多個語句。
ExitFor:退出循環。這是中途退出循環的語句。用ExitFor只能退出當前循環,即它所在的最內層循環。
Next:循環終端語句,在Next后面的“循環變量”與For語句中的“循環變量”必須相同。Next后的“循環變量”可以省略。計算初值、終值、步長循環變量=初值循環變量超過終值?循環體語句循環變量=循環變量+步長FalseTrue這里所說的“超過”有兩種含義:當步長為正值時,檢查循環變量是否大于終值;當步長為負值時,判斷循環變量的值是否小于終值。For循環變量=初值To終值[
step步長] <語句塊>Next
[循環變量]求例:
用for循環求
所謂“水仙花數”是指一個3位數,其各位數字的立方和等于該數本身。例如:因為153=13+53+33所以153是一個“水仙花數”。同樣370、371、407也是水仙花數。開始m=100a=m\100,b=(mmod100)\10,(b=m\10mod10)c=mmod10a3+b3+c3=m打印結果Ym=m+1m<=999結束NNY請分別用DoWhile和ForNext循環語句解決上面的問題。
使用For-Next循環應注意的問題:
(a)循環出口問題 正常出口非正常出口
判斷素數素數就是除過1和自身之外,沒有其他因子的自然數。試編程,輸入任意一個正整數n,判斷n是否是素數。I=2輸入nI>n-1nModI=0I=I+1TFTFPrivateSubcalculate_Click()DimnAsInteger,IAsIntegern=Text1ForI=2Ton-1IfnModI=0ThenExitForNextIIfI>n-1ThenMsgBoxn&"是素數"ElseMsgBoxn&"不是素數"EndIfEndSub(b)循環參數的類型問題例:DimIAsIntegerForI=1.0To10.5Step1.5…NextI…上述循環如何執行??循環參數在循環體中的變化問題。例:DimIAsInteger,yAsIntegery=2ForI=1Toy+8Stepy…y=y+2…NextI上述循環如何執行?循環的嵌套
一個循環體內又包括另外一個完整的循環體結構,稱為循環的嵌套。內嵌的循環體中還可以嵌套循環,這就是多層循環。循環嵌套的概念對各種語言都是一樣的。單循環可以解決一些簡單的問題,但實際上有許多問題需要用兩層,甚至多層循環解決。示例:用多重循環求水仙花數。
同一種循環和不同循環之間都列以相互嵌套,例如下列循環嵌套都是合法的:必須注意:小循環一定要完整地被包含在大循環之內,不得相互交叉。在多重循環中,各層循環的循環控制變量不能同名。示例:打印乘法口訣表
基本算法
算法是問題求解過程的精確描述,一個算法由有限條可完全機械地執行的、有確定結果的指令組成。通常求解一個問題可能會有多種算法可供選擇,選擇的主要標準是算法的正確性和可靠性,簡單性和易理解性。其次是算法所需要的存儲空間少和執行更快等。
經常采用的算法設計技術主要有迭代法、遞推法、窮舉搜索法、貪婪法、回溯法、分治法、動態規劃法等等。
在計算機數值程序設計中,迭代與遞推是兩個重要的基礎算法。
一、迭代
許多的實際問題都能轉化為解方程F(x)=0的實數解的問題。求根可以直接從方程出發,逐步縮小根的存在區間,把根的近似值逐步精確到要以滿足具體實際問題的需要為止,該算法稱為迭代。
迭代的一般原則可以用一個數學模型來描述,要求出方程F(x)=0的解。
先設F(x)=G(x)-x
則方程F(x)=0可化為x=G(x)
這就產生了一個迭代算法的數學模型
Xn+1=G(Xn)
從某一個數X0出發,按此迭代模型,求出一個序列:
{X0,X1,X2,X3,……,Xn-2,Xn-1,Xn}
當Xn-Xn-1小于一個特定值(誤差許可值)時,X≈Xn-1≈Xn,這時可認定x=G(x)。也就是說,求出的Xn已經可以作為原方程f(x)=0
根的
近似值了。迭代法有精確迭代法和近似迭代法。所謂精確迭代是指算法本身提供了問題的精確解。如對N個數求和、求均值、求方差等,這些問題都適合使用精確迭代法解決。
迭代算法的三個環節迭代初始值迭代公式迭代終止條件
迭代法的特點是:把一個復雜問題的求解過程轉化為相對簡單的迭代算式,然后重復執行這個簡單的算式,直到得到最終解。例:高次方程求根其中:f'(xi)是f(xi)的導數,當
|xi+1–xi|≤ε時xi+1就是方程的近似根。牛頓切線法的思想:
對方程f(x)給定一個初值x0作為方程的近似根,經過若干次迭代后,得到方程較高精度的近似根。牛頓切線法迭代公式為:f(x0)x0
(初值)x1x2牛頓切線法的幾何意義x3f(x1)f(x)f(x2)x0,x1,x2,x3,x4,x*…,x*xn,n→∞示例:編寫程序,利用牛頓迭代法求方程(書p78,例4-9)例:給定兩個正整數m和n,求它們的最大公約數。
求最大公約數的問題一般用輾轉相除法(也稱歐幾里德算法)求解。例如:設m=35,n=15它們的最大公約數的求法如下:r=35Mod15(余數為5)m=15:n=5(m=15,n=5)
r≠0
(r=5)r=15Mod5(余數為0)
r=0
所以
5就是最大公約數二、遞推
對于一個數列來說,如果已知它的通項公式,那么,要求出數列中某項之值是十分容易的。但是,在許多情況下,要得到數列的通項公式是很困難的,甚至無法得到。然而,一個有規律的數列的相鄰位置上的數項之間通常存在著一定的關系,我們可以借助已知的項,利用特定的關系逐項推算出它的后繼項的值……,如此反復,直到找到所需的那一項為止,這樣的方法稱為遞推算法。
遞推算法的首要問題是得到相鄰的數據項間的關系(即遞推關系)。遞推算法避開了求通項公項的麻煩,把一個復雜的問題的求解,分解成了連續的若干步簡單運算。一般說來,可以將遞推算法看成是一種特殊的迭代算法。
所謂遞推法,是指利用遞推公式,由簡到繁逐次迭代求解。
例.斐波那契(Fibonacci)數列公元1202年,商人出身的意大利數學家斐波那契(1170~1250),完成了一部偉大的論著《算法之書》。這部中世紀的名著,把當時發達的阿拉伯和印度的數學方法,經過整理和發展之后介紹到歐洲。在斐波那契的書中,曾提出下列有趣的問題:
假定一對剛出生的小兔一個月就能長成大兔,再過一個月便能生下一對小兔,并且此后每個月都生一對小兔,一年內沒有發生死亡。問一對剛出生的兔子,一年內繁殖成多少對兔子?
假定一對剛出生的小兔一個月就能長成大兔,再過一個月便能生下一對小兔,并且此后每個月都生一對小兔,一年內沒有發生死亡。問一對剛出生的兔子,一年內繁殖成多少對兔子?逐月推算,可得數列:
1,1,2,3,5,8,13,21,34,55,89,144,233。
這個數列后來便以斐波那契的名字命名。數列中的每一項,則稱為“斐波那契數”。第十三位的斐波那契數,即為一對剛出生的小兔,一年內所能繁殖成的兔子的對數,這個數字為233。
斐波那契數列有許多奇妙的性質,其中有一個性質是這樣的:奇妙的數學魔術
涉及到的數據1,1,2,3,5,8,13恰是斐波那契數列的前七項。
在現實的自然世界中,《算法之書》里那樣的神奇兔子自然是找不到的,但是這并不妨礙大自然使用斐波那契數列。例如:植物“薊”,它們的頭部幾乎呈球狀。在下面這個圖里,標出了兩條不同方向的螺旋。我們可以數一下,順時針旋轉的螺旋一共有13條,而逆時針旋轉的則有21條。以這樣的形式排列種子、花瓣或葉子的植物還有很多(最容易讓人想到的是向日葵),事實上許多常見的植物,我們食用的蔬菜如花菜,包心菜,等的排列也具有這個特性,只是不容易觀察清楚。盡管這些順逆螺旋的數目并不固定,但它們也并不隨機,它們是斐
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 艾瑞AI報告-標準模板
- 停車場消防應急標志規范
- 安全生產預防措施全解講解
- 地層測試工崗前安全素養考核試卷含答案
- 太陽能利用工崗前技巧考核試卷含答案
- 安全頭條運營指南講解
- 旅店服務員崗前技術綜合考核試卷含答案
- 磨工崗前風險評估考核試卷含答案
- 中獸醫員操作知識競賽考核試卷含答案
- 脂肪醇裝置操作工崗后考核試卷含答案
- 2026年鄉鎮自來水抄表客服招聘考試筆試試題(含答案)
- 2025年福州市鼓樓區城投集團招聘筆試歷年參考題庫(含答案詳解)
- 2026內蒙古呼倫貝爾市海拉爾區紅旅文化旅游開發有限責任公司下屬四家子公司招聘23人考試參考題庫及答案詳解
- 2026年山東事業編統考考試《綜合應用能力》真題及答案解析
- 四川水電集團招聘崗位綜合能力測試客觀題題庫
- 2026年急診科質量控制考核細則
- 2026年光伏產業集團財務總監面試題及答案解析
- 煤礦職業病危害培訓課件
- 2025年南充市農業科學院第二批引進高層次人才公開考核公開招聘筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 地下管線探測課件
- 項目經理安全管理課件
評論
0/150
提交評論