




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第5章設計循環結構程序1循環結構又稱重復結構。本章主要介紹:邏輯表達式For/Next語句Do/Loop語句While/Wend語句循環的嵌套使用。2循環結構是根據條件來決定某段代碼是否重復執行。循環結構中一種常用的流程可以表示如圖:條件滿足就執行a塊程序段然后再進行條件判別如果滿足條件,則繼續執行a塊程序段直到條件不滿足,才執行a塊后面的程序。5.1概述3其中的a程序塊段稱為循環體。條件使用邏輯表達式。循環的另一種形式是把判斷條件放在循環體之后。4循環結構中有兩個基本問題需要考慮:(1)條件必須明確,能使循環過程正常結束(2)循環體內,必要時可改變控制循環的條件改變可能導致循環結束改變也可能導致循環進入無休止的狀態(死循環)。5循環有兩種類型:計數控制控制累計執行循環體的次數次數已到則結束循環如1+2+3+…+100或98+96+94+…+4+2事態控制由某些條件決定循環結束。如計算一系列正整數之和,遇負數停止循環。也可以在一個循環過程中同時使用這兩種類型6【例5-1】設計一個判斷素數的程序。若不是素數,要求分解為a*b的形式控件:1個文本框和1個命令按鈕事件:命令按鈕的Click。首先要了解什么是素數。素數是指除了1和自身外,不能被其它整數整除的正整數。判斷A是否為素數的基本方法是:將A分別除以2、3、……、A-1,若都不能整除,則它為素數。判斷A被i整除可以采用表達式:AModi=0或:A/i=A\i或:A/i=Int(A/i)5.2判斷素數7OptionExplicit
PrivateSubCommand1_Click()
DimAAsLong,iAsInteger'A存放要判斷的數。i取值為2~A-1
DimFlagAsBoolean'Flag作素數標志,False時,表示不是素數
A=Val(Text1.Text)
Flag=True'先設A是素數,當A<2或能被i整除時,再置為False
IfA<2Then
Flag=False'A<2,不是素數
Else
i=2
DoWhilei<=A-1
IfAModi=0ThenFlag=False:ExitDo'A能被i整除,則不是素數
i=i+1
Loop
EndIf
IfFlagThen
MsgBoxA&"是素數",,"信息"
Else'A表示成兩數之積
MsgBoxA&"不是素數"&Chr(13)&A&"="&i&"*"&A/i,,"信息"
EndIf
EndSub5.2判斷素數----程序8說明:程序中,也可以不設標志變量,在最后判斷i是否超過終值A-1,若超過終值則表示直到循環完成,還沒遇到一個能被整除的整數,即它是素數;否則它就不是素數。當A能被其中一個i整除時,A肯定不是素數,所以沒有必要再測試下一個i,因此使用ExitDo退出循環。在使用ExitDo退出循環的時候,沒有改變i的值,故A能被該i整除,即A可以表示成A=i*(A/i)。事實上只要判斷A能否被2、3、……、Sqr(A)整除即可。9邏輯運算使用邏輯運算符VB提供了多個邏輯運算符,有:非(Not)、與(And)、或(Or)異或(Xor)、等價(Eqv)、蘊含(Imp)。1.基本格式Not為一元運算符,其它均為二元運算符。格式:
Not表達式表達式1邏輯運算符表達式2(除Not外)一個邏輯表達式可用一個或多個邏輯運算符。如:A>0AndB>0AndC>02.數據類型邏輯運算的數據及結果均為布爾類型。5.3進行邏輯運算103.運算方式
4.優先級115.邏輯表達式舉例(1)設變量Name1的值為“王小華”、變量Addr的值為“上海”,則
表達式:Name1=“王小華”OrAddr="杭州"值:True表達式:Name1=“王小華”AndAddr="滬"值:False(2)寫出數學表達式0<x<10對應的VB表達式。
VB表達式應為:x>0Andx<1012(3)描述Name1的值不等于“王小華”的表達式。該表達式可寫為:
Name1<>"王小華"或:NotName1="王小華"(4)X=3、Y=4、Z=5,求表達式X>2XorY<0OrZ>X+1的值。
執行次序如圖所示,最終值為False。13閏年的條件是:能被4整除,但不能被100整除;或能被400整除。設變量Y存放年份,則該邏輯表達式應為:YMod4=0AndYMod100<>0OrYMod400=0【例5-2】設計程序,要求對文本框的年份判斷是否為閏年,并在標簽中顯示相應的信息。14程序代碼如下:
OptionExplicit
PrivateSubCommand1_Click()
DimYAsInteger
IfCommand1.Caption="閏年判斷"Then'閏年判斷
Y=Val(Text1.Text)
IfYMod4=0AndYMod100<>0OrYMod400=0Then
Label1.Caption="是閏年"
Else
Label1.Caption="不是閏年"
EndIf
Command1.Caption="清除"
Else'清除
Text1.Text="":Label1.Caption="":Command1.Caption="閏年判斷"
Text1.SetFocus
EndIf
EndSub5.3進行邏輯運算-閏年判斷155.4.1For/Next語句使用For/Next語句可以方便地實現計數循環For/Next由For語句、循環體、Next語句組成。格式:
For循環控制變量=初值To終值[Step步長]
[循環體]
Next[循環控制變量]5.4使用For/Next循環語句161.執行過程
(1)將初值送至循環控制變量
(2)判斷循環控制變量的值是否超過終值:若未超過終值,執行步驟(3);超過終值執行步驟(5)。
(3)執行循環體。
(4)遇到Next,使循環控制變量加上步長再送入循環控制變量中,轉步驟(2)。
(5)循環終止,執行Next語句后面的語句。
注意:其中“超過終值”不一定是大于終值。172.關于格式省略“Step步長”則默認為“Step1”。初值、終值、步長分別控制循環變量的起始值、終止值和增量。For和Next必須成對出現。Next后若有循環控制變量,則必須與For中的相同。建議Next后不要省略循環控制變量,以有利于閱讀程序183.關于循環體循環體是一條或多條語句可以包括分支結構和循環結構可以寫成一行或多行。循環體中可以引用循環控制變量,也可以不引用。但不要隨便修改循環控制變量的值,以防引起循環混亂。4.強行終止死循環使用Ctrl+Break可以暫停程序運行再使用VB工具欄上的“結束”按鈕終止程序執行。19【例5-3】輸入10個非負整數,求所有偶數之和。
假定存放和的變量為Sum,先讓Sum=0。然后可采用以下方法:
將第1個數送入A,如果A是偶數,則讓Sum加上A,否則Sum不變。
……
將第10個數送入A,如果A是偶數,則讓Sum增加A,否則Sum不變。
最終得到的Sum就是和。由此可見,每步都做著同樣的工作,即:
將第i個數送入A,如果A是偶數,則讓Sum增加A,否則Sum不變。
20
OptionExplicit
PrivateSubCommand1_Click()'輸入10個非負整數,求偶數和。
DimSumAsLong,iAsInteger
DimAAsInteger
Sum=0'賦初值,注意位置
Fori=1To10
A=Val(InputBox("請輸入第"&i&"個數:","輸入非負整數"))
IfAMod2=0ThenSum=Sum+A
Nexti
MsgBox"Sum="&Sum
EndSub
一個好的程序,應該為自己用于累加、累乘等的變量賦初值。21【例5-4】求表達式值。x、n由鍵盤輸入。這是一個求和的例子。它由n項構成,能表示成Sum=Sum+Item的形式第i項等于第i-1項乘以X/(i+1),即Item=Item*X/(i+1)故循環體可由Item=Item*X/(i+1)和Sum=Sum+Item構成。初值問題:Sum初值為0,Item初值應為1。
為防止溢出,Item和Sum聲明為雙精度型。
程序運行結果:
當X=6,N分別為1、2、3時,其和分別為3、9、18。22PrivateSubCommand1_Click()
DimSumAsDouble,ItemAsDouble,iAsInteger
DimNAsInteger,XAsDouble
N=Val(InputBox("請輸入項數:"))
X=Val(InputBox("X="))
Sum=0:Item=1
Fori=1ToN
Item=Item*X/(i+1)
Sum=Sum+Item
Nexti
MsgBox"x/2!+x^2/3!+...="&Sum,,"信息"
EndSub235.4.2ExitFor語句循環中,中途退出循環,稱為跳出循環。跳出For/Next循環的語句就是ExitFor。跳出循環后,將執行Next語句后面的語句。ExitFor語句一般往往與If語句合用。如:
IfA>=2Then'素數判斷
Fori=2ToInt(Sqr(A))
IfAModi=0ThenExitFor'A能被i整除,不是素數,退出For循環
Nexti
Ifi>Int(Sqr(A))Then'表示A不能被2~Int(Sqr(A))中的數整除
PrintA;"是素數"
Else'此時表示程序運行是通過ExitFor轉出來的
PrintA;"不是素數"
EndIf
Else
PrintA;"不是素數"
EndIf245.5.1Do/Loop語句對只知道循環終止條件,可采用Do/Loop循環For/Next語句可改寫成Do/Loop循環,反之則不然。Do/Loop語句有五種表示形式,它們的格式為:
5.5使用Do/Loop循環語句251.執行過程
(1)對格式一和二,VB將先判斷條件,再執行循環體。
(2)對格式三和四,先執行循環體,再判斷條件。循環體至少執行一次。
(3)對用While的語句,當條件滿足(True)時,執行循環體。
(4)對用Until的語句,當條件不滿足(False)時,執行循環體。
(5)格式五的循環體內必須存在ExitDo語句,否則會出現死循環。
若程序運行出現死循環,同樣可用CtrlBreak暫停程序執行。262.關于格式
(1)條件一般應為關系或邏輯表達式,一般應有變量。
(2)Do和Loop必須成對出現3.關于循環體循環體是一條或多條語句可以包括分支結構和循環結構。可以寫成一行或多行。循環體中應有改變循環條件的語句,以避免出現死循環。27PrivateSubCommand1_Click()
DimNAsInteger,ResultAsDouble
DimiAsInteger
N=Val(InputBox("n="))
Result=1
Fori=1ToN
Result=Result*i
Nexti
MsgBoxN&"!="&Result
EndSub0PrivateSubCommand2_Click()
DimNAsInteger,ResultAsDouble
DimiAsInteger
N=Val(InputBox("n="))
Result=1:i=1
DoWhilei<=N
Result=Result*i
i=i+1
Loop
MsgBoxN&"!="&Result
EndSubPrivateSubCommand3_Click()
DimNAsInteger,ResultAsDouble
DimiAsInteger
N=Val(InputBox("n="))
Result=1:i=1
DoUntili>N
Result=Result*i
i=i+1
Loop
MsgBoxN&"!="&Result
EndSubPrivateSubCommand4_Click()
DimNAsInteger,ResultAsDouble
DimiAsInteger
N=Val(InputBox("n="))
Result=1:i=1
Do
Result=Result*i
i=i+1
LoopWhilei<=N
MsgBoxN&“!=”&Result
EndSub5.5.1Do/Loop語句-編程序:求n!28【例5-6】在文本框中輸入兩個整數,求它們的最大公約數和最小公倍數。求最大公約數可用輾轉相除法。該方法的基本思想是使用帶余除法:(1)A除以B,得余數為R1;(2)若R1=0,則B為最大公約數。
若R1≠0,則B賦值給A,R1賦值給B,求余數R2;
若R2≠0,則繼續以上步驟。29(3)經過有限(n+1)步后,Rn+1=0。這時A和B的最大公約數是Rn。最小公倍數為A*B/Rn。該算法循環次數未知,但循環條件已知:余數不為0。因此適用于Do/Loop語句編程。其循環體為:把上一個B作為新的A,把上一個余數作為新的B,求出新余數。305.5.1Do/Loop語句—求最大公約數和最小公倍數PrivateSubCommand1_Click()
DimAAsLong,BAsLong,RAsLong
A=Val(Text1.Text)
B=Val(Text2.Text)
R=AModB
DoWhileR<>0
A=B:B=R
R=AModB
Loop
MsgBox"最大公約數="&B
MsgBox"最小公倍數="&Val(Text1.Text)*Val(Text2.Text)/BEndSub
如果s在兩個文本框中分別輸入351和675,單擊命令按鈕后,得出最大公約數為27,最小公倍數為8775。31【例5-7】編程:輸入一批非負數,當輸入負數時,表示輸入結束。求這批非負數據的最大值、最小值和平均值。由于輸入的個數不確定,故應采用Do/Loop語句。本題關鍵在于如何設置最大值、最小值的初值。32PrivateSubCommand1_Click()
DimXAsInteger,MinAsInteger,MaxAsInteger
DimNAsInteger,AverageAsSingle'N作為計數,存放項數
X=Val(InputBox("X=")):Max=X:Min=X'最大最小值初值
N=0:Average=0
DoWhileX>=0
IfX>MaxThenMax=X
IfX<MinThenMin=X
N=N+1
Average=Average+X'Average暫存數據和,最后再除N
X=Val(InputBox("X="))'從第2個開始輸入
Loop
IfN<>0ThenAverage=Average/N
Print"Max=";Max,"Min=";Min,"Average=";Round(Average,3)EndSub當輸入23、41、35、61、12、1、7、-1后,運行結果:Max=61Min=1Average=25.714335.5.2ExitDo語句ExitDo是跳出Do/Loop循環的語句跳出循環后,將執行Loop語句后面的語句。ExitDo語句同樣也往往與If語句合用如求階乘的程序片斷為:
N=Val(InputBox("n="))
Result=1:i=1
Do
Result=Result*i
i=i+1:Ifi>NThenExitDo
Loop
MsgBoxN&"!="&Result34While/Wend語句的作用與DoWhile條件/循環體/Loop相同。格式:
While條件
[循環體]
Wend執行過程:先計算條件的值,若條件的值為True,執行循環體,否則執行Wend語句后面的語句。While和Wend必須成對出現循環體中必須要有設法改變循環條件的語句While/Wend語句沒有對應的跳出語句。5.6使用While/Wend循環語句35【例5-8】編程:求π的值。有關π的級數公式為:要求逐項累加,直到最后一項<0.0000001時,求π。因沒有確定項數,故可用Do/Loop或While/Wend可設一個變量Sign作為各項的符號,在循環中讓Sign=-Sign,可以達到一次正、一次負的目的。為達到較為精確的值,變量大多聲明為雙精度型36本例中變量Pi、Sum、Item、N、Precision分別存放π、累計和、項值、項中分母值和精度。PrivateSubCommand1_Click()
DimPiAsDouble,SumAsDouble,ItemAsDouble
DimNAsLong,PrecisionAsDouble,SignAsInteger
N=1:Item=1/N:Sum=0:Sign=1
Precision=Val(InputBox(“請輸入精度:”,“輸入數據”,“0.0000001”))
WhileItem>=Precision
Sum=Sum+Sign*Item
N=N+2
Item=1/N
Sign=-Sign
Wend
Pi=4*Sum
Print“π=”;Pi
EndSub
在單擊命令按鈕后,若精度用缺省值0.0000001,則顯示=3.1415924535898。37循環結構中可以嵌套循環當循環體中包含了循環時,稱為循環嵌套,或稱為多重循環。循環體中包含的循環語句可以與外循環相同,也可以不同。嵌套一層稱為二重循環。多重循環中遇到ExitFor(Do),只能跳出當前一層循環。5.7如何實現多重循環控制38【例5-9】窗體上顯示3~100之間的所有素數。每行顯示5個。前面的例子中判斷A是否為素數是一重循環。現讓A分別等于3、5、7、……、97、99就可以了。為了每行顯示5個,設置一個計數變量Count。PrivateSubCommand1_Click()
DimAAsInteger,iAsInteger,CountAsInteger
Count=0'素數個數計數變量
Print"以下數據為素數:"
ForA=3To99Step2
Fori=2ToInt(Sqr(A))
IfAModi=0ThenExitFor'被整除
Nexti
Ifi>Int(Sqr(A))Then
Count=Count+1:PrintA,
IfCountMod5=0ThenPrint'換行
EndIf
NextA
EndSub39【例5-10】
在窗體上如圖圖案,它由“*”組成。分析:上三角形中,第I行有I個,可使用循環:ForJ=1ToI:Print"*";:NextJ因每行起點不同,而且一行結束后要換行,所以在J循環的前后各有一Print。這樣的行有7行,故外循環使I從1至7。下三角形,操作過程與上三角相似40PrivateSubCommand1_Click()
DimIAsInteger,JAsInteger
Cls
ForI=1To7
PrintSpc(20-I);'打印時空20-i格
ForJ=1ToI
Print"*";
NextJ
Print'用于換行
NextI
ForI=6To1Step-1
PrintSpc(20-I);
ForJ=1ToI
Print"*";
NextJ
NextI
EndSub
5.7如何實現多重循環控制-顯示圖案415.8.1遞推法【例5-11】
有一個數列,前兩項是1、1,第三項是前二項之和,以后每一項都是前二項之和。即為:1、1、2、3、5、8、13、21,34……。要求輸出該數列的前30項。該數列又稱斐波那契數列。由“兔子問題”引發這是一個遞推問題所謂遞推關系是指一串函數之間的關系,它把每一個函數表示為前k個函數的線性組合。本題中k=2。解決遞推問題必須具備兩個條件:
(1)
有初始值,如F1=1、F2=1
(2)
存在遞推關系。如Fn=Fn-1+Fn-2(n>2)在程序中一般設置二或三個變量就可以了。程序中用F1、F2、F3表示三個數,在循環中,它們不斷用新值代替舊值。這種操作稱為迭代,5.8程序舉例42程序代碼如下:
PrivateSubCommand1_Click()
DimF1AsLong,F2AsLong,F3AsLong
DimiAsInteger
Cls
F1=1:F2=1
PrintF1,F2,
Fori=3To30
F3=F1+F2
PrintF3,
IfiMod4=0ThenPrint'每行顯示4個數
F1=F2:F2=F3'用新值代替舊值
Next
EndSubF1和F2始終作為前兩個數,F3作為新產生的數因第24個月兔子數已超過32767對,故變量聲明為Long435.8.2窮舉法【例5-12】
我國古代數學家在《算經》中出了一道題:“雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一。百錢買百雞,問雞翁、母、雛各幾何?”即:當時用100元錢買100只雞,其中公雞每只5元,母雞每只3元,小雞3只1元,問可買公雞、母雞、小雞各多少只?設公雞X只,母雞Y只,小雞Z只,列出方程式:
X+Y+Z=100
5X+3Y+Z/3=1002個方程求3個未知數,無法用代數方法求解可將X、Y、Z分別為0~100的每一種可能性都去試一下,如符合,則就是其中的一種購買方案。列舉所有可能的方案,找出符合要求的,這樣的算法稱為窮舉法。44可測試方案分別為: 0、0、0;0、0、1;……;0、0、100;1、0、0;1、0、1;……;1、0、100;……;100、100、0;100、100、1;……;100、100、100事實上當X和Y確定時,Z可以用100-X-Y求得,因此可以把三重循環改為二重循環。
PrivateSubCommand1_Click()
DimXAsInteger,YAsInteger,ZAsInteger
Print"公雞","母雞","小雞"
ForX=0To100
ForY=0To100
Z=100-X-Y
If5*X+3*Y+Z/3=100ThenPrintX,Y,Z
NextY
NextX
EndSub事實上X和Y的循環可分別為0到20和0到33455.8.3求水仙花數【例5-13】
求數100~999所有滿足:數X=數X個位、十位、百位的立方和。如:153=1*1*1+5*5*5+3*3*3說明:該程序主要是能分出個位、十位、百位PrivateSubCommand1_Click()
DimiAsInteger
DimN1AsInteger,N2AsInteger,N3AsInteger
Fori=100To999
N1=i\100 '求百位
N2=(i-N1*100)\10 '求十位
N3=iMod10 '求個位
Ifi=N1^3+N2^3+N3^3Then '計算水仙花數
Printi;"=";N1;"^3+";N2;"^3+";N3;"^3"
EndIf
Next
EndSub
465.8.4驗證哥德巴赫猜想【例5-14】
輸入一個大于等于6的偶數,將它分解為兩個素數之和。對每一個大于等于6的偶數N都可表示成:N=3+(N-3)、N=4+(N-4)、N=5+(N-5)、……、N=(N-3)+3,即A、B的范圍為3~N-3由于大于2的偶數不是素數,處理前可以去掉這些數,由于3+(N-3)和(N-3)+3是一致的,故A的范圍為3~N/2,B=N-A。程序設計思路:當輸入一個大于等于6的偶數N后,讓A在3~N/2的奇數范圍內循環,若A是素數,則求出B=N-A,再判斷B是否為素數,若B也是素數,則輸出A和B。47PrivateSubCommand1_Click()
DimAAsLong,BAsLong,NAsLong,iAsInteger,jAsInteger
Do'該循環是為了必須獲得一個大于等于6的偶數
N=Val(InputBox("請輸入一個大于6的偶數"))
Print"輸入的數為"&N
LoopWhileN/2<>N\2OrN<6
ForA=3ToN/2Step2'步長為2是只判斷偶數
Fori=2ToSqr(A)'判斷A是否為素數
IfAModi=0ThenExitFor
Nexti
Ifi>Sqr(A)Then'若A是素數
B=N-A'求出B
Forj=2ToSqr(B)'判斷B是否也為素數
IfBModj=0ThenExitFor
Nextj
Ifj>Sqr(B)Then'若B也是素數
Pri
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學美術學科培訓
- ICU護理學習文獻匯報
- 電梯安全知識教育
- 建筑企業質量安全月培訓
- 海關監管體系課件
- 個人舞蹈教室租賃合同模板
- 罐頭食品HACCP體系評估與優化合同
- 企業股權收購撤銷及利益分配合同
- 餐飲行業食品安全事故處理協議
- 知名餐飲品牌總經理任職及品牌推廣合同
- 公益性公墓建設實施方案(3篇)
- 2023年貴州貴州賴茅酒業有限公司招聘考試真題
- 合并財務報表格式(2019版)
- 心臟射頻消融術
- 《商務郵件禮儀》課件
- 《配電自動化系統》課件
- 創業基礎理論與實務(寧波財經學院)知到智慧樹章節答案
- 《某飛機場物業管理服務方案》
- 《讓子彈飛》電影賞析
- 移動OA系統建設方案
- DB34T∕ 2423-2015 安徽省城市道路交叉口信號控制設計規范
評論
0/150
提交評論