《Visual Basic程序設(shè)計(jì)》課件1第4章_第1頁(yè)
《Visual Basic程序設(shè)計(jì)》課件1第4章_第2頁(yè)
《Visual Basic程序設(shè)計(jì)》課件1第4章_第3頁(yè)
《Visual Basic程序設(shè)計(jì)》課件1第4章_第4頁(yè)
《Visual Basic程序設(shè)計(jì)》課件1第4章_第5頁(yè)
已閱讀5頁(yè),還剩158頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論