《Visual Basic 2005 程序設(shè)計》第3章 程序結(jié)構(gòu)控制_第1頁
《Visual Basic 2005 程序設(shè)計》第3章 程序結(jié)構(gòu)控制_第2頁
《Visual Basic 2005 程序設(shè)計》第3章 程序結(jié)構(gòu)控制_第3頁
《Visual Basic 2005 程序設(shè)計》第3章 程序結(jié)構(gòu)控制_第4頁
《Visual Basic 2005 程序設(shè)計》第3章 程序結(jié)構(gòu)控制_第5頁
已閱讀5頁,還剩164頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章程序結(jié)構(gòu)控制1本章主要內(nèi)容:程序順序結(jié)構(gòu)。使用If…Then構(gòu)建分支結(jié)構(gòu)程序。使用SelectCase構(gòu)建多分支結(jié)構(gòu)程序。使用For…Next構(gòu)建循環(huán)結(jié)構(gòu)程序。使用Do…Loop構(gòu)建循環(huán)結(jié)構(gòu)程序。使用Panel容器控件。使用RadioButton控件。過程的定義與使用。變量的生存期與作用域。2通過上一章的討論可知,算法用來描述如何對數(shù)據(jù)進(jìn)行處理,以便得到期望的結(jié)果。因此,在算法中需要依次處理一些數(shù)據(jù),或?qū)σ恍?shù)據(jù)處理結(jié)果進(jìn)行判斷決策,或循環(huán)處理一些數(shù)據(jù)。為此,使用VisualBasic2005實現(xiàn)一個算法時,需要相應(yīng)的語句實現(xiàn)判斷決策和循環(huán)處理,即對程序的流程進(jìn)行控制。下面結(jié)合逐步增加功能的實例講述程序流程的順序結(jié)構(gòu)、選擇分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),以及過程的定義和使用。33.1順序結(jié)構(gòu)最簡單的程序流程結(jié)構(gòu)是順序結(jié)構(gòu),即各語句按照先后出現(xiàn)的次序執(zhí)行,其執(zhí)行流程如圖3-1所示。語句1語句2…...語句n圖3-1順序結(jié)構(gòu)流程圖4例3.1通過文本框輸入兩個數(shù),進(jìn)行相加處理后,通過輸出文本框輸出。具體操作過程:⑴新建項目,選擇“Windows應(yīng)用程序”,并把“名稱”修改為“程序流程控制1.0”,然后單擊“確定”。⑵在解決方案資源管理器中把“Form1.vb”文件名改為“程序流程控制.vb”。⑶打開窗體設(shè)計視圖,選擇Form1窗體,在屬性框中修改窗體的屬性:Name改為“frmProgStruct”;StartPosition改為“CenterScreen”;Text改為“程序流程控制1.0”。⑷為窗體添加Label控件,Text改為“請輸入兩個數(shù):”。⑸為窗體添加2個TextBox控件,Name分別改為“txtInput1”、“txtInput2”。⑹為窗體添加2個Button控件,修改該控件的屬性:Name分別改為“btnCalculate”、“btnQuit”,Text分別改為“計算”、“退出”。⑺為窗體添加1個TextBox控件,Name改為“txtOutput”,Multiline改為“True”,ScrollBars改為“Vertical”。⑻雙擊“退出”按鈕,在“退出”按鈕Click事件過程中添加響應(yīng)代碼:Close()。⑼雙擊“計算”按鈕,在代碼編輯器中添加對“計算”按鈕Click事件響應(yīng)的代碼:5

PrivateSubbtnCalculate_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnCalculate.Click'定義變量

DimobjOper1AsObjectDimobjOper2AsObjectDimobjResultAsObjectDimstrOutputAsString=""'讀取輸入的內(nèi)容

objOper1=txtInput1.TextobjOper2=txtInput2.Text'輸入內(nèi)容相加

objResult=objOper1+objOper2'輸出結(jié)果

strOutput=txtInput1.Text&"+"&txtInput2.Text&"="&objResult&vbCrLf

txtOutput.Text=txtOutput.Text&strOutput

EndSub6提示:“程序流程控制1.0”程序中兩個數(shù)相加實現(xiàn)的是兩個字符串的連接操作,沒有實現(xiàn)兩個數(shù)值的相加。這是因為objOper1和objOper2是Object類型,而txtInput1.Text和txtInput2.Text的類型是String類型,因此objOper1+objOper2進(jìn)行的是兩個字符串“+”操作,即字符串連接操作。7如果要把12和34相加按數(shù)值“+”進(jìn)行運算,則需要把文本框輸入的字符串轉(zhuǎn)換為數(shù)值類型,如下面的代碼把輸入內(nèi)容轉(zhuǎn)換為Double數(shù)值類型后再進(jìn)行相加:

'讀取輸入的內(nèi)容

objOper1=CDbl(txtInput1.Text)'把輸入的字符串內(nèi)容轉(zhuǎn)換為Double數(shù)值類型

objOper2=CDbl(txtInput2.Text)'把輸入的字符串內(nèi)容轉(zhuǎn)換為Double數(shù)值類型8在對話框中輸入12和34,單擊“計算”按鈕,則在輸出文本框中顯示相加結(jié)果是“46”。但如果輸入的是12x(有時輸入數(shù)值時可能不小心輸入了一個非數(shù)字字母)和34,如果在VisualStudio2005中通過“啟動調(diào)試”運行的程序,則出現(xiàn)從字符串“12x”到類型“Double”轉(zhuǎn)換無效的異常提示對話框,如圖3-4所示。9圖3-4從字符串“12x”到類型“Double”轉(zhuǎn)換無效的異常提示10如果是直接運行的程序流程控制1.0.exe程序,當(dāng)輸入的“12x”無法轉(zhuǎn)換為Double類型的數(shù)值時,程序出現(xiàn)錯誤,如圖3-5所示,并異常終止執(zhí)行。如果是直接運行的程序流程控制1.0.exe程序,當(dāng)輸入的“12x”無法轉(zhuǎn)換為Double類型的數(shù)值時,程序出現(xiàn)錯誤,如圖3-5所示,并異常終止執(zhí)行。11圖3-5程序流程控制1.0.exe運行出現(xiàn)錯誤提示信息12為了防止數(shù)據(jù)轉(zhuǎn)換出現(xiàn)錯誤,在程序中進(jìn)行數(shù)據(jù)轉(zhuǎn)換之前,應(yīng)該判斷輸入的內(nèi)容是否能夠進(jìn)行轉(zhuǎn)換,如果不能轉(zhuǎn)換,則提示錯誤信息,即需要選擇分支。實現(xiàn)選擇分支結(jié)構(gòu)的語句有兩個:If…Then語句和SelectCase語句。133.2If…Then語句If…Then語句在程序設(shè)計中,經(jīng)常以單分支、雙分支、多分支和嵌套的顯示出現(xiàn)。143.2.1If…Then語句單分支結(jié)構(gòu)If…Then語句單分支結(jié)構(gòu)的語句格式為:If(Expression)Then語句塊EndIf其中Expression是邏輯表達(dá)式或關(guān)系表達(dá)式。如對于0≤intX≤100,VisualBasic可以寫成:intX>=0AndintX<=100。Expression的值只能是True或False,作為If進(jìn)行測試判斷的依據(jù):如果Expression的值為True,依次執(zhí)行語句塊中的語句,然后執(zhí)行EndIf后的語句;如果Expression的值為False,則跳過語句塊直接執(zhí)行EndIf后的語句。其執(zhí)行流程如圖3-6所示。15語句塊圖3-6單分支結(jié)構(gòu)流程圖ExpressionTrueFalse16提示:語句塊中可以包含多條語句。如果語句塊中只有一條語句,If…Then單分支結(jié)構(gòu)可以省略EndIf,寫成一行,如下格式:

If(Expression)Then語句17例3.2在例3.1的基礎(chǔ)上,增加對文本框輸入內(nèi)容的判斷:如果輸入內(nèi)容不能轉(zhuǎn)換為Double類型,則退出過程調(diào)用。具體操作過程同例3.1,為了區(qū)別上述程序,項目“名稱”修改為“程序流程控制2.0”。雙擊“計算”按鈕,在代碼編輯器中添加對“計算”按鈕Click事件響應(yīng)的代碼:18

PrivateSubbtnCalculate_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnCalculate.Click'定義變量

DimobjOper1AsObjectDimobjOper2AsObjectDimobjResultAsObjectDimstrOutputAsString=""19

'讀取輸入的內(nèi)容,如果輸入的內(nèi)容包含非數(shù)字字符則退出過程調(diào)用

IfNot(IsNumeric(txtInput1.Text)AndIsNumeric(txtInput2.Text))Then

MessageBox.Show("輸入的內(nèi)容包含非數(shù)字字符!","錯誤")'輸出提示信息

ExitSub'退出過程調(diào)用

EndIfobjOper1=CDbl(txtInput1.Text)'把輸入的字符串內(nèi)容轉(zhuǎn)換為Double數(shù)值類型

objOper2=CDbl(txtInput2.Text)'把輸入的字符串內(nèi)容轉(zhuǎn)換為Double數(shù)值類型20

'輸入內(nèi)容相加

objResult=objOper1+objOper2'輸出結(jié)果

strOutput=txtInput1.Text&"+"&txtInput2.Text&"="&objResult&vbCrLf

txtOutput.Text=txtOutput.Text&strOutputEndSub提示:IsNumeric函數(shù)的格式為IsNumeric(Expression),如果Expression中的內(nèi)容能夠轉(zhuǎn)換為數(shù)值,則返回True,否則返回False。21代碼說明:⑴對于Not(IsNumeric(txtInput1.Text)AndIsNumeric(txtInput2.Text)),只要txtInput1.Text和txtInput2.Text有一個不能正確轉(zhuǎn)換為數(shù)值,則表達(dá)式返回True,執(zhí)行If…Then后的語句,即退出過程調(diào)用。⑵如果Not(IsNumeric(txtInput1.Text)AndIsNumeric(txtInput2.Text))為False,則不執(zhí)行If…Then后的語句,而是執(zhí)行EndIf后面的語句。運行“程序流程控制2.0”程序,在文本框中如果輸入12x和34,單擊“計算”按鈕后,程序不出現(xiàn)異常信息,而是彈出如圖3-7所示對話框。223.2.2If…Then語句雙分支結(jié)構(gòu)If…Then語句雙分支結(jié)構(gòu)的語句格式為:If(Expression)Then語句塊1Else

語句塊2EndIf23其中Expression是邏輯表達(dá)式或關(guān)系表達(dá)式,返回值為True或False。If…Then語句雙分支結(jié)構(gòu)的語句的含義是:如果Expression的值為True,依次執(zhí)行語句塊1中的語句,然后執(zhí)行EndIf后的語句;如果Expression的值為False,依次執(zhí)行語句塊2中的語句,然后執(zhí)行EndIf后的語句。24If…Then語句雙分支結(jié)構(gòu)執(zhí)行流程如圖3-8所示??梢钥闯觯Z句塊1和語句塊2只能執(zhí)行其中一個,不能同時執(zhí)行。圖3-8雙分支結(jié)構(gòu)流程圖ExpressionFalseTrue語句塊1語句塊225例3.3在例3.2的基礎(chǔ)上,增加可以選擇兩個數(shù)相加或相減的功能,“計算”按鈕根據(jù)選擇的功能進(jìn)行兩個數(shù)相加或相減操作。具體操作過程同例3.2,需要添加和修改的額外內(nèi)容有:⑴為了區(qū)別上述程序功能的不同,把該項目“名稱”修改為“程序流程控制2.1”。⑵為窗體添加Label控件,Text改為“選擇操作:”。⑶為窗體添加一個Panel控制,修改“BorderStyle”為“Fix3D”。⑷在Panel控制中添加2個RadioButton控件,Text分別改為“+”、“-”,Name分別改為“rdbPlus”、“rdbSub”,其中“+”單選框的Checked改為“True”。26提示:Panel是容器控件,把其中包含的控件通過組合形成控件集合。RadioButton

控件為單選框按鈕,一般包含在Panel控件中,或包含在GroupBox

控件中形成一組RadioButton

控件集合,一組RadioButton

控件集合可以確保每次只能選中一個控件。27⑸在代碼編輯器中,在類聲明“PublicClassfrmProgStruct”語句之后添加一個記錄已選操作類型的屬性:

'定義屬性,記錄選擇的操作類型,默認(rèn)為+操作

PrivatestrSelOperatorAsString="+“注意:在本例中strSelOperator默認(rèn)的初始值是“+”。Private是訪問控制描述關(guān)鍵字,說明strSelOperator只能在類frmProgStruct內(nèi)使用,即類frmProgStruct內(nèi)的過程可以引用strSelOperator。28⑹雙擊“+”,在代碼編輯器中添加對“+”單選框CheckedChanged事件響應(yīng)的代碼:

PrivateSubrdbPlus_CheckedChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesrdbPlus.CheckedChanged

strSelOperator="+"'“+”操作被選中EndSub29⑺雙擊“-”,在代碼編輯器中添加對“-”單選框CheckedChanged事件響應(yīng)的代碼:

PrivateSubrdbSub_CheckedChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesrdbSub.CheckedChanged

strSelOperator="-"'“-”操作被選中EndSub30⑻在例3.2實現(xiàn)的“計算”按鈕Click事件響應(yīng)代碼的基礎(chǔ)上,重新編寫對輸入內(nèi)容進(jìn)行相加、相減操作和輸出的代碼:

'輸入內(nèi)容相加、相減操作

If(strSelOperator="+")Then'如果“+”操作被選中

objResult=objOper1+objOper2Else'否則“+”操作沒有被選中,則“-”操作被選中

objResult=objOper1-objOper2EndIf'輸出結(jié)果

strOutput=txtInput1.Text&strSelOperator&txtInput2.Text&"="&objResult&vbCrLf

txtOutput.Text=txtOutput.Text&strOutput31提示:RadioButton只有選中、未選中兩種狀態(tài),單擊同一集合類的某一個RadioButton控件,則該控件被則選中,相應(yīng)地其它控件則為未選中。RadioButton控件中的Checked屬性記錄控件選中與否的狀態(tài),當(dāng)狀態(tài)變化時,觸發(fā)RadioButton控件的CheckedChanged事件。323.2.3If…Then語句多分支結(jié)構(gòu)If…Then語句多分支結(jié)構(gòu)的語句格式為:If(Expression1)Then

語句塊1ElseIf

(Expression2)Then

語句塊2…

ElseIf

(Expressionn)Then

語句塊nElse

語句塊n+1EndIf33If…Then語句多分支結(jié)構(gòu)根據(jù)表達(dá)式的值確定要執(zhí)行的語句塊,如果表達(dá)式的值為True,則執(zhí)行相應(yīng)的語句塊,然后退出If…Then多分支結(jié)構(gòu)語句,執(zhí)行EndIf后的語句;否則執(zhí)行其后的判斷語句ElseIf

(Expressionx)Then語句。If…Then語句多分支結(jié)構(gòu)執(zhí)行流程如圖3-10所示??梢钥闯觯看沃荒軋?zhí)行其中一個語句塊。34圖3-10多分支結(jié)構(gòu)流程圖FalseTrue語句塊2Expression1語句塊1Expression2……ExpressionnTrueFalseTrueFalse語句塊n語句塊n+135例3.4在例3.3的基礎(chǔ)上,增加可以選擇兩個數(shù)相加、減、乘、除的功能,“計算”按鈕根據(jù)選擇的功能進(jìn)行兩個數(shù)相應(yīng)的計算。具體操作過程同例3.3,需要添加和修改的額外內(nèi)容有:⑴為了區(qū)別上述程序功能的不同,把該項目“名稱”修改為“程序流程控制2.2”。⑵在Panel控制中再添加2個RadioButton控件,Text分別改為“×”、“÷”,Name分別改為“rdbMultiple”、“rdbDivide”。36⑶雙擊“×”,在代碼編輯器中添加對“×”單選框CheckedChanged事件響應(yīng)的代碼:

PrivateSubrdbMultiple_CheckedChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesrdbMultiple.CheckedChanged

strSelOperator="×"'“×”操作被選中EndSub37⑷雙擊“÷”,在代碼編輯器中添加對“÷”單選框CheckedChanged事件響應(yīng)的代碼:

PrivateSubrdbDivide_CheckedChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesDivide.CheckedChanged

strSelOperator="÷"'“÷”操作被選中EndSub38⑸在例3.3實現(xiàn)的“計算”按鈕Click事件響應(yīng)代碼的基礎(chǔ)上,重新編寫對輸入內(nèi)容進(jìn)行加、減、乘、除操作的代碼:

'輸入內(nèi)容進(jìn)行+、-、×、÷操作

If(strSelOperator="+")Then'如果“+”操作被選中

objResult=objOper1+objOper2

ElseIf(strSelOperator="-")Then'如果“-”操作被選中

objResult=objOper1-objOper2

ElseIf(strSelOperator="×")Then'如果“×”操作被選中

objResult=objOper1*objOper2

ElseIf(strSelOperator="÷")Then'如果“÷”操作被選中

objResult=objOper1/objOper2Else

MessageBox.Show("選擇操作有錯!","錯誤")EndIf39如果在“程序流程控制2.2”的文本框中如果輸入12和0,選擇操作“÷”并單擊“計算”按鈕,則顯示計算結(jié)果為無窮大,如圖3-12所示。這是因為在除操作中,除數(shù)不能為0。為此,在“÷”運算前,需要判斷除數(shù)是否為0,如果是0,則不能進(jìn)行“÷”運算。403.2.4If…Then語句嵌套If…Then語句嵌套是指在If…Then語句單分支、雙分支、多分支結(jié)構(gòu)的Then語句后或Else語句后還可以再使用If…Then語句進(jìn)行判斷,構(gòu)成選擇分支。如:If(Expression1)Then'第1個If

語句塊1Else'與第1個If配對的ElseIf(Expression1.1)Then'第2個IfIf(Expression1.1.1)Then'第3個If

語句塊1.1.1Else'與第3個If配對的Else

語句塊1.1.2EndIf'與第3個If配對的EndifEndIF'與第2個If配對的EndifEndIf'與第1個If配對的Endif41為了防止在“程序流程控制2.2”出現(xiàn)除數(shù)是0的情況,在“÷”運算前,增加判斷除數(shù)是否為0的語句:

'輸入內(nèi)容進(jìn)行+、-、×、÷操作

If(strSelOperator="+")Then'如果“+”操作被選中

objResult=objOper1+objOper2

ElseIf(strSelOperator="-")Then'如果“-”操作被選中

objResult=objOper1-objOper2

ElseIf(strSelOperator="×")Then'如果“×”操作被選中

objResult=objOper1*objOper2

ElseIf(strSelOperator="÷")Then'如果“÷”操作被選中

If(objOper2=0)Then'如果被除數(shù)是,則退出過程調(diào)用

MessageBox.Show("被除數(shù)不能為零!","錯誤")ExitSubElse'否則進(jìn)行÷操作

objResult=objOper1/objOper2EndIfElse

MessageBox.Show("選擇操作有錯!","錯誤")EndIf423.3SelectCase語句如果要從多種備選情況中選擇一種情況,或從多種備選情況中選擇多種情況,可以通過If…Then語句多分支結(jié)構(gòu)及嵌套實現(xiàn),如例3.4。但當(dāng)備選情況的量比較大時,使用If…Then語句則:效率低。如例3.4中,要判斷到“÷”時,必須和前3種操作進(jìn)行比較,如果使用“÷”的概率非常高,則每次要進(jìn)行的無用比較操作就越多,從而造成程序執(zhí)行效率的低下。程序不易閱讀。如例3.4中,要知道“ElseIf(strSelOperator="÷")Then”中表達(dá)式所包含的確切邏輯含義,必須要和前面的所有判斷包含的表達(dá)式的邏輯含義結(jié)合起來進(jìn)行理解。43在例3.4的If…Then語句多分支結(jié)構(gòu)中,進(jìn)行判斷的語句有一個共同的特點,即strSelOperator和一個字符串(“+”、“-”、“×”、“÷”)進(jìn)行“=”(相等)比較。對于這種特點的從多種備選情況中選擇一種、多種情況的判斷,VisualBasic2005提供了一個更好的多分支判斷結(jié)構(gòu),即SelectCase語句。443.3.1使用SelectCase語句SelectCase語句格式為:SelectCaseExpressionCaseValue1

語句塊1CaseValue2

語句塊2…CaseValuen

語句塊nCaseElse

語句塊n+1EndSelect45如果Expression與某一CaseValuex

子句匹配,則執(zhí)行該Case語句后的語句塊x,執(zhí)行完語句塊x后執(zhí)行EndSelect后的語句;如果Expression沒有與任何Case語句匹配,則執(zhí)行CaseElse后的語句塊。46例3.5用SelectCase語句替換例3.4中的If…Then多分支結(jié)構(gòu)。具體操作過程同例3.4,需要添加和修改的額外內(nèi)容有:⑴為了區(qū)別上述程序功能的不同,把該項目“名稱”修改為“程序流程控制2.2.1”。⑵使用SelectCase語句替換If…Then多分支結(jié)構(gòu):47

'輸入內(nèi)容進(jìn)行+、-、×、÷操作

SelectCasestrSelOperatorCase"+"'如果“+”操作被選中

objResult=objOper1+objOper2Case"-"'如果“-”操作被選中

objResult=objOper1-objOper2Case"×"'如果“×”操作被選中

objResult=objOper1*objOper2Case"÷"'如果“÷”操作被選中

If(objOper2=0)Then'如果被除數(shù)是,則退出過程調(diào)用

MessageBox.Show("被除數(shù)不能為零!","錯誤")ExitSubElse

objResult=objOper1/objOper2EndIfCaseElse

MessageBox.Show("選擇操作有錯!","錯誤")EndSelect48注意:SelectCase后只能有一個表達(dá)式。如SelectCasex,y

是錯誤的。SelectCase語句中的Case子句后還可以嵌套If…Then語句、或SelectCase語句。493.3.2多重選擇前面的Expression與某一CaseValuex

子句匹配,執(zhí)行該Case語句后的語句塊x,如果要求Expression與某一批CaseValueKx

子句之一匹配,執(zhí)行相同的語句塊K,則SelectCase語句可以寫成:50SelectCaseExpressionCaseValue1

語句塊1…CaseValueK1,ValueK2,…,ValueKm

語句塊K…CaseValuen

語句塊nCaseElse

語句塊n+1EndSelect即CaseValueK1,ValueK2,…,ValueKm中的多個值(多個值之間用逗號分隔)對應(yīng)于同一語句塊K。51例如:

DimstrMemberTypeasString……‘為strMemberType賦值

SelectCasestrMemberTypeCase"小學(xué)生","中學(xué)生","高中生","大學(xué)生"

MessageBox.Show("您選擇的學(xué)生是:"&strMemberType,"學(xué)生類型")Case"教師","干部"

MessageBox.Show("您選擇的工作人員是:"&strMemberType,"工作人員類型")CaseElse

MessageBox.Show("您輸入的"&strMemberType&"是無效類型!","錯誤")EndSelect52如果Case子句要表示范圍,有兩種格式:⑴Exp1ToExp2格式:表示的范圍是[Exp1,Exp2],即大于等于Exp1,并且小于等于Exp2。這里Exp2必須大于Exp1。如:Case60To69。⑵IsOperatorExp格式:用帶比較運算符(=、<>、<、<=、>或>=)的Is關(guān)鍵字來指定對Expression匹配值的限制。如CaseIs<0。53提示:⑴Exp1、Exp2和Exp都可以為字符串。如“AA”To“HH”,表示“AA”到“HH”之間的所有字符串(按字母排列)。⑵在第2種格式中,如果沒有輸入Is關(guān)鍵字,系統(tǒng)將自動在Operator前面插入。這里Is是關(guān)鍵字,不是運算符!54例3.6通過文本框輸入一個0到100之間的整數(shù)成績,使用MessageBox對話框顯示成績的級別:小于60為不及格;60~69為中等;70~79為良好;80~89為優(yōu)良;90~100為優(yōu)秀。具體操作過程:⑴創(chuàng)建Windows應(yīng)用程序項目,項目“名稱”為“成績分級”。⑵為窗體添加1個Label控件、1個TextBox控件和兩個Button控件,Name分別為:labString,txtInputScore,btnGrade,btnQuit;Text分別為:“請輸入成績:”,“0”,“顯示級別”,“退出”。為使用“退出”按鈕添加退出程序代碼:Close()。55⑶在編輯器中添加響應(yīng)“顯示級別”按鈕Click事件的代碼:

PrivateSubbtnGrade_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesbtnGrade.Click'定義變量,保存輸入的成績

DimintScoreAsInteger'讀取輸入的成績

IfNotIsNumeric(txtInputScore.Text)Then

MessageBox.Show("無效輸入內(nèi)容!","錯誤")ExitSubEndIf

intScore=CInt(txtInputScore.Text)'為intScore

賦值56

'根據(jù)intScore顯示相應(yīng)的成績級別

SelectCaseintScoreCaseIs<0

MessageBox.Show("無效成績!","錯誤")CaseIs<60

MessageBox.Show("不及格","成績級別")Case60To69

MessageBox.Show("中等","成績級別")Case70To79

MessageBox.Show("良好","成績級別")Case80To89

MessageBox.Show("優(yōu)良","成績級別")Case90To100

MessageBox.Show("優(yōu)秀","成績級別")CaseElse

MessageBox.Show("無效成績!","錯誤")EndSelectEndSub573.4循環(huán)結(jié)構(gòu)有時程序中某些代碼需要重復(fù)執(zhí)行一定的次數(shù)后才能得到最終結(jié)果,這種重復(fù)執(zhí)行可以通過循環(huán)結(jié)構(gòu)實現(xiàn)。比如在例3.5中增加對輸入的兩個數(shù)進(jìn)行累加的功能,如輸入12、34,累加表示12+13+…+33+34,如果累加后的和保存在變量intSum中,則這種累加的動作可以表示成:intSum=intSum+intX,即intSum的當(dāng)前值和intX相加,結(jié)果再保存到intSum中,如果intX依次取12到34之間的一個整數(shù),重復(fù)執(zhí)行上述累加動作(34-12+1)次,即可計算出12到34的累加和,即intSum的值。循環(huán)結(jié)構(gòu)有兩種:“For”計數(shù)型循環(huán),即循環(huán)指定的次數(shù)后停止循環(huán);“Do”條件型循環(huán),即當(dāng)某一條件滿足時執(zhí)行循環(huán)語句或退出循環(huán)。583.4.1For…Next循環(huán)

For…Next循環(huán)屬于計數(shù)型循環(huán),將語句塊重復(fù)執(zhí)行指定的次數(shù),其語句格式為:Forcounter[Asdatatype]=startToend[Stepstep]

語句塊Next[counter]其中counter為循環(huán)控制變量,其值從start按步長step變化到end。For…Next循環(huán)執(zhí)行流程圖如圖3-13所示:59FalseTrue語句塊counter=start是否繼續(xù)循環(huán)?counter=counter+stepNext下條語句圖3-13For…Next循環(huán)執(zhí)行流程60說明:⑴如果step為正,“是否繼續(xù)循環(huán)”的判斷表達(dá)式為:counter<=end;如果step為負(fù),“是否繼續(xù)循環(huán)”的判斷表達(dá)式為:counter>=end。⑵如果沒有指定,則step的默認(rèn)值為1。⑶counter變量一般是在For語句之前定義,但也可以在For語句中定義,例如:

ForintCounterAsInteger=0To100Step2……'循環(huán)語句塊

NextintCounterintCounter在For語句中定義,則intCounter只能在For…Next循環(huán)內(nèi)的語句塊中使用,即intCounter的作用域是For循環(huán)體。61⑷VisualBasic僅在循環(huán)開始之前計算一次start、end和step的值,如果在循環(huán)體的語句塊中更改了end或step的值,則更改不影響對循環(huán)的控制。例如:

DimintStepAsInteger=2DimintEndAsInteger=100ForintCounterAsInteger=1TointEndStepintStep

'循環(huán)步長是2,循環(huán)100次

……'循環(huán)語句塊

intStep=intStep+10'intStep的值變?yōu)?2,但控制循環(huán)的步長仍然是2

intEnd=200'intEnd的值變?yōu)?00,但循環(huán)的次數(shù)仍然是100次

Next62例3.7在例3.5的基礎(chǔ)上,增加兩個數(shù)“累加”功能。具體操作過程同例3.3,需要添加和修改的額外內(nèi)容有:⑴為了區(qū)別上述程序功能的不同,把該項目“名稱”修改為“程序流程控制3.0”。⑵在Panel控制中再添加1個RadioButton控件,Text改為“累加”,Name改為“rdbConseculate”。63⑶雙擊“累加”,在代碼編輯器中添加對“累加”單選框CheckedChanged事件響應(yīng)的代碼:

PrivateSubrdbConseculate_CheckedChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesrdbConseculate.CheckedChanged

strSelOperator="累加"'“累加”操作被選中EndSub64⑷在“計算”按鈕Click事件響應(yīng)代碼“SelectCasestrSelOperator”部分的“CaseElse”之前添加兩個數(shù)累加的代碼:

Case"累加"DimintStart,intEndAsInteger

intStart=IIf(objOper1<objOper2,objOper1,objOper2)'循環(huán)起始值為累加下界

intEnd=IIf(objOper1<objOper2,objOper2,objOper1)'循環(huán)終止值為累加上界

objResult=0'累加和初始值為0'開始累加

ForintCountAsInteger=intStartTointEnd'省略步長,則默認(rèn)為1

objResult+=intCount'開始累加

Next65

提示:IIf()函數(shù)的作用是根據(jù)表達(dá)式的值,從兩個值中選擇一個返回,其格式為:IIf(Expression,TruePart,FalsePart)Expression為Boolean類型,如果Expression的值為True,則返回TruePart,否則返回FalsePart。663.4.2For…Next嵌套循環(huán)For…Next嵌套循環(huán)指將一個循環(huán)放在另一個循環(huán)的語句塊內(nèi)。在嵌套循環(huán)中,每個循環(huán)體都應(yīng)具有唯一的循環(huán)控制變量,且循環(huán)體不能重疊。如下面的例子是錯誤的:ForintX=1To10ForintY=1To10……'循環(huán)語句塊NextXNextY67例3.8創(chuàng)建一Windows應(yīng)用程序,通過MessageBox消息對話框輸出九九乘法表。具體操作過程:⑴創(chuàng)建一個Windows應(yīng)用程序項目,項目“名稱”為“九九乘法表”。⑵添加Button控件,Text改為“九九乘法表”,Name改為“btnMultipleTable”。⑶雙擊“九九乘法表”按鈕,在代碼編輯器中添加其Click事件響應(yīng)的代碼:68PrivateSubbtnMultipleTable_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnMultipleTable.Click'定義變量

DimstrOutAsString=“”‘把九九乘法表作為字符串保存在strOut中

ForintXAsInteger=1To9'九九乘法表共9行

DimstrLineAsString=""'每一行的乘法表保存在strLine中

ForintYAsInteger=1TointX'第intX

行共有intX

個乘法

strLine=strLine&intY&"×"&intX&"="&intX*intY&""

NextintY

'添加intX

行的乘法表字符串到輸出字符串strOut

中,并添加換行控制

strOut=strOut&strLine&vbCrLf

NextintX'輸出乘法表

MessageBox.Show(strOut,"九九乘法表")EndSub693.4.3ExitFor有時在循環(huán)執(zhí)行的過程中,由于某個條件的改變而需要提前退出For…Next循環(huán)。這種情況可以通過ExitFor實現(xiàn)。70例3.9創(chuàng)建一Windows應(yīng)用程序,通過文本框輸入一個整數(shù),判斷該數(shù)數(shù)否是素數(shù)。具體操作過程:⑴創(chuàng)建Windows應(yīng)用程序項目,項目“名稱”為“判斷素數(shù)”。⑵添加TextBox控件,Name改為“txtInput”。⑶添加Button控件,Text改為“判斷素數(shù)”,Name分別改為“btnPrimeYN”。⑷雙擊“判斷素數(shù)”按鈕,在代碼編輯器中添加其Click事件響應(yīng)的代碼:71

PrivateSubbtnPrimeYN_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesbtnPrimeYN.Click'讀取輸入的內(nèi)容

IfNot(IsNumeric(txtInput.Text))Then

MessageBox.Show("輸入的內(nèi)容包含非數(shù)字字符!","錯誤")ExitSubEndIfDimintNumAsInteger=CInt(txtInput.Text)'把輸入的字符串內(nèi)容轉(zhuǎn)換為Integer數(shù)值

DimintCAsInteger

intNum=IIf(intNum<0,-intNum,intNum)'如果輸入的是負(fù)數(shù),則轉(zhuǎn)換為正數(shù)72

'判斷intNum

是否是素數(shù)

ForintC=2TointNum-1'如果intNum能夠整除intC,則intNum不是素數(shù),提前退出循環(huán)

If(intNumModintC=0)ThenExitFor'退出循環(huán)

EndIfNext73

'如果是提前退出,則intC的值小于intNum,否則intC的值遞增到intNum時退出循環(huán)

If(intC<intNum)Then'如果是提前退出For循環(huán)

MessageBox.Show(txtInput.Text&"不是素數(shù)!")Else

MessageBox.Show(txtInput.Text&"是素數(shù)!")EndIfEndSub提示:當(dāng)退出循環(huán)時,循環(huán)控制變量的值保持退出時的值,如上例中,如果是提前退出For循環(huán)則intC的值肯定小于intNum,否則如果是大于等于intNum,則是正常退出For循環(huán)。743.4.4ContinueFor有時在循環(huán)執(zhí)行的過程中,由于某個條件的改變而需要忽略掉當(dāng)前語句到Next之間的語句,提前進(jìn)入下一次For…Next循環(huán)。這種情況可以通過ContinueFor實現(xiàn)。75例3.10創(chuàng)建一Windows應(yīng)用程序,通過文本框輸入一個整數(shù),輸出從2到該整數(shù)之間的所有素數(shù)。具體操作過程:⑴創(chuàng)建Windows應(yīng)用程序項目,項目“名稱”為“判斷一組素數(shù)1”。⑵添加TextBox控件,Name改為“txtInput”。⑶添加Button控件,Text改為“判斷一組素數(shù)”,Name分別改為“btnPrimes”。⑷雙擊“判斷一組素數(shù)”按鈕,在代碼編輯器中添加其Click事件響應(yīng)的代碼:76PrivateSubbtnPrimes_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnPrimes.Click'讀取輸入的內(nèi)容

IfNot(IsNumeric(txtInput.Text))Then

MessageBox.Show("輸入的內(nèi)容包含非數(shù)字字符!","錯誤")ExitSubEndIf

DimintNumAsInteger=CInt(txtInput.Text)'把輸入的字符串內(nèi)容轉(zhuǎn)換為Integer數(shù)值

DimintN,intCAsIntegerDimstrOutAsString=""

intNum=IIf(intNum<0,-intNum,intNum)'如果輸入的是負(fù)數(shù),則轉(zhuǎn)換為正數(shù)77'判斷過程

ForintN=3TointNum'判斷2—intNum之間的所有數(shù)

ForintC=2TointN/2'如果intNum能夠整除intC,則intNum不是素數(shù),提前退出循環(huán)

If(intNModintC=0)ThenExitForEndIfNextintCIfintC<=intN/2Then'如果是提前退出ForintC

循環(huán),則intN

不是素數(shù)

ContinueFor'提前進(jìn)入下一次ForintN

循環(huán)

EndIf'否則intN是素數(shù),添加到輸出字符串中

strOut=strOut&intN&""NextintNMessageBox.Show("2--"&txtInput.Text&"之間的所有素數(shù):"&strOut)

EndSub783.4.5Do…Loop循環(huán)有時在進(jìn)入循環(huán)處理時,不能確定需要執(zhí)行多少次循環(huán),則可以使用Do…Loop循環(huán)。Do…Loop屬于條件型循環(huán),其基本語句格式為:Do

語句塊Loop由于Do語句中沒有任何條件限制,則語句塊被無限次重復(fù)執(zhí)行,這種循環(huán)也稱為死循環(huán)。其執(zhí)行流程圖如圖3-15所示。79語句塊DoLoop下條語句圖3-15Do

…Loop死循環(huán)執(zhí)行流程80提示:在Do…Loop循環(huán)中,可以使用ContinueDo語句跳轉(zhuǎn)到Do語句處執(zhí)行,進(jìn)而忽略執(zhí)行ContinueDo到Loop之間的語句。Do…Loop循環(huán)也可以嵌套。81在一些需要無限次重復(fù)執(zhí)行的循環(huán)中,可能需要通過死循環(huán)的形式實現(xiàn),但為了增加程序的交互性,一般在死循環(huán)中增加一定的條件判斷,進(jìn)而能夠退出死循環(huán),在Do…Loop循環(huán)體中退出循環(huán)使用ExitDo。如圖3-16的執(zhí)行流程圖。82語句塊1DoLoop下條語句圖3-16通過ExitDo退出的Do

…Loop循環(huán)執(zhí)行流程圖是否繼續(xù)循環(huán)?TrueFalse語句塊2ExitDo83例3.11在例3.10的基礎(chǔ)上,使用Do…Loop循環(huán)替換For…Next循環(huán)判斷是否是素數(shù)。具體操作過程:⑴創(chuàng)建Windows應(yīng)用程序項目,項目“名稱”為“判斷一組素數(shù)2”。⑵其它操作同例3.10。⑶“判斷一組素數(shù)”按鈕的Click事件響應(yīng)的代碼中,“判斷過程”代碼更改為:84

'判斷過程

ForintN=2TointNum

intC=2'intC用來測試intN能否整除

Do'如果intC

的當(dāng)前值能夠整除intN,或intC

已經(jīng)遞增到intN/2,則退出Do循環(huán)

If(((intNModintC)=0)Or(intC>=intN/2))ThenExitDoElse'否則還需要繼續(xù)測試

intC+=1'intC

遞增

EndIfLoop85

'測試退出Do…Loop循環(huán)的原因

If((intNModintC)=0)Then'Do循環(huán)是由于intNModintC=0退出,intN不是素數(shù)

ContinueFor'繼續(xù)ForintN

的下一次循環(huán)

EndIf'否則,Do循環(huán)是由于intC>=intN/2退出,則intN

是素數(shù)

strOut=strOut&intN&""NextintNMessageBox.Show("2--"&txtInput.Text&"之間的所有素數(shù):"&strOut)863.4.6DoWhile|Until…Loop循環(huán)除上面介紹的通過ExitDo退出循環(huán)外,還可以使用關(guān)鍵字While或Until在Do…Loop結(jié)構(gòu)中添加一個表達(dá)式來控制循環(huán),語句格式為:DoWhile|UntilExpression

語句塊Loop87⑴對于DoWhileExpression,當(dāng)Expression的值為True時,執(zhí)行語句塊,否則退出循環(huán),執(zhí)行流程圖如圖3-17所示。Loop下條語句圖3-17DoWhile

…Loop循環(huán)執(zhí)行流程圖ExpressionTrueFalse語句塊88⑵對于DoUntilExpression,則當(dāng)Expression的值為True時,退出循環(huán),否則執(zhí)行語句塊,執(zhí)行流程圖與DoWhileExpression類似,只是判斷條件與DoWhile循環(huán)相反。注意:由于在執(zhí)行語句塊之前要進(jìn)行Expression判斷,因此無論DoWhile,還是DoUntil,有可能語句塊一次都不執(zhí)行。89例3.12在例3.10的基礎(chǔ)上,使用DoWhile…Loop循環(huán)或DoUntil…Loop循環(huán)替換For…Next循環(huán)判斷是否是素數(shù)。具體操作過程:⑴創(chuàng)建Windows應(yīng)用程序項目,項目“名稱”為“判斷一組素數(shù)3”。⑵其它操作同例3.10。⑶“判斷一組素數(shù)”按鈕的Click事件響應(yīng)的代碼中,“判斷過程”代碼更改為:90

'判斷過程

ForintN=2TointNum

intC=2'intC用來測試intN能否整除

'如果使用DoUntil循環(huán),則如果intC

的當(dāng)前值能整除intN,或intC>=intN/2,則退出'循環(huán),否則循環(huán),控制語句為:

'DoUntil(intNModintC)=0Or(intC>=intN/2)

'如果使用DoWhile循環(huán),則如果intC

的當(dāng)前值不能整除intN,并且intC

小于intN/2,則'循環(huán),否則退出循環(huán),控制語句為:

DoWhile(intNModintC)<>0And(intC<intN/2)

intC+=1'intC

遞增

Loop91'DoWhile循環(huán)是由于intNModintC=0退出,intN

不是素數(shù)

If((intNModintC)=0)ThenContinueFor'繼續(xù)ForintN

的下一次循環(huán)

EndIf'否則DoWhile循環(huán)是由于intC>=intN/2退出,intN

是素數(shù)

strOut=strOut&intN&""NextintN923.4.7Do…LoopWhile|Until循環(huán)另一種使用關(guān)鍵字While或Until在Do…Loop結(jié)構(gòu)中添加一個表達(dá)式來控制循環(huán)的語句格式為:Do

語句塊LoopWhile|UntilExpression93⑴對于LoopWhileExpression,當(dāng)Expression的值為True時,執(zhí)行語句塊,否則退出循環(huán),執(zhí)行流程圖如圖3-18所示LoopWhile下條語句圖3-18DoWhile

…Loop循環(huán)執(zhí)行流程圖ExpressionTrueFalse語句塊Do94⑵對于LoopUntilExpression,則當(dāng)Expression的值為True時,退出循環(huán),否則執(zhí)行語句塊,執(zhí)行流程圖與LoopWhileExpression類似,只是判斷條件與LoopWhile循環(huán)相反。注意:由于在執(zhí)行完語句塊后進(jìn)行Expression判斷,因此無論LoopWhile,還是LoopUntil,語句塊至少能執(zhí)行一次。95例3.13通過MessageBox消息對話框顯示一個最小的水仙花數(shù)。所謂“水仙花數(shù)”是指一個3位數(shù),其各位數(shù)字(個位、十位、百位)的立方和等于該數(shù)。具體操作過程:⑴創(chuàng)建Windows應(yīng)用程序項目,項目“名稱”為“最小水仙花數(shù)”。⑵添加Button控件,Name為btnNum,其Click事件的響應(yīng)代碼為:

96PrivateSubbtnNum_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnNum.Click'定義變量

DimintNumAsInteger=99DimintB0,intB1,intB2AsInteger97

'開始循環(huán)

Do

intNum+=1intB0=intNumMod10'計算個位數(shù)字

intB1=(intNumMod100)\10'計算十位數(shù)字

intB2=intNum\100'計算百位數(shù)字

'如果找到最小的水仙花數(shù),或被判斷的數(shù)遞增到四位數(shù),則退出循環(huán)

LoopUntil(intNum=intB0^3+intB1^3+intB2^3)OrintNum>100098

'如果找到最小的水仙花數(shù),則通過對話框顯示

If(intNum<=1000)Then'如果退出Do循環(huán)是由于找到了最小的水仙花數(shù)

MessageBox.Show("最小的水仙花數(shù):"&intNum,"水仙花數(shù)")Else

MessageBox.Show("沒有找到最小的水仙花數(shù)!","水仙花數(shù)")EndIfEndSub993.5過程在編寫比較大的程序時,可能經(jīng)常

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論