程序流程的控制(二)_第1頁
程序流程的控制(二)_第2頁
程序流程的控制(二)_第3頁
程序流程的控制(二)_第4頁
程序流程的控制(二)_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

VisualBasic程序設(shè)計

第十講

第四章程序流程

(二)

2011-7-101

4.4循環(huán)結(jié)構(gòu)

44

For...Next循環(huán)Do...Loop循環(huán)

2011-7-102

4.4循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)是算法語言中一種重要的

結(jié)構(gòu),它的應(yīng)用非常廣泛,把要重復執(zhí)行

的語句放在循環(huán)結(jié)構(gòu)中,就可避免多次重

復輸入。在使用循環(huán)結(jié)構(gòu)時,有些循環(huán)的

次數(shù)事先可以確定,這種循環(huán)稱為確定性

循環(huán)。有些循環(huán)的循環(huán)次數(shù)是不能事先確

定,需要根據(jù)條件來決定是否繼續(xù)循環(huán),

我們稱這種循環(huán)為不確定循環(huán)。

2011-7-103

在VB程序設(shè)計語句中有二種形

式的循環(huán)結(jié)構(gòu)。

其中For循環(huán)結(jié)構(gòu)用來設(shè)計循環(huán)次

數(shù)可以事先確定的循環(huán)結(jié)構(gòu)。即循

環(huán)次數(shù)已知循環(huán)結(jié)構(gòu)。

而Do.??Loop循環(huán)結(jié)構(gòu)一般用來設(shè)計

循環(huán)次數(shù)無法事先確定的循環(huán)結(jié)構(gòu)。

2011-7-104

4.4.1For循環(huán)結(jié)構(gòu)

?For循環(huán)結(jié)構(gòu)的一般形式:

For循環(huán)控制變量=初值To終值[Step步長]

[語句組1]]

[ExitFor]卜循環(huán)體

[語句組2]

Next[循環(huán)控制變量]

205

For循環(huán)結(jié)構(gòu)一格式

說明:

For循環(huán)以For語句開始,以Next語句結(jié)束。

循環(huán)變量用來控制循環(huán)次數(shù);

初值代表循環(huán)變量的初始被賦的值;

終值代表循環(huán)變量最終能繼續(xù)進行循環(huán)的值;

步長代表每循環(huán)一次循環(huán)變量增長的值。

For循環(huán)結(jié)構(gòu)

?一循環(huán)次數(shù)的計算

循環(huán)的次數(shù)可以從循環(huán)初值、終值、和步

長計算出來:

R=INT((終值-初值+步長)/步長)

例如:For1=1To10Step2

循環(huán)次數(shù)R=INT((10-1+2)/2)=INT(5.5)=5

For1=5.0To25.Step0.5

R=INT((25.-5.0+0.5)/0.5)=INT(41.0)=41

2011-7-107

?A?1

For循環(huán)結(jié)構(gòu)-循環(huán)結(jié)構(gòu)的一些規(guī)定

1、循環(huán)變量初值、終值和步長分別可以是常數(shù)、

變量和表達式。如果是變量,則它應(yīng)是預(yù)先被賦

值。如果是表達式,則應(yīng)先計算表達式的值。

2、初值、終值和步長的值可以為正或負,初值、

終值可以為零。但步長不能為零。

例如:For1=-1To-3Step-1的循環(huán)次數(shù)為:

R=INT((-3-(-l)+(-l))/-l)=3o

2011-7-108

For循環(huán)結(jié)構(gòu)

一循環(huán)結(jié)構(gòu)的一些規(guī)定

即當I的值為T,-2,-3時,執(zhí)行正常

循環(huán),當I的值變成-4時不再執(zhí)行循環(huán)時。

3、脫離循環(huán)的條件是:

循環(huán)變量沿變化的方向超過終值。如

果步長的值為正,則“超過”意味著“大

于",如果步長為負,則“超過”意味著

“小于”。

2011-7-109

For循環(huán)結(jié)構(gòu)

一循環(huán)結(jié)構(gòu)的一些規(guī)定

4、如果計算出循環(huán)次數(shù)R〈0,按R=0處理,

即一次也不執(zhí)行循環(huán)體。

5、如果循環(huán)變量的初值、終值和步長類

型和循環(huán)變量的類型不一致,則按賦值的

規(guī)則處理,即先將其類型化成循環(huán)變量的

類型,然后進行處理,即先將初值、終

值和步長的類型化成循環(huán)變量的類型,然

后進行處理。

For循環(huán)結(jié)構(gòu)

一一循環(huán)結(jié)構(gòu)的執(zhí)行過程

1、執(zhí)行For循環(huán)語句時先將初值賦給循環(huán)控制

變量。

2、再利用公式計算循環(huán)次數(shù)。

計算循環(huán)次數(shù)的公式:

R=Int((終值-初值+步長)/步長)

2011-7JHII

For循環(huán)結(jié)構(gòu)

—循環(huán)結(jié)構(gòu)的執(zhí)行過程

3、檢查循環(huán)次數(shù),若R=0(或RvO),則跳

出循環(huán)體,執(zhí)行Next語句的下一個語句,若

R>0,則執(zhí)行循環(huán)體。

4、執(zhí)行Next語句時,循環(huán)變量增值步長。

循環(huán)次數(shù)R?L

5、返回前面步驟3,重復執(zhí)行步驟3,4o

2011-7-1012

For循環(huán)結(jié)構(gòu)

一一循環(huán)結(jié)構(gòu)的執(zhí)行過程

6、其中ExitFor為在滿足一定條件下退出

For循環(huán)結(jié)構(gòu)。

若For循環(huán)的語句為:

For循環(huán)變量=?1Toe2Stepe3

循環(huán)體

Next循環(huán)變量

則其執(zhí)行過程可用下頁的流程圖表示:

2011-7JH13

計算el,e2,e3的值

?1=>循環(huán)變量/當Rv=0時\

則循環(huán)變量

圖4-15計算應(yīng)循環(huán)次數(shù)R/的值就超過A

<1終值,若步

For循廣飛長為負值時,、

環(huán)執(zhí)行超過終值則U

過程流\表示小于終!

程圖.執(zhí)行循環(huán)體

循環(huán)次數(shù)R減1

循環(huán)變量增值e3

2011-7JH執(zhí)行Next語句的下一個語句14

【例4?7】輸入一個正整數(shù),利用For循環(huán)來判

斷是否為素數(shù)。

分析:所謂素數(shù)是指除了1和它本身之外,不

能被其他的數(shù)整除的數(shù)。判斷一個自然數(shù)n

(>3)是否為素數(shù)的方法是:依次用2?<

數(shù)作除數(shù)去除,如果余數(shù)都不為0,則為素

數(shù)。

工程設(shè)計步驟如下:

(1)啟動VB,選“新建工程”中“標準EXE”

工程。在出現(xiàn)的窗體上添加1個文本框、兩

個標簽和兩個命令按鈕。如圖4?16左圖所示。

2011-7-10)15

(2)設(shè)置窗體和控件的屬性如圖4?16右圖所示。

其中標簽Label2的Caption屬性開始設(shè)置

為“輸出判斷結(jié)果:”在工程運行后應(yīng)輸出具

體的判斷結(jié)果。

?判斷素數(shù)程序0]X

請輸入一個大于等于3的自然數(shù)N

判斷

輸出判斷結(jié)果!

退出

圖446判斷素數(shù)工程設(shè)計界面和屬性設(shè)置

2011-7-1016

在文本框中輸入一個自然數(shù)n

j=",i=2

圖417

判斷自然數(shù)n

是否為素數(shù)的

程序流程

2011-7-107

(3)編寫代碼

編寫單擊Commandl命令按鈕“判斷”所

執(zhí)行的代碼

PrivateSubCommandl_Click()

DimiAsLong,jAsLong,nAsLong

n=Val(Textl.Text)

j=Clng(Sqr(n))

Debug.Printj

2011-7-10>118

rFori=2Toj

,IfnModi=0ThenExitFor

Nexti

Debug.Printi

rIfi>jThen

Labell.Caption=Textl.Text&"為素數(shù)"

YElse

Labell.Caption=Textl.Text&"為非素數(shù)”

^EndIf

EndSub

2011-7-1019

編寫單擊Command2命令按鈕“退出”所

執(zhí)行的代碼

PrivateSubCommand2_Click()

UnloadMe

EndSub

編寫Form_Activate()事件發(fā)生時所執(zhí)行的

代碼一

PrivateSubForm_Activate()

Textl.SetFocus

EndSub

2011-7-1020

(4)運行結(jié)果。按F5鍵運行工程,當出

現(xiàn)運行畫面時在提示的文本框中輸入1個

自然數(shù)例如137,然后單擊“判斷”按鈕,

就會在標簽2中顯示“137為非素數(shù)”的

信息。如圖4-16所示。

圖4?16判斷素數(shù)工程運行結(jié)果

2011-7-1021

442多重循環(huán)

通常把循環(huán)體內(nèi)不含有循環(huán)語句的

循環(huán)稱為單層循環(huán),而把循環(huán)體內(nèi)含有

循環(huán)語句的循環(huán)稱為多重環(huán)。例如在一

個循環(huán)體內(nèi)含有一個循環(huán)語句的稱為二

重循環(huán)。多重循環(huán)又稱為多層循環(huán)和循

環(huán)的嵌套。下面通過例題來講解多重循

環(huán)的應(yīng)用。

2011-7-1022

【例4?8】我國古代數(shù)學家張丘建在“算經(jīng)”

里提出一個世界數(shù)學史上有名的百雞問

題:雞翁一、值錢五、雞母一、值錢三,

雞雛三、值錢一,百錢買百雞,問雞翁、

母、雛各幾何?

分析:若公雞x只,母雞y只,小雞z只,

依題意可以列出以下方程組:

x+y+z=100

<x

5x+3y——=100

3

2011-7-1023

在上面的兩個方程中,有3個未知

數(shù),屬于不定方程,無法直接求解。下

面我們用“窮舉法”求解。窮舉法是將

各種可能的組合全部一一測試,將符合

條件的組合輸出。這里使用二層循環(huán)結(jié)

構(gòu)。即將公雞數(shù)從1變化到100,母雞數(shù)

也從1變化到100,對于每一組公雞和母

雞數(shù),從100中減去公雞和母雞數(shù)就得到

小雞的個數(shù),然后再計算買三種雞的總

錢數(shù)是否為100元。若是就得到一組解,

然后再繼續(xù)。

2011-7-1024

再仔細分析一下,若100元錢全部都買公雞

最多買20只,如果全部買母雞最多買33只,

所以窮舉法外循環(huán)中公雞數(shù)可從1變到19,

內(nèi)循環(huán)中母雞數(shù)可從1變化到33,小雞個數(shù)

應(yīng)100中減去公雞數(shù)和母雞數(shù)得到。

工程設(shè)計步驟如下:

(1)新建“標準EXE”工程,在出現(xiàn)的窗體

上添加四個標簽、一個列表框、一個框架和

兩個命令按鈕。其中標簽1是放在框架內(nèi)。

2011-7-1025

(2)標簽1的Caption屬性設(shè)為“公雞五元、

母雞三元、小雞一元錢三只。100元錢買

100只雞。問公雞、母雞、小雞各多少

只?”標簽2■標簽4的Caption屬性分別設(shè)

置為“公雞”、“母雞”、“小雞”。

如下圖所示。

?百錢買百雞

公雞母雞:小雞

計算

公雞每只五元、母雞每月三

兀、小雞三只一兀;100兀錢

買100只雞,問公雞、母雞、退出

小雞各多少只?

2011-7-1026

(3)代碼編寫如下:

編寫單擊命令按鈕“計算”所執(zhí)行的代碼如下。

PrivateSubCommandl_Click()

Listl.ClearFormat

是格式化

Forx=1To19,外循環(huán)求公雞數(shù)二個表達

Fory=1To33,內(nèi)循環(huán)求母雞數(shù)工IO

z=100-x-y,小雞數(shù)

If5*x+y*3+z/3=100Then

p=Format(x,n@@@n)&Format(y,_

"@@@@@@")&Format(z,

2011-7-1027

Rem把滿足條件的一種情況添加到列表框中。

Listl.Additempk

EndIf在列表框中

使用、

NextyAdditem方

Nextx法添加項目

EndSub

編寫單擊命令按鈕“退出”所執(zhí)行的代碼如下。

PrivateSubCommand2_Click()

End

EndSub

2011-7-1028

(4)運行結(jié)果。按F5鍵運行工程出現(xiàn)運

行界面后按“計算”按鈕后,得到結(jié)果

如下圖所示。

0Jx

公雞母雞小雞

41878

81181

I12484

公雞每只五元、母雞每兄三

兀、小雞三只一兀;100兀錢

買100只雞,問公雞、母雞、退出

小雞各多少只?

圖4?17百錢買百雞問題的運行結(jié)果

2011-7-1029

[例4?10]在窗體上輸出下列圖案

-Forml

<1?“■■/a^?

?丫??丫??[??丫?,丫??],?丫?.丫?rj??T?

行?4,,丫?

■[■?Tw?T,??1?*T?■[?*T■*T??[■■]-

■].“■■[■■[■■]■■[■4].d]■

4,?磨rj??[■?[■?丫?<rj.?[■■]■,7?

?丫??丫.■Y'B

■[■.Te?^w.丫..丫.?Tw■1??[??]?

〃?0】?q.q.“■”■.卜“■

?小

〃??LB

,丫??T、?丫?,T'?磨

yik^B■妖.L

?丫?,]■?yww^irjw

??I?一???????????《?…?.]

4]■“■^L?.[■■],4],

:輸出圖案:q.*p?*],■,丫?*T*'T*.T.?T?

2011-7-1030

問題分析:

該圖案共有十行,每行有十個星號。要

想輸出該圖案應(yīng)使用For循環(huán)結(jié)構(gòu),可以先用

變量a存放這十個星號。使用語句:

a=***********”

由于要輸出的是一個平行四邊形,每一

行的起始位置比上一行位置多2列。因此要使

用Tab函數(shù)來確定每一行輸出的起始位置。

語句PrintTab(2*i);表示從第2*i列開

始輸出內(nèi)容。編寫代碼如下:

2011-7-1031

OptionExplicit

PrivateSubCommandl_Click()

DimaAsString,iAsInteger,jAsInteger

a=,,**********,,

Forml.FontSize=14

Fori=1To10

PrintTab(2*i);表示從每

Printa一行的第

Nexti2*i列開

始輸出變

EndSub量a的值。

2011-7-10

[例4?11]在窗體上輸出下列圖案

2011-7-1033

問題分析:

該圖案共有十行,每行有不同的星號。

第一行有一個“*”,第二行有三個“*”,

第三行有五個……,要想輸出該圖案

應(yīng)使m雙層For循環(huán)結(jié)構(gòu),外層彳后環(huán)決定輸出

的行數(shù),內(nèi)層循環(huán)決定每行輸出的星號數(shù)。

可以先用變量a存放一個星號。使用語句:

由于要輸出的是一個等腰三角形,每一

行的起始位置比上一行位置少一列。因此要

使用Tab函數(shù)來確定每一行的起始位置。

語句PrintTab(18-i);表示從第18-i列開始

輸出內(nèi)容。編寫代碼如下:

2011-7-1034

編寫代碼如下:

OptionExplicit

PrivateSubForm_Click()

DimaAsString

DimiAsInteger,jAsInteger

a=

Forml.FontSize=14

2011-7-1035

Fori=1To10

2011-7-1036

[例4?12]在窗體上輸出乘法九九表

Forml

乘法九九表

*1逑456789

11

224

3369

4481216

5510152025

661218243036

77142128354249

8816243240485664

991827364554637281

2011-7-1037

OptionExplicit

PrivateSubForm_Click()

DimiAsInteger,jAsInteger,kAsInteger

DimmAsInteger

FontSize=12

PrintTab(25);“乘法九九表“

Print:Print輸

n

Print;表

Fori=1To9頭

PrintTab(i*6);i;

Nexti

2011-7-10

Print

h

l

'Forj=lTo9內(nèi)

外r

循循

環(huán)Printj;"環(huán)

決決

定Fork=1Toj定

?*

?

J

<PrintTab(k輸

a

6)

共y

輸出

出Nextk

幾積

行Print

INextj數(shù)

EndSub

39

2011-7-10

[例4?13]打印下列圖案

■Forml□1x1

****

****

*****

********

********

******

****

*

分析:上面的圖案可分成兩個等腰三角形。

上面的三角形有5行第1行為一個…,第

2行為三個“*”,第3行為五個……第5行

意2*5”個…。代碼編寫如下頁所示。,0

OptionExplicit

PrivateSubForm_Click()

DimiAsInteger,jAsInteger

DimaAsString

Fori=1To5、

PrintTab(20-i);輸

Forj=lTo2^i-l出

PrintI上

Nextj角

Print

Nextij

2011-7-10,

Fori=4To1Step-1

PrintTab(20-i);

Forj=lTo2^i-l

Print出

Nextj三

Print角

NextiJ

EndSub

2011-7-1042

443DoLoop循環(huán)結(jié)構(gòu)

Do…Loop循環(huán)結(jié)構(gòu)也是常用的循

環(huán)結(jié)構(gòu)。對于一些無法事先確定循環(huán)次數(shù)

的程序,可用Do……Loop型循環(huán)結(jié)構(gòu)。

1.它的格式有兩種:

格式L先測型

Do[While|Until]v條件〉

[V語句組1>]

[ExitDo]

[V語句組2>]

2M99P43

格式2:后測型

Do

[v語句組1>]

[ExitDo]

[V語句組2>]

Loop[While|Until]v條件〉

2011-7-1044

2.說明:

(1)格式1中“DoWhilev條件

>……Loop語句”,是先測型當型

循環(huán)。即先判斷While后面的條件

是否為“真”,如果為“真”則執(zhí)

行循環(huán)體里面的各語句,如果為

“假”,則退出循環(huán),循環(huán)直到條

件為“假”終止。

2011-7-1045

(2)格式2中“D。...LoopWhilev條

件》語句”是后測型當型循環(huán)。與前

者的區(qū)別在于,它不管條件的真假,

都會先執(zhí)行“Do”后面的語句,也就是

循環(huán)體,當執(zhí)行到LoopWhilev條件〉

語句時,再判斷<條件>的真假,如果

為“真”則返回執(zhí)行循環(huán)體里面的各

語句,如果為“假”,則退出循環(huán),

循環(huán)直到條件為“假”終止。也就是

說,它至少執(zhí)行循環(huán)體一次。

2011-7-1046

在兩種格式中While語句都可以用Until

語句代替,它是直到條件為真時則終止循

環(huán)。注意While語句后面的條件和Until語

句的條件正好互補。

例如:求5!

如果使用當型循環(huán)則While后的條件

是(Nv=5)o

而如果用Until語句,則后面的條件為

(N>5)o為了避免混淆,所以我們建議只

用DoWhile循環(huán)即可。

2011-7-1047

(3)格式中[ExitDo]為可選項,在上面兩種Do

循環(huán)結(jié)構(gòu)中,可以有一個或多個ExitDo語句,

以便在滿足一定的條件下,隨時退出循環(huán)體。

下頁中分別給出前測型DoWhile...Loop和

DoUntil...Loop循環(huán)結(jié)構(gòu)的邏輯框圖。同學們

可自己畫出后測型的兩種邏輯框圖。

2011-7-1048

DoUntiL?.Loop循環(huán)邏輯框圖

Do...Loop循環(huán)舉例

【例4-14】任意輸入一個自然數(shù),編

程輸出其各個因子。工程設(shè)計步驟

如下:

(1)新建“標準EXE”工程,在出現(xiàn)

的界面上添加三個標簽、一個文本

框、和兩個命令按鈕如圖4?18所示。

2011-7-10M喝?>1

(2)設(shè)置窗體及控件的屬性。標簽1

的Caption屬性為“請輸入一個自然

數(shù)”;標簽2的Caption屬性為“N的

因子是:”;標簽3的Caption屬性為

空,在運行時賦值。另外標簽3的

Autosize屬性為True,以便在運行時

賦值能根據(jù)實際內(nèi)容自動適應(yīng)。其

他屬性如下頁圖4-18所示。

2011-7-10)51

圖4?18求自然數(shù)因子的工程界面及屬性設(shè)置

2011-7-1052

圖4?19輸出某個自然數(shù)y的所有因子流程圖

2011-7-1053

(3)編寫代碼如下:

編寫單擊命令按鈕“計算”所執(zhí)行的代碼

PrivateSubCommandl_Click()

DimxAsString,yAsSingle

y=Val(Textl.Text)

i=2

x=,,,,

2011-7-10>154

DoWhiley<>l

IfyModi=0Then

x=x&"*"&Str(i)&Chr(13)

y=y\i

Elseo

i=i+1

EndIf

Loop

LabeB.Caption=x

Labell.Caption=Textl.Text&”的因子是:“

EndSub

2011-7-1055

(4)運行結(jié)果。按F5執(zhí)行工程,當

出現(xiàn)運行界面時,從文本中輸入一

個自然數(shù),然后單擊命令按鈕“計

算”就會得到如圖4?20所示的結(jié)果。

即在標簽3中輸出了自然數(shù)的各個因

子相乘的結(jié)果;另外,標簽2的內(nèi)容

也根據(jù)輸入的數(shù)自動改變?nèi)鐖D4?20

所示。

2011-7-1056

圖4?20求自然數(shù)因子的運行結(jié)果

2011-7-10

【例4-15】用牛頓迭代法求方程的根。所求的方程

為:

ex—x=0

分析:用牛頓迭代法求方程?;?0在瓦附近的實

根的方法如下。

(1)選一個接近己的真實根。;

(2)通過J求出(X亂)。在幾何中就是作己=

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論