程序控制結(jié)構(gòu)與算法基礎(chǔ).ppt
第4章程序控制結(jié)構(gòu)與算法基礎(chǔ),代碼書寫規(guī)則,每個(gè)語(yǔ)句一行,以回車鍵結(jié)束;多個(gè)語(yǔ)句可以寫在同一行上,各語(yǔ)句之間用冒號(hào)(:)進(jìn)行分隔;一條長(zhǎng)語(yǔ)句可以分成多行書寫,在除最后一行之外的其余各行的末尾使用下劃線(_)作為續(xù)行符,并且續(xù)行符與它前面的字符之間至少要有一個(gè)空格;所有語(yǔ)句中的變量名、函數(shù)名、關(guān)鍵字、對(duì)象名、對(duì)象屬性名、對(duì)象方法名等均不區(qū)分大小寫,但保留定義時(shí)所使用的大小寫格式;代碼的物理行最多可含1023個(gè)字符,一個(gè)邏輯行最多可由10個(gè)物理行組成。,自動(dòng)語(yǔ)法檢測(cè),VB的IDE默認(rèn)情況下具有自動(dòng)語(yǔ)法檢測(cè)功能。如果用戶輸入有語(yǔ)法錯(cuò)誤的語(yǔ)句,在按下回車鍵后,系統(tǒng)將彈出一個(gè)出錯(cuò)提示框,并用紅色標(biāo)出有語(yǔ)法錯(cuò)誤的語(yǔ)句。,賦值語(yǔ)句,格式:變量對(duì)象.屬性名=表達(dá)式可以給一個(gè)變量(或?qū)ο蟮膶傩裕┒啻钨x值,但變量中保留的是最后一次的值。累加:B=B+N累乘:C=C*N,交換兩個(gè)變量的值,中間變量法T=AA=BB=T數(shù)值加減法A=A+BB=A-BA=A-B,適合任何兩個(gè)相同類型的變量,適合兩個(gè)數(shù)值類型的變量,賦值相容,相容是指變量或?qū)ο蟮膶傩阅軌蛘_存取賦值號(hào)右邊的表達(dá)式的值。一般要求用于賦值的表達(dá)式的結(jié)果類型與變量的類型保持一致。,示例,DimAAsInteger,BAsLong,CAsSingle,DAsDate,SAsStringA=100B=200C=14.5D=31.4S="3.14"A=S純數(shù)字字符串可以當(dāng)作數(shù)賦給數(shù)值類型的變量B=D日期型數(shù)據(jù)可轉(zhuǎn)換為數(shù)值D=A一個(gè)數(shù)值也可以轉(zhuǎn)換為日期時(shí)間S=C任何類型的數(shù)據(jù)均可給字符串型變量賦值S="XYZ"A=S出錯(cuò),類型不匹配,此外,還可以將數(shù)值(含純數(shù)字字符串)賦值給Boolean類型的變量,所有不等于0的數(shù)值轉(zhuǎn)換為True,0轉(zhuǎn)換為False。將Boolean類型的數(shù)據(jù)賦值給數(shù)值類型的轉(zhuǎn)換方法為:True-1,F(xiàn)alse0,給對(duì)象類型的變量賦值,格式:Set對(duì)象變量=對(duì)象引用,示例DimfrmAsObject定義frm為Object類型的變量Setfrm=Form1將對(duì)窗體Form1的引用賦給frmfrm.Caption="Hello"將窗體Form1的標(biāo)題設(shè)置為“Hello”,暫停、結(jié)束、注釋,暫停:Stop,VB進(jìn)入中斷模式,打開“立即窗口”。Stop語(yǔ)句被執(zhí)行后,并不退出VB系統(tǒng),如果在可執(zhí)行文件(.EXE)中含有Stop語(yǔ)句,則將會(huì)關(guān)閉文件。結(jié)束:End,結(jié)束VB程序執(zhí)行。注釋單引號(hào):?jiǎn)我?hào)后的內(nèi)容為注釋Rem:注釋一整行,算法,程序=數(shù)據(jù)結(jié)構(gòu)+算法算法是解決問題的方法、步驟,是程序的核心。算法的特性確定性能行性有窮性輸入輸出,傳統(tǒng)流程圖,流程圖示例,輸入兩個(gè)數(shù)A與B,求出其中大的數(shù)并輸出。,程序的三種基本結(jié)構(gòu),順序結(jié)構(gòu):按語(yǔ)句書寫順序執(zhí)行。分支結(jié)構(gòu):也叫選擇結(jié)構(gòu),根據(jù)一個(gè)條件決定程序執(zhí)行的走向。循環(huán)結(jié)構(gòu):將某些語(yǔ)句重復(fù)執(zhí)行有限次。,順序結(jié)構(gòu),示例,輸入正方形邊長(zhǎng),求其周長(zhǎng)與面積。,PrivateSubCommand1_Click()DimAAsSingle,LAsSingle,SAsSingleA=Val(Text1.Text)獲取Text1中的內(nèi)容L=4*AS=A2Text2.Text=L在Text2中輸出周長(zhǎng)Text3.Text=S在Text3中輸出面積EndSub,分支結(jié)構(gòu)-If語(yǔ)句,單行結(jié)構(gòu)If語(yǔ)句If條件Then語(yǔ)句AElse語(yǔ)句B塊結(jié)構(gòu)If語(yǔ)句,If條件Then語(yǔ)句塊AElse語(yǔ)句塊BEndIf,If語(yǔ)句流程圖,示例,輸入一個(gè)整數(shù),若為偶數(shù),則輸出“偶數(shù)”,否則輸出“奇數(shù)”。,PrivateSubForm_Click()DimXAsIntegerX=Val(InputBox("輸入一個(gè)整數(shù)A")IfXMod2=0ThenPrint"偶數(shù)"ElsePrint"奇數(shù)"EndSub,說(shuō)明,If語(yǔ)句中的條件一般是一個(gè)邏輯表達(dá)式,也可以是一個(gè)返回值為數(shù)值的表達(dá)式。如果是數(shù)值表達(dá)式,則0對(duì)應(yīng)False,非0的任何數(shù)對(duì)應(yīng)True。If語(yǔ)句中如果條件成立,則執(zhí)行對(duì)應(yīng)的語(yǔ)句或語(yǔ)句塊,然后便跳出條件語(yǔ)句結(jié)構(gòu)。在塊結(jié)構(gòu)的條件語(yǔ)句中,語(yǔ)句塊中的語(yǔ)句不能與Then、Else書寫在同一行上。單行結(jié)構(gòu)的條件語(yǔ)句中不能有EndIf,而塊結(jié)構(gòu)的條件語(yǔ)句中不能缺少EndIf。,練習(xí),輸入一個(gè)三位正整數(shù),判斷其是否為水仙花數(shù)。水仙花數(shù):一個(gè)三位整數(shù)等于其各位數(shù)字的立方和,如153=13+53+33輸入一個(gè)年份,判斷該年是否為閏年。滿足下列條件之一的年份即為閏年年份能被4整除但不能被100整除年份能被400整除,多分支語(yǔ)句-If-ElseIf,If條件1Then語(yǔ)句塊1ElseIf條件2Then語(yǔ)句塊2ElseIf條件3Then語(yǔ)句塊3Else語(yǔ)句塊n+1EndIf,ElseIf中的Else與If之間不能有空格!ElseIf語(yǔ)句的數(shù)量沒有限制!前面的條件成立執(zhí)行對(duì)應(yīng)語(yǔ)句后結(jié)束!,多分支語(yǔ)句-SelectCase,SelectCase測(cè)試表達(dá)式Case表達(dá)式列表1語(yǔ)句組1Case表達(dá)式列表2語(yǔ)句組2Case表達(dá)式列表3語(yǔ)句組3CaseElse語(yǔ)句組n+1EndSelect,SelectCase語(yǔ)句功能,首先計(jì)算出測(cè)試表達(dá)式的值,然后自上而下依次與各個(gè)表達(dá)式列表進(jìn)行比較,如果匹配,則執(zhí)行相應(yīng)的語(yǔ)句組,然后跳到EndSelect后面的語(yǔ)句繼續(xù)執(zhí)行;如果測(cè)試表達(dá)式的值不能與給出的任何一個(gè)表達(dá)式列表匹配,則執(zhí)行CaseElse之后的語(yǔ)句組。如果缺省了CaseElse部分,而測(cè)試表達(dá)式的值不能與給出的任何一個(gè)表達(dá)式列表匹配,則不執(zhí)行任何語(yǔ)句組,直接跳到EndSelect后的語(yǔ)句執(zhí)行。,測(cè)試項(xiàng)的形式,具體的取值(表達(dá)式),值與值之間用逗號(hào)分隔。如:1,3,5,A+B等。連續(xù)的范圍,范圍是用關(guān)鍵字To連接的兩個(gè)值。如:10To20,”A”To“Z”。使用Is關(guān)鍵字構(gòu)成的比較表達(dá)式。如:Is>=10。也可以是上述幾種形式的組合,用逗號(hào)分隔開。,示例,輸入一個(gè)成績(jī),輸出此成績(jī)相應(yīng)的等級(jí)。,PrivateSubCommand1_Click()DimCJAsSingle,DJAsStringCJ=Val(Text1.Text)獲取成績(jī)SelectCaseCJ判斷等級(jí)CaseIs>=90DJ="優(yōu)秀"CaseIs>=80DJ="良好"CaseIs>=70DJ="中等"CaseIs>=60DJ="及格"CaseElseDJ="不及格"EndSelectText2.Text=DJ輸出等級(jí)EndSub,注意在SelectCase語(yǔ)句中,各測(cè)試項(xiàng)執(zhí)行的順序是自上而下依次判斷的,如果執(zhí)行到“CaseIs>=80”,說(shuō)明“Is>=90”已經(jīng)不成立,一定要注意書寫的順序,如果順序混亂,可能導(dǎo)致結(jié)果不正確。,練習(xí),輸入一個(gè)月份,輸出該月有多少天。編寫一個(gè)簡(jiǎn)單計(jì)算器,只要能實(shí)現(xiàn)輥減乘除運(yùn)算即可。,IIf函數(shù),格式:IIf(邏輯表達(dá)式,值1,值2)IIf函數(shù)的功能類似于有兩個(gè)分支的If語(yǔ)句。當(dāng)邏輯表達(dá)式的值為True時(shí),函數(shù)返回值1,當(dāng)邏輯表達(dá)式的值為False時(shí),函數(shù)返回值2。,IfA>BThenMaxData=AElseMaxData=BEndIf可以簡(jiǎn)化為:MaxData=IIf(A>B,A,B),循環(huán)結(jié)構(gòu)-For循環(huán),For循環(huán)也叫計(jì)次循環(huán),格式為:For循環(huán)變量=初值To終值Step步長(zhǎng)循環(huán)體ExitFor循環(huán)體Next循環(huán)變量,說(shuō)明-1,(1)循環(huán)變量。用做循環(huán)計(jì)數(shù)器的數(shù)值變量,不能是布爾類型或數(shù)組元素。(2)初值。循環(huán)變量的初始值,一般是一個(gè)數(shù)值表達(dá)式。(3)終值。循環(huán)變量的終值,一般是一個(gè)數(shù)值表達(dá)式。(4)步長(zhǎng)。循環(huán)變量的增量,一般是一個(gè)數(shù)值表達(dá)式。其值可正可負(fù),但不能為0。步長(zhǎng)可以省略,若省略,則步長(zhǎng)為1。(5)循環(huán)體。放在For和Next之間的一條或多條語(yǔ)句,它們將被執(zhí)行指定的次數(shù)。(6)ExitFor。退出當(dāng)前一層For-Next循環(huán)。循環(huán)中可以在任何位置放置任意個(gè)ExitFor語(yǔ)句,隨時(shí)退出循環(huán)。ExitFor通常在條件判斷之后使用,例如If.Then,并將控制權(quán)轉(zhuǎn)移到緊接在Next之后的語(yǔ)句。(7)Next。循環(huán)結(jié)構(gòu)的最后一個(gè)語(yǔ)句,其后的循環(huán)變量可以缺省,若不缺省,則要與For語(yǔ)句中的循環(huán)變量一致。,說(shuō)明-2,For-Next循環(huán)遵循“先檢查后循環(huán)”的原則。步長(zhǎng)為正,循環(huán)變量初值大于終值時(shí),不循環(huán);步長(zhǎng)為負(fù),循環(huán)變量初值小于終值時(shí),不循環(huán)。,For循環(huán)的執(zhí)行,把初值賦給循環(huán)變量;檢查循環(huán)變量值是否超過終值,若超過,則不執(zhí)行循環(huán)體而轉(zhuǎn)到Next后一條語(yǔ)句執(zhí)行,否則轉(zhuǎn)到3;執(zhí)行一次循環(huán)體;循環(huán)變量=循環(huán)變量+步長(zhǎng);轉(zhuǎn)到2。,超過有兩種情況:若步長(zhǎng)為正,為循環(huán)變量值大于終值;若步長(zhǎng)為負(fù),為循環(huán)變量值小于終值。,示例,求1+2+3+100。,DimIAsInteger,SAsIntegerForI=1To100S=S+INextPrint"1+2+3+.+100="S,循環(huán)結(jié)束后I=?,注意,如果在For循環(huán)中,循環(huán)變量的初值、終值及步長(zhǎng)是用變量表示的,則這些變量在循環(huán)體中的改變不會(huì)影響循環(huán)次數(shù)。,問:如下程序循環(huán)多少次?DimAAsInteger,BAsIntegerDimCAsInteger,IAsIntegerA=1:B=10:C=1ForI=AToBStepCA=A+1B=B-1C=C+1Next,答案:10次,練習(xí),求N!輸入一個(gè)整數(shù),判斷其是否為素?cái)?shù)。素?cái)?shù):一個(gè)整數(shù)除了1與本身之外再無(wú)其他因子。隨機(jī)生成10個(gè)兩位整數(shù)并輸出。找出1000以內(nèi)所有同構(gòu)數(shù)。,循環(huán)結(jié)構(gòu)-Do循環(huán),Do循環(huán)有當(dāng)型與直到型兩種。,DoWhile條件循環(huán)體ExitDo循環(huán)體Loop,Do循環(huán)體ExitDo循環(huán)體LoopWhile條件,DoUntil條件循環(huán)體ExitDo循環(huán)體Loop,Do循環(huán)體ExitDo循環(huán)體LoopUntil條件,當(dāng)型,直到型,說(shuō)明,(1)對(duì)于循環(huán)次數(shù)未知的情況下,Do-Loop循環(huán)十分有用。(2)在DoWhile循環(huán)中,當(dāng)條件為真時(shí),要繼續(xù)循環(huán);在DoUntil循環(huán)中,條件為真時(shí),結(jié)束循環(huán)。(3)在Do-Loop循環(huán)中可以沒有While或Until部分,也稱為無(wú)條件循環(huán),但在循環(huán)體中一定要有ExitDo語(yǔ)句,否則會(huì)造成死循環(huán)。與ExitFor語(yǔ)句一樣,ExitDo語(yǔ)句通常在條件判斷之后使用。(4)ExitDo語(yǔ)句可以退出當(dāng)前一層Do循環(huán),把控制權(quán)轉(zhuǎn)移到Loop語(yǔ)句后的語(yǔ)句。,示例,求兩個(gè)整數(shù)的最大公約數(shù)。經(jīng)典算法:歐幾里德算法,DimMAsInteger,NAsInteger,RAsIntegerM=InputBox("輸入M")N=InputBox("輸入N")R=MModNDoWhileR0M=NN=RR=MModNLoopPrint"最大公約數(shù)為:"N,結(jié)構(gòu)的嵌套,一個(gè)結(jié)構(gòu)把另一個(gè)結(jié)構(gòu)完全包含。注意嵌套的層數(shù)沒有限制。一個(gè)控制結(jié)構(gòu)必須完全位于另一個(gè)結(jié)構(gòu)之內(nèi)。結(jié)構(gòu)層次比較多時(shí),應(yīng)盡可能讓程序呈現(xiàn)鋸齒形。多個(gè)循環(huán)結(jié)構(gòu)嵌套時(shí),注意循環(huán)控制變量的使用。,嵌套中的Exit語(yǔ)句,當(dāng)有多個(gè)Do循環(huán)嵌套時(shí),ExitDo語(yǔ)句只跳出當(dāng)前一層Do循環(huán);當(dāng)有多個(gè)For循環(huán)嵌套時(shí),ExitFor語(yǔ)句只跳出當(dāng)前一層For循環(huán);當(dāng)Do循環(huán)與For循環(huán)嵌套時(shí),使用ExitDo語(yǔ)句可退出Do循環(huán),若內(nèi)層循環(huán)為For循環(huán),則ExitDo語(yǔ)句同時(shí)跳出For循環(huán);使用ExitFor語(yǔ)句可退出For循環(huán),若內(nèi)層循環(huán)為Do循環(huán),則ExitFor語(yǔ)句同時(shí)跳出Do循環(huán)。,練習(xí),隨機(jī)生成十個(gè)能被3整除但不能被5整除的三位整數(shù)。用矩形法求定積分。計(jì)算近似值。,返回,