版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第8章循環(huán)結(jié)構(gòu)程序設計第8章循環(huán)結(jié)構(gòu)程序設計1學習重點
For…Next語句、Do…Loop語句、While…Wend語句、GoTo語句。循環(huán)語句的嵌套使用。掌握常用的循環(huán)結(jié)構(gòu)算法。學習重點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):重復進行某些相同或相近的操作
循環(huán)結(jié)構(gòu)語句:
程序自動重復執(zhí)行代碼段。
VisualBasic中的循環(huán)結(jié)構(gòu)語句:
For…Next語句
Do…Loop語句
While…Wend語句引言循環(huá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ù)來重復執(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)體——被重復執(zhí)行的代碼段。循環(huán)次數(shù)——循環(huán)體被重復執(zhí)行的次數(shù)。循環(huán)次數(shù)必須是有限的,否則稱程序陷入“死循環(huán)”關(guān)于循環(huán)的幾個概念:7DimiAsInteger
Fori=1To10Step1
Printi;
Nexti說明:上述代碼中整型變量i是循環(huán)變量。
初值、終值和步長也必須是數(shù)值表達式。步長可以是正數(shù)或負數(shù),僅當步長為1時,“Step步長”可以省略。當步長是正數(shù)或零時,要求循環(huán)變量小于或等于終值;當步長是負數(shù)時,要求循環(huá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í)行過程:①首先計算初值、終值和步長表達式的值,并將它們都轉(zhuǎn)換成與循環(huán)變量相同的類型。②將計算好的初值表達式的值賦給循環(huán)變量,作為循環(huán)變量的初值,注意循環(huán)變量僅被賦初值一次。③進行判別:判斷循環(huán)變量的值是否超過終值,即當步長>0(步長為正數(shù))時,判別循環(huán)變量>終值否;當步長<0(步長為負數(shù))時,判別循環(huán)變量<終值否,如果未超過,則進入執(zhí)行循環(huán)體;如果超過了,則正常退出結(jié)束循環(huán),去執(zhí)行Next語句的下一語句。④
執(zhí)行Next語句,使循環(huán)變量增加一個步長,即執(zhí)行循環(huán)變量=循環(huán)變量+步長;返回步驟③繼續(xù)進行判別。
圖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當前的值,否則結(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,因此在進入后一次循環(huán)時i的值比前一次進入循環(huán)時共增加了2,因此循環(huán)也就執(zhí)行了50次。8.1For…Next語句循環(huán)次數(shù)的一般計算公式如下:
128.1For…Next語句注意:初值、終值和步長值僅在步驟①中計算,在循環(huán)體內(nèi)對這三個值所涉及的變量進行值的更改,都不會改變循環(huán)進行中的初值、終值和步長值,當然也不會影響循環(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對應的循環(huán)變量,并對它進行相應的步長運算。如以下代碼也是正確的。
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當型循環(huán)
8.2.2直到型循環(huán)
8.2Do…Loop語句8.2.1當型循環(huán)178.2.1當型循環(huán)當型Do…Loop語句格式如下:
Do[While循環(huán)條件]
[語句塊]
[ExitDo]
[語句塊]
Loop
或
Do
[語句塊]
[ExitDo]
[語句塊]
Loop
[While循環(huán)條件]功能:當循環(huán)條件為True時,重復執(zhí)行語句塊中的命令。8.2.1當型循環(huán)當型Do…Loop語句格式如下:
D188.2.1當型循環(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當型循環(huán)如用以下代碼也可以在窗體上輸出12198.2.1當型循環(huán)說明:(1)“循環(huán)條件”通常是一個關(guān)系或邏輯表達式,其值為True或False。(2)Do和Loop間的語句塊是循環(huán)體,當循環(huán)條件為True時,重復執(zhí)行循環(huán)體,當循環(huán)條件為False時,結(jié)束循環(huán),轉(zhuǎn)入Loop后的語句執(zhí)行。8.2.1當型循環(huán)說明:208.2.1當型循環(huán)說明:(3)兩種格式的當型Do…Loop語句對應的流程圖如圖8-2所示,兩者的區(qū)別是:圖8-2(a)表示每一次進入循環(huán),總是先判斷循環(huán)條件是否為“True”,然后再決定是否進入執(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)進入循環(huán),其循環(huán)次數(shù)和對應的圖8-2(b)循環(huán)次數(shù)相等。(a)DoWhile…Loop結(jié)構(gòu)流程圖
(b)Do…LoopWhile結(jié)構(gòu)流程圖
8.2.1當型循環(huán)說明:(a)DoWhile…Loop218.2.1當型循環(huán)說明:(4)Do…Loop語句中可以在任何位置放置任意個數(shù)的ExitDo語句,隨時跳出Do…Loop循環(huán)。ExitDo只能用于Do…Loop語句中,通常用于條件判斷之后。如以下代碼中沒有設置循環(huán)條件,而采用在循環(huán)體中有條件的跳出來設置循環(huán)終止條件。
DimiAsInteger
i=1
Do
Printi;
i=i+1
Ifi>10ThenExitDo
Loop8.2.1當型循環(huán)說明:228.2.1當型循環(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)”。
提示
當程序進入“死循環(huán)”或長時間執(zhí)行某過程時,用戶可以使用Ctrl+Break鍵強行中斷程序的運行,將程序從運行狀態(tài)改為設計狀態(tài),并釋放程序運行中的臨時資源。
8.2.1當型循環(huán)說明:238.2.1當型循環(huán)說明:(6)可以將For…Next語句改寫成Do…Loop語句,但僅有已知循環(huán)次數(shù)的Do…Loop語句才可以改寫成For…Next語句。在For…Next語句中,格式中包含了對循環(huán)變量的賦初值、設置循環(huán)進行的條件及循環(huán)變量按步長變化等操作,這些在Do…Loop語句中都需要編程人員一一考慮并用語句設置。
8.2.1當型循環(huán)說明:248.2.1當型循環(huán)例8-3
驗證谷角猜想。對于任意一個自然數(shù)n,若n為偶數(shù),則將其除以2;若n為奇數(shù),則將其乘以3,然后再加1。如此經(jīng)過有限次運算后,總可以得到自然數(shù)1。
分析:由于不能確定要多少步才能結(jié)束運算,因此本題中采用當型Do…Loop循環(huán)語句實現(xiàn)。使用變量n存放該正整數(shù),每次重新計算出的新值仍然存放在n中。當n未達到1時繼續(xù)執(zhí)行運算,當n等于1時結(jié)束循環(huán)。
8.2.1當型循環(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)條件]功能:當循環(huán)條件為False時,重復執(zhí)行語句塊中的命令;當循環(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語句格式中的組成和當型Do…Loop語句格式基本一致,兩者的區(qū)別是兩者的循環(huán)條件正好相反。
大部分當型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ù)進行取整可以將用戶輸入的實數(shù)類型數(shù)據(jù)轉(zhuǎn)換為整數(shù)
使用一個Do…Loop循環(huán)對負數(shù)進行過濾,并由用戶選擇是否繼續(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)使用完全類似于當型Do…Loop循環(huán)語句的格式1
8.3While…Wend語句語句格式:在窗體上輸出1348.4GoTo語句
語句格式如下:GoTo標簽其中標簽無需定義,是在一行語句的開頭用冒號和語句隔開的標識符。
說明:(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不恰當?shù)腉oTo語句將使程序陷入死循環(huán)C:Fori=1To9Print"*"Ifi>5ThenGoToCNexti
8.4GoTo語句(3)在循環(huán)語句中使用GoTo語句,既378.4GoTo語句(4)結(jié)構(gòu)化程序設計中并不建議使用GoTo語句來控制程序流程,因為它會使程序流程復雜化。
8.4GoTo語句(4)結(jié)構(gòu)化程序設計中并不建議使用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)進行嵌套時,要注意循環(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)進行嵌套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進制轉(zhuǎn)換8.6.8圖形字符的打印
8.6常用算法及實例8.6.1累加(乘)458.6.1累加(乘)累加(乘)是指在某個值的基礎(chǔ)上一次又一次的加上(乘以)一些數(shù)。累加(乘)的結(jié)果是運算最終的目標,通常只需使用一個變量來存放在各次運算結(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進行累乘運算。同樣的,也可以總結(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:給存放最大(小)值的變量賦初值。
步驟2:取n個數(shù)中的一個數(shù)和最大(小)值變量比較,若大于最大值變量(小于最小值變量),則將該數(shù)賦值給最大(?。┲底兞?。
步驟3:重復步驟2,直至所有數(shù)都比較完成。
8.6.2求最值最值問題一般表現(xiàn)為求n個數(shù)中的最大(小52程序舉例例8-8
使用隨機函數(shù)生成30個學生的數(shù)學成績,并求其中的最高分。
分析:百分制分數(shù)的范圍是0~100,設最大值變量max的初值為0,以保證在第1次數(shù)據(jù)比較時就能使max等于第一個數(shù)。
程序舉例例8-8使用隨機函數(shù)生成30個學生的數(shù)學成績,并53例8-8PrivateSubForm_Click()DimgradeAsInteger,iAsInteger,maxAsIntegerPrint"30個學生的數(shù)學成績是:"max=0 '設置最大值為一個相對小的數(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比較。改進:PrivateSubForm_Click()DimgradeAsInteger,iAsInteger,maxAsIntegerPrint"30個學生的數(shù)學成績是:"grad=Int(101*Rnd) '生成第一個成績Printgrad;max=grad '設置最大值為第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ù)一一進行判斷。搜索范圍的確定是窮舉法的關(guān)鍵,一旦確定了范圍,使用常規(guī)的循環(huán)語句即可解決問題。1.組合問題
2.素數(shù)問題
8.6.3窮舉法窮舉法主要通過將可能出現(xiàn)解的范圍中所有561.組合問題
組合問題一般體現(xiàn)在要求符合條件的所有組合情況,此類問題的關(guān)鍵是要按一定的順序進行窮舉,避免遺漏。
例8-9
求由數(shù)字0、1、2、3、4組成的所有無重復數(shù)字的3位正整數(shù)。
分析:分別對3位數(shù)的3個位數(shù)字進行窮舉,其中百位數(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改進:將搜索范圍縮小到[2,]之間
k=Sqr(x)'這里進行自動轉(zhuǎn)換,等價于四舍五入取整Fori=2TokIfxModi=0ThenExitForNextiIfi>kThenMsgBoxx&"是素數(shù)"ElseMsgBoxx&"不是素數(shù)"EndIf例8-10改進:將搜索范圍縮小到[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ù)學關(guān)系(ai=f(ai-1))時,累加(乘)運算也可采用遞推法來實現(xiàn),這種遞推也稱為迭代法。使用迭代法求累加(乘)中通項ai時,可以避免每次都重新開始計算ai,大大提高程序的效率。3.累加中的遞推在累加(乘)算法中,若ai序列的前后項之間71程序舉例例8-14
用遞推法求解
分析:通項,當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,……,其中是對求導的結(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當程序輸入x的初值為0.5時,結(jié)果顯示近似根為0.5671433。例8-15程序代碼如下:768.6.5字符串遍歷
字符串的遍歷是指逐個訪問字符串中的每一個字符,并對其進行指定的操作。
1.完全遍歷
2.回文字符串
8.6.5字符串遍歷字符串的遍歷是指逐個訪問字符串中的771.完全遍歷
一般的,我們總是從字符串的第一個字符開始訪問,直到最后一個字符,稱為字符串的完全遍歷。經(jīng)常采用以下語句結(jié)構(gòu)進行字符串的遍歷。
Fori=1ToLen(str)
…‘對str中第i個字符Mid(str,i,1)進行處理
Nexti1.完全遍歷一般的,我們總是從字符串的第一個字符開始訪問,78程序舉例例8-16
統(tǒng)計用戶輸入的字符串中字母字符、數(shù)字字符和其他字符的數(shù)量。
程序舉例例8-16統(tǒng)計用戶輸入的字符串中字母字符、數(shù)字字79PrivateSubCmdCount_Click() '統(tǒng)計按鈕的單擊事件DimsAsString,iAsInteger'設置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個輸入的字符進行判斷分類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ù)器加一。當前字符不是空格,它是不是新詞的開始還依賴于前一字符是否空格?!嗵幚聿襟E不能孤立進行,處理方式需要依賴于前面的歷史情況。讀入過程有兩種不同的狀態(tài)(相互轉(zhuǎn)換):
①處在單詞之外(如果遇到非空格字符,那就是新詞)
②正處在某單詞的內(nèi)部(不會遇到新詞)程序舉例例8-18統(tǒng)計文章中共有多少英文單詞。設單詞間使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為當前字符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進制轉(zhuǎn)換
例8-19
實現(xiàn)D進制數(shù)整數(shù)(D<=16)和十進制數(shù)整數(shù)的互換
1.D進制整數(shù)轉(zhuǎn)換成10進制整數(shù)
2.10進制整數(shù)轉(zhuǎn)換成D進制整數(shù)
8.6.7進制轉(zhuǎn)換例8-19實現(xiàn)D進制數(shù)整數(shù)(D<891.D進制整數(shù)轉(zhuǎn)換成10進制整數(shù)
由于D進制數(shù)只能表示成字符串,因此這又是一個對字符串的操作運算。若D進制數(shù)表示成akak?1…a2a1a0,則轉(zhuǎn)換成十進制數(shù)據(jù)的方法是多項式法,如下所示。
也可以表示成
其中后一種表達式中避免了對基數(shù)D的冪指數(shù)的求解,且將求和歸結(jié)為求若干次ai·D+ai?1的過程,這是較為常用的方法。
1.D進制整數(shù)轉(zhuǎn)換成10進制整數(shù)由于D進制數(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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中語文第2單元孟子蚜1王好戰(zhàn)請以戰(zhàn)喻課件新人教版選修先秦諸子蚜
- 2024年吉林省長春市中考英語試題含解析
- 七年級下心理健康教育教案
- 2024年河北省高考生物試卷真題(含答案解析)
- 2024至2030年中國攻瑰茄行業(yè)投資前景及策略咨詢研究報告
- 2024至2030年中國手持式多波長穩(wěn)定光源行業(yè)投資前景及策略咨詢研究報告
- 2024至2030年中國印花T/C純棉休閑襯衫行業(yè)投資前景及策略咨詢研究報告
- 2024年山東省東營市中考語文試題含解析
- 2024年黑龍江省齊齊哈爾市中考語文試題含解析
- 2024年中國鋼絲跑道軸承市場調(diào)查研究報告
- 對外漢語口語入門篇第7課-你身體好嗎
- 新教科版科學六年級上冊知識點
- 眾辰變頻器z2400t-15gy-1說明書
- 農(nóng)業(yè)機械化-課件
- 《中小學心理健康教育和生命健康關(guān)愛工作重點事項清單》
- DB31T 684-2023 養(yǎng)老機構(gòu)照護服務分級要求
- 連續(xù)油管工藝-課件
- 自考《人力資源開發(fā)與管理》近年考試真題題庫匯總(含答案)
- 膜性腎病診治分享演示文稿
- 超聲波安全操作規(guī)程
- 什么時候才能啟動應急預案
評論
0/150
提交評論