版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第8章循環(huán)結(jié)構(gòu)程序設(shè)計第8章循環(huán)結(jié)構(gòu)程序設(shè)計1學(xué)習(xí)重點
For…Next語句、Do…Loop語句、While…Wend語句、GoTo語句。循環(huán)語句的嵌套使用。掌握常用的循環(huán)結(jié)構(gòu)算法。學(xué)習(xí)重點For…Next語句、Do…Loop語句、Whil2本章內(nèi)容8.1For…Next語句8.2Do…Loop語句8.3While…Wend語句8.4GoTo語句8.5循環(huán)嵌套8.6常用算法及實例本章小結(jié)本章內(nèi)容8.1For…Next語句3引言循環(huán):重復(fù)進(jìn)行某些相同或相近的操作
循環(huán)結(jié)構(gòu)語句:
程序自動重復(fù)執(zhí)行代碼段。
VisualBasic中的循環(huán)結(jié)構(gòu)語句:
For…Next語句
Do…Loop語句
While…Wend語句引言循環(huán):重復(fù)進(jìn)行某些相同或相近的操作48.1For…Next語句
For…Next語句(也稱步長循環(huán)語句),常用于在循環(huán)開始前能確定循環(huán)執(zhí)行次數(shù)的情況。For…Next語句格式如下:
For循環(huán)變量=初值To終值[Step步長]
[語句塊]
[ExitFor]
[語句塊]
Next循環(huán)變量功能:以指定次數(shù)來重復(fù)執(zhí)行一組語句。
8.1For…Next語句For…Next語句(也稱步5示例代碼:
DimiAsInteger
Fori=1To10Step1
Printi;
Nexti執(zhí)行以上代碼將在窗體上輸出結(jié)果如下:
12345678910For循環(huán)變量=初值To終值[Step步長]
[語句塊]
[ExitFor]
[語句塊]
Next循環(huán)變量示例代碼:
DimiAsInteger
Fori=6關(guān)于循環(huán)的幾個概念:循環(huán)變量——又稱為“循環(huán)控制變量”、“控制變量”或“循環(huán)計數(shù)器”,是用做循環(huán)計數(shù)器的數(shù)值變量。這個變量必須為數(shù)值型變量,不能是邏輯型數(shù)據(jù)或數(shù)組元素。
循環(huán)體——被重復(fù)執(zhí)行的代碼段。循環(huán)次數(shù)——循環(huán)體被重復(fù)執(zhí)行的次數(shù)。循環(huán)次數(shù)必須是有限的,否則稱程序陷入“死循環(huán)”關(guān)于循環(huán)的幾個概念:7DimiAsInteger
Fori=1To10Step1
Printi;
Nexti說明:上述代碼中整型變量i是循環(huán)變量。
初值、終值和步長也必須是數(shù)值表達(dá)式。步長可以是正數(shù)或負(fù)數(shù),僅當(dāng)步長為1時,“Step步長”可以省略。當(dāng)步長是正數(shù)或零時,要求循環(huán)變量小于或等于終值;當(dāng)步長是負(fù)數(shù)時,要求循環(huán)變量大于或等于終值。若不符合以上情況時,不能進(jìn)入循環(huán)執(zhí)行語句塊。在上述代碼中循環(huán)變量i的初值是1,終值是10,步長是1。
DimiAsInteger
Fori=1To108DimiAsInteger
Fori=1To10Step1
Printi;
NextiFor和Next中間的語句段稱為循環(huán)體。在上述代碼中循環(huán)體僅有一條語句構(gòu)成??梢栽谘h(huán)體中任何位置放置任意個ExitFor語句,隨時退出循環(huán)。ExitFor經(jīng)常在條件判斷之后使用,如If…Then語句之后,并將控制權(quán)轉(zhuǎn)移到緊接在Next之后的語句。如將上述代碼改為
DimiAsInteger
Fori=1To10Step1
Printi;
Ifi>5ThenExitFor
Nexti
程序的輸出就變?yōu)?2345。
DimiAsInteger
Fori=1To1098.1For…Next語句For…Next語句執(zhí)行過程:①首先計算初值、終值和步長表達(dá)式的值,并將它們都轉(zhuǎn)換成與循環(huán)變量相同的類型。②將計算好的初值表達(dá)式的值賦給循環(huán)變量,作為循環(huán)變量的初值,注意循環(huán)變量僅被賦初值一次。③進(jìn)行判別:判斷循環(huán)變量的值是否超過終值,即當(dāng)步長>0(步長為正數(shù))時,判別循環(huán)變量>終值否;當(dāng)步長<0(步長為負(fù)數(shù))時,判別循環(huán)變量<終值否,如果未超過,則進(jìn)入執(zhí)行循環(huán)體;如果超過了,則正常退出結(jié)束循環(huán),去執(zhí)行Next語句的下一語句。④
執(zhí)行Next語句,使循環(huán)變量增加一個步長,即執(zhí)行循環(huán)變量=循環(huán)變量+步長;返回步驟③繼續(xù)進(jìn)行判別。
圖8-1For…Next語句程序流程圖
8.1For…Next語句For…Next語句執(zhí)10DimiAsInteger
Fori=1To10Step1
Printi;
Nexti上述代碼中循環(huán)變量的初值是1,以后每次執(zhí)行到For語句時判斷i<=10是否成立,成立則執(zhí)行循環(huán)體中的語句,即輸出變量i當(dāng)前的值,否則結(jié)束循環(huán),每次執(zhí)行到Next語句時將循環(huán)變量i的值自增1。因此,循環(huán)變量i的值從1一直變化到10,并將這些值輸出。最后一次執(zhí)行過Next語句后,變量i的值是11,因為超出終值而結(jié)束循環(huán)。一般地,若循環(huán)體中不出現(xiàn)類似于ExitFor和ExitSub之類的強制跳轉(zhuǎn)語句時,結(jié)束For循環(huán)時循環(huán)變量的值肯定超過了終值。
DimiAsInteger
Fori=1To10118.1For…Next語句循環(huán)次數(shù)的一般計算公式如下:
循環(huán)次數(shù)=Int(Abs(終值-初值)/步長)+1注意,若循環(huán)變量在循環(huán)體內(nèi)被重新賦值,則會影響和改變循環(huán)次數(shù)。示例代碼如下:
Fori=1to100
i=i+1
Nexti以上循環(huán)體中i的值自增了1,而語句Nexti還將使i的值增加1,因此在進(jìn)入后一次循環(huán)時i的值比前一次進(jìn)入循環(huán)時共增加了2,因此循環(huán)也就執(zhí)行了50次。8.1For…Next語句循環(huán)次數(shù)的一般計算公式如下:
128.1For…Next語句注意:初值、終值和步長值僅在步驟①中計算,在循環(huán)體內(nèi)對這三個值所涉及的變量進(jìn)行值的更改,都不會改變循環(huán)進(jìn)行中的初值、終值和步長值,當(dāng)然也不會影響循環(huán)次數(shù)。
以下3段代碼中的循環(huán)執(zhí)行次數(shù)均為
Int((20-1)/2)+1=10次。
代碼1:
代碼2:
代碼3:
ForI=1to20step2 c=c+1NextI
c=20ForI=1tocstep2 c=c+1NextId=2ForI=1to20stepd d=d+1NextI執(zhí)行后c的值是10執(zhí)行后c的值是30執(zhí)行后d的值是128.1For…Next語句注意:初值、終值和步長值僅在步138.1For…Next語句格式中Next后面的循環(huán)變量有時被省略,但不推薦這樣使用。如果省略,則由系統(tǒng)自己去識別該Next對應(yīng)的循環(huán)變量,并對它進(jìn)行相應(yīng)的步長運算。如以下代碼也是正確的。
Fori=1To10Step1
Printi;
Next '省略循環(huán)變量8.1For…Next語句格式中Next后面的循環(huán)變量有14For…Next舉例例8-1
求1+2+3+…+100
PrivateSubCommand1_Click()
DimiAsInteger,sumAsInteger
sum=0 ‘變量sum清零
Fori=1To100
sum=sum+i ’累加
NextI
Printsum
EndSub本題輸出結(jié)果是5050。思考:如何實現(xiàn)n!=1×2×3×…×n?
For…Next舉例例8-1求1+2+3+…+100
15For…Next舉例例8-2
輸出1~200間所有能被3整除的數(shù),要求每行輸出10個數(shù)。
第1種方法實現(xiàn)如下:PrivateSubCommand1_Click()DimxAsInteger,nAsIntegerForx=1To200IfxMod3=0ThenPrintx;n=n+1IfnMod10=0ThenPrintEndIfNextxPrintEndSub第2種方法實現(xiàn)如下:PrivateSubCommand2_Click()DimxAsInteger,nAsIntegerForx=3To200Step3Printx;n=n+1IfnMod10=0ThenPrintNextxPrintEndSubFor…Next舉例例8-2輸出1~200間所有能被3整168.2Do…Loop語句
8.2.1當(dāng)型循環(huán)
8.2.2直到型循環(huán)
8.2Do…Loop語句8.2.1當(dāng)型循環(huán)178.2.1當(dāng)型循環(huán)當(dāng)型Do…Loop語句格式如下:
Do[While循環(huán)條件]
[語句塊]
[ExitDo]
[語句塊]
Loop
或
Do
[語句塊]
[ExitDo]
[語句塊]
Loop
[While循環(huán)條件]功能:當(dāng)循環(huán)條件為True時,重復(fù)執(zhí)行語句塊中的命令。8.2.1當(dāng)型循環(huán)當(dāng)型Do…Loop語句格式如下:
D188.2.1當(dāng)型循環(huán)如用以下代碼也可以在窗體上輸出12345678910。
DimiAsInteger
i=1
DoWhilei<=10
Printi;
i=i+1
Loop
DimiAsInteger
i=1
Do
Printi;
i=i+1
LoopWhilei<=108.2.1當(dāng)型循環(huán)如用以下代碼也可以在窗體上輸出12198.2.1當(dāng)型循環(huán)說明:(1)“循環(huán)條件”通常是一個關(guān)系或邏輯表達(dá)式,其值為True或False。(2)Do和Loop間的語句塊是循環(huán)體,當(dāng)循環(huán)條件為True時,重復(fù)執(zhí)行循環(huán)體,當(dāng)循環(huán)條件為False時,結(jié)束循環(huán),轉(zhuǎn)入Loop后的語句執(zhí)行。8.2.1當(dāng)型循環(huán)說明:208.2.1當(dāng)型循環(huán)說明:(3)兩種格式的當(dāng)型Do…Loop語句對應(yīng)的流程圖如圖8-2所示,兩者的區(qū)別是:圖8-2(a)表示每一次進(jìn)入循環(huán),總是先判斷循環(huán)條件是否為“True”,然后再決定是否進(jìn)入執(zhí)行循環(huán)體語句;而圖8-2(b)先執(zhí)行一次循環(huán)體語句,再判別循環(huán)條件是否為真“True”,以決定是否再次執(zhí)行循環(huán)體。即圖8-2(a)的循環(huán)形式有可能一次也沒執(zhí)行循環(huán)體語句,而圖8-2(b)中不管循環(huán)條件是否為真,至少執(zhí)行一次循環(huán)體語句。但一旦圖8-2(a)進(jìn)入循環(huán),其循環(huán)次數(shù)和對應(yīng)的圖8-2(b)循環(huán)次數(shù)相等。(a)DoWhile…Loop結(jié)構(gòu)流程圖
(b)Do…LoopWhile結(jié)構(gòu)流程圖
8.2.1當(dāng)型循環(huán)說明:(a)DoWhile…Loop218.2.1當(dāng)型循環(huán)說明:(4)Do…Loop語句中可以在任何位置放置任意個數(shù)的ExitDo語句,隨時跳出Do…Loop循環(huán)。ExitDo只能用于Do…Loop語句中,通常用于條件判斷之后。如以下代碼中沒有設(shè)置循環(huán)條件,而采用在循環(huán)體中有條件的跳出來設(shè)置循環(huán)終止條件。
DimiAsInteger
i=1
Do
Printi;
i=i+1
Ifi>10ThenExitDo
Loop8.2.1當(dāng)型循環(huán)說明:228.2.1當(dāng)型循環(huán)說明:(5)為了使循環(huán)語句在有限的時間內(nèi)執(zhí)行完畢,在循環(huán)體中至少要有一條語句使得循環(huán)條件趨向于假“False”或用ExitDo語句終止循環(huán),否則程序?qū)o休止的執(zhí)行循環(huán)體,直至耗盡系統(tǒng)資源,我們稱這種現(xiàn)象為“死循環(huán)”。
提示
當(dāng)程序進(jìn)入“死循環(huán)”或長時間執(zhí)行某過程時,用戶可以使用Ctrl+Break鍵強行中斷程序的運行,將程序從運行狀態(tài)改為設(shè)計狀態(tài),并釋放程序運行中的臨時資源。
8.2.1當(dāng)型循環(huán)說明:238.2.1當(dāng)型循環(huán)說明:(6)可以將For…Next語句改寫成Do…Loop語句,但僅有已知循環(huán)次數(shù)的Do…Loop語句才可以改寫成For…Next語句。在For…Next語句中,格式中包含了對循環(huán)變量的賦初值、設(shè)置循環(huán)進(jìn)行的條件及循環(huán)變量按步長變化等操作,這些在Do…Loop語句中都需要編程人員一一考慮并用語句設(shè)置。
8.2.1當(dāng)型循環(huán)說明:248.2.1當(dāng)型循環(huán)例8-3
驗證谷角猜想。對于任意一個自然數(shù)n,若n為偶數(shù),則將其除以2;若n為奇數(shù),則將其乘以3,然后再加1。如此經(jīng)過有限次運算后,總可以得到自然數(shù)1。
分析:由于不能確定要多少步才能結(jié)束運算,因此本題中采用當(dāng)型Do…Loop循環(huán)語句實現(xiàn)。使用變量n存放該正整數(shù),每次重新計算出的新值仍然存放在n中。當(dāng)n未達(dá)到1時繼續(xù)執(zhí)行運算,當(dāng)n等于1時結(jié)束循環(huán)。
8.2.1當(dāng)型循環(huán)例8-3驗證谷角猜想。對于任意一個25例8-3代碼:PrivateSubCommand1_Click()DimnAsIntegerCls '清屏n=Val(InputBox("請輸入一個正整數(shù)"))Printn;Ifn>0ThenDoWhilen<>1IfnMod2=1Thenn=n*3+1Elsen=n/2EndIfPrint"->";n;LoopEndIfEndSub例8-3代碼:PrivateSubCommand1_Cl268.2.2直到型循環(huán)
直到型Do…Loop語句格式如下:
Do[Until循環(huán)條件]
[語句塊]
[ExitDo]
[語句塊]
Loop
或
Do
[語句塊]
[ExitDo]
[語句塊]
Loop
[Until循環(huán)條件]功能:當(dāng)循環(huán)條件為False時,重復(fù)執(zhí)行語句塊中的命令;當(dāng)循環(huán)條件為True時,結(jié)束循環(huán)。8.2.2直到型循環(huán)直到型Do…Loop語句格式如下278.2.2直到型循環(huán)如用以下代碼也可以在窗體上輸出12345678910。
DimiAsInteger
i=1
DoUntili>10
Printi;
i=i+1
Loop
DimiAsInteger
i=1
Do
Printi;
i=i+1
LoopUntili>108.2.2直到型循環(huán)如用以下代碼也可以在窗體上輸出1288.2.2直到型循環(huán)說明:(1)直到型Do…Loop語句也有兩種形式。(a)DoUntil…Loop結(jié)構(gòu)流程圖
(b)Do…LoopUntil結(jié)構(gòu)流程圖
8.2.2直到型循環(huán)說明:(a)DoUntil…Lo298.2.2直到型循環(huán)說明:(2)直到型Do…Loop語句格式中的組成和當(dāng)型Do…Loop語句格式基本一致,兩者的區(qū)別是兩者的循環(huán)條件正好相反。
大部分當(dāng)型Do…Loop語句都可以改寫成直到型Do…Loop語句。如將例8-3中的DoWhilen<>1改成DoUntiln=1,程序功能完全一致。
8.2.2直到型循環(huán)說明:30例8-4例8-4
隨機產(chǎn)生n個隨機整數(shù),并求它們的平均值,n由用戶輸入。
分析:用戶輸入信息的有效性過濾:使用整型變量n接收用戶輸入的數(shù)據(jù),可以過濾掉非數(shù)值字符串
采用Fix函數(shù)進(jìn)行取整可以將用戶輸入的實數(shù)類型數(shù)據(jù)轉(zhuǎn)換為整數(shù)
使用一個Do…Loop循環(huán)對負(fù)數(shù)進(jìn)行過濾,并由用戶選擇是否繼續(xù)輸入
例8-4例8-4隨機產(chǎn)生n個隨機整數(shù),并求它們的平均值,31例8-4PrivateSubForm_Click()DimnAsInteger,xAsInteger,iAsInteger,sumAsIntegern=Fix(Val(InputBox("請輸入數(shù)據(jù)個數(shù)"))) '舍去取整DoUntiln>0IfMsgBox("輸入錯誤,需要重新輸入嗎?",vbYesNo)=vbYesThenn=Fix(Val(InputBox("請輸入數(shù)據(jù)個數(shù)")))ElseExitSub '結(jié)束本事件過程EndIfLoop實現(xiàn)數(shù)據(jù)n的輸入例8-4PrivateSubForm_Click()實現(xiàn)32例8-4sum=0 '累加器sum清零Fori=1Tonx=Int(Rnd*100)sum=sum+xPrintx;IfiMod10=0ThenPrint '每行輸出5個數(shù)據(jù)NextiPrintPrintn;"個數(shù)的平均值=";sum/nEndSub功能實現(xiàn)——求n個數(shù)的平均值
例8-4sum=0338.3While…Wend語句
語句格式:While循環(huán)條件循環(huán)體Wend在窗體上輸出12345678910。DimiAsIntegeri=1Whilei<=10Printi;i=i+1Wend這種結(jié)構(gòu)使用完全類似于當(dāng)型Do…Loop循環(huán)語句的格式1
8.3While…Wend語句語句格式:在窗體上輸出1348.4GoTo語句
語句格式如下:GoTo標(biāo)簽其中標(biāo)簽無需定義,是在一行語句的開頭用冒號和語句隔開的標(biāo)識符。
說明:(1)GoTo語句是一個無條件轉(zhuǎn)支語句,通常和分支語句配合使用。
PrivateSubForm_Click()DimxAsIntegerx=Val(InputBox("請輸入一個正整數(shù)"))Ifx<0ThenGoToL1PrintxL1:EndSub
程序功能:
只輸出用戶輸入的正整數(shù)
8.4GoTo語句語句格式如下:PrivateSub358.4GoTo語句(2)使用GoTo語句可以構(gòu)造出一個具有循環(huán)功能的結(jié)構(gòu)。在窗體上以緊湊格式輸出數(shù)值1~10。
DimiAsInteger
i=1
A:Printi;
i=i+1
Ifi<=10ThenGoToA執(zhí)行以上程序段后i的值是11。8.4GoTo語句(2)使用GoTo語句可以構(gòu)造出一個具368.4GoTo語句(3)在循環(huán)語句中使用GoTo語句,既可以從循環(huán)內(nèi)部跳轉(zhuǎn)到循環(huán)外部語句,也可以從循環(huán)外部語句跳轉(zhuǎn)到循環(huán)內(nèi)部語句,但要注意由此產(chǎn)生的循環(huán)執(zhí)行過程的變化。
如:
DimiAsInteger
Fori=1To10
B:Printi;
Nexti
Ifi<=11ThenGoToB以緊湊格式輸出數(shù)值1~11不恰當(dāng)?shù)腉oTo語句將使程序陷入死循環(huán)C:Fori=1To9Print"*"Ifi>5ThenGoToCNexti
8.4GoTo語句(3)在循環(huán)語句中使用GoTo語句,既378.4GoTo語句(4)結(jié)構(gòu)化程序設(shè)計中并不建議使用GoTo語句來控制程序流程,因為它會使程序流程復(fù)雜化。
8.4GoTo語句(4)結(jié)構(gòu)化程序設(shè)計中并不建議使用Go388.5循
環(huán)
嵌
套
循環(huán)嵌套是指在某個循環(huán)的循環(huán)體中又包含著另一個完整的循環(huán)。8.5循環(huán)嵌套循環(huán)嵌套是指在某個循環(huán)的循環(huán)體中又398.5循
環(huán)
嵌
套說明:
(1)嵌套的層數(shù)沒有具體限制,但內(nèi)層的小循環(huán)一定要完整地被包含在外層的大循環(huán)之內(nèi),而不得相互交叉。
以下兩種結(jié)構(gòu)中語句之間存在著交叉,是不正確的:
Do...
For......LoopNext...Fori=1To10...Forj=1To10...Nexti...Nextj8.5循環(huán)嵌套說明:
(1)嵌套的層數(shù)沒有具體限制408.5循
環(huán)
嵌
套(2)對有循環(huán)控制變量的循環(huán)進(jìn)行嵌套時,要注意循環(huán)嵌套后對改變循環(huán)變量的值是否影響循環(huán)次數(shù)等。(3)循環(huán)嵌套的層次數(shù)不能太多,要考慮實際語句的執(zhí)行次數(shù)。一般的,在內(nèi)層循環(huán)體中的語句執(zhí)行次數(shù)=每次內(nèi)層循環(huán)次數(shù)×外層循環(huán)次數(shù)。(4)若有多層For…Next語句嵌套,且各自的Next語句在連續(xù)位置上,則可將多條Next語句合并成一條語句,格式是Next內(nèi)層循環(huán)變量,外層循環(huán)變量……
以下代碼是正確的。Fora=1to5 Forb=1to5 Forc=1to5 …Nextc,b,a'等價于三條語句Nextc:Nextb:Nexta8.5循環(huán)嵌套(2)對有循環(huán)控制變量的循環(huán)進(jìn)行嵌套41程序舉例例8-5如有以下程序代碼:
i=1
DoWhilei<=10
s=1
Fori=1Toi
s=s*i
Nexti
Printi;"!=";s
i=i+1
Loop程序的本意是要分別輸出1~10的階乘,但程序的輸出如圖所示,除了輸出的行數(shù)不符外,我們還發(fā)現(xiàn)每行上求的值也不符合。
程序舉例例8-5如有以下程序代碼:
i=1
42例8-5分析其原因發(fā)現(xiàn),內(nèi)層循環(huán)對變量i的變化影響了外層循環(huán)的正常執(zhí)行。解決的方法是每一個循環(huán)使用一個唯一的循環(huán)控制變量(不同名)。修改代碼:
DimiAsInteger,sAsDoublei=1DoWhilei<=10s=1Forj=1Tois=s*jNextjPrinti;"!=";si=i+1Loop例8-5分析其原因發(fā)現(xiàn),內(nèi)層循環(huán)對變量i的變化影響了外層循環(huán)43程序舉例例8-6
輸出九九乘法表
PrivateSubForm_Activate()DimiAsInteger,jAsIntegerFori=1To9Forj=1To9Picture1.PrintTab(10*(j-1));CStr(i);"*";CStr(j);"=";CStr(i*j);NextjPicture1.PrintNextiEndSub思考:如何輸出只有下三角區(qū)域的九九乘法表?
程序舉例例8-6輸出九九乘法表PrivateSub448.6常用算法及實例
8.6.1累加(乘)8.6.2求最值8.6.3窮舉法8.6.4遞推法(迭代法)8.6.5字符串遍歷8.6.6有限狀態(tài)自動機8.6.7進(jìn)制轉(zhuǎn)換8.6.8圖形字符的打印
8.6常用算法及實例8.6.1累加(乘)458.6.1累加(乘)累加(乘)是指在某個值的基礎(chǔ)上一次又一次的加上(乘以)一些數(shù)。累加(乘)的結(jié)果是運算最終的目標(biāo),通常只需使用一個變量來存放在各次運算結(jié)果,稱這樣的變量為累加(乘)器。
1.累加2.累乘
8.6.1累加(乘)累加(乘)是指在某個值的基礎(chǔ)上一次又461.累加算法描述如下。步驟1:給累加器變量sum賦初值為0,給計數(shù)器i賦初值為0。步驟2:計數(shù)器加1,即i+1i。步驟3:計算ai。步驟4:ai+sumsum。步驟5:ai是否是最后一項,若是則轉(zhuǎn)步驟6,否則轉(zhuǎn)步驟2。步驟6:輸出累加器變量sum的值。
1.累加算法描述如下。471.累加程序模式:(1)若已知i的取值范圍是1~k,則用以下語句組合來計算累加和sum。
sum=0
Fori=1tok
sum=sum+ai
Nexti(2)若已知最后一項的取值要求,則用以下語句組合來計算累加和sum。
sum=0:i=1
DoWhileai滿足條件‘或DoUntilai不滿足條
件
sum=sum+ai
i=i+1
Loop1.累加程序模式:482.累乘算法描述與累加相似,主要區(qū)別在于:
(1)累乘器的初值賦為1
(2)使用sum=sum*ai進(jìn)行累乘運算。同樣的,也可以總結(jié)出類似的累乘程序模式加以運用。
2.累乘算法描述與累加相似,主要區(qū)別在于:
(1)累乘器的49程序舉例例8-7
正弦函數(shù)可表示為
使用該公式求sinx的近似解,直到累加項的絕對值小于10-6為止。
分析:這是一個累加問題,使用累加模式實現(xiàn)。其中,通項中分子是個階乘,需要使用累乘模式實現(xiàn)。
程序舉例例8-7正弦函數(shù)可表示為
使用該公式求sin50例8-7PrivateSubCmdcul_Click()DimxAsSingle,iAsInteger,jAsIntegerDimsumAsSingle,tAsSingle,fAsSinglex=Val(txtX.Text)i=1Dof=1 '求2i-1的階乘,放入變量f中Forj=1To2*i-1f=f*jNextjt=(-1)^(i-1)*x^(2*i-1)/f '通項t的計算sum=sum+t '累加i=i+1LoopUntilAbs(t)<10^(-6)txtResult.Text=Format(sum,"0.00000")EndSub多項式法
例8-7PrivateSubCmdcul_Click()518.6.2求最值
最值問題一般表現(xiàn)為求n個數(shù)中的最大(?。┲?。算法描述如下。
步驟1:給存放最大(?。┲档淖兞抠x初值。
步驟2:取n個數(shù)中的一個數(shù)和最大(小)值變量比較,若大于最大值變量(小于最小值變量),則將該數(shù)賦值給最大(小)值變量。
步驟3:重復(fù)步驟2,直至所有數(shù)都比較完成。
8.6.2求最值最值問題一般表現(xiàn)為求n個數(shù)中的最大(小52程序舉例例8-8
使用隨機函數(shù)生成30個學(xué)生的數(shù)學(xué)成績,并求其中的最高分。
分析:百分制分?jǐn)?shù)的范圍是0~100,設(shè)最大值變量max的初值為0,以保證在第1次數(shù)據(jù)比較時就能使max等于第一個數(shù)。
程序舉例例8-8使用隨機函數(shù)生成30個學(xué)生的數(shù)學(xué)成績,并53例8-8PrivateSubForm_Click()DimgradeAsInteger,iAsInteger,maxAsIntegerPrint"30個學(xué)生的數(shù)學(xué)成績是:"max=0 '設(shè)置最大值為一個相對小的數(shù)Fori=1To30grad=Int(101*Rnd) '隨機生成百分制成績Printgrad;IfiMod10=0ThenPrintIfgrad>maxThenmax=gradNextiPrint"最高分是";maxEndSub例8-8PrivateSubForm_Click()54例8-8這種對max賦初值的方法在有些場合并不適用,為了能確保max中只存放真實數(shù)據(jù)中的一個,我們可以將第1個數(shù)據(jù)作為初值賦給max,然后從第2個數(shù)開始和max比較。改進(jìn):PrivateSubForm_Click()DimgradeAsInteger,iAsInteger,maxAsIntegerPrint"30個學(xué)生的數(shù)學(xué)成績是:"grad=Int(101*Rnd) '生成第一個成績Printgrad;max=grad '設(shè)置最大值為第1個數(shù)Fori=2To30 '從第2個數(shù)開始比較grad=Int(101*Rnd)Printgrad;IfiMod10=0ThenPrintIfgrad>maxThenmax=gradNextiPrint"最高分是";maxEndSub例8-8這種對max賦初值的方法在有些場合并不適用,為了能確558.6.3窮舉法
窮舉法主要通過將可能出現(xiàn)解的范圍中所有的數(shù)一一進(jìn)行判斷。搜索范圍的確定是窮舉法的關(guān)鍵,一旦確定了范圍,使用常規(guī)的循環(huán)語句即可解決問題。1.組合問題
2.素數(shù)問題
8.6.3窮舉法窮舉法主要通過將可能出現(xiàn)解的范圍中所有561.組合問題
組合問題一般體現(xiàn)在要求符合條件的所有組合情況,此類問題的關(guān)鍵是要按一定的順序進(jìn)行窮舉,避免遺漏。
例8-9
求由數(shù)字0、1、2、3、4組成的所有無重復(fù)數(shù)字的3位正整數(shù)。
分析:分別對3位數(shù)的3個位數(shù)字進(jìn)行窮舉,其中百位數(shù)字不能為0。使用三重循環(huán)來實現(xiàn),
1.組合問題組合問題一般體現(xiàn)在要求符合條件的所有組合情況,57例8-9PrivateSubForm_Click()DimaAsInteger,bAsInteger,cAsInteger,nAsIntegerFora=1To4Forb=0To4Forc=0To4Ifa<>bAndb<>cAnda<>cThenPrinta*100+b*10+c;n=n+1IfnMod5=0ThenPrintEndIfNextcNextbNextaEndSub例8-9PrivateSubForm_Click()582.素數(shù)問題
素數(shù)即質(zhì)數(shù),是指除了能被1和自身整除而不能被其他任何數(shù)整除的數(shù)。例8-10
判斷整數(shù)x是否是素數(shù)。根據(jù)素數(shù)的定義,只需用2到n-1去除n,如果都除不盡則n是素數(shù),否則,只要其中有一個數(shù)能除盡則n不是素數(shù)。也可以理解為,在2到n-1中尋找n的因子,若找不到則n是素數(shù),否則n不是素數(shù)。2.素數(shù)問題素數(shù)即質(zhì)數(shù),是指除了能被1和自身整除而不能被其59例8-10PrivateSubCommand1_Click()DimxAsInteger,iAsIntegerx=Val(Text1)Ifx>1ThenFori=2Tox-1IfxModi=0ThenExitFor'判斷x是否能被i整除,即i是否是x的因子NextiIfi=xThenMsgBoxx&"是素數(shù)"ElseMsgBoxx&"不是素數(shù)"EndIfElseMsgBox"x必須大于1"EndIfEndSub例8-10PrivateSubCommand1_Clic60例8-10改進(jìn):將搜索范圍縮小到[2,]之間
k=Sqr(x)'這里進(jìn)行自動轉(zhuǎn)換,等價于四舍五入取整Fori=2TokIfxModi=0ThenExitForNextiIfi>kThenMsgBoxx&"是素數(shù)"ElseMsgBoxx&"不是素數(shù)"EndIf例8-10改進(jìn):將搜索范圍縮小到[2,]之間61例8-11例8-11
從鍵盤上輸入一個正整數(shù),找出大于或等于該數(shù)的第一個素數(shù)。
x=Val(Text1)Ifx>1ThenDoFori=2ToSqr(x)IfxModi=0ThenExitForNextiIfi>Round(Sqr(x))ThenExitDoElsex=x+1EndIfLoopLabel2.Caption=“>=x的第一個素數(shù)是:"&xElseMsgBox"x必須大于1"EndIf例8-11例8-11從鍵盤上輸入一個正整數(shù),找出大于或等628.6.4遞推法(迭代法)
使用遞推法來解決的問題中,前一個狀態(tài)和后一個狀態(tài)間存在著一定的函數(shù)關(guān)系。遞推法的關(guān)鍵在于找到正確的函數(shù)關(guān)系,然后使用循環(huán)語句來實現(xiàn)。1.最大公約數(shù)和最小公倍數(shù)
2.Fibonacci數(shù)列
3.累加中的遞推
4.迭代法求方程的近似根
8.6.4遞推法(迭代法)使用遞推法來解決的問題中,前631.最大公約數(shù)和最小公倍數(shù)
若已知整數(shù)x和y的最大公約數(shù)是k,則它們的最小公倍數(shù)是x×y/k。
求兩個整數(shù)最大公約數(shù)的兩種方法。
(1)輾轉(zhuǎn)相除法(歐幾里德算法)
(2)相減法
1.最大公約數(shù)和最小公倍數(shù)若已知整數(shù)x和y的最大公約數(shù)是k641.最大公約數(shù)和最小公倍數(shù)(1)輾轉(zhuǎn)相除法(歐幾里德算法)遞推公式如下:算法描述如下:步驟1:輸入兩個自然數(shù)x、y,令x>=y。步驟2:求x除以y的余數(shù)r。步驟3:yx,ry。步驟4:若r≠0,則轉(zhuǎn)步驟2,否則轉(zhuǎn)步驟5。步驟5:輸出x。1.最大公約數(shù)和最小公倍數(shù)(1)輾轉(zhuǎn)相除法(歐幾里德算法)算651.最大公約數(shù)和最小公倍數(shù)(2)相減法。遞推公式如下:
兩個數(shù)中從大數(shù)中減去小數(shù),所得的差若與小數(shù)相等,則該數(shù)為最大公約數(shù)。若不等,對所得的差和小數(shù),繼續(xù)從大數(shù)中減去小數(shù),……,直到兩個數(shù)相等為止。
1.最大公約數(shù)和最小公倍數(shù)(2)相減法。兩個數(shù)中從大數(shù)中減去66程序舉例例8-12
用歐幾里德算法求x和y的最大公約數(shù)。
Ifx<yThentemp=x:x=y:y=tempDo '求最大公約數(shù)r=xModyx=yy=rLoopWhiler<>0Text3.Text=CStr(x) '輸出最大公約數(shù)程序舉例例8-12用歐幾里德算法求x和y的最大公約數(shù)。672.Fibonacci數(shù)列
兔子繁殖問題:如果每對兔子每月繁殖一對子兔,而子兔在出生后第2個月就有生殖能力,試問一對兔子一年能繁殖多少對兔子?
可以這樣思考:第1個月后即第2個月時,一對兔子變成了兩對兔子,其中一對是它本身,另一對是它生下的幼兔。第3個月時兩對兔子變成了三對,其中一對是最初的一對,另一對是它剛生下來的幼兔,第三對是幼兔長成的大兔子。第4個月時,三對兔子變成了五對,第5個月時,五對兔子變成了八對,按此方法推算,第6個月是13對兔子,第7個月是21對兔子……
2.Fibonacci數(shù)列兔子繁殖問題:如果每對兔子每月繁682.Fibonacci數(shù)列裴波那契得到一個數(shù)列,人們將這個數(shù)列前面加上一項1,成為“裴波那契數(shù)列”,即1,1,2,3,5,8,13……。該數(shù)列的特點是從數(shù)列的第3項開始,每一項都等于前兩項之和,用公式表示如下。算法描述如下:步驟1:將x1和x2的初值賦為1。步驟2:若x1符合條件,則輸出x1;若不符合,則程序結(jié)束。步驟3:x1t;x1+x2x1;tx2。步驟4:轉(zhuǎn)步驟2。
2.Fibonacci數(shù)列裴波那契得到一個數(shù)列,人們將這個數(shù)69程序舉例例8-13
輸出100以內(nèi)的Fibonacci數(shù)列。
PrivateSubForm_Click()Dimx1AsInteger,x2AsInteger,tAsIntegerx1=1:x2=1Printx2;DoWhilex1<=100Printx1;t=x1x1=x1+x2x2=tLoopEndSub程序舉例例8-13輸出100以內(nèi)的Fibonacci數(shù)列703.累加中的遞推
在累加(乘)算法中,若ai序列的前后項之間存在數(shù)學(xué)關(guān)系(ai=f(ai-1))時,累加(乘)運算也可采用遞推法來實現(xiàn),這種遞推也稱為迭代法。使用迭代法求累加(乘)中通項ai時,可以避免每次都重新開始計算ai,大大提高程序的效率。3.累加中的遞推在累加(乘)算法中,若ai序列的前后項之間71程序舉例例8-14
用遞推法求解
分析:通項,當(dāng)k=i和i+1時,得得到兩者之間的遞推關(guān)系式如下:
程序舉例例8-14用遞推法求解分析:通項72例8-14參考代碼如下:PrivateSubCmdcul_Click()DimxAsSingle,iAsIntegerDimsumAsSingle,tAsSinglex=Val(txtX.Text)i=1:t=x:sum=x '第1項的處理Dot=t*(-1)*x*x/(2*i*(2*i+1))'通項t的遞推sum=sum+ti=i+1LoopUntilAbs(t)<10^(-6)txtResult.Text=Format(sum,"0.00000")EndSub例8-14參考代碼如下:734.迭代法求方程的近似根
主要思想是從某個初值x0開始,根據(jù)迭代公式逐次產(chǎn)生更接近于真實解的x1,x2,……,直到某個x在一定精度下非常接近真實解,這個x就是解的近似值。
4.迭代法求方程的近似根主要思想是從某個初值x0開始,根據(jù)74程序舉例例8-15
用牛頓迭代法求方程
的近似根(為止)。
牛頓迭代法的迭代公式是
,k=0,1,2,……,其中是對求導(dǎo)的結(jié)果。
本題中程序舉例例8-15用牛頓迭代法求方程
的近似根(75例8-15程序代碼如下:PrivateSubCommand1_Click()Dimx0AsSingle,x1AsSinglex1=Val(InputBox("請輸入x的初值"))Dox0=x1x1=x0-(x0*Exp(x0)-1)/(Exp(x0)*(x0+1))LoopUntilAbs(x1-x0)<10^-5PrintFormat(x1,"0.0000000")EndSub當(dāng)程序輸入x的初值為0.5時,結(jié)果顯示近似根為0.5671433。例8-15程序代碼如下:768.6.5字符串遍歷
字符串的遍歷是指逐個訪問字符串中的每一個字符,并對其進(jìn)行指定的操作。
1.完全遍歷
2.回文字符串
8.6.5字符串遍歷字符串的遍歷是指逐個訪問字符串中的771.完全遍歷
一般的,我們總是從字符串的第一個字符開始訪問,直到最后一個字符,稱為字符串的完全遍歷。經(jīng)常采用以下語句結(jié)構(gòu)進(jìn)行字符串的遍歷。
Fori=1ToLen(str)
…‘對str中第i個字符Mid(str,i,1)進(jìn)行處理
Nexti1.完全遍歷一般的,我們總是從字符串的第一個字符開始訪問,78程序舉例例8-16
統(tǒng)計用戶輸入的字符串中字母字符、數(shù)字字符和其他字符的數(shù)量。
程序舉例例8-16統(tǒng)計用戶輸入的字符串中字母字符、數(shù)字字79PrivateSubCmdCount_Click() '統(tǒng)計按鈕的單擊事件DimsAsString,iAsInteger'設(shè)置3個計數(shù)器,分別記錄字母、數(shù)字和其他字符的統(tǒng)計數(shù)量Dimn_charAsInteger,n_digitalAsInteger,n_otherAsIntegers=Text1.Text '接收用戶輸入的一串字符Fori=1ToLen(s)'從第1個字符開始統(tǒng)計到最后1個字符SelectCaseMid(s,i,1) '對每1個輸入的字符進(jìn)行判斷分類Case"A"To"Z","a"To"z"n_char=n_char+1 '字母計數(shù)器+1Case"0"To"9"n_digital=n_digital+1 '數(shù)字計數(shù)器+1CaseElsen_other=n_other+1 '其他字符計數(shù)器+1EndSelectNexti'顯示統(tǒng)計結(jié)果MsgBox“有”&n_char&“個字母,”&n_digital&“個數(shù)字,”&_
n_other&"個其他字符。"EndSubPrivateSubCmdCount_Click()802.回文字符串
回文字符串是指該字符串正讀和反讀都一樣。如“aba”、“abba”、“處處飛花飛處處”、“珠聯(lián)璧合璧聯(lián)珠”等都屬于回文字符串。例8-17
判斷用戶輸入的字符串是否是回文。
兩種方法:(1)按定義判斷(2)首尾字符的成對比較
2.回文字符串回文字符串是指該字符串正讀和反讀都一樣。81例8-17(1)按定義判斷先求出字符串的反序字符串,然后和原字符串比較,如果相等則是回文,否則不是回文。DimstrAsString,iAsInteger'以下求Text1中文本的反序串strFori=1ToLen(Text1)str=Mid(Text1,i,1)&strNextiIfstr=Text1ThenMsgBox"是回文"ElseMsgBox"不是回文"例8-17(1)按定義判斷DimstrAsStrin822.回文字符串(2)首尾字符的成對比較將字符串折半比較,若每對字符都相等則是回文,否則只要有一對字符不等就不是回文。
DimiAsIntegerFori=1ToLen(Text1)\2IfMid(Text1,i,1)<>Mid(Text1,Len(Text1)-i+1,1)ThenExitForNextiIfi>Len(Text1)\2ThenMsgBox"是回文"ElseMsgBox"不是回文"2.回文字符串(2)首尾字符的成對比較DimiA838.6.6有限狀態(tài)自動機
計算機工作者們提出了一種形象的方式描述這種動態(tài)過程,它可以清楚地反映一個“系統(tǒng)”的狀態(tài)、狀態(tài)轉(zhuǎn)換的條件、轉(zhuǎn)換時的動作等等。
這種抽象模型稱為自動機。8.6.6有限狀態(tài)自動機計算機工作者們提出了一種形象的84程序舉例例8-18
統(tǒng)計文章中共有多少英文單詞。設(shè)單詞間使用空格隔開,句中或句末使用逗號、句號、感嘆號、問號。分析:當(dāng)前字符是單詞的首字符,則遇到新單詞,這時應(yīng)把計數(shù)器加一。當(dāng)前字符不是空格,它是不是新詞的開始還依賴于前一字符是否空格?!嗵幚聿襟E不能孤立進(jìn)行,處理方式需要依賴于前面的歷史情況。讀入過程有兩種不同的狀態(tài)(相互轉(zhuǎn)換):
①處在單詞之外(如果遇到非空格字符,那就是新詞)
②正處在某單詞的內(nèi)部(不會遇到新詞)程序舉例例8-18統(tǒng)計文章中共有多少英文單詞。設(shè)單詞間使85描述讀入狀態(tài)轉(zhuǎn)換的自動機
INOUT讀到空格字符,狀態(tài)不變讀到空格字符,轉(zhuǎn)到OUT狀態(tài)讀到非空格字符,轉(zhuǎn)到IN狀態(tài)
counter=counter+1讀到非空格字符,狀態(tài)不變Flag=TrueFlag=False描述讀入狀態(tài)轉(zhuǎn)換的自動機
INOUT讀到空格字符,狀態(tài)不變讀86例8-18Fori=1ToLen(Text1)ch=Mid(Text1,i,1) 'ch為當(dāng)前字符Ifch>="a"Andch<="z"Orch>="A"Andch<="Z"ThenIfflag=FalseThen '若前一字符不是字母flag=True 'OUT狀態(tài)轉(zhuǎn)換到IN狀態(tài)counter=counter+1EndIfElseIfch=""Orch="."Orch=","Orch="!"Orch="?"Thenflag=False 'IN狀態(tài)轉(zhuǎn)換到OUT狀態(tài)EndIfNextiMsgBox"共有"&counter&"個單詞"例8-18Fori=1ToLen(Text1)878.6.6有限狀態(tài)自動機素數(shù)問題另解:
Flag=True '邏輯型狀態(tài)變量FlagFori=2ToSqr(x)IfxModi=0ThenFlag=False:ExitForNextiIfFlagThen '等價于IfFlag=TrueThenMsgBoxx&"是素數(shù)"ElseMsgBoxx&"不是素數(shù)"EndIf8.6.6有限狀態(tài)自動機素數(shù)問題另解:888.6.7進(jìn)制轉(zhuǎn)換
例8-19
實現(xiàn)D進(jìn)制數(shù)整數(shù)(D<=16)和十進(jìn)制數(shù)整數(shù)的互換
1.D進(jìn)制整數(shù)轉(zhuǎn)換成10進(jìn)制整數(shù)
2.10進(jìn)制整數(shù)轉(zhuǎn)換成D進(jìn)制整數(shù)
8.6.7進(jìn)制轉(zhuǎn)換例8-19實現(xiàn)D進(jìn)制數(shù)整數(shù)(D<891.D進(jìn)制整數(shù)轉(zhuǎn)換成10進(jìn)制整數(shù)
由于D進(jìn)制數(shù)只能表示成字符串,因此這又是一個對字符串的操作運算。若D進(jìn)制數(shù)表示成akak?1…a2a1a0,則轉(zhuǎn)換成十進(jìn)制數(shù)據(jù)的方法是多項式法,如下所示。
也可以表示成
其中后一種表達(dá)式中避免了對基數(shù)D的冪指數(shù)的求解,且將求和歸結(jié)為求若干次ai·D+ai?1的過程,這是較為常用的方法。
1.D進(jìn)制整數(shù)轉(zhuǎn)換成10進(jìn)制整數(shù)由于D進(jìn)制數(shù)只能表示成字符90PrivateSubCmdD_10_Click()DimsAsString,chAsString*1
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆吉林省通榆一中高三3月份第一次模擬考試語文試卷含解析
- 八年級期末測試卷(課件)課件
- 2025屆廣東省深圳建文外國語學(xué)校高考壓軸卷英語試卷含解析
- 現(xiàn)代學(xué)徒制課題:中國特色學(xué)徒制質(zhì)量評價標(biāo)準(zhǔn)研究(附:研究思路模板、可修改技術(shù)路線圖)
- 現(xiàn)代學(xué)徒制課題:基于中國特色學(xué)徒制的工匠精神培養(yǎng)路徑研究(附:研究思路模板、可修改技術(shù)路線圖)
- 河南省鶴壁市??h第二高級中學(xué)2025屆高三3月份模擬考試英語試題含解析
- 上海市浦東新區(qū)進(jìn)才中學(xué)2025屆高考語文三模試卷含解析
- 廣東省深圳實驗學(xué)校2025屆高三3月份模擬考試英語試題含解析
- 2025屆浙江省越崎中學(xué)高三最后一卷語文試卷含解析
- 《設(shè)施光環(huán)境控制》課件
- 2024年農(nóng)村公寓房屋買賣協(xié)議書參考樣本3篇
- 五年級數(shù)學(xué)(小數(shù)乘除法)計算題專項練習(xí)及答案匯編
- 初中濟南版生物實驗報告單
- 北京郵電大學(xué)《自然語言處理》2023-2024學(xué)年第一學(xué)期期末試卷
- 艾滋病、乙肝、梅毒健康宣教
- 二零二四年度商務(wù)考察及交流合同
- 【初中地理】天氣與天氣預(yù)報教學(xué)課件-2024-2025學(xué)年七年級地理上冊(湘教版2024)
- 浙教版(2023)小學(xué)信息技術(shù)五年級上冊第7課《分支結(jié)構(gòu)》說課稿及反思
- 《網(wǎng)絡(luò)系統(tǒng)管理與維護(hù)》期末考試題庫及答案
- 考研計算機學(xué)科專業(yè)基礎(chǔ)(408)研究生考試試卷及答案指導(dǎo)(2024年)
- 【初中生物】脊椎動物-魚課件2024-2025學(xué)年人教版生物七年級上冊
評論
0/150
提交評論