第7章-程序控制語句_第1頁
第7章-程序控制語句_第2頁
第7章-程序控制語句_第3頁
第7章-程序控制語句_第4頁
第7章-程序控制語句_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章程序控制語句7.1算法基礎7.2分支結(jié)構(gòu)7.3循環(huán)控制結(jié)構(gòu)2014一個程序應包括兩個方面的內(nèi)容:對數(shù)據(jù)的描述:數(shù)據(jù)結(jié)構(gòu)(datastructure)對操作的描述:算法(algorithm)著名計算機科學家沃思提出一個公式:

數(shù)據(jù)結(jié)構(gòu)+算法=程序

數(shù)據(jù)結(jié)構(gòu)+算法+程序設計方法+語言工具完整的程序設計應該是:1算法的概念

廣義地說,為解決一個問題而采取的方法和步驟,就稱為“算法”。方法1:1+2,+3,+4,一直加到100加99次方法2:100+(1+99)+(2+98)+…+(49+51)+50=100+49×100+50加51次對同一個問題,可有不同的解題方法和步驟例:求7.1算法基礎算法的選擇

為了有效地進行解題,不僅需要保證算法正確,還要考慮算法的質(zhì)量,選擇合適的算法。希望方法簡單,運算步驟少。計算機算法可分為兩大類別:數(shù)值運算算法:求數(shù)值解,例如求方程的根、求函數(shù)的定積分等。非數(shù)值運算:包括的面十分廣泛,最常見的是用于事務管理領域,例如圖書檢索、人事管理、行車調(diào)度管理等。1.算法的概念算法可以通過時間復雜度和空間復雜度來度量。算法的時間復雜度是指算法的執(zhí)行時間;算法的空間復雜度是算法執(zhí)行時所需的最大存儲空間。2.算法的五要素(特點)(1)確定性:指算法的每個步驟都應確切無誤,沒有歧義。(2)可行性:指算法的每個步驟必須是計算機能夠有效執(zhí)行,可以實現(xiàn)的,并可得到確定的結(jié)果。(3)有窮性:指一個算法應該在有限的時間和步驟內(nèi)可以執(zhí)行完畢的。(4)輸入性:指一個算法可以有0或多個輸入數(shù)據(jù)。(5)輸出性:指一個算法必須有一個或多個輸出結(jié)果。3.算法的描述形式4.算法的基本結(jié)構(gòu)自然語言;流程圖;偽代碼;PAD順序結(jié)構(gòu);分支結(jié)構(gòu)(選擇結(jié)構(gòu));循環(huán)結(jié)構(gòu)7.2分支語句分支語句是實現(xiàn)分支結(jié)構(gòu)的語法結(jié)構(gòu)此結(jié)構(gòu)語句的一般形式是:IfeThen[A組語句]Else[B組語句]EndIfABeTrueFalse該語句結(jié)構(gòu),還有變形形式(單分支):1.If-Then-Else-EndIf

結(jié)構(gòu)語句(雙分支)此結(jié)構(gòu)語句也可以寫成:IfeThen[A組語句]Else[B組語句]判決條件可以是邏輯變量、關系表達式或邏輯表達式。IfeThenA組語句EndIfAeTrueFalse以上語句還可以寫成:IfeThenA語句【例7-1】輸入X的值,并輸出其絕對值。例題PrivateSubCommand1_Click()Dimx!x=InputBox("請輸入一個數(shù)")Ifx<0Then x=-x

EndIfPrint"絕對值是:";xEndSub【例7-2】輸入一個整數(shù),判斷其奇偶性。例題

PrivateSubForm_Click()

Dimxasintegerx=InputBox(“請輸入一個整數(shù)”)Ifxmod2=0Then

Printx;“是偶數(shù)”

Else Printx;“是奇數(shù)”

EndIfEndSub2.If-Then-ElseIf-Else-EndIf語句(多分支)A1e1TrueFalseIfe1ThenA1組語句ElseIfe2ThenA2組語句ElseIfe3ThenA3組語句ElseA4組語句...EndIfA2A3...e2e3TrueTrueFalseFalse【例7-3】在文本框中輸入若干字符,統(tǒng)計其中字母字符、數(shù)字字符以及其他字符的個數(shù),并顯示結(jié)果。例題DimcountX%,countY%,countZ%PrivateSubText1_KeyPress(KeyAsciiAsInteger)

Dimc$

c=chr(KeyAscii)‘將文本框中輸入的字符賦給變量c

IfUcase(c)>=”A”AndUcase(c)<=”Z”Then

countX=countX+1

ElseIfc>=”0”Andc<=”9”Then

countY=county+1

Else

countZ=countZ+1

EndIf

IfKeyAscii=13Then‘當按回車鍵字符輸入完畢,顯示結(jié)果

Print“字母字符有”;countX;”個”

Print“數(shù)字字符有”;countY;”個”

Print“其他字符有”;countZ;”個”

EndIfEndSubSelectCaseeCasec1A組語句

Casec2B組語句...

CaseElsen組語句EndSelect3.Select-Case-EndSelect

結(jié)構(gòu)語句

此結(jié)構(gòu)語句提供了實現(xiàn)多分支結(jié)構(gòu)的另一種方法,它的一般形式是:e為測試表達式,可以是算術表達式或字符表達式。c1、c2是測試項:可取:1、具體數(shù)值。2、連續(xù)的數(shù)據(jù)范圍3、滿足某個判決條件執(zhí)行方式:先求測試表達式e的值,接著逐個檢查每個Case語句的測試項,如果測試表達式e的值滿足某個測試項,系統(tǒng)就執(zhí)行該Case語句下的那組語句;如果沒有一個測試項滿足要求,就執(zhí)行CaseElse

下的語句。如果有一個以上的測試項滿足要求,,則只有第一個匹配后面的語句會被執(zhí)行。計算測試表達式與測試值1相同嗎?語句1與測試值2相同嗎?語句2語句nSelectCase語句的下一條語句是不是是都不是(1)測試表達式必須為數(shù)值型或字符型數(shù)據(jù)(2)測試值列表必須與測試表達式的值的類型一致(3)測試值列表的取值形式

A枚舉型如:case1,5,7,9

case"a","b","C","d"

B范圍型如:case1to9case"a"to"z"

C關系表達式型如:caseIs<100caseIs>"a"注意:用關鍵字To來指定一個范圍時,必須把較小的值寫在前面,較大的值寫在后面,字符串常量的范圍必須按字母順序?qū)懗?。如果同一個域值的范圍在多個Case子句中出現(xiàn),則只執(zhí)行符合要求的第一個Case子句的語句塊,這時Case子句的順序?qū)?zhí)行結(jié)果有影響。因此,在編程時,一般都使各個Case子句是“互斥”的(即只有一個子句的范圍滿足)。再次提醒:思考題1下面程序的運行結(jié)果是:DimiAsIntegerDimXAsIntegeri=2X=4SelectCaseiCase0:Print"Case0"Case1:Print"Case1"CaseX-i:Print"CaseX-i"CaseX:Print"CaseX"CaseElse:Print"CaseElse"EndSelectCaseX-i思考題2假設x的值為5,則在執(zhí)行以下語句時,其輸出結(jié)果為“OK”的Selectcase語句是()A)SelectCaseX

Case10to1:Print"OK"

EndSelectB)SelectCaseX

CaseIs>5,1,3to10:

Print"OK"

EndSelectC)SelectCaseX

CaseIs>5,Is<5:Print"OK“EndSelectD)SelectcasexCaseIs>5,Is<5:

Print"OK"

EndselectB【例7-4】某商店進行購物打折優(yōu)惠活動促銷,根據(jù)每位顧客一次性購物的消費額給予不同的折扣,具體方法如下:(1)購物1000元以上的九五折優(yōu)惠,(2)購物2000元以上的九折優(yōu)惠,(3)購物3000元以上的八五折優(yōu)惠,(4)購物5000元以上的八折優(yōu)惠。例題

DimxAsSingle,yAsSingle

x=InputBox("請輸入購物金額:")

SelectCasex

CaseIs<1000

Print"不優(yōu)惠"

y=x

CaseIs<2000

Print"九五折優(yōu)惠"

y=0.95*x

CaseIs<3000

Print"九折優(yōu)惠"

y=0.9*x

CaseIs<5000

Print"八五折優(yōu)惠"

y=0.85*x

CaseIs>=5000

Print"八折優(yōu)惠"

y=0.8*x

EndSelect

Print"優(yōu)惠后應收款額為:";y

只要滿足結(jié)構(gòu)規(guī)則,If語句可以有任意多的嵌套。在編寫嵌套程序的時候,需要注意If與ELse的配對關系。配對的原則是:先從最內(nèi)層的E1se開始找,Else總是與離它最近的而且在它前面未配對的If配對,如此逐層配對。按照鋸齒形的書寫格式書寫,容易看出各層的嵌套關系。4.選擇結(jié)構(gòu)的嵌套將一個選擇結(jié)構(gòu)放在另一個選擇結(jié)構(gòu)內(nèi),稱為選擇結(jié)構(gòu)的嵌套。If語句的嵌套在If語句中又包含一個或多個If語句,稱為語句的嵌套。

If語句與Select語句的嵌套在If語句中包含—個select語句,或者select語句中包含一個或多個If語句。只要滿足結(jié)構(gòu)規(guī)則,If語句可以有任意多的嵌套。在編寫嵌套程序的時候,需要注意If與ELse的配對關系。配對的原則是:先從最內(nèi)層的E1se開始找,Else總是與離它最近的而且在它前面未配對的If配對,如此逐層配對。按照鋸齒形的書寫格式書寫,容易看出各層的嵌套關系。例:輸入自變量x和z,求一個雙變量的分段函數(shù)。5.條件函數(shù)(1)IIF函數(shù)使用IIf函數(shù)也可以實現(xiàn)簡單的雙分支選擇結(jié)構(gòu)。語句格式:result=IIF(條件表達式,<表達式1>,<表達式2>)測試條件表達式的值,如果取值為True則返回表達式1的值,否則返回表達式2的值。例如:語句Ifx>yThenmax=xElsemax=Y也可寫成:Max=IIf(x>y,x,y)(2)Choose函數(shù)使用Choose函數(shù)也可以實現(xiàn)簡單的多分支選擇結(jié)構(gòu)。語句格式:result=Choose(整數(shù)表達式,選項列表)根據(jù)整數(shù)表達式的值,決定返回選項列表中的哪個項目。例如:C=Choose(x,“red”,“green”,“blue”)當x值為1時,返回“red”;當x值為2時,返回“green”;當x值為3時,返回“blue”;當x不在1-3之間,函數(shù)返回Null循環(huán)結(jié)構(gòu)在實際工作中,常遇到一些操作過程不太復雜,但又需要反復進行相同處理的問題,比如,統(tǒng)計本單位所有人員的工資,求全班同學各科的平均成績等等。這些問題的解決邏輯上并不復雜,但如果單純用順序結(jié)構(gòu)來處理,那將得到一個非常乏味且冗長的程序。例:計算1~100所有奇數(shù)的平方和,如果用順序結(jié)構(gòu)來解決這個問題,我們就會給出下面的程序:由上面的例子不難看出,程序的絕大部分是在反復執(zhí)行兩條語句x=x+2

和s=s+x^2,不同的是x的值在變化。程序當然非常簡單易懂,但缺乏最基本的編程技巧。要想方便地解決這類問題,最好的辦法就是用循環(huán)語句。

所謂循環(huán)就是重復地執(zhí)行一組語句。VB提供了三種不同風格的循環(huán)語句,它們分別是:(1)While…Wend語句;(2)Do…Loop語句;(3)For…Next語句;7.3循環(huán)語句1.While循環(huán)結(jié)構(gòu)該循環(huán)也稱為While–Wend循環(huán),語句格式如下:While<條件表達式>

.........Wend語句說明:(1)語句的執(zhí)行過程是:先計算條件表達式的值,若為True,則執(zhí)行循環(huán)中的語句塊,遇到Wend語句時返回While語句繼續(xù)判斷,若仍為真,則繼續(xù)執(zhí)行語句塊,重復上述過程直到條件表達式的值為False,則退出循環(huán)結(jié)構(gòu),執(zhí)行Wend語句的后續(xù)語句。

AeTrueFalse(3)如果條件一開始就不成立,則語句塊一次也不會被執(zhí)行。(2)“條件表達式”可以是關系表達式、邏輯表達式或數(shù)值表達式。如果是數(shù)值表達式,值為0被作為False,非零值則為True?!纠?-6】用While-Wend循環(huán)語句求1+2+3+…+100,程序代碼如下例題PrivateSubCommand1_Click()

DimiAsInteger,sumAsInteger

sum=0:i=1

Whilei<=100

sum=sum+i

i=i+1

Wend

PrintsumEndSub2.Do-Loop循環(huán)結(jié)構(gòu)語句

Do-Loop循環(huán)結(jié)構(gòu)語句有四種形式:DoWhilee...[ExitDo]...LoopDo...[ExitDo]...LoopWhileeDoUntile...[ExitDo]...LoopDo...[ExitDo]...LoopUntileSum=0I=1

DoWhileI<=100Sum=Sum+II=I+1

LoopDoWhilee...[ExitDo]...LoopAeTrueFalse求sum=1+2+…+100A.當型循環(huán):AeFalseTrueDo...[ExitDo]...LoopWhileeSum=0I=1

DoSum=Sum+II=I+1

LoopWhileI<=100上述兩當型循環(huán)結(jié)構(gòu)的區(qū)別:當?shù)谝淮螆?zhí)行循環(huán)語句條件不成立時,第一種不執(zhí)行循環(huán)體,而第二種要執(zhí)行一次。B.直到型循環(huán):DoUntile...[ExitDo]...LoopSum=0I=1

DoUntilI>100Sum=Sum+II=I+1

LoopAeFalseTrueDo...[ExitDo]...LoopUntileSum=0I=1

DoSum=Sum+II=I+1

LoopUntilI>100上述兩直到型循環(huán)結(jié)構(gòu)的區(qū)別:當?shù)谝淮螆?zhí)行循環(huán)語句條件成立時,第一種不執(zhí)行循環(huán)體,而第二種要執(zhí)行一次。AeTrueFalse循環(huán)的出口問題正常出口非正常出口ExitDo循環(huán)的參數(shù)即循環(huán)條件問題使用Do-Loop循環(huán)應注意的問題:例:給定兩個正整數(shù)m和n,求它們的最大公約數(shù)。

求最大公約數(shù)的問題一般用輾轉(zhuǎn)相除法(也稱歐幾里德算法)求解。(書p107,例7-8)例如:設m=35,n=15它們的最大公約數(shù)的求法如下:

r=35Mod15(余數(shù)為5)m=15:n=5(m=15,n=5)

r≠0(r=5)r=15Mod5(余數(shù)為0)m=5:n=0(m=5,n=0)

r=0

所以

5就是最大公約數(shù)典型應用例:輸入有效位數(shù),按下述公式計算圓周率∏的有效值。m=val(text1.text)pai=2:p=0Do

t=sp=spr(2+p)pai=t*2/pLoopUntilabs(t-s)<0.1^m3.For-Next循環(huán)如果事先已知循環(huán)次數(shù),則可使用For-Next循環(huán)結(jié)構(gòu)語句,它的一般形式是:Forv=e1Toe2[Stepe3]...[ExitFor]...NextvV=v+e3V超過e2?TrueFalse計算e1,e2,e3V=e1循環(huán)體V為循環(huán)控制變量,e1、e2、e3是控制循環(huán)的參數(shù)e1為初值e2為終值e3為步長討論For-Next>0初值<終值(Step1可省略)<0初值>終值=0死循環(huán)ForI=1to100

S=S+INextI循環(huán)變量必須為數(shù)值型。循環(huán)次數(shù)步長ExitFor:強制退出循環(huán)ForI=100to1Step-1

S=S+INextIPrivateSubForm_Click()Dimstr1AsStringDimletterAsIntegerDimnumberAsIntegerDimotherAsIntegerDimnAsIntegerLetter=0:number=0:other=0Str1=InputBox(“輸入字符串=”,”輸入框”,”ab32-c,4d_5”)Forn=1toLen(str1)SelectCaseMid(Str1,n,1)Case“A”to“Z”,“a”to“z”Letter=letter+1Case1to9Number=number+1CaseelseOther=other+1EndSelectNextn

Print“l(fā)etter=”;letter,”number=”;number,”other=”;otherEndSub思考:(1)n的取值分別=(2)循環(huán)體共執(zhí)行了多少次?(3)退出循環(huán)后,n=?(4)如何理解letter=letter+1?nnnnnnnnnnnn123456789101112letternumberOthern44312【例7-10】求Fibonacci數(shù)列的前30個數(shù)。這個數(shù)列有如下特點:前兩個數(shù)為1,從第三個數(shù)開始,其值是前兩個數(shù)的和,即:F1=1(n=1);F2=1(n=2);

Fn=Fn-1+Fn-2(n≥3)例題DimiAsInteger,f1AsLong,f2AsLong,fnAsLong

f1=1:f2=1

Printf1,:Printf2,

Fori=3To30'f1,f2已知,從第三個數(shù)開始計算

fn=f1+f2

f1=f2

f2=fn'更改f1,f2的值

Printfn,

IfiMod4=0ThenPrint'打印4個數(shù)后換行打印

Next

(a)循環(huán)出口問題 正常出口非正常出口使用For-Next循環(huán)應注意的問題:

例:試編程,輸入任意一個正整數(shù)n,判斷n是否是素數(shù)。(素數(shù)就是除過1和自身之外,沒有其他因子的自然數(shù)。)I=2輸入nI>n-1nModI=0I=I+1TFTFPrivateSubForm_Click()Dimm%,i%,k%,FlagAsBooleanm=InputBox("請輸入一個數(shù)")Fori=2Tom-1If(mModi)=0ThenPrintm&"不是素數(shù)"ElsePrintm&"是素數(shù)"EndIfNextiEndSub典型的錯誤代碼正確代碼(1)PrivateSubForm_Click()Dimm%,i%,k%,FlagAsBooleanm=InputBox("請輸入一個數(shù)")Flag=TrueFori=2Tom-1If(mModi)=0ThenFlag=FalseEndIfNextiIfFlagThen'與Flag=True功能一樣

Printm&"是素數(shù)"ElsePrintm&"不是素數(shù)"EndIfEndSub正確代碼(2)PrivateSubForm_Click()

Dimm%,i%,k%m=Inputbox(“請輸入一個數(shù)”)

Fori=2Tom-1

If(mmodi)=0Then ExitForEndIf

Nexti

Ifi>m-1Then

Printm&“是素數(shù)”

ElsePrintm&“不是素數(shù)”

EndIfEndSub

一個疑問:循環(huán)的終值是否可以減???

實際上:循環(huán)的終值設置為Sqr(m)、m/2。

這個程序的重要意義:利用標記變量;

利用循環(huán)控制變量與終值的關系判斷某個條件是否成立。(b)循環(huán)參數(shù)的類型問題例:DimIAsIntegerForI=1.0To10.5Step1.5…NextI…上述循環(huán)如何執(zhí)行?使用For-Next循環(huán)應注意的問題:循環(huán)參數(shù)按CInt或CLng的方式轉(zhuǎn)換,故本循環(huán)執(zhí)行5次幾種循環(huán)語句比較For....toNextDowhile/until....Loopdo....LoopWhile/until...循環(huán)類型當型循環(huán)當型循環(huán)直到循環(huán)循環(huán)控制條件循環(huán)變量大于/小于終值條件成立/不成立條件成立/不成立循環(huán)變量初值在FOR語句中在DO之前在DO之前使循環(huán)結(jié)束For語句中無需專門語句必須用專門語句必須使用專門語句使用場合循環(huán)次數(shù)容易確定條件件易給出條件件易給出4.循環(huán)的嵌套在一個循環(huán)語句的循環(huán)體內(nèi)又包含另一個循環(huán)語

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論