版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章基本控制結(jié)構(gòu)4.1順序結(jié)構(gòu)
4.2選擇結(jié)構(gòu)
4.3循環(huán)結(jié)構(gòu)
4.4嵌套
4.5應(yīng)用舉例
4.6Do循環(huán)的其他結(jié)構(gòu)
教學(xué)小結(jié)
習(xí)題 4.1順序結(jié)構(gòu)
4.1.1輸出數(shù)據(jù)的基本方法
在VB中,輸出數(shù)據(jù)的方法比較多,經(jīng)常使用的有以下三種方法。
1.調(diào)用窗體或圖片框的Print方法
前面章節(jié)已經(jīng)介紹了窗體和圖片框的Print方法,本節(jié)主要通過舉例說明Print方法中Tab函數(shù)的使用。
在Print方法中,Tab函數(shù)是用于確定輸出項(xiàng)列位置的函數(shù)。使用時(shí)Tab函數(shù)通常和輸出項(xiàng)之間用分號(hào)隔開。格式為:
Print[Tab(n);]輸出項(xiàng)
該格式表示在窗體當(dāng)前行第n列顯示輸出項(xiàng)的值。
例4-1
在窗體上輸出一個(gè)由“?*?”組成的等腰三角形,首行一個(gè)“?*?”,共5行。
分析:采用順序結(jié)構(gòu)來完成,需要寫出5個(gè)輸出語句,每一個(gè)語句用一個(gè)Tab函數(shù)來控制輸出列的起始位置。程序代碼寫在命令按鈕的Click事件中,代碼如下:
PrivateSubCommand1_Click()
PrintTab(9);"*"
PrintTab(8);"***"
PrintTab(7);"*****"
PrintTab(6);"*******"
PrintTab(5);"*********"
EndSub在該代碼段中,Tab(9)、Tab(8)、…、Tab(5)分別用來控制每行第一個(gè)字符的輸出位置,即相對(duì)于當(dāng)前窗體左邊的位置。程序執(zhí)行結(jié)果如圖4-1a所示。圖4-1a用Tab函數(shù)控制列位置其實(shí),圖片框控件也支持Print方法,其Print方法的調(diào)用格式為:
圖片框名.Print[Tab(n);]輸出項(xiàng)
如果將上述結(jié)果輸出到圖片框控件對(duì)象Picture1中,僅需要在窗體上添加一個(gè)圖片框(PictureBox),將例4-1所有的Print方法前加上“Picture1.”,運(yùn)行結(jié)果如圖4-1b所示。圖4-1b輸出到圖片框
2.利用標(biāo)簽(Label)輸出結(jié)果
利用標(biāo)簽輸出結(jié)果是通過標(biāo)簽的Caption屬性來實(shí)現(xiàn)的。方法是:將輸出內(nèi)容組成字符串,作為標(biāo)簽的Caption屬性值。當(dāng)輸出信息較多時(shí),還可在輸出字符串中加回車Chr(13)或換行Chr(10)控制符,使輸出效果更清晰。
例4-2
雞兔同籠問題:籠中飼養(yǎng)雞和兔子,總頭數(shù)為16,總腳數(shù)為40。問籠中雞和兔子各幾只?
分析:設(shè)有雞x只,兔y只,雞和兔的總頭數(shù)為h,總腳數(shù)為f。根據(jù)題意可以寫出下面的方程式:
本例中h和f的值已知,可以使用賦值語句將數(shù)據(jù)直接寫在程序中,輸出結(jié)果可以通過標(biāo)簽顯示出來。
在窗體上添加1個(gè)標(biāo)簽和1個(gè)命令按鈕(見圖4-2a),標(biāo)簽的AutoSize為True,命令按鈕的Caption值設(shè)置為“計(jì)算”。本段代碼中,雞和兔的總頭數(shù)預(yù)先確定,計(jì)算結(jié)果(雞和兔只數(shù))可用具體的表達(dá)式表示。結(jié)果通過Label1輸出,輸出字符串中加入了一個(gè)換行符Chr(10)實(shí)現(xiàn)換行功能,當(dāng)然也可以用回車符Chr(13)代替換行符Chr(10)。程序運(yùn)行結(jié)果如圖4-2b所示。
同樣,利用文本框的Text屬性和消息對(duì)話框MsgBox函數(shù)等,也能輸出運(yùn)算結(jié)果。圖4-2a窗體布局情況圖4-2b程序運(yùn)行結(jié)果
3.輸出到數(shù)據(jù)文件中
利用Print語句可以將程序處理結(jié)果直接輸出到數(shù)據(jù)文件中并保存起來,供其他程序共享使用。將數(shù)據(jù)輸出到數(shù)據(jù)文件中,必不可少的步驟有三個(gè),分別是:
(1)利用Open語句創(chuàng)建數(shù)據(jù)文件。格式為:
Open文件標(biāo)識(shí)ForOutputAs#文件號(hào)
其中:文件標(biāo)識(shí)是由待寫入的數(shù)據(jù)文件名及路徑組成的字符串;文件號(hào)是一個(gè)內(nèi)存緩沖區(qū)編號(hào),取值范圍在1~511之間。
(2)利用Write語句寫入文件。格式為:
Write#文件號(hào),數(shù)據(jù)1,數(shù)據(jù)2,數(shù)據(jù)3……
(3)關(guān)閉文件。格式為:
Close#文件號(hào)
例4-3
將例4-2的運(yùn)算結(jié)果輸出到數(shù)據(jù)文件中。
程序代碼如下:圖4-3寫入文件中的數(shù)據(jù)4.1.2提供數(shù)據(jù)的基本方法
1.使用InputBox函數(shù)
例4-4
用InputBox函數(shù)提供數(shù)據(jù)來求解雞兔同籠問題。
在程序運(yùn)行過程中,通過InputBox函數(shù)接收總頭數(shù)與總腳數(shù),運(yùn)算結(jié)果通過Print方法輸出到窗體上。
程序代碼如下:
2.使用文本框
在程序運(yùn)行時(shí)為變量提供數(shù)據(jù),除了使用InputBox函數(shù)外,還可以將文本框的Text屬性值賦給變量。
使用文本框?yàn)樽兞刻峁?shù)據(jù)的格式為:
變量名=對(duì)象名.Text
例4-5
用文本框提供數(shù)據(jù)來求解雞兔同籠問題。
設(shè)計(jì)步驟如下:
(1)界面設(shè)計(jì)。
在窗體上添加2個(gè)文本框(Text1,Text2)、3個(gè)標(biāo)簽(Label1,Label2,Label3)、1個(gè)命令按鈕(Command1),如圖4-4a所示。圖4-4a界面布局
(2)屬性設(shè)置。
標(biāo)簽的AutoSize值均為True,文本框的Text和Label3.Caption為空,Label1.Caption為?"總頭數(shù)為:",Label2.Caption為?"總腳數(shù)為:",Command1.Caption為?"計(jì)算"。
(3)編寫程序代碼。程序運(yùn)行時(shí),Text1首先獲得焦點(diǎn),等待用戶輸入總頭數(shù),輸入完數(shù)據(jù)后,按Tab鍵或鼠標(biāo)單擊Text2,使Text2獲得焦點(diǎn),輸入總腳數(shù),再單擊“計(jì)算”按鈕執(zhí)行計(jì)算程序,計(jì)算結(jié)果通過Label3的Caption屬性顯示出來。程序運(yùn)行結(jié)果如圖4-4b所示。圖4-4b運(yùn)行結(jié)果
3.從文件中獲得數(shù)據(jù)
從文件中讀取數(shù)據(jù)一般分為三個(gè)步驟:
(1)利用Open語句打開文件。格式為:
Open文件標(biāo)識(shí)ForInputAs#文件號(hào)
(2)利用Input語句讀出數(shù)據(jù)。格式為:
Input#文件號(hào),變量1,變量2,變量3……
該語句可以將文件中的數(shù)據(jù)依次讀出并一一賦給對(duì)應(yīng)位置的變量。
(3)關(guān)閉文件。格式為:
Close#文件號(hào) 4.2選擇結(jié)構(gòu)
4.2.1If結(jié)構(gòu)
If結(jié)構(gòu)的流程如圖4-5所示,語法格式如下:
If<條件1>Then
<語句組1>
[ElseIf<條件2>Then
<語句組2>
……
ElseIf<條件n>Then
<語句組n>
Else
<語句組n+1>]
EndIf圖4-5If多分支結(jié)構(gòu)流程圖執(zhí)行過程如下:
(1)從上到下依次判斷條件,當(dāng)遇到第一個(gè)條件被滿足后,便執(zhí)行相應(yīng)的語句組,執(zhí)行完后,執(zhí)行EndIf的后續(xù)語句。也就是說,首先判斷第一個(gè)條件是否成立,若成立,執(zhí)行語句組1,再執(zhí)行EndIf的后續(xù)語句;如果條件不成立,判斷第二個(gè)條件,處理辦法同第一個(gè)條件,……,其他依次類推。
(2)如果所有條件都不成立,則執(zhí)行Else對(duì)應(yīng)的語句組n+1,最后執(zhí)行EndIf之后的語句。
例4-7
從鍵盤輸入血型,輸出該血型的性格特點(diǎn)(性格特點(diǎn)可以從網(wǎng)上獲得)。
分析:常規(guī)血型分為A、B、AB、O型四種,該題可以通過建立一個(gè)四個(gè)分支的選擇結(jié)構(gòu)完成。
新建一個(gè)工程,在窗體上添加1個(gè)文本框(Text1,用于輸入血型)、1個(gè)命令按鈕(Command1)、2個(gè)標(biāo)簽(Label1用于輸入提示,Label2用于輸出結(jié)果)。各控件的擺放位置如圖4-6所示。
程序代碼如下:
PrivateSubCommand1_Click()
Dimx$,y$
x=UCase(Text1.Text)
Ifx="O"Then圖4-6程序運(yùn)行界面
例4-8C盤根目錄下的數(shù)據(jù)文件in.txt保存了3個(gè)整數(shù)(數(shù)據(jù)文件內(nèi)容如圖4-7所示),請(qǐng)讀出數(shù)據(jù)并判斷以這3個(gè)數(shù)為邊長(zhǎng)的3條線段能不能構(gòu)成三角形,如果能構(gòu)成三角形,求這個(gè)三角形的面積,否則,輸出信息“三邊構(gòu)不成三角形!”。圖4-7數(shù)據(jù)文件內(nèi)容這是一種常用的If結(jié)構(gòu),由于它只有兩個(gè)分支且兩個(gè)分支的條件互為反條件,所以簡(jiǎn)稱為雙分支結(jié)構(gòu)。雙分支結(jié)構(gòu)的流程如圖4-8所示。圖4-8If雙分支結(jié)構(gòu)流程圖
例4-9
設(shè)計(jì)一個(gè)整點(diǎn)報(bào)時(shí)程序,使其具有整點(diǎn)報(bào)時(shí)的功能。
程序運(yùn)行后需要不斷獲得系統(tǒng)時(shí)間,所以需要一個(gè)計(jì)時(shí)器控件,每隔1秒鐘取一次系統(tǒng)時(shí)間。系統(tǒng)時(shí)間格式為“HH:MM:SS”,只要判斷后5位為“00:00”即可得到整點(diǎn)時(shí)刻。程序判斷流程為:取系統(tǒng)時(shí)間右5位與“00:00”比較,如果相等則報(bào)時(shí),否則不做任何操作,程序繼續(xù)。
界面設(shè)計(jì)非常簡(jiǎn)單,在窗體上添加1個(gè)標(biāo)簽(用于顯示系統(tǒng)時(shí)間)、1個(gè)計(jì)時(shí)器(將其Interval屬性設(shè)置為1000)即可。程序代碼如下:程序運(yùn)行界面見圖4-9,該程序運(yùn)行成功的條件必須是計(jì)算機(jī)時(shí)間快到整點(diǎn)才行。圖4-9程序運(yùn)行界面如果將條件改為:
Right(x,2)="00"
再將后面的輸出信息改動(dòng)一下,就可以實(shí)現(xiàn)整分報(bào)時(shí)了。
本例中Else之后沒有任何操作語句,可以將Else省去,這種結(jié)構(gòu)常稱為單分支結(jié)構(gòu)。單分支結(jié)構(gòu)流程如圖4-10所示。圖4-10單分支結(jié)構(gòu)流程圖另外,VB還提供如下一種格式:
If<條件>Then<語句組1>[else語句組2]
執(zhí)行過程為:當(dāng)條件成立時(shí),執(zhí)行語句組1;否則執(zhí)行語句組2。
4.2.2SelectCase結(jié)構(gòu)
在VB中,除了If結(jié)構(gòu)外,還可使用SelectCase結(jié)構(gòu)完成分支選擇。
格式如下:
SelectCase結(jié)構(gòu)執(zhí)行過程與塊If多分支結(jié)構(gòu)相同,即按照從上到下的順序進(jìn)行條件判斷,執(zhí)行首次條件成立時(shí)對(duì)應(yīng)的Case語句組中的語句之后,再執(zhí)行EndSelect的后續(xù)語句。Select多分支結(jié)構(gòu)流程如圖4-11所示。圖4-11Select多分支結(jié)構(gòu)流程圖
例4-10
用SelectCase結(jié)構(gòu)計(jì)算分段函數(shù)。
程序代碼如下:
PrivateSubCommand1_Click()
DimxAsSingle,yAsSingle
x=Val(InputBox("請(qǐng)輸入變量的值"))
SelectCasex
CaseIs>=10 '情況:x>=10
y=x^2+1
CaseIs>=-5 '情況:x>=-5andx<10
y=0
CaseIs<-5 '情況:x<-5
y=x^2-1
EndSelect
Print"x=";x,"";"y=";y
EndSub還要進(jìn)一步說明的是,SelectCase結(jié)構(gòu)與塊If多分支結(jié)構(gòu)均屬于“多中選一”的情況,但各有所長(zhǎng),在表示多分支簡(jiǎn)單條件時(shí)兩者均可,SelectCase結(jié)構(gòu)似乎更清晰些;當(dāng)遇到復(fù)合條件時(shí),只能使用塊If結(jié)構(gòu),而不能使用SelectCase結(jié)構(gòu)。
例4-11
編程判斷從鍵盤上輸入的日期(格式:YYYY-MM-DD)是否合法。例如月份在1~12之間就為合法日期,另外還要考慮閏年的情況;為了簡(jiǎn)化程序,這里也對(duì)年份做出規(guī)定,要求在1900~3000之間。
程序代碼如下:4.2.3有關(guān)函數(shù)
IIf()和Choose()函數(shù)為條件判斷函數(shù),根據(jù)不同情況返回不同的值。
1.IIf函數(shù)
格式:
IIf(條件,表達(dá)式1,表達(dá)式2)
說明:當(dāng)條件成立時(shí),該函數(shù)返回表達(dá)式1的值,否則返回表達(dá)式2的值。
2.Choose函數(shù)
格式:
Choose(整數(shù)表達(dá)式,選項(xiàng)列表)
說明:根據(jù)整數(shù)表達(dá)式的值,決定函數(shù)返回選項(xiàng)列表中的某個(gè)值。如果整數(shù)表達(dá)式的值為1,則返回選項(xiàng)列表中的第一個(gè)選項(xiàng)值;如果是2,則返回第二個(gè)選項(xiàng)值,依此類推。若整數(shù)表達(dá)式的值小于1或大于列出的選項(xiàng)數(shù)時(shí),函數(shù)返回空值(Null)。
例4-12
根據(jù)系統(tǒng)當(dāng)前日期,輸出今天是星期幾?
分析:使用date函數(shù)獲取系統(tǒng)的當(dāng)前日期,使用Weekday(d)函數(shù)返回一周中的第幾天(返回值為數(shù)字1~7)。程序?qū)崿F(xiàn)時(shí)最容易想到的就是使用多分支結(jié)構(gòu),根據(jù)Weekday(d)的值輸出“星期日”、“星期一”……“星期六”,這樣程序會(huì)非常冗長(zhǎng)。
如果使用Choose函數(shù),關(guān)鍵問題是構(gòu)造Choose函數(shù)中的第一個(gè)參數(shù)“整數(shù)表達(dá)式”,使其取值范圍為1~7,第二個(gè)參數(shù)便是“星期日”、“星期一”……“星期六”列表。
程序代碼如下:
PrivateSubCommand1_Click()
DimdAsDate,xAsInteger,yAsString
d=Date
x=Weekday(d)
y=Choose(x,"日","一","二","三","四","五","六")
Print"星期"&y
EndSub
通過比較可以看出,選擇合適的函數(shù)可以優(yōu)化程序結(jié)構(gòu),減少代碼行。 4.3循環(huán)結(jié)構(gòu)
循環(huán)結(jié)構(gòu)也是結(jié)構(gòu)化程序設(shè)計(jì)的三種基本結(jié)構(gòu)之一。在程序中,把重復(fù)執(zhí)行一組指令(程序段)的操作稱為循環(huán)操作。根據(jù)循環(huán)次數(shù)預(yù)先確定與否,循環(huán)結(jié)構(gòu)分為循環(huán)次數(shù)確定的For…Next結(jié)構(gòu)和循環(huán)次數(shù)不確定的Do…Loop結(jié)構(gòu)。其中,Do…Loop結(jié)構(gòu)又可以分為前測(cè)試循環(huán)和后測(cè)試循環(huán)兩種,每一種結(jié)構(gòu)又對(duì)應(yīng)了兩種形式,如圖4-12所示。圖4-12循環(huán)結(jié)構(gòu)形式4.3.1DoWhile…Loop循環(huán)結(jié)構(gòu)
前測(cè)試當(dāng)型循環(huán)DoWhile…Loop結(jié)構(gòu)表示為:
DoWhile<循環(huán)條件>
<循環(huán)體>
Loop
DoWhile…Loop循環(huán)執(zhí)行流程如圖4-13所示。圖4-13DoWhile…Loop循環(huán)執(zhí)行流程圖
例4-13
計(jì)算1?+?2?+?3?+?…?+?10的值。
分析:這是一個(gè)累加問題。假設(shè)變量n表示累加數(shù),變量s表示累加和,變量i表示累加次數(shù),累加模型s=s+n,其中n的第一個(gè)數(shù)為1,最后一個(gè)數(shù)為10,相鄰兩個(gè)數(shù)之間相差為1。
算法分析如下:
(1)給變量n、s和i賦初值0。
(2)一次累加過程如下:
n=n+1 '計(jì)算累加數(shù)
s=s+n '累加
i=i+1 '計(jì)算累加次數(shù)
(3)重復(fù)累加10次,操作如下:
DoWhilei<10
累加操作語句組
Loop
(4)輸出計(jì)算結(jié)果。
程序代碼如下:
PrivateSubCommand1_Click()
Dimi%,s%,n%表4-1例4-13執(zhí)行過程
例4-14
設(shè)某工廠當(dāng)年產(chǎn)值為13億,如果每年以5%的平均速度增長(zhǎng),問經(jīng)過多少年后該工廠的產(chǎn)值達(dá)到或超過18億。
分析:設(shè)x為當(dāng)年產(chǎn)值,y為經(jīng)過1年后的產(chǎn)值,則y=x×(1?+?0.05);判斷y值是否達(dá)到或超過18億(即判斷y≥18是否成立),如果不成立,則讓x=y(即年末產(chǎn)值為下年年初值),n?=?n?+?1(n為經(jīng)過的年數(shù));依次類推,直到y(tǒng)≥18成立時(shí)結(jié)束。
程序代碼如下:分析程序運(yùn)行過程可以看出,該問題的實(shí)質(zhì)是一個(gè)累乘問題,即在13億的基礎(chǔ)上循環(huán)累乘1+0.05,累乘了多少次,就是經(jīng)過了多少年,當(dāng)累乘結(jié)果大于或等于18億時(shí),結(jié)束累乘。應(yīng)用到累乘模型“f?=?f?*?i”。程序代碼如下:
Dimx!,n%
x=13
n=0
Dowhilex<18
x=x*(1+0.05)'x經(jīng)過1年后的產(chǎn)值,可作為下年年初值
n=n+1
Loop
MsgBox"經(jīng)過"&n&"年以后,產(chǎn)值達(dá)到或超過"&x&"億"
其實(shí),有些問題(如例4-13)的循環(huán)次數(shù)預(yù)先是可以計(jì)算出來的,當(dāng)循環(huán)次數(shù)已知時(shí),用For…Next結(jié)構(gòu)比DoWhile…Loop結(jié)構(gòu)會(huì)更簡(jiǎn)單。4.3.2For…Next循環(huán)結(jié)構(gòu)
對(duì)于循環(huán)次數(shù)已知的循環(huán),除了可以用DoWhile…Loop結(jié)構(gòu)外,還可用For…Next結(jié)構(gòu)。格式如下:
For循環(huán)變量=初值To終值[Step步長(zhǎng)]
<循環(huán)體>
Next[循環(huán)變量]
For…Next循環(huán)的執(zhí)行流程如圖4-14所示。圖4-14For…Next循環(huán)執(zhí)行流程圖 4.4嵌套
嵌套是指在一個(gè)控制結(jié)構(gòu)中包含另一個(gè)控制結(jié)構(gòu),例如選擇中嵌套選擇,選擇中嵌套循環(huán),循環(huán)中嵌套循環(huán)等。根據(jù)嵌套層數(shù)不同,可以有二重嵌套、三重嵌套甚至多重嵌套。
例4-16
求方程ax2?+?bx?+?c?=?0的解。
分析:方程的系數(shù)a、b、c的值使用InputBox通過鍵盤提供。在程序?qū)崿F(xiàn)過程中,應(yīng)根據(jù)a、b、c的不同取值情況,得到相應(yīng)的解。為幫助讀者理解判斷過程,圖4-15給出了一元二次方程求解的流程。圖4-15一元二次方程求解流程圖
(1)程序中包括三個(gè)雙分支結(jié)構(gòu)和一個(gè)多分支結(jié)構(gòu),在調(diào)試程序時(shí)要注意嵌套關(guān)系。
(2)程序的縮進(jìn)格式寫法,讀者可以試一下,如果不縮進(jìn)將會(huì)如何?
(3)引入中間變量p、q的目的是簡(jiǎn)化后面表達(dá)式。
(4)對(duì)復(fù)數(shù)解的輸出格式控制,要注意Print之后是一個(gè)字符串表達(dá)式,這個(gè)字符串表達(dá)式是由五個(gè)部分通過4個(gè)“&”符號(hào)連接而成的。
(5)對(duì)于多分支程序的調(diào)試,每一種可能性都要考慮。
例4-17
打印九九乘法口訣表(如圖4-16所示)。圖4-16九九乘法表運(yùn)行結(jié)果分析:九九乘法口訣表由9行組成,每行有9列。在設(shè)計(jì)算法時(shí),可以這樣考慮問題:
(1)外循環(huán)控制行,循環(huán)變量用i表示,循環(huán)體執(zhí)行9次,每次輸出九九表中的一行。程序框架為:
Fori=1To9
輸出一行的操作處理
Nexti
(2)內(nèi)循環(huán)控制列,循環(huán)變量用j表示,循環(huán)體執(zhí)行9次,每次完成一列的計(jì)算和輸出。程序框架為:
Forj=1To9
列的計(jì)算與輸出
Nexti循環(huán)嵌套是學(xué)習(xí)中的難點(diǎn),讀寫程序時(shí)往往無從下手,下面的總結(jié)對(duì)讀者的學(xué)習(xí)會(huì)有幫助,請(qǐng)注意仔細(xì)思考并積極應(yīng)用。
(1)讀程序時(shí),循環(huán)執(zhí)行順序時(shí)先外循環(huán)后內(nèi)循環(huán),內(nèi)循環(huán)是外循環(huán)的循環(huán)體;在編寫程序時(shí),先要明確什么樣的事情做多少次以及這樣的事情如何做,可用外循環(huán)控制做多少次,內(nèi)循環(huán)實(shí)現(xiàn)這樣的事情如何做。
(2)嵌套時(shí),內(nèi)層循環(huán)必須完全嵌套在外層循環(huán)之內(nèi),即內(nèi)外層循環(huán)不能交叉,外層要完全包含內(nèi)層。
(3)在循環(huán)嵌套中,內(nèi)外循環(huán)的循環(huán)變量不能同名。
(4)多重循環(huán)中如果用ExitDo或ExitFor退出循環(huán),要注意只能退出ExitDo或ExitFor所對(duì)應(yīng)的循環(huán)。
(5)采用縮進(jìn)格式書寫代碼可以有效地防止嵌套混亂。
例4-18
在C盤根目錄下有數(shù)據(jù)文件in.dat,其中有10組數(shù)據(jù),每組3個(gè)數(shù)據(jù),如圖4-17所示。讀出每組數(shù)據(jù),如果能夠構(gòu)成三角形,輸出這個(gè)三角形的面積;否則輸出相應(yīng)的信息。圖4-17a數(shù)據(jù)文件內(nèi)容圖4-17b程序運(yùn)行結(jié)果 4.5應(yīng)用舉例
1.不定方程
例4-19
我國(guó)古代數(shù)學(xué)家張丘建在《算經(jīng)》中提出一個(gè)不定方程問題,即“百雞問題”:公雞每只5元,母雞每只3元,小雞3只1元,100元錢買100只雞,三種雞都要有。問:公雞、母雞、小雞各可買多少只?
分析:設(shè)可買公雞x只、母雞y只、小雞z只,根據(jù)數(shù)學(xué)知識(shí)可以寫出下面的方程式:這是一個(gè)由3個(gè)未知數(shù)、2個(gè)方程組成的不定方程組,有多組解,可用窮舉法求解。窮舉法是對(duì)所有可能的解一一列舉,從中判斷哪些解符合題設(shè)條件的求解方法??紤]到100元最多買20只公雞或33只母雞,所以x的取值范圍應(yīng)該在1~20之間,y的取值范圍應(yīng)該在1~33之間。
程序代碼如下:
PrivateSubCommand1_Click()
Dimx%,y%,z%
Forx=1To20該程序中的判斷語句共運(yùn)行了20?×?33?×?100次,實(shí)際上,知道了公雞和母雞的只數(shù)后,小雞可以直接推算出來,即z?=?100?-?x?-?y,而不需要再用循環(huán)了。所以,程序可以優(yōu)化為:
PrivateSubCommand1_Click()
Dimx%,y%,z%
Forx=1To20 '確定買公雞的只數(shù)
2.計(jì)數(shù)、累加、累積
進(jìn)行累加、累積和計(jì)數(shù)是程序設(shè)計(jì)中的最基本問題之一,本節(jié)舉例中不可能列舉完所有問題,下面是在例4-13的基礎(chǔ)上選擇的一個(gè)典型應(yīng)用。
例4-20
求任意數(shù)n的階乘。
分析:計(jì)算階乘要做累積運(yùn)算,應(yīng)用累積器“f=f*i”,累積器的初值一般為1。
程序代碼如下:
3.最大公約數(shù)與最小公倍數(shù)
例4-21
給定任意兩個(gè)整數(shù)m、n,求最大公約數(shù)和最小公倍數(shù)。
分析:設(shè)已知的兩個(gè)整數(shù)m和n,x為最小公倍數(shù),假設(shè)m?>?n,x的取值范圍為[m,m?×?n],可用窮舉的辦法求解。
對(duì)x從m開始的每一個(gè)可能的取值,判斷能否同時(shí)被m、n整除(即是否是公倍數(shù)),若是,x必定是m和n的最小公倍數(shù),程序運(yùn)行結(jié)束;如果不是,則判斷下一個(gè)x,依次類推,直到x的取值為m?×?n為止。
最大公約數(shù)算法與最小公倍數(shù)類似,設(shè)y為最大公約數(shù),y的范圍是[1,n],程序?qū)崿F(xiàn)時(shí),y的取值從n開始,判斷過程與求最小公倍數(shù)類似。這種方法效率較低。求最大公約數(shù)可采用經(jīng)典的輾轉(zhuǎn)相除法,并在求出最大公約數(shù)后,最小公倍數(shù)就等于兩個(gè)原數(shù)的乘積除以最大公約數(shù)。
算法描述如下:
(1)將m除以n得余數(shù)r。
(2)若r=0,則n為求得的最大公約數(shù),循環(huán)結(jié)束;若r?≠?0,則執(zhí)行(3)。
(3)將n賦給m,將r賦給n,再重執(zhí)行(1)、(2)步。
程序代碼如下:
PrivateSubCommand1_Click()
Dimm%,n%,r%
4.質(zhì)數(shù)
質(zhì)數(shù)也叫素?cái)?shù),是指只能被1和它本身整除的自然數(shù)。最小的質(zhì)數(shù)是2。
例4-22
從鍵盤輸入一個(gè)數(shù)m,判斷是否為質(zhì)數(shù)。
分析:判斷一個(gè)數(shù)m是否為質(zhì)數(shù)的方法很多,最基本的是從質(zhì)數(shù)的定義來求解,其思路是將2~m?-?1之間的整數(shù)依次去整除m,若都不能整除m,則m為質(zhì)數(shù),只要其中有一個(gè)數(shù)能整除m,則m就不是質(zhì)數(shù)。
程序代碼如下:
4.6Do循環(huán)的其他結(jié)構(gòu)
Do…Loop結(jié)構(gòu)除了上面講的DoWhile…Loop以外,還有其他幾種結(jié)構(gòu)。盡管沒有這幾種結(jié)構(gòu)完全可以解決各種循環(huán)問題,但靈活應(yīng)用各種不同的循環(huán)結(jié)構(gòu),可以進(jìn)一步優(yōu)化程序設(shè)計(jì)。對(duì)Do循環(huán)的其他結(jié)構(gòu)的學(xué)習(xí)要求:
(1)掌握各種結(jié)構(gòu)的語法格式;
(2)掌握循環(huán)執(zhí)行過程;
(3)正確區(qū)別Do…Loop的各種結(jié)構(gòu);
(4)學(xué)會(huì)使用不同的結(jié)構(gòu)解決同一個(gè)問題,比較循環(huán)條件和計(jì)算循環(huán)次數(shù)。
1.無條件循環(huán)Do…Loop
Do…Loop循環(huán)流程如圖4-18所示。語法結(jié)構(gòu)為:
Do
循環(huán)體
Loop
從圖4-18可以看出,這是一個(gè)無條件的循環(huán)結(jié)構(gòu),要退出循環(huán),必須執(zhí)行ExitDo語句(通常放在選擇結(jié)構(gòu)中),否則會(huì)造成死循環(huán)。(調(diào)試程序時(shí)如遇到死循環(huán),可用Ctrl+Break強(qiáng)行結(jié)束。)
例4-23
用Do…Loop結(jié)構(gòu)實(shí)現(xiàn)例4-14。
程序代碼如下:圖4-18無條件循環(huán)流程圖
2.后測(cè)試當(dāng)型循環(huán)Do…LoopWhile
Do…LoopWhile循環(huán)結(jié)構(gòu)為:
Do
循環(huán)體
LoopWhile<循環(huán)條件>
Do…LoopWhile循環(huán)的特點(diǎn)是先執(zhí)行一次循環(huán)體,再判斷循環(huán)條件,條件成立則繼續(xù)循環(huán),否則退出循環(huán)。Do…LoopWhile循環(huán)的流程如圖4-19所示。圖4-19Do…LoopWhile循環(huán)的流程圖
3.前測(cè)試直到型DoUntil…Loop
DoUntil…Loop語法結(jié)構(gòu)為:
DoUntil<循環(huán)條件>
循環(huán)體
Loop
DoUntil…Loop循環(huán)的特點(diǎn)是先判斷循環(huán)條件,條件不成立則執(zhí)行循環(huán),條件成立就退出循環(huán)。DoUntil…Loop循環(huán)的流程如圖4-20所示。圖4-20DoUntil…Loop循環(huán)的流程圖
4.后測(cè)試直到型循環(huán)Do…LoopUntil
Do…LoopUntil語法結(jié)構(gòu)為:
Do
循環(huán)體
LoopUntil<循環(huán)條件>
Do…LoopUntil循環(huán)的特點(diǎn)是先執(zhí)行循環(huán)體,后判斷循環(huán)條件,條件不成立執(zhí)行循環(huán),條件成立退出循環(huán)。Do…LoopUntil循環(huán)的流程如圖4-21所示。圖4-21Do…LoopUntil循環(huán)的流程圖
5.前測(cè)試當(dāng)型循環(huán)While…Wend
While…Wend循環(huán)的功能和執(zhí)行方式與DoWhile…Loop循環(huán)結(jié)構(gòu)完全相同。其語法結(jié)構(gòu)為:
While<循環(huán)條件>
循環(huán)體
Wend
While…Wend循環(huán)的特點(diǎn)是先判斷循環(huán)條件,條件成立執(zhí)行循環(huán)體,否則退出循環(huán)。
教學(xué)小結(jié)
順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)是程序設(shè)計(jì)語言的三大基本結(jié)構(gòu),這部分內(nèi)容既是學(xué)習(xí)重點(diǎn),又是難點(diǎn),特別是循環(huán)結(jié)構(gòu)。對(duì)于這三種結(jié)構(gòu),在校園中流傳有“上課能聽懂,下課想不通,作業(yè)做不來”的說法。編者認(rèn)為,要掌握好本章內(nèi)容,首先要熟記選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)中具有代表性結(jié)構(gòu)的語法構(gòu)成,理解其執(zhí)行過程;其次要培養(yǎng)自己的邏輯思維能力。本書中的應(yīng)用舉例涉及了初學(xué)者學(xué)習(xí)程序設(shè)計(jì)時(shí)的許多基本問題,建議精讀典型例題,用人腦來模仿程序的運(yùn)行過程,這樣既能培養(yǎng)、鍛煉邏輯思維能力,又能深化對(duì)語法結(jié)構(gòu)的理解,還能提高學(xué)習(xí)質(zhì)量;最后,要敢于動(dòng)手,面對(duì)具體編程問題,按照分析問題、確定算法、設(shè)計(jì)界面、編寫代碼等步驟完成?!罢肇埉嫽ⅰ币彩浅鯇W(xué)者學(xué)習(xí)編程的好方法。
(1)順序結(jié)構(gòu)是最簡(jiǎn)單的結(jié)構(gòu),本書重點(diǎn)介紹輸入、輸出數(shù)據(jù)的基本方法。
(2)選擇結(jié)構(gòu)相對(duì)容易,建議將If結(jié)構(gòu)作為重點(diǎn)掌握內(nèi)容。
(3)循環(huán)結(jié)構(gòu)較難掌握,分為For…Next和Do…Loop兩種結(jié)構(gòu)。本章把For…Next和Do…Loop結(jié)構(gòu)中的DoWhile…Loop結(jié)構(gòu)作為重點(diǎn)。
(4)使用VB編寫應(yīng)用程序,主要包括界面設(shè)計(jì)和事件代碼設(shè)計(jì)兩方面的任務(wù)?;痉椒ㄊ怯每梢暬幊碳夹g(shù)進(jìn)行界面設(shè)計(jì),用結(jié)構(gòu)化程序設(shè)計(jì)思想編寫事件代碼。
習(xí)題
一、選擇題
1.下面正確的賦值語句是
。
(A)
x+y=30 (B)
y=r*r,x=1
(C)?y=x+30 (D)?3y=x
2.為了給x、y、z三個(gè)變量賦初值1,下面正確的賦值語句是
。
(A)?x=1:y=1:z=1 (B)?x=1,y=1,z=1
(C)?x=y=z=1 (D)?xyz=1
3.閱讀下面的程序段:
Dimn1%,n2%
n1=InputBox("請(qǐng)輸入第一個(gè)數(shù):")
n2=InputBox("請(qǐng)輸入第二個(gè)數(shù):")
Printn1+n2
當(dāng)輸入分別為111和222時(shí),程序輸出為
。
(A)?111222 (B)?222
(C)?333 (D)程序出錯(cuò)
4.下列語句中可以將變量a、b的值互換的是
。
(A)
a=b:b=a
(B)
a=a+b:b=a-b:a=a-b
(C)
a=c:c=b:b=a
(D)
a=(a+b)/2:b=(a-b)/2
5.執(zhí)行完程序段:
DimaAsBoolean,bAsBoolean
a=2:b=0
Printa+b
輸出結(jié)果為
。
(A)?-1 (B)?2 (C)?True (D)?False
6.為使連續(xù)兩個(gè)Print方法的輸出項(xiàng)在同一行輸出,則應(yīng)在前一個(gè)尾部加
。
(A)逗號(hào)或分號(hào)均可 (B)只能加逗號(hào)
(C)只能加分號(hào) (D)不用加何任符號(hào)
7.下面求兩個(gè)數(shù)中較大數(shù)的程序段中,
不正確。
(A)?Max=IIf(x>y,x,y)(B)?Ifx>yThenMax=xElseMax=y
(C)?Max=x(D)?Ify>=xThenMax=y
?Ify>xThenMax=y?Max=x
8.下面語句執(zhí)行后,變量W的值是
。
W=Choose(Int(2.6),"Red","Green","Blue","Yellow")
(A)?Null (B)?"Red"
(C)?"Green" (D)?"Yellow"
9.用If結(jié)構(gòu)實(shí)現(xiàn)分段函數(shù)f?(x)= ,下列不正確的程序段是
。
(A)?f=x*x+3
Ifx>=1thenf=sqr(x+1)
(B)?Ifx>=1thenf=sqr(x+1)
Ifx<1thenf=x*x+3
(C)?Ifx>=1thenf=sqr(x+1)
f=x*x+3
(D)?Ifx<1thenf=x*x+3elsef=sqr(x+1)
10.設(shè)x的值為5,執(zhí)行以下語句時(shí),其輸出結(jié)果為“Result”的SelectCase語句是
。
11.設(shè)a=4,b=3,c=2,d=1,則表達(dá)式IIf(a<b,a,IIf(c>d,c,d))的結(jié)果為
。
(A)?4 (B)?3
(C)?2 (D)?1
12.下列程序段的執(zhí)行結(jié)果為
。
X=5
Y=-20
IfNotX>0ThenX=Y-3ElseY=X+3
(A)?-33 (B)?5-8
(C)?3-3 (D)?25-25
13.下列程序段的執(zhí)行結(jié)果為
。
A=79
IfA>50ThenI=5
IfA>60ThenI=6
IfA>70ThenI=7
IfA>80ThenI=8
Print“I=”;I
(A)?I=5 (B)?I=6
(C)?I=7 (D)?I=8
14.用SelectCase語句選擇|x|>10情況的語句為:Case
。
(A)?Not(-10To10) (B)?-10To10
(C)?Is<-10,Is>10 (D)?Abs(x)>10
15.若x=0,執(zhí)行語句IfxThenx=0Elsex=1的結(jié)果是
。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)威士忌市場(chǎng)銷售渠道與營(yíng)銷趨勢(shì)預(yù)測(cè)報(bào)告
- 2024年獨(dú)家:影視作品版權(quán)許可使用協(xié)議
- 2024年特許經(jīng)營(yíng)合同實(shí)務(wù)操作
- 2024年版企業(yè)間技術(shù)咨詢合同
- 茅臺(tái)學(xué)院《公共關(guān)系案例精講》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年智能監(jiān)控系統(tǒng)設(shè)備安裝協(xié)議版B版
- 2024年度內(nèi)河化學(xué)品運(yùn)輸安全責(zé)任合同模板下載3篇
- 2024年生態(tài)農(nóng)業(yè)自建房產(chǎn)權(quán)轉(zhuǎn)移協(xié)議3篇
- 2025廢品回收合同
- 2024年標(biāo)準(zhǔn)電腦維修服務(wù)承諾合同范本版B版
- 清表工程協(xié)議書
- 精讀《烏合之眾:大眾心理研究》學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 酒店長(zhǎng)租房合同模板
- 露天爆破學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 科技館開業(yè)典禮活動(dòng)策劃方案
- 2024版危重癥患兒管飼喂養(yǎng)護(hù)理TCNAS 45─2024圖文解讀學(xué)習(xí)課件
- 2024秋期國(guó)家開放大學(xué)??啤稇椃▽W(xué)》一平臺(tái)在線形考(形考作業(yè)1至4)試題及答案
- 《搭船的鳥》說課稿
- 家電以舊換新風(fēng)險(xiǎn)管理方案
- 國(guó)家開放大學(xué)《兒童發(fā)展問題的咨詢與輔導(dǎo)》案例1-5參考答案
- 期末綜合模擬測(cè)試卷一(試題)2024-2025學(xué)年統(tǒng)編版語文五年級(jí)上冊(cè)
評(píng)論
0/150
提交評(píng)論