第四章VB程序設(shè)計(jì)概述§41結(jié)構(gòu)化程序設(shè)計(jì)課件_第1頁
第四章VB程序設(shè)計(jì)概述§41結(jié)構(gòu)化程序設(shè)計(jì)課件_第2頁
第四章VB程序設(shè)計(jì)概述§41結(jié)構(gòu)化程序設(shè)計(jì)課件_第3頁
第四章VB程序設(shè)計(jì)概述§41結(jié)構(gòu)化程序設(shè)計(jì)課件_第4頁
第四章VB程序設(shè)計(jì)概述§41結(jié)構(gòu)化程序設(shè)計(jì)課件_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第四章VB程序設(shè)計(jì)概述§4.1結(jié)構(gòu)化程序設(shè)計(jì)§4.2順序結(jié)構(gòu)§4.4循環(huán)結(jié)構(gòu)§4.3選擇結(jié)構(gòu)§4.5綜合應(yīng)用程序舉例第四章VB程序設(shè)計(jì)概述§4.1結(jié)構(gòu)化程序設(shè)計(jì)14.1結(jié)構(gòu)化程序設(shè)計(jì)程序設(shè)計(jì)方法經(jīng)歷了手工編程、結(jié)構(gòu)化程序設(shè)計(jì)方法和面向?qū)ο蟮某绦蛟O(shè)計(jì)方法幾個(gè)階段。VB作為一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,既繼承了結(jié)構(gòu)化程序設(shè)計(jì)的優(yōu)點(diǎn),又采用了面向?qū)ο?、事件?qū)動的編程機(jī)制。就整個(gè)工程來說,它是由許多面向?qū)ο蟮氖录^程組成的,程序運(yùn)行過程中通過觸發(fā)事件,驅(qū)動執(zhí)行相應(yīng)的事件過程來實(shí)現(xiàn)程序員的意圖。4.1結(jié)構(gòu)化程序設(shè)計(jì)程序設(shè)計(jì)方法經(jīng)歷了手工編程、結(jié)構(gòu)化程序24.1.1算法及其表示算法是解決問題的方法和步驟。要用計(jì)算機(jī)來解決一個(gè)實(shí)際問題,編程時(shí),首先要設(shè)計(jì)解決這個(gè)問題的算法(方法和步驟)。 例將兩個(gè)變量x和y的值進(jìn)行交換,設(shè)x=10,y=20。分析:變量是存儲單元的代名詞,存儲器可以反復(fù)地“讀”,“寫”,如果直接交換,即x=y:y=x,則x原來的值被覆蓋其結(jié)果x和y的值都是20。在此可借助一個(gè)中間變量t作為一個(gè)臨時(shí)的“容器”。算法為:步驟1:將x的值暫存在t中;步驟2:將y的值存入x中;步驟3:將t的值存入y中。4.1.1算法及其表示算法是解決問題的方法和步驟。要用計(jì)3算法的幾種表示方法:自然語言、偽代碼、PAD圖、流程圖、N-S結(jié)構(gòu)流程圖等等。流程圖也稱為框圖,它是用一些幾何圖形、流向線和文字說明來表示各種類型的操作。常用的幾種圖符如圖所示。4.1.1算法及其表示算法的幾種表示方法:4.1.1算法及其表示4表示任務(wù)的開始或結(jié)束表示任務(wù)中的命令序列表示任務(wù)執(zhí)行的走向表示對條件進(jìn)行判斷2連接點(diǎn)處理框表示任務(wù)的開始或結(jié)束表示任務(wù)中的命令序列表示任務(wù)執(zhí)行的走向表5開始打開電腦打開IE鍵入按Enter鍵結(jié)束開始星期六天晴?結(jié)束去燒烤Y去自習(xí)N來看兩個(gè)小例子:開始打開電腦打開IE鍵入按64.1.2結(jié)構(gòu)化程序設(shè)計(jì)結(jié)構(gòu)化程序設(shè)計(jì)基本思想之一:任何程序都可以采用順序、選擇、循環(huán)三種基本結(jié)構(gòu)來構(gòu)造。這三種結(jié)構(gòu)可以任意組合、嵌套,構(gòu)造各種復(fù)雜的程序?;窘Y(jié)構(gòu)只有一個(gè)入口和一個(gè)出口。1、順序結(jié)構(gòu):程序流程按照一個(gè)方向進(jìn)行,依次執(zhí)行各語句。2、選擇結(jié)構(gòu):程序流程出現(xiàn)一個(gè)或多個(gè)分支,按一定的條件選擇其中之一執(zhí)行,也叫分支結(jié)構(gòu)。中間可以有兩條或多條分支。4.1.2結(jié)構(gòu)化程序設(shè)計(jì)結(jié)構(gòu)化程序設(shè)計(jì)基本思想之一:任何程74.1.2結(jié)構(gòu)化程序設(shè)計(jì)3、循環(huán)結(jié)構(gòu):程序流程按一定的條件重復(fù)多次執(zhí)行一段程序(循環(huán)體)。循環(huán)結(jié)構(gòu)按退出循環(huán)的條件可分為當(dāng)型(While)循環(huán)結(jié)構(gòu)和直到型(Until)循環(huán)結(jié)構(gòu)。有效的循環(huán)只允許有限次的重復(fù)。當(dāng)型循環(huán):條件成立時(shí)執(zhí)行循環(huán)體,條件不成立時(shí)退出循環(huán);直到型循環(huán):條件不成立時(shí)執(zhí)行循環(huán)體,條件成立時(shí)退出循環(huán)。當(dāng)型循環(huán)直到循環(huán)4.1.2結(jié)構(gòu)化程序設(shè)計(jì)3、循環(huán)結(jié)構(gòu):程序流程按一定的條件84.1.2結(jié)構(gòu)化程序設(shè)計(jì)三種基本結(jié)構(gòu)有如下共同特點(diǎn):只有一個(gè)入口,一個(gè)出口。無死語句,所謂“死語句”是指始終執(zhí)行不到的語句。無死循環(huán),即循環(huán)次數(shù)是有限的。4.1.2結(jié)構(gòu)化程序設(shè)計(jì)三種基本結(jié)構(gòu)有如下共同特點(diǎn):94.2順序結(jié)構(gòu)順序結(jié)構(gòu)是一種最簡單的算法結(jié)構(gòu),也是程序設(shè)計(jì)中最簡單、最常用得基本結(jié)構(gòu)。其特點(diǎn)是:算法的每一個(gè)操作按照各自出現(xiàn)的先后順序從上到下線性執(zhí)行。用程序處理實(shí)際問題時(shí),常常需要用戶輸入數(shù)據(jù)或要求程序輸出數(shù)據(jù)。下面介紹幾個(gè)語句,并由它們組成順序結(jié)構(gòu)。這些語句包括賦值語句、輸入輸出語句等。4.2順序結(jié)構(gòu)順序結(jié)構(gòu)是一種最簡單的算法結(jié)構(gòu),也是10§4.2.1賦值語句格式:目標(biāo)操作符=源操作符功能:把源操作符的值賦給目標(biāo)操作符。源操作符:變量、表達(dá)式、常量及帶有屬性的對象目標(biāo)操作符:變量和帶有屬性的對象

=:賦值號例:

Data=15Text1.text=Str(Data)x=x+2S$=“Welcome”§4.2.1賦值語句格式:目標(biāo)操作符=源操作符11注意:(1)賦值語句兼有計(jì)算和賦值雙重功能;(2)“=”是賦值號,與數(shù)學(xué)上的等號意義不同;(3)“目標(biāo)操作符”和“源操作符”的數(shù)據(jù)類型通常要求一致,但VB提供的對某些數(shù)據(jù)類型的自動轉(zhuǎn)換機(jī)制,可強(qiáng)制變量轉(zhuǎn)換為適當(dāng)?shù)臄?shù)據(jù)類型。賦值兼容與數(shù)據(jù)溢出注意:賦值兼容與數(shù)據(jù)溢出12§4.2.4注釋、暫停與程序結(jié)束格式:‘注釋內(nèi)容或Rem注釋內(nèi)容(1)注釋語句是非執(zhí)行語句。(2)任何字符均可放在注釋語句中作為注釋內(nèi)容。示例:‘ThisisateststatementRem計(jì)算圓的周長

a=3:b=4:c=5‘a(chǎn),b,c為三角形的邊注釋語句§4.2.4注釋、暫停與程序結(jié)束格式:‘注釋內(nèi)容13暫停語句格式:Stop說明:(1)可放置在過程中的任何地方,相當(dāng)于在程序代碼中設(shè)置斷點(diǎn),類似于執(zhí)行“運(yùn)行”菜單中的“中斷”命令。(2)執(zhí)行Stop語句時(shí),系統(tǒng)將自動打開“立即窗口”,方便程序員調(diào)試跟蹤程序。(3)程序調(diào)試結(jié)束后,生成可執(zhí)行文件之前,應(yīng)刪除代碼中的所有Stop語句。暫停語句格式:Stop14結(jié)束語句格式:End功能:通常用來結(jié)束一個(gè)程序的執(zhí)行。在不同環(huán)境下的其他用途:EndSub:結(jié)束一個(gè)Sub過程;EndFunction:結(jié)束一個(gè)Function過程;EndIf:結(jié)束一個(gè)If語句塊;EndType:結(jié)束記錄類型的定義;EndSelect:結(jié)束情況語句。結(jié)束語句格式:End15§4.2.2數(shù)據(jù)輸入InputBox函數(shù)格式:Inputbox[$](prompt[,title][,default][,xpos,ypos][,helpfile,context])參數(shù)說明:(1)xpos:指定對話框的左邊與屏幕左邊的距離;(2)ypos:指定對話框的上邊與屏幕上邊的距離;(3)helpfile:字符串表達(dá)式,識別幫助文件,用該文件為對話框提供上下文相關(guān)的幫助;(4)context:數(shù)值表達(dá)式,由幫助文件的作者指定給某個(gè)幫助主題的幫助上下文編號,它與Helpfile參數(shù)必須同時(shí)提供或省略;§4.2.2數(shù)據(jù)輸入InputBox函數(shù)格式:In16Inputbox[$](prompt[,title][,default])(1)prompt:對話框中的提示消息字符串表達(dá)式;(2)title:對話框標(biāo)題欄中的字符串表達(dá)式;(3)default:文本框中的字符串表達(dá)式,在無其它輸入時(shí)作為缺省值;若省略default,則文本框?yàn)榭铡?biāo)題提示字符串用戶輸入?yún)^(qū)默認(rèn)值Inputbox[$](prompt[,title][,de17【例】設(shè)計(jì)一個(gè)程序,由用戶輸入一個(gè)華氏溫度F,程序可將其轉(zhuǎn)換為攝氏溫度C。轉(zhuǎn)換公式為C=5/9*(F-32)PrivateSubCommand1_Click()

EndSubPrivateSubCommand2_Click()EndEndSubDimFAsLong,CAsLongF=Val(InputBox("請輸入華氏溫度","例4-1"))C=5/9*(F-32)Text1.Text=FText2.Text=C華氏攝氏溫度互換【例】設(shè)計(jì)一個(gè)程序,由用戶輸入一個(gè)華氏溫度F,程序可將其轉(zhuǎn)18§4.2.3數(shù)據(jù)輸出Print方法格式:[對象名.]Print[表達(dá)式表]說明:

(1)“對象名”可以是窗體、立即窗口、圖片框、打印機(jī)等的名稱(Name屬性),若省略對象名在當(dāng)前窗體上輸出;(2)“表達(dá)式表”是一個(gè)或多個(gè)表達(dá)式,可為數(shù)值表達(dá)式(求出表達(dá)式的值然后輸出)或字符串(原樣輸出)。如若省略,則輸出一空行;(3)多個(gè)表達(dá)式之間可以用以下分隔符隔開:“,”:標(biāo)準(zhǔn)輸出格式,每14

列作為一個(gè)輸出區(qū)段“

;“:緊湊格式輸出(4)當(dāng)輸出數(shù)值數(shù)據(jù)時(shí),數(shù)值的前面有一個(gè)符號位,后面有一個(gè)空格,而字符串前后都沒有空格?!?.2.3數(shù)據(jù)輸出Print方法格式:[191218161519151614列為1個(gè)輸出區(qū)1218161519151614列為120與Print方法有關(guān)的函數(shù)Tab[(n)]功能:與Print方法一起使用,在參數(shù)n指定的位置輸出其后的表達(dá)式的值。說明:

(1)n是數(shù)值表達(dá)式,值為整數(shù),若省略,則將輸出點(diǎn)移動到下一個(gè)輸出區(qū)(每個(gè)輸出區(qū)占14列)的起點(diǎn);(2)若n小于1,則tab將輸出位置移動到第1列;(3)一個(gè)print方法中使用多個(gè)Tab函數(shù)時(shí),每個(gè)Tab函數(shù)對應(yīng)一個(gè)輸出項(xiàng),各項(xiàng)之間用分號隔開。如:PrintTab(10);“Good”;tab(26);”Morning” 與Print方法有關(guān)的函數(shù)Tab[(n)]21Spc(n)功能:與Print方法一起使用,使光標(biāo)從當(dāng)前位置跳過n個(gè)空格,對輸出進(jìn)行定位。注意:

(1)Tab函數(shù)中的n:相對于屏幕最左端第1列而言的列號;(2)Spc函數(shù)中的n:相對于前一輸出項(xiàng)的最后1

個(gè)字符所在列而言跳過的空格數(shù)。Tab函數(shù)與Spc函數(shù)的比較Spc(n)注意:Tab函數(shù)與Spc函數(shù)的比較2241520101641520101623Format[$](數(shù)值表達(dá)式,格式字符串)功能:使數(shù)值表達(dá)式的值按“格式字符串”制定的某種格式輸出。(1)數(shù)值格式化輸出:見P61表4-2

(2)日期和時(shí)間格式化輸出:見P61表4-3

Format[$](數(shù)值表達(dá)式,格式字符串)24例①

PrintFormat(12345.6,“###,###.##”)

輸出:12,345.6例①PrintFormat(12345.6,“###,25例②

PrintFormat(Now,“yyyy年m月dd日hh:mm”)輸出:2007年4月12日例②PrintFormat(Now,“yyyy年m月d26MsgBox函數(shù)和MsgBox語句格式:

MsgBox(msg[,type][,title])MsgBox函數(shù)

標(biāo)題提示字符串由Type指定的按鈕數(shù)目、形式和圖標(biāo)MsgBox函數(shù)和MsgBox語句格式:27

MsgBox函數(shù)的返回值是1~7的整數(shù)(或相應(yīng)的符號常量),分別對應(yīng)7種命令按鈕(見P63表4-5)。函數(shù)功能是,根據(jù)接收到的用戶響應(yīng)信息,決定程序下一步進(jìn)行的操作。MsgBox(msg[,[type][,title]])參數(shù)說明:

(1)msg:對話框提示消息字符串;`

(2)type:整數(shù)值或字符常量,用來控制在對話框內(nèi)顯示的按鈕、圖標(biāo)的種類及數(shù)量;(見P63表4-4)(3)title:對話框的標(biāo)題字符串。MsgBox函數(shù)的返回值是1~7的整數(shù)(或28第四章VB程序設(shè)計(jì)概述§429第四章VB程序設(shè)計(jì)概述§430MsgBox語句格式:MsgBoxMsg$,[type][,title]說明:(1)各參數(shù)的含義及作用與MsgBox函數(shù)相同;(2)但MsgBox語句沒有返回值,它僅是一個(gè)簡單語句,因此常被用于簡單的信息顯示。

由MsgBox函數(shù)或MsgBox語句所顯示的對話框有一個(gè)共同特點(diǎn):在出現(xiàn)對話框后,用戶必須作出選擇,否則不能執(zhí)行其他任何操作。MsgboxMsgBox語句格式:MsgBoxMsg$31§4.3選擇結(jié)構(gòu)特點(diǎn):根據(jù)給定的條件是否滿足,來決定下一步所要執(zhí)行的操作?!纠咳绻瞧谔焯烨纾覀兙腿g陽河邊燒烤;否則,我們就在教室自習(xí)。?三種形式:

單行結(jié)構(gòu)、塊結(jié)構(gòu)、多分支結(jié)構(gòu)(情況語句)§4.3選擇結(jié)構(gòu)特點(diǎn):根據(jù)給定的條件是否滿足,來決定32§4.3.1單行結(jié)構(gòu)條件語句【例】如果星期天天晴,我們就去瀏陽河邊燒烤;否則,我們就在教室自習(xí)。if條件then語句1語句2else格式:If<條件>Then<語句1>[Else<語句2>]

其中,“條件”通常是關(guān)系表達(dá)式或邏輯表達(dá)式;“語句1”和“語句2”可以是簡單句或復(fù)合句;Else子句為可選項(xiàng)。§4.3.1單行結(jié)構(gòu)條件語句【例】如果星期天天晴,我33條件條件語句(序列)1True語句1True下一個(gè)語句False下一個(gè)語句語句2Else功能:無ELSE選項(xiàng)

條件取值為“真”,執(zhí)行語句(序列)1;條件取值為“假”,語句(序列)1就不執(zhí)行。

有ELSE選項(xiàng)

條件取值為“真”,執(zhí)行語句1;條件取值為“假”,執(zhí)行語句2。條件條件語句(序列)1True語句1True34注意:(1)格式中的If、Then、Else是關(guān)鍵字,并且一定要配對使用;(2)條件一定要是一個(gè)邏輯表達(dá)式,也就是說條件的結(jié)果一定要是真值或假值;(3)語句是條件判斷之后需要執(zhí)行的命令,它可以是一條命令,也可以是一組命令。注意:35【例】試編一個(gè)程序,要求輸入任意兩個(gè)數(shù),然后把它們按照從大到小的順序輸出。開始給a、b賦值a<b?依次輸出a、b值N依次輸出b、a的值YDimA,BAsSinglea=InputBox(“請輸入a的值:”)b=InputBox(“請輸入b的值:”)Ifa<bThenprintb;aElseprinta;b結(jié)束交換a、b的值【例】試編一個(gè)程序,要求輸入任意兩個(gè)數(shù),然后把它36

【例】判斷一個(gè)學(xué)生的成績是否及格。PrivateSubCommand1_Click()Ifval(Text1.text)>60ThenText2="及格"ElseText2="不及格"Endsub【例】判斷一個(gè)學(xué)生的成績是否及格。37簡單的選擇結(jié)構(gòu)可以使用IIf()函數(shù)實(shí)現(xiàn)。格式:IIf(條件,True部分,F(xiàn)alse部分)功能:當(dāng)“條件”為真時(shí),函數(shù)返回值為True部分的值當(dāng)“條件”為假時(shí),函數(shù)返回值為False部分的值說明:(1)條件是邏輯表達(dá)式或關(guān)系表達(dá)式;(2)True部分和False部分是表達(dá)式,它們的返回值必須與結(jié)果變量類型一致。Ifx=1Theny=1Elsey=1/xIIf(x=1,1,1/x)IIF函數(shù)使用簡單的選擇結(jié)構(gòu)可以使用IIf()函數(shù)實(shí)現(xiàn)。說明:If38§4.3.2塊結(jié)構(gòu)條件語句命令格式:If<條件1>Then

<語句塊1>

[ElseIf<條件2>Then

<語句塊2>]………[Else

<語句塊n>]EndIf功能:若“條件1”成立,執(zhí)行“語句塊1”;否則若“條件2”成立,執(zhí)行“語句塊2”;……若上述條件均不成立,執(zhí)行“語句塊n”。注意:(1)嵌套使用(單行或塊嵌套)時(shí),If命令不得交叉;(2)遵循就近配對原則。§4.3.2塊結(jié)構(gòu)條件語句命令格式:If<條件39【例】輸入系數(shù)a,b和c,求二次方程ax2+bx+c=0的實(shí)根。開始輸入a,b,cd=b2-4acd>0d=0Nx=-b/2a輸出xY輸出此方程無實(shí)根N結(jié)束輸出x1,x2Yx1=(-b+d)/2ax2=(-b-d)/2a√√【例】輸入系數(shù)a,b和c,求二次開始輸入a,b,40PrivateSubCommand1_Click()

EndSubDima!,b!,c!,d!,x1!,x2!,x!a=Val(InputBox(“請輸入系數(shù)a:"))b=Val(InputBox(“請輸入系數(shù)b:"))c=Val(InputBox(“請輸入系數(shù)c:"))d=b*b-4*a*cIfd>0Thenx1=(-b+Sqr(d))/(2*a)x2=(-b-Sqr(d))/(2*a)Print"x1=";x1,"x2=";x2Else

Ifd=0Thenx=-b/(2*a)Print"x=";x

ElsePrint"此方程無實(shí)根"

EndIfEndIf程序代碼:語句塊1語句塊2語句塊3PrivateSubCommand1_Click(41例編程求符號函數(shù)sgn(x)的值。

程序代碼如下:PrivateSubCommand1_Click()x=Val(Text1.Text)Ifx>0ThenText2.Text="1"ElseIfx=0ThenText2.Text="0"ElseText2.Text="-1"EndIfEndSub用戶界面例編程求符號函數(shù)sgn(x)的值。42單行形式If語句與多行形式的If語句的區(qū)別。前者適用于簡單的二叉分支的情況,后者適用于多分支的情況。前者可以改寫為后者的形式。前者必須寫在一行中;后者必須寫成多行,并且在關(guān)鍵字“Then”后面必須回車。后者必須是If開頭,EndIf結(jié)束,兩者必須成對出現(xiàn)。但是,前者沒有EndIf。后者中“ElseIf”是一個(gè)關(guān)鍵字,不能寫成“ElseIf”。在多行形式的If語句中,代碼的排版推薦使用縮進(jìn)方式,這樣不僅有利于閱讀程序,也有利于發(fā)現(xiàn)錯、排除錯誤。單行形式If語句與多行形式的If語句的區(qū)別。43§4.3.3情況語句SelectCase<測試表達(dá)式>

Case<表達(dá)式表列1>

[<語句塊1>]

[Case<表達(dá)式表列2>

[<語句塊2>]]……[CaseElse

[<語句塊n>]]EndSelect表達(dá)式表列1語句塊1YEndSelect之后的下一條語句N其它?N表達(dá)式表列2N語句塊nY語句塊2Y§4.3.3情況語句SelectCase44功能:根據(jù)“測試表達(dá)式”的值,從多個(gè)語句塊中選擇符合條件的一個(gè)語句塊執(zhí)行。(最多只選擇執(zhí)行其中一個(gè)命令序列)“表達(dá)式表列”的形式:(1)<表達(dá)式1>[,<表達(dá)式2>]……

測試表達(dá)式的值與其中之一相同,就執(zhí)行該Case子句中的語句塊;例Case2,4,6,8,10(2)<表達(dá)式1>To<表達(dá)式2>當(dāng)測試表達(dá)式的值落在表達(dá)式1和表達(dá)式2之間(含自身),則執(zhí)行該Case子句中的語句塊;(表達(dá)式1<表達(dá)式2)例Case2To10(3)Is<關(guān)系表達(dá)式>當(dāng)測試表達(dá)式的值滿足“關(guān)系表達(dá)式”指定條件時(shí),執(zhí)行該Case子句中的語句塊。功能:根據(jù)“測試表達(dá)式”的值,從多個(gè)語句塊中選擇符合條件的一45PrivateSubCommand1_Click()SelectCaseVal(Text1.Text)CaseIs<0Text2.text="不合理的成績“

CaseIs<60Text2.text="不及格"Case60,61,62,63,64,65,66,67,68,69Text2.text="及格"Case70To89Text2.text="良好"CaseIs<=100Text2.text="優(yōu)秀" CaseelseText2.text="不合理的成績"EndSelectEndSub【例】從鍵盤上輸入學(xué)生成績,然后在文件框中顯示其等級(按5級計(jì)分值輸出“不及格”、“及格”、“中等”、“良好”、“優(yōu)秀”)。方法一:PrivateSubCommand1_Click()【例46PrivateSubCommand1_Click()

EndSubDimscoreAsInteger,strxAsStringstart:score=InputBox(“請輸入學(xué)生成績”)SelectCasescoreCase0To59:strx$=“不及格”

Case60To69:strx$=“及格”

Case70To79:strx$=“中等”

Case80To89:strx$=“良好”

Case90To100:strx$=“優(yōu)秀”

CaseElseMsgBox“請輸入0~100范圍內(nèi)的整數(shù)”,,“出錯提示”

GoTostartEndSelectText1.Text=scoreText2.Text=strx$不可缺少,用于省略Type參數(shù)值例方法二:PrivateSubCommand1_Click474.3.4選擇結(jié)構(gòu)的嵌套在選擇結(jié)構(gòu)的每個(gè)分支中,可以是任何語句,也可以再是一個(gè)分支結(jié)構(gòu)。這種分支結(jié)構(gòu)中包含另一個(gè)分支結(jié)構(gòu)的情況稱為分支嵌套。在分支嵌套中應(yīng)注意的問題:每個(gè)結(jié)構(gòu)必須完整。外層結(jié)構(gòu)必須完全包住內(nèi)層結(jié)構(gòu),不能交叉。內(nèi)層結(jié)構(gòu)應(yīng)采用縮進(jìn)格式,以使層次清楚。例:完善問候程序,要求輸出:xx先生/女士,上午/下午/晚上好!4.3.4選擇結(jié)構(gòu)的嵌套在選擇結(jié)構(gòu)的每48【引例】試求n!(n為自然數(shù))。分析:根據(jù)數(shù)學(xué)知識,自然數(shù)n的階乘為:

n!=1×2×3×…×n=2!×3×…×n=……=(n-1)!n也就是說,一個(gè)自然數(shù)n的階乘,即從1開始連續(xù)地乘以下一個(gè)自然數(shù),直到n為止,亦即等于該自然數(shù)與前一個(gè)自然數(shù)的階乘的乘積?!疽吭嚽髇!(n為自然數(shù))。分析:根據(jù)數(shù)學(xué)知識49顯然,如采用簡單的順序結(jié)構(gòu)進(jìn)行程序設(shè)計(jì),該程序中必然包含大量重復(fù)的語句,處理過程繁瑣而低效。而實(shí)際應(yīng)用中,經(jīng)常會遇到類似情形,一些操作并不復(fù)雜,但需要反復(fù)多次進(jìn)行處理,諸如:人口增長統(tǒng)計(jì)、銀行存款利率計(jì)算等問題,僅簡單依靠順序結(jié)構(gòu)程序設(shè)計(jì),不但程序代碼效率低,有時(shí)甚至是難以實(shí)現(xiàn)的。因此,VisualBasic提供了循環(huán)語句,而利用它構(gòu)造循環(huán)結(jié)構(gòu)的程序來處理類似引例的問題變得相當(dāng)簡易,能達(dá)到事半功倍的效果。顯然,如采用簡單的順序結(jié)構(gòu)進(jìn)行程序設(shè)504.4循環(huán)結(jié)構(gòu)所謂循環(huán)是指對同一個(gè)程序段重復(fù)執(zhí)行若干次,被重復(fù)執(zhí)行的部分稱為循環(huán)體,由若干語句構(gòu)成。循環(huán)必須是有窮的,其循環(huán)控制有兩種情況:當(dāng)已知循環(huán)次數(shù)時(shí),可用循環(huán)次數(shù)控制。有些問題,編程時(shí)并不知道循環(huán)體的執(zhí)行次數(shù),此時(shí),必須根據(jù)某個(gè)條件來判斷何時(shí)結(jié)束循環(huán)。在VB中有多種語句可實(shí)現(xiàn)循環(huán)結(jié)構(gòu),包括For循環(huán)、Do循環(huán)、While循環(huán)和GoTo循環(huán)。4.4循環(huán)結(jié)構(gòu)所謂循環(huán)是指對同一個(gè)程序段重復(fù)執(zhí)行若干次,51一般格式為:For循環(huán)變量=初值To終值[Step步長][循環(huán)體][ExitFor]Next[循環(huán)變量][,循環(huán)變量]……格式說明:(1)循環(huán)變量:循環(huán)過程中的計(jì)數(shù)器;(2)初值和終值:分別為循環(huán)變量的初值和終值,可以相等;(3)步長:循環(huán)變量的增量,是數(shù)值表達(dá)式,如步長為1,可省略;(4)循環(huán)體:在For語句和Next語句之間的語句序列;(5)ExitFor:退出循環(huán);(6)Next:循環(huán)終端語句?!?.4.1For循環(huán)結(jié)構(gòu)一般格式為:For循環(huán)變量=初值To終值[52(1)循環(huán)變量←初值;(2)檢查循環(huán)變量的值是否超過終值:(i)超過,跳出循環(huán),執(zhí)行Next之后的語句;(ii)否則,執(zhí)行一次循環(huán)體,并作如下操作循環(huán)變量←(循環(huán)變量+步長);(3)重復(fù)上述步驟(2)。注意:步驟(2)中的“超過”有兩種含義,分別對應(yīng)于步長為正值和負(fù)值的兩種情況。循環(huán)過程的邏輯流程如下頁圖(a)、(b)所示。

For循環(huán)語句的執(zhí)行過程:(1)循環(huán)變量←初值;(2)檢查循環(huán)變量的值是否超過終值:(53循環(huán)變量=初值循環(huán)變量>終值?循環(huán)變量=循環(huán)變量+步長執(zhí)行循環(huán)體N(a)步長為正數(shù)For-Next循環(huán)的邏輯流程開始(b)步長為負(fù)數(shù)循環(huán)變量=初值循環(huán)變量<終值?執(zhí)行循環(huán)體循環(huán)變量=循環(huán)變量+步長N開始Y結(jié)束Y結(jié)束循環(huán)變量=初值循環(huán)變量>終值?循環(huán)變量=循環(huán)變量+步長執(zhí)行循54【例】某For-Next循環(huán)結(jié)構(gòu)語句如下:

t=0Fori=1to10t=t+iPrintt;Nexti其循環(huán)執(zhí)行過程是:①把初值1賦給循環(huán)變量i;②i值與終值比較,若i>10,轉(zhuǎn)到⑤,否則執(zhí)行循環(huán)體;③i增加一個(gè)步長值,即i=i+1;④返回②繼續(xù)執(zhí)行;⑤執(zhí)行Next后面的語句。循環(huán)變量是i,

循環(huán)初值是1,循環(huán)終值是10,步長為正值1,循環(huán)體包含兩個(gè)語句:

t=t+iPrintt!思考:這個(gè)循環(huán)結(jié)構(gòu)完成什么程序功能?【例】某For-Next循環(huán)結(jié)構(gòu)語句如下:其循55

(1)For語句和Next語句必須成對出現(xiàn),且For語句必須在Next語句之前。(2)For循環(huán)方便實(shí)現(xiàn)對一個(gè)語句序列執(zhí)行固定次數(shù)的循環(huán),其循環(huán)次數(shù)的計(jì)算公式為:循環(huán)次數(shù)=Int(終值-初值)/步長+1。程序設(shè)計(jì)注意點(diǎn):(1)For語句和Next語句必須成對出現(xiàn),且56【例】試求n!(n為自然數(shù))。分析:根據(jù)數(shù)學(xué)知識,自然數(shù)n的階乘為:

n!=1×2×3×…×n=2!×3×…×n=……=(n-1)!n

也就是說,一個(gè)自然數(shù)n的階乘,即從1開始連續(xù)地乘以下一個(gè)自然數(shù),直到n為止,亦即等于該自然數(shù)與前一個(gè)自然數(shù)的階乘的乘積?!纠吭嚽髇!(n為自然數(shù))。分析:根據(jù)數(shù)學(xué)知識,57PrivateSubForm_Click()DimNAsIntegerN=InputBox(“EnterN:”)Result=1

Fori=1ToNResult=Result*iNextiPrintN;”!=”;ResultEndSubVB程序如下:PrivateSubForm_Click()VB58【例】每只公雞價(jià)值5個(gè)錢,每只母雞價(jià)值3個(gè)錢,每3只小雞價(jià)值1個(gè)錢?,F(xiàn)有100個(gè)錢想買100只雞,問公雞、母雞、小雞各應(yīng)買幾只?據(jù)題意,設(shè)x,y,z分別為公雞、母雞、小雞的數(shù)目,則可得到不定方程組:5x+3y+z/3=100x+y+z=100所以,用VB程序解決百錢買百雞問題的過程,就是編程求解下面方程組的過程?!纠棵恐还u價(jià)值5個(gè)錢,每只母雞價(jià)值3個(gè)錢59

那么,對于上述方程組進(jìn)行求解,就是要找到所有那些同時(shí)滿足兩個(gè)方程的參數(shù)x,y,z值的組合,即在某個(gè)參數(shù)值確定的情況下,分別判定另兩個(gè)參數(shù)與之組合能否滿足等式要求。逐個(gè)進(jìn)行重復(fù)操作(即判定)顯然符合使用循環(huán)的條件。然而這里遇到一個(gè)問題,雖然已經(jīng)知道程序中間需要用到循環(huán)結(jié)構(gòu),然而僅僅依靠前面學(xué)習(xí)的單重循環(huán)(即程序中只用一層循環(huán))也無法實(shí)現(xiàn)問題的解答,因?yàn)榉匠虆?shù)有3個(gè)。因此,許多時(shí)候遇到類似的復(fù)雜問題,要實(shí)現(xiàn)求解,就必須用到更復(fù)雜的循環(huán)結(jié)構(gòu),即多重循環(huán)。這就是在程序設(shè)計(jì)中使用循環(huán)的嵌套。那么,對于上述方程組進(jìn)行求解,就是要找到所有60(4)For循環(huán)進(jìn)行嵌套使用時(shí),有基本要求:每個(gè)循環(huán)必須有一個(gè)唯一的變量名作為循環(huán)變量;內(nèi)層循環(huán)的Next語句必須放在外層循環(huán)的Next語句之前,內(nèi)外循環(huán)不得互相騎跨。下例所示嵌套錯誤:Forj=1To5Fori=2To8……NextjNexti騎跨(4)For循環(huán)進(jìn)行嵌套使用時(shí),有基本要求:每個(gè)循61

For-Next循環(huán)的嵌套形式有以下三種:

①一般形式:ForI1=……ForI2=……ForI3=…………NextI3NextI2NextI1②省略Next后的參數(shù):ForI1=……ForI2=……ForI3=…………NextNextNext③內(nèi)外層循環(huán)終點(diǎn)相同時(shí):ForI1=……ForI2=……ForI3=…………NextI3,I2,I1For-Next循環(huán)的嵌套形式有以下三種:①一般形式:62這樣一來,可用循環(huán)嵌套來解決百錢買百雞問題,再次分析題意及方程組:5x+3y+z/3=100x+y+z=100(1)各層循環(huán)的循環(huán)變量初值與終值為1和100;(2)循環(huán)中步長為1;(3)循環(huán)體的內(nèi)容,就是判斷符合方程等式的各組x,y,z值的語句。顯然,各種雞最多可買的數(shù)量為100,所以方程變量x,y,z的取值范圍就是1~100。所以:

由此確定了For循環(huán)中各組成部分,可以進(jìn)行代碼編寫。這樣一來,可用循環(huán)嵌套來解決百錢買百雞問題,63據(jù)此,編寫VB程序如下:PrivateSubForm_Click()EndSub

顯然,這個(gè)三重循環(huán)結(jié)構(gòu)簡單清晰,但程序效率極低,因?yàn)樾枰獔?zhí)行的循環(huán)次數(shù)為:

100×100×100=1,000,000事實(shí)上,稍加分析發(fā)現(xiàn),每重循環(huán)都執(zhí)行100次沒有必要。因?yàn)?00錢最多能買20只公雞,即在最外層循環(huán)最多能執(zhí)行20次,以此類推,可修改程序以減少循環(huán)執(zhí)行次數(shù)!Forx=1To100Fory=1To100Forz=1To100Sum=x+y+zRSum=5*x+3*y+z/3If(Sum=100)And(RSum=100)ThenPrintx,y,zEndIfNextzNextyNextx據(jù)此,編寫VB程序如下:顯然,這個(gè)三重循環(huán)64修改后的VB程序如下:PrivateSubForm_Click()EndSub

循環(huán)次數(shù)大大減少!注意到程序中仍然存在三重循環(huán)嵌套,需要對程序進(jìn)一步優(yōu)化以縮短程序運(yùn)行時(shí)間,提高效率!Forx=0To20Fory=0To34-xForz=0To100Sum=x+y+zRSum=5*x+3*y+z/3If(Sum=100)And(RSum=100)ThenPrintx,y,zEndIfNextzNextyNextx修改后的VB程序如下:循環(huán)次注65優(yōu)化后的VB程序如下:PrivateSubForm_Click()EndSub

使用一個(gè)數(shù)值表達(dá)式,省去最內(nèi)層循環(huán),使三重循環(huán)變?yōu)槎匮h(huán)!

不使用中間變量,直接把條件列入If語句,提高程序代碼質(zhì)量。Forx=0To20

Fory=0To34-xz=100-x-yIf5*x+3*y+z/3=100ThenPrintx,y,zEndIf

NextyNextx優(yōu)化后的VB程序如下:使用一個(gè)數(shù)值表達(dá)式66(5)使用ExitFor語句可以實(shí)現(xiàn)在循環(huán)變量達(dá)到終值前便退出循環(huán),并允許一次或多次地出現(xiàn)在循環(huán)體中的任何位置。但它僅能退出所在的最內(nèi)層循環(huán),如上例:Fori=1to100Forj=1to100Printi+j;Ifi*j>5000ThenExitForNextjNexti(5)使用ExitFor語句可以實(shí)現(xiàn)在循環(huán)變量67(6)For循環(huán)中的“循環(huán)體”是可選項(xiàng),當(dāng)該項(xiàng)默認(rèn)時(shí),執(zhí)行“空循環(huán)”,在實(shí)際運(yùn)用中可實(shí)現(xiàn)暫停操作。當(dāng)循環(huán)結(jié)束時(shí),暫停也相應(yīng)結(jié)束。在某特定條件得到滿足的情況下,按規(guī)定的次數(shù)重復(fù)執(zhí)行一個(gè)語句(序列)。

For循環(huán)實(shí)現(xiàn)的程序功能:(6)For循環(huán)中的“循環(huán)體”是可選項(xiàng),當(dāng)該項(xiàng)默68§4.4.2While循環(huán)結(jié)構(gòu)功能:當(dāng)給定條件為True時(shí),執(zhí)行循環(huán)體。說明:(1)先測試“條件”,再決定是否執(zhí)行循環(huán);(2)循環(huán)體中應(yīng)含有對“條件”的修改操作,使循環(huán)體能正常結(jié)束;否則,會構(gòu)成死循環(huán);(3)循環(huán)可嵌套,不許交叉,每個(gè)Wend和最近的While相匹配。開始計(jì)算“條件”值條件為“真”嗎結(jié)束N循環(huán)體Y格式:

While條件[循環(huán)體]

Wend§4.4.2While循環(huán)結(jié)構(gòu)功能:當(dāng)給定條件為69【例】小紅今年12歲,她父親比她大30歲,編程計(jì)算出她父親在幾年后比她年齡大一倍,那時(shí)父女的年齡各為多少?DimageAsIntegerage=12Whileage*2<>age+30age=age+1WendPrint“經(jīng)過”;age-12;_“年,小紅父女的年齡分別是:”;_age+30;"和";agePrivateSubCommand1_Click()

EndSub【例】小紅今年12歲,她父親比她大30歲,編程計(jì)算出她父70§4.4.3Do循環(huán)結(jié)構(gòu)程序設(shè)計(jì)格式1:Do[While|Until<條件>][<循環(huán)體>][ExitDo]Loop格式2:Do[<循環(huán)體>][ExitDo]Loop[While|Until<條件>]DoWhile···Loop流程圖計(jì)算“條件”值條件“真”嗎循環(huán)體YN開始結(jié)束NYDo···LoopWhile流程圖開始結(jié)束計(jì)算“條件”值循環(huán)體條件“真”嗎YNDo···LoopUntil流程圖開始結(jié)束計(jì)算“條件”值循環(huán)體條件“真”嗎DoUntil···Loop流程圖NY開始結(jié)束計(jì)算“條件”值循環(huán)體條件“真”嗎§4.4.3Do循環(huán)結(jié)構(gòu)程序設(shè)計(jì)格式1:Do71PrivateSubCommand1_Click()

EndSub【例】編寫程序,對任意輸入的正整數(shù)n(n>=3)判斷其是否為素?cái)?shù)。Dimn%,i%,k%n=Val(InputBox(“請輸入一個(gè)正整數(shù)(>=3):”))i=2k=Int(n/2)

DoWhilei<=k

IfnModi=0ThenExitDoElsei=i+1EndIfLoopIfi>kThenPrintn;“是素?cái)?shù)!”ElsePrintn;“不是素?cái)?shù)!"k=int(sqr(n))PrivateSubCommand1_Click(72【例】輸入兩個(gè)正整數(shù),求它們的最大公約數(shù)。輾轉(zhuǎn)相除法:用兩數(shù)中的大數(shù)除以小數(shù),并將所除得到的余數(shù)作為下一次的除數(shù)再除上一次的除數(shù);如此往復(fù),直至余數(shù)為0,則最后一次的除數(shù)就是最大公約數(shù)。Dimm%,n%,r%,t%m=Val(InputBox(“請輸入第一個(gè)整數(shù):”))n=Val(InputBox(“請輸入第二個(gè)整數(shù):”))Ifm<nThent=m:m=n:n=tDor=mModnm=nn=rLoopUntilr=0Print“它們的最大公約數(shù)是:";mPrivateSubCommand1_Click()

EndSub【例】輸入兩個(gè)正整數(shù),求它們的最大公約數(shù)。輾73§4.4.4循環(huán)結(jié)構(gòu)的嵌套在一個(gè)循環(huán)結(jié)構(gòu)的循環(huán)體內(nèi)含有另一個(gè)循環(huán)結(jié)構(gòu),稱為循環(huán)嵌套,又稱為多重循環(huán)。多重循環(huán)用于復(fù)雜問題的求解過程,可以是同類循環(huán)的嵌套使用,也可以是不同類循環(huán)的相互嵌套。思路:(1)確定程序結(jié)構(gòu),考慮是否需要使用循環(huán);(2)根據(jù)實(shí)際需要和當(dāng)前條件,確定應(yīng)使用的循環(huán)類型;(3)提取循環(huán)中各組成要素,一一羅列;(4)將各要素進(jìn)行組合。§4.4.4循環(huán)結(jié)構(gòu)的嵌套在一個(gè)循環(huán)結(jié)構(gòu)74使用嵌套時(shí)應(yīng)注意以下幾個(gè)問題:嵌套中的各個(gè)控制結(jié)構(gòu)必須完整,內(nèi)外結(jié)構(gòu)不能交叉。內(nèi)外循環(huán)變量也不能同名。與IF…EndIf語句一起使用時(shí),只能從循環(huán)內(nèi)跳到循環(huán)外,不能從循環(huán)外跳到循環(huán)內(nèi),也不能從外循環(huán)跳到內(nèi)循環(huán)。嵌套中使用強(qiáng)制退出語句Exit只退出本層循環(huán)。輸入代碼時(shí)嵌套中各層結(jié)構(gòu)應(yīng)采用總體縮排,以使層次分明。For與Next配對的規(guī)則:從最內(nèi)層的循環(huán)往外看,next總是與離它最近的沒有配過對的For配對??梢允÷訬ext后面的循環(huán)變量。當(dāng)內(nèi)外循環(huán)有相同的終點(diǎn)時(shí),可以共用同一個(gè)Next語句,此時(shí)Next后面的循環(huán)變量名不能省略。并列的循環(huán)可以用同一個(gè)變量名作循環(huán)變量,而嵌套的循環(huán)不能用同一個(gè)變量名作循環(huán)變量?!?.4.4

循環(huán)結(jié)構(gòu)的嵌套使用嵌套時(shí)應(yīng)注意以下幾個(gè)問題:§4.4.4循環(huán)結(jié)構(gòu)的嵌75【例】用臺勞多項(xiàng)式求SinX的近似值。分析:

(1)SinX的初值為X;(2)有一求和過程,求和對象:

((-1)n-1*X2n-1)/(2n-1)!

(3)存在大量重復(fù)操作,根據(jù)需要應(yīng)設(shè)計(jì)兩個(gè)循環(huán):

a.

外層循環(huán)用于實(shí)現(xiàn)各分?jǐn)?shù)項(xiàng)的累加;

b.

內(nèi)層循環(huán)用于求各項(xiàng)分子、分母;其中:Factor:(2*n-1)的階乘Xpower:X2n-1

標(biāo)志位sign:(-1)n-1【例】用臺勞多項(xiàng)式求SinX的近似值。分析:76PrivateSubCommand1_Click()

EndSubDimnAsIntegerDimxAssingleDimyAsdoublex=InputBox(“請輸入X:”)n=InputBox(“請輸入n:”)y=x:sign=1Fori=2TonFactor=1:Xpower=1

Forj=1To2*i-1Factor=Factor*jXpower=Xpower*xNextjsign=-signy=y+sign*Xpower/FactorNextiPrint“SinX=”;y實(shí)現(xiàn)多項(xiàng)式逐項(xiàng)相加求得各求和項(xiàng)的分子和分母Factor:(2*n-1)!Xpower:X2n-1Sign:(-1)n-1PrivateSubCommand1_Click(77【例】輸出100~200之間的所有素?cái)?shù)。PrivateSubCommand1_Click()

EndSubNumber=0Forx=101To199Step2i=2:k=Int(x/2)DoWhilei<=kIfxmodi=0ThenExitDoi=i+1LoopIfi>kThenNumber=Number+1IfNumbermod5=0ThenPrintxElsePrintx,EndIfNextx使求得的素?cái)?shù)確在100~200之間判定X是否為素?cái)?shù)【例】輸出100~200之間的所有素?cái)?shù)。Privat78格式:GoTo<標(biāo)號>功能:把控制轉(zhuǎn)移到“標(biāo)號”所在的程序行,并從該行開始往下執(zhí)行。說明:

(1)標(biāo)號是一個(gè)標(biāo)識符或整型數(shù);(2)程序必須給GoTo語句提供唯一的轉(zhuǎn)向入口,入口處格式為<標(biāo)號>:<語句>(3)不能用GoTo語句轉(zhuǎn)向另一個(gè)過程。4.4.5Goto語句例5-5格式:GoTo<標(biāo)號>4.4.5Goto語句例5-579例PrivateSubForm_click()I=0:s=0Start:I=I+1:s=s+IIfI>=100ThenGoToEndingGoToStartEnding:Print“s=”;sEndSub該程序是通過GoTo語句完成循環(huán)的,其中Start與Ending是兩個(gè)標(biāo)號,本程序?qū)崿F(xiàn)的是求

1+2+3+…+100的值。由于GoTo語句易破壞程序的結(jié)構(gòu),因此一般不提倡使用。例PrivateSubForm_click()80§4.5綜合應(yīng)用程序舉例本節(jié)主要考慮常用算法程序設(shè)計(jì),因此所有的程序均只在Form或Command控件的單擊事件中編寫,而不考慮介面設(shè)計(jì)與屬性設(shè)置。一般步驟如下:第一步:分析問題確定要使用的數(shù)據(jù)(輸入、輸出),確定相關(guān)變量。確定算法,

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論