![《Visual Basic 2005 程序設計》第3章 程序結構控制_第1頁](http://file4.renrendoc.com/view10/M02/0A/08/wKhkGWWfI26Aeu4ZAABK4gJ4d-0464.jpg)
![《Visual Basic 2005 程序設計》第3章 程序結構控制_第2頁](http://file4.renrendoc.com/view10/M02/0A/08/wKhkGWWfI26Aeu4ZAABK4gJ4d-04642.jpg)
![《Visual Basic 2005 程序設計》第3章 程序結構控制_第3頁](http://file4.renrendoc.com/view10/M02/0A/08/wKhkGWWfI26Aeu4ZAABK4gJ4d-04643.jpg)
![《Visual Basic 2005 程序設計》第3章 程序結構控制_第4頁](http://file4.renrendoc.com/view10/M02/0A/08/wKhkGWWfI26Aeu4ZAABK4gJ4d-04644.jpg)
![《Visual Basic 2005 程序設計》第3章 程序結構控制_第5頁](http://file4.renrendoc.com/view10/M02/0A/08/wKhkGWWfI26Aeu4ZAABK4gJ4d-04645.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章程序結構控制1本章主要內容:程序順序結構。使用If…Then構建分支結構程序。使用SelectCase構建多分支結構程序。使用For…Next構建循環(huán)結構程序。使用Do…Loop構建循環(huán)結構程序。使用Panel容器控件。使用RadioButton控件。過程的定義與使用。變量的生存期與作用域。2通過上一章的討論可知,算法用來描述如何對數(shù)據(jù)進行處理,以便得到期望的結果。因此,在算法中需要依次處理一些數(shù)據(jù),或對一些數(shù)據(jù)處理結果進行判斷決策,或循環(huán)處理一些數(shù)據(jù)。為此,使用VisualBasic2005實現(xiàn)一個算法時,需要相應的語句實現(xiàn)判斷決策和循環(huán)處理,即對程序的流程進行控制。下面結合逐步增加功能的實例講述程序流程的順序結構、選擇分支結構、循環(huán)結構,以及過程的定義和使用。33.1順序結構最簡單的程序流程結構是順序結構,即各語句按照先后出現(xiàn)的次序執(zhí)行,其執(zhí)行流程如圖3-1所示。語句1語句2…...語句n圖3-1順序結構流程圖4例3.1通過文本框輸入兩個數(shù),進行相加處理后,通過輸出文本框輸出。具體操作過程:⑴新建項目,選擇“Windows應用程序”,并把“名稱”修改為“程序流程控制1.0”,然后單擊“確定”。⑵在解決方案資源管理器中把“Form1.vb”文件名改為“程序流程控制.vb”。⑶打開窗體設計視圖,選擇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事件過程中添加響應代碼:Close()。⑼雙擊“計算”按鈕,在代碼編輯器中添加對“計算”按鈕Click事件響應的代碼:5
PrivateSubbtnCalculate_Click(ByValsenderAsSystem.Object,_
ByValeAsSystem.EventArgs)HandlesbtnCalculate.Click'定義變量
DimobjOper1AsObjectDimobjOper2AsObjectDimobjResultAsObjectDimstrOutputAsString=""'讀取輸入的內容
objOper1=txtInput1.TextobjOper2=txtInput2.Text'輸入內容相加
objResult=objOper1+objOper2'輸出結果
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進行的是兩個字符串“+”操作,即字符串連接操作。7如果要把12和34相加按數(shù)值“+”進行運算,則需要把文本框輸入的字符串轉換為數(shù)值類型,如下面的代碼把輸入內容轉換為Double數(shù)值類型后再進行相加:
'讀取輸入的內容
objOper1=CDbl(txtInput1.Text)'把輸入的字符串內容轉換為Double數(shù)值類型
objOper2=CDbl(txtInput2.Text)'把輸入的字符串內容轉換為Double數(shù)值類型8在對話框中輸入12和34,單擊“計算”按鈕,則在輸出文本框中顯示相加結果是“46”。但如果輸入的是12x(有時輸入數(shù)值時可能不小心輸入了一個非數(shù)字字母)和34,如果在VisualStudio2005中通過“啟動調試”運行的程序,則出現(xiàn)從字符串“12x”到類型“Double”轉換無效的異常提示對話框,如圖3-4所示。9圖3-4從字符串“12x”到類型“Double”轉換無效的異常提示10如果是直接運行的程序流程控制1.0.exe程序,當輸入的“12x”無法轉換為Double類型的數(shù)值時,程序出現(xiàn)錯誤,如圖3-5所示,并異常終止執(zhí)行。如果是直接運行的程序流程控制1.0.exe程序,當輸入的“12x”無法轉換為Double類型的數(shù)值時,程序出現(xiàn)錯誤,如圖3-5所示,并異常終止執(zhí)行。11圖3-5程序流程控制1.0.exe運行出現(xiàn)錯誤提示信息12為了防止數(shù)據(jù)轉換出現(xiàn)錯誤,在程序中進行數(shù)據(jù)轉換之前,應該判斷輸入的內容是否能夠進行轉換,如果不能轉換,則提示錯誤信息,即需要選擇分支。實現(xiàn)選擇分支結構的語句有兩個:If…Then語句和SelectCase語句。133.2If…Then語句If…Then語句在程序設計中,經(jīng)常以單分支、雙分支、多分支和嵌套的顯示出現(xiàn)。143.2.1If…Then語句單分支結構If…Then語句單分支結構的語句格式為:If(Expression)Then語句塊EndIf其中Expression是邏輯表達式或關系表達式。如對于0≤intX≤100,VisualBasic可以寫成:intX>=0AndintX<=100。Expression的值只能是True或False,作為If進行測試判斷的依據(jù):如果Expression的值為True,依次執(zhí)行語句塊中的語句,然后執(zhí)行EndIf后的語句;如果Expression的值為False,則跳過語句塊直接執(zhí)行EndIf后的語句。其執(zhí)行流程如圖3-6所示。15語句塊圖3-6單分支結構流程圖ExpressionTrueFalse16提示:語句塊中可以包含多條語句。如果語句塊中只有一條語句,If…Then單分支結構可以省略EndIf,寫成一行,如下格式:
If(Expression)Then語句17例3.2在例3.1的基礎上,增加對文本框輸入內容的判斷:如果輸入內容不能轉換為Double類型,則退出過程調用。具體操作過程同例3.1,為了區(qū)別上述程序,項目“名稱”修改為“程序流程控制2.0”。雙擊“計算”按鈕,在代碼編輯器中添加對“計算”按鈕Click事件響應的代碼:18
PrivateSubbtnCalculate_Click(ByValsenderAsSystem.Object,_
ByValeAsSystem.EventArgs)HandlesbtnCalculate.Click'定義變量
DimobjOper1AsObjectDimobjOper2AsObjectDimobjResultAsObjectDimstrOutputAsString=""19
'讀取輸入的內容,如果輸入的內容包含非數(shù)字字符則退出過程調用
IfNot(IsNumeric(txtInput1.Text)AndIsNumeric(txtInput2.Text))Then
MessageBox.Show("輸入的內容包含非數(shù)字字符!","錯誤")'輸出提示信息
ExitSub'退出過程調用
EndIfobjOper1=CDbl(txtInput1.Text)'把輸入的字符串內容轉換為Double數(shù)值類型
objOper2=CDbl(txtInput2.Text)'把輸入的字符串內容轉換為Double數(shù)值類型20
'輸入內容相加
objResult=objOper1+objOper2'輸出結果
strOutput=txtInput1.Text&"+"&txtInput2.Text&"="&objResult&vbCrLf
txtOutput.Text=txtOutput.Text&strOutputEndSub提示:IsNumeric函數(shù)的格式為IsNumeric(Expression),如果Expression中的內容能夠轉換為數(shù)值,則返回True,否則返回False。21代碼說明:⑴對于Not(IsNumeric(txtInput1.Text)AndIsNumeric(txtInput2.Text)),只要txtInput1.Text和txtInput2.Text有一個不能正確轉換為數(shù)值,則表達式返回True,執(zhí)行If…Then后的語句,即退出過程調用。⑵如果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語句雙分支結構If…Then語句雙分支結構的語句格式為:If(Expression)Then語句塊1Else
語句塊2EndIf23其中Expression是邏輯表達式或關系表達式,返回值為True或False。If…Then語句雙分支結構的語句的含義是:如果Expression的值為True,依次執(zhí)行語句塊1中的語句,然后執(zhí)行EndIf后的語句;如果Expression的值為False,依次執(zhí)行語句塊2中的語句,然后執(zhí)行EndIf后的語句。24If…Then語句雙分支結構執(zhí)行流程如圖3-8所示??梢钥闯觯Z句塊1和語句塊2只能執(zhí)行其中一個,不能同時執(zhí)行。圖3-8雙分支結構流程圖ExpressionFalseTrue語句塊1語句塊225例3.3在例3.2的基礎上,增加可以選擇兩個數(shù)相加或相減的功能,“計算”按鈕根據(jù)選擇的功能進行兩個數(shù)相加或相減操作。具體操作過程同例3.2,需要添加和修改的額外內容有:⑴為了區(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”語句之后添加一個記錄已選操作類型的屬性:
'定義屬性,記錄選擇的操作類型,默認為+操作
PrivatestrSelOperatorAsString="+“注意:在本例中strSelOperator默認的初始值是“+”。Private是訪問控制描述關鍵字,說明strSelOperator只能在類frmProgStruct內使用,即類frmProgStruct內的過程可以引用strSelOperator。28⑹雙擊“+”,在代碼編輯器中添加對“+”單選框CheckedChanged事件響應的代碼:
PrivateSubrdbPlus_CheckedChanged(ByValsenderAsSystem.Object,_
ByValeAsSystem.EventArgs)HandlesrdbPlus.CheckedChanged
strSelOperator="+"'“+”操作被選中EndSub29⑺雙擊“-”,在代碼編輯器中添加對“-”單選框CheckedChanged事件響應的代碼:
PrivateSubrdbSub_CheckedChanged(ByValsenderAsSystem.Object,_
ByValeAsSystem.EventArgs)HandlesrdbSub.CheckedChanged
strSelOperator="-"'“-”操作被選中EndSub30⑻在例3.2實現(xiàn)的“計算”按鈕Click事件響應代碼的基礎上,重新編寫對輸入內容進行相加、相減操作和輸出的代碼:
'輸入內容相加、相減操作
If(strSelOperator="+")Then'如果“+”操作被選中
objResult=objOper1+objOper2Else'否則“+”操作沒有被選中,則“-”操作被選中
objResult=objOper1-objOper2EndIf'輸出結果
strOutput=txtInput1.Text&strSelOperator&txtInput2.Text&"="&objResult&vbCrLf
txtOutput.Text=txtOutput.Text&strOutput31提示:RadioButton只有選中、未選中兩種狀態(tài),單擊同一集合類的某一個RadioButton控件,則該控件被則選中,相應地其它控件則為未選中。RadioButton控件中的Checked屬性記錄控件選中與否的狀態(tài),當狀態(tài)變化時,觸發(fā)RadioButton控件的CheckedChanged事件。323.2.3If…Then語句多分支結構If…Then語句多分支結構的語句格式為:If(Expression1)Then
語句塊1ElseIf
(Expression2)Then
語句塊2…
ElseIf
(Expressionn)Then
語句塊nElse
語句塊n+1EndIf33If…Then語句多分支結構根據(jù)表達式的值確定要執(zhí)行的語句塊,如果表達式的值為True,則執(zhí)行相應的語句塊,然后退出If…Then多分支結構語句,執(zhí)行EndIf后的語句;否則執(zhí)行其后的判斷語句ElseIf
(Expressionx)Then語句。If…Then語句多分支結構執(zhí)行流程如圖3-10所示??梢钥闯觯看沃荒軋?zhí)行其中一個語句塊。34圖3-10多分支結構流程圖FalseTrue語句塊2Expression1語句塊1Expression2……ExpressionnTrueFalseTrueFalse語句塊n語句塊n+135例3.4在例3.3的基礎上,增加可以選擇兩個數(shù)相加、減、乘、除的功能,“計算”按鈕根據(jù)選擇的功能進行兩個數(shù)相應的計算。具體操作過程同例3.3,需要添加和修改的額外內容有:⑴為了區(qū)別上述程序功能的不同,把該項目“名稱”修改為“程序流程控制2.2”。⑵在Panel控制中再添加2個RadioButton控件,Text分別改為“×”、“÷”,Name分別改為“rdbMultiple”、“rdbDivide”。36⑶雙擊“×”,在代碼編輯器中添加對“×”單選框CheckedChanged事件響應的代碼:
PrivateSubrdbMultiple_CheckedChanged(ByValsenderAsSystem.Object,_
ByValeAsSystem.EventArgs)HandlesrdbMultiple.CheckedChanged
strSelOperator="×"'“×”操作被選中EndSub37⑷雙擊“÷”,在代碼編輯器中添加對“÷”單選框CheckedChanged事件響應的代碼:
PrivateSubrdbDivide_CheckedChanged(ByValsenderAsSystem.Object,_
ByValeAsSystem.EventArgs)HandlesDivide.CheckedChanged
strSelOperator="÷"'“÷”操作被選中EndSub38⑸在例3.3實現(xiàn)的“計算”按鈕Click事件響應代碼的基礎上,重新編寫對輸入內容進行加、減、乘、除操作的代碼:
'輸入內容進行+、-、×、÷操作
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,選擇操作“÷”并單擊“計算”按鈕,則顯示計算結果為無窮大,如圖3-12所示。這是因為在除操作中,除數(shù)不能為0。為此,在“÷”運算前,需要判斷除數(shù)是否為0,如果是0,則不能進行“÷”運算。403.2.4If…Then語句嵌套If…Then語句嵌套是指在If…Then語句單分支、雙分支、多分支結構的Then語句后或Else語句后還可以再使用If…Then語句進行判斷,構成選擇分支。如: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的語句:
'輸入內容進行+、-、×、÷操作
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ù)是,則退出過程調用
MessageBox.Show("被除數(shù)不能為零!","錯誤")ExitSubElse'否則進行÷操作
objResult=objOper1/objOper2EndIfElse
MessageBox.Show("選擇操作有錯!","錯誤")EndIf423.3SelectCase語句如果要從多種備選情況中選擇一種情況,或從多種備選情況中選擇多種情況,可以通過If…Then語句多分支結構及嵌套實現(xiàn),如例3.4。但當備選情況的量比較大時,使用If…Then語句則:效率低。如例3.4中,要判斷到“÷”時,必須和前3種操作進行比較,如果使用“÷”的概率非常高,則每次要進行的無用比較操作就越多,從而造成程序執(zhí)行效率的低下。程序不易閱讀。如例3.4中,要知道“ElseIf(strSelOperator="÷")Then”中表達式所包含的確切邏輯含義,必須要和前面的所有判斷包含的表達式的邏輯含義結合起來進行理解。43在例3.4的If…Then語句多分支結構中,進行判斷的語句有一個共同的特點,即strSelOperator和一個字符串(“+”、“-”、“×”、“÷”)進行“=”(相等)比較。對于這種特點的從多種備選情況中選擇一種、多種情況的判斷,VisualBasic2005提供了一個更好的多分支判斷結構,即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多分支結構。具體操作過程同例3.4,需要添加和修改的額外內容有:⑴為了區(qū)別上述程序功能的不同,把該項目“名稱”修改為“程序流程控制2.2.1”。⑵使用SelectCase語句替換If…Then多分支結構:47
'輸入內容進行+、-、×、÷操作
SelectCasestrSelOperatorCase"+"'如果“+”操作被選中
objResult=objOper1+objOper2Case"-"'如果“-”操作被選中
objResult=objOper1-objOper2Case"×"'如果“×”操作被選中
objResult=objOper1*objOper2Case"÷"'如果“÷”操作被選中
If(objOper2=0)Then'如果被除數(shù)是,則退出過程調用
MessageBox.Show("被除數(shù)不能為零!","錯誤")ExitSubElse
objResult=objOper1/objOper2EndIfCaseElse
MessageBox.Show("選擇操作有錯!","錯誤")EndSelect48注意:SelectCase后只能有一個表達式。如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中的多個值(多個值之間用逗號分隔)對應于同一語句塊K。51例如:
DimstrMemberTypeasString……‘為strMemberType賦值
SelectCasestrMemberTypeCase"小學生","中學生","高中生","大學生"
MessageBox.Show("您選擇的學生是:"&strMemberType,"學生類型")Case"教師","干部"
MessageBox.Show("您選擇的工作人員是:"&strMemberType,"工作人員類型")CaseElse
MessageBox.Show("您輸入的"&strMemberType&"是無效類型!","錯誤")EndSelect52如果Case子句要表示范圍,有兩種格式:⑴Exp1ToExp2格式:表示的范圍是[Exp1,Exp2],即大于等于Exp1,并且小于等于Exp2。這里Exp2必須大于Exp1。如:Case60To69。⑵IsOperatorExp格式:用帶比較運算符(=、<>、<、<=、>或>=)的Is關鍵字來指定對Expression匹配值的限制。如CaseIs<0。53提示:⑴Exp1、Exp2和Exp都可以為字符串。如“AA”To“HH”,表示“AA”到“HH”之間的所有字符串(按字母排列)。⑵在第2種格式中,如果沒有輸入Is關鍵字,系統(tǒng)將自動在Operator前面插入。這里Is是關鍵字,不是運算符!54例3.6通過文本框輸入一個0到100之間的整數(shù)成績,使用MessageBox對話框顯示成績的級別:小于60為不及格;60~69為中等;70~79為良好;80~89為優(yōu)良;90~100為優(yōu)秀。具體操作過程:⑴創(chuàng)建Windows應用程序項目,項目“名稱”為“成績分級”。⑵為窗體添加1個Label控件、1個TextBox控件和兩個Button控件,Name分別為:labString,txtInputScore,btnGrade,btnQuit;Text分別為:“請輸入成績:”,“0”,“顯示級別”,“退出”。為使用“退出”按鈕添加退出程序代碼:Close()。55⑶在編輯器中添加響應“顯示級別”按鈕Click事件的代碼:
PrivateSubbtnGrade_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesbtnGrade.Click'定義變量,保存輸入的成績
DimintScoreAsInteger'讀取輸入的成績
IfNotIsNumeric(txtInputScore.Text)Then
MessageBox.Show("無效輸入內容!","錯誤")ExitSubEndIf
intScore=CInt(txtInputScore.Text)'為intScore
賦值56
'根據(jù)intScore顯示相應的成績級別
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)結構有時程序中某些代碼需要重復執(zhí)行一定的次數(shù)后才能得到最終結果,這種重復執(zhí)行可以通過循環(huán)結構實現(xiàn)。比如在例3.5中增加對輸入的兩個數(shù)進行累加的功能,如輸入12、34,累加表示12+13+…+33+34,如果累加后的和保存在變量intSum中,則這種累加的動作可以表示成:intSum=intSum+intX,即intSum的當前值和intX相加,結果再保存到intSum中,如果intX依次取12到34之間的一個整數(shù),重復執(zhí)行上述累加動作(34-12+1)次,即可計算出12到34的累加和,即intSum的值。循環(huán)結構有兩種:“For”計數(shù)型循環(huán),即循環(huán)指定的次數(shù)后停止循環(huán);“Do”條件型循環(huán),即當某一條件滿足時執(zhí)行循環(huán)語句或退出循環(huán)。583.4.1For…Next循環(huán)
For…Next循環(huán)屬于計數(shù)型循環(huán),將語句塊重復執(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)”的判斷表達式為:counter<=end;如果step為負,“是否繼續(xù)循環(huán)”的判斷表達式為:counter>=end。⑵如果沒有指定,則step的默認值為1。⑶counter變量一般是在For語句之前定義,但也可以在For語句中定義,例如:
ForintCounterAsInteger=0To100Step2……'循環(huán)語句塊
NextintCounterintCounter在For語句中定義,則intCounter只能在For…Next循環(huán)內的語句塊中使用,即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的基礎上,增加兩個數(shù)“累加”功能。具體操作過程同例3.3,需要添加和修改的額外內容有:⑴為了區(qū)別上述程序功能的不同,把該項目“名稱”修改為“程序流程控制3.0”。⑵在Panel控制中再添加1個RadioButton控件,Text改為“累加”,Name改為“rdbConseculate”。63⑶雙擊“累加”,在代碼編輯器中添加對“累加”單選框CheckedChanged事件響應的代碼:
PrivateSubrdbConseculate_CheckedChanged(ByValsenderAsSystem.Object,_
ByValeAsSystem.EventArgs)HandlesrdbConseculate.CheckedChanged
strSelOperator="累加"'“累加”操作被選中EndSub64⑷在“計算”按鈕Click事件響應代碼“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'省略步長,則默認為1
objResult+=intCount'開始累加
Next65
提示:IIf()函數(shù)的作用是根據(jù)表達式的值,從兩個值中選擇一個返回,其格式為:IIf(Expression,TruePart,FalsePart)Expression為Boolean類型,如果Expression的值為True,則返回TruePart,否則返回FalsePart。663.4.2For…Next嵌套循環(huán)For…Next嵌套循環(huán)指將一個循環(huán)放在另一個循環(huán)的語句塊內。在嵌套循環(huán)中,每個循環(huán)體都應具有唯一的循環(huán)控制變量,且循環(huán)體不能重疊。如下面的例子是錯誤的:ForintX=1To10ForintY=1To10……'循環(huán)語句塊NextXNextY67例3.8創(chuàng)建一Windows應用程序,通過MessageBox消息對話框輸出九九乘法表。具體操作過程:⑴創(chuàng)建一個Windows應用程序項目,項目“名稱”為“九九乘法表”。⑵添加Button控件,Text改為“九九乘法表”,Name改為“btnMultipleTable”。⑶雙擊“九九乘法表”按鈕,在代碼編輯器中添加其Click事件響應的代碼: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應用程序,通過文本框輸入一個整數(shù),判斷該數(shù)數(shù)否是素數(shù)。具體操作過程:⑴創(chuàng)建Windows應用程序項目,項目“名稱”為“判斷素數(shù)”。⑵添加TextBox控件,Name改為“txtInput”。⑶添加Button控件,Text改為“判斷素數(shù)”,Name分別改為“btnPrimeYN”。⑷雙擊“判斷素數(shù)”按鈕,在代碼編輯器中添加其Click事件響應的代碼:71
PrivateSubbtnPrimeYN_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesbtnPrimeYN.Click'讀取輸入的內容
IfNot(IsNumeric(txtInput.Text))Then
MessageBox.Show("輸入的內容包含非數(shù)字字符!","錯誤")ExitSubEndIfDimintNumAsInteger=CInt(txtInput.Text)'把輸入的字符串內容轉換為Integer數(shù)值
DimintCAsInteger
intNum=IIf(intNum<0,-intNum,intNum)'如果輸入的是負數(shù),則轉換為正數(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提示:當退出循環(huán)時,循環(huán)控制變量的值保持退出時的值,如上例中,如果是提前退出For循環(huán)則intC的值肯定小于intNum,否則如果是大于等于intNum,則是正常退出For循環(huán)。743.4.4ContinueFor有時在循環(huán)執(zhí)行的過程中,由于某個條件的改變而需要忽略掉當前語句到Next之間的語句,提前進入下一次For…Next循環(huán)。這種情況可以通過ContinueFor實現(xiàn)。75例3.10創(chuàng)建一Windows應用程序,通過文本框輸入一個整數(shù),輸出從2到該整數(shù)之間的所有素數(shù)。具體操作過程:⑴創(chuàng)建Windows應用程序項目,項目“名稱”為“判斷一組素數(shù)1”。⑵添加TextBox控件,Name改為“txtInput”。⑶添加Button控件,Text改為“判斷一組素數(shù)”,Name分別改為“btnPrimes”。⑷雙擊“判斷一組素數(shù)”按鈕,在代碼編輯器中添加其Click事件響應的代碼:76PrivateSubbtnPrimes_Click(ByValsenderAsSystem.Object,_
ByValeAsSystem.EventArgs)HandlesbtnPrimes.Click'讀取輸入的內容
IfNot(IsNumeric(txtInput.Text))Then
MessageBox.Show("輸入的內容包含非數(shù)字字符!","錯誤")ExitSubEndIf
DimintNumAsInteger=CInt(txtInput.Text)'把輸入的字符串內容轉換為Integer數(shù)值
DimintN,intCAsIntegerDimstrOutAsString=""
intNum=IIf(intNum<0,-intNum,intNum)'如果輸入的是負數(shù),則轉換為正數(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'提前進入下一次ForintN
循環(huán)
EndIf'否則intN是素數(shù),添加到輸出字符串中
strOut=strOut&intN&""NextintNMessageBox.Show("2--"&txtInput.Text&"之間的所有素數(shù):"&strOut)
EndSub783.4.5Do…Loop循環(huán)有時在進入循環(huán)處理時,不能確定需要執(zhí)行多少次循環(huán),則可以使用Do…Loop循環(huán)。Do…Loop屬于條件型循環(huán),其基本語句格式為:Do
語句塊Loop由于Do語句中沒有任何條件限制,則語句塊被無限次重復執(zhí)行,這種循環(huán)也稱為死循環(huán)。其執(zhí)行流程圖如圖3-15所示。79語句塊DoLoop下條語句圖3-15Do
…Loop死循環(huán)執(zhí)行流程80提示:在Do…Loop循環(huán)中,可以使用ContinueDo語句跳轉到Do語句處執(zhí)行,進而忽略執(zhí)行ContinueDo到Loop之間的語句。Do…Loop循環(huán)也可以嵌套。81在一些需要無限次重復執(zhí)行的循環(huán)中,可能需要通過死循環(huán)的形式實現(xiàn),但為了增加程序的交互性,一般在死循環(huá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的基礎上,使用Do…Loop循環(huán)替換For…Next循環(huán)判斷是否是素數(shù)。具體操作過程:⑴創(chuàng)建Windows應用程序項目,項目“名稱”為“判斷一組素數(shù)2”。⑵其它操作同例3.10。⑶“判斷一組素數(shù)”按鈕的Click事件響應的代碼中,“判斷過程”代碼更改為:84
'判斷過程
ForintN=2TointNum
intC=2'intC用來測試intN能否整除
Do'如果intC
的當前值能夠整除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)外,還可以使用關鍵字While或Until在Do…Loop結構中添加一個表達式來控制循環(huán),語句格式為:DoWhile|UntilExpression
語句塊Loop87⑴對于DoWhileExpression,當Expression的值為True時,執(zhí)行語句塊,否則退出循環(huán),執(zhí)行流程圖如圖3-17所示。Loop下條語句圖3-17DoWhile
…Loop循環(huán)執(zhí)行流程圖ExpressionTrueFalse語句塊88⑵對于DoUntilExpression,則當Expression的值為True時,退出循環(huán),否則執(zhí)行語句塊,執(zhí)行流程圖與DoWhileExpression類似,只是判斷條件與DoWhile循環(huán)相反。注意:由于在執(zhí)行語句塊之前要進行Expression判斷,因此無論DoWhile,還是DoUntil,有可能語句塊一次都不執(zhí)行。89例3.12在例3.10的基礎上,使用DoWhile…Loop循環(huán)或DoUntil…Loop循環(huán)替換For…Next循環(huán)判斷是否是素數(shù)。具體操作過程:⑴創(chuàng)建Windows應用程序項目,項目“名稱”為“判斷一組素數(shù)3”。⑵其它操作同例3.10。⑶“判斷一組素數(shù)”按鈕的Click事件響應的代碼中,“判斷過程”代碼更改為:90
'判斷過程
ForintN=2TointNum
intC=2'intC用來測試intN能否整除
'如果使用DoUntil循環(huán),則如果intC
的當前值能整除intN,或intC>=intN/2,則退出'循環(huán),否則循環(huán),控制語句為:
'DoUntil(intNModintC)=0Or(intC>=intN/2)
'如果使用DoWhile循環(huán),則如果intC
的當前值不能整除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)另一種使用關鍵字While或Until在Do…Loop結構中添加一個表達式來控制循環(huán)的語句格式為:Do
語句塊LoopWhile|UntilExpression93⑴對于LoopWhileExpression,當Expression的值為True時,執(zhí)行語句塊,否則退出循環(huán),執(zhí)行流程圖如圖3-18所示LoopWhile下條語句圖3-18DoWhile
…Loop循環(huán)執(zhí)行流程圖ExpressionTrueFalse語句塊Do94⑵對于LoopUntilExpression,則當Expression的值為True時,退出循環(huán),否則執(zhí)行語句塊,執(zhí)行流程圖與LoopWhileExpression類似,只是判斷條件與LoopWhile循環(huán)相反。注意:由于在執(zhí)行完語句塊后進行Expression判斷,因此無論LoopWhile,還是LoopUntil,語句塊至少能執(zhí)行一次。95例3.13通過MessageBox消息對話框顯示一個最小的水仙花數(shù)。所謂“水仙花數(shù)”是指一個3位數(shù),其各位數(shù)字(個位、十位、百位)的立方和等于該數(shù)。具體操作過程:⑴創(chuàng)建Windows應用程序項目,項目“名稱”為“最小水仙花數(shù)”。⑵添加Button控件,Name為btnNum,其Click事件的響應代碼為:
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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度股東個人借款合同續(xù)借與展期規(guī)定
- 景區(qū)旅游合作合同范本
- 臨建拆遷合同范本
- 2025年度建筑工程項目管理咨詢服務合同樣本
- 2025年度文化產(chǎn)業(yè)園區(qū)發(fā)展基金借款協(xié)議
- 會議合同范例
- 個人餐飲技術合同范例
- 入股奶茶店合同范本
- 包公勞動合同范例
- 2025年度建筑幕墻設計與安裝合同范本
- 非物質文化遺產(chǎn)拓印 課件
- 手拉葫蘆安全技術操作規(guī)程
- 2024-2025年高中化學 第1章 第3節(jié) 第1課時 電離能及其變化規(guī)律教案 魯科版選修3
- 無錫商業(yè)職業(yè)技術學院雙高建設申報書
- 重大事故隱患判定標準與相關事故案例培訓課件
- 2024年秋新北師大版七年級上冊數(shù)學教學課件 3.1.1 代數(shù)式
- 全過程工程咨詢管理服務方案
- 《麻風病防治知識》課件
- 經(jīng)典誦讀演講稿6篇
- 鄉(xiāng)村醫(yī)生返聘協(xié)議書
- 2024機械買賣協(xié)議
評論
0/150
提交評論