




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第10章 基本計算(二)選擇控制結(jié)構(gòu) 在上章我們可以看到,賦值語句之所以能夠驅(qū)動計算過程的運(yùn)行,除了賦值語句本身構(gòu)成完整的運(yùn)算求值指令之外,計算機(jī)本身所具有的串行機(jī)制保證了,只要把執(zhí)行語句與說明語句串列下來,然后保證數(shù)據(jù)對象流的暢通,計算機(jī)就能夠按照語句序列的次序依次執(zhí)行下來,從而完成相應(yīng)的計算任務(wù)。不過分析一下我們的實際計算任務(wù),就會發(fā)現(xiàn)真正完全可以只需要按照一個固有計算序列算下來,就可以完成計算的問題只是少數(shù)簡單的問題而已,稍微復(fù)雜點(diǎn)的問題往往都需要在計算過程當(dāng)中出現(xiàn)某種判別問題,使得計算途徑可以分支,對不同的情形,會有不同的計算途徑與不同的計算結(jié)果;還會出現(xiàn)反復(fù)進(jìn)行同一種運(yùn)算,然后再在適
2、當(dāng)?shù)臈l件下跳出循環(huán)的情形,如果只是使用串行序列來描述此時的運(yùn)算過程,會使得程序的寫作充滿重沓的語句。顯然這些類型的計算任務(wù),或者是語句串行序列無法描述的,或者是描述發(fā)生令人難以忍受的。所以一種描述計算過程的語言,除了可以構(gòu)成串行的計算序列之外,還必須能夠控制這個序列有可能出現(xiàn)的選擇分支與循環(huán)的情形,這就是所謂語言的控制結(jié)構(gòu)。本章和下章,我們將分別討論FORTRAN所提供的兩種類型的控制結(jié)構(gòu)以及相應(yīng)的控制語句: 選擇控制結(jié)構(gòu); 循環(huán)控制結(jié)構(gòu)。把程序序列當(dāng)中的控制結(jié)構(gòu)清晰地加以強(qiáng)調(diào)出來,實際上既有助于程序的閱讀,也是符合人的思維的清晰性原則的,因此控制結(jié)構(gòu)的規(guī)范化正是編程語言追求結(jié)構(gòu)化的一個主要著
3、力點(diǎn),但是在早期FORTRAN版本里面,并沒有完全意識到結(jié)構(gòu)化編程風(fēng)格的重要性,因此引入了一些常常破壞結(jié)構(gòu)的轉(zhuǎn)移控制語句,而FORTRAN語言的現(xiàn)代版本還沒有完全放棄它們,但不提倡使用,這些轉(zhuǎn)移控制語句我們在下章也將簡略地討論到。10.1 執(zhí)行順序一個完整的FORTRAN程序,或程序單位,就給出了一個由可執(zhí)行語句引導(dǎo)的語句執(zhí)行序列,這個序列就是語句在程序里面出現(xiàn)的序列,稱為正常運(yùn)行序列。但是某些可執(zhí)行結(jié)構(gòu)或可執(zhí)行語句,能夠控制實際的語句運(yùn)行不止是按照語句書寫的序列進(jìn)行,這樣的可執(zhí)行結(jié)構(gòu)或語句包括控制結(jié)構(gòu)和分支語句。控制語句執(zhí)行序列有兩種基本風(fēng)格: 使用可執(zhí)行結(jié)構(gòu),使得程序能夠選擇性地運(yùn)行程序序
4、列里某個特定位置的語句塊或結(jié)構(gòu)。 使用能夠分支到程序其他任意位置的語句的可執(zhí)行語句。一般說來,上面的第一種方式具有更好的可閱讀性和可維護(hù)性,因此我們將詳細(xì)討論第一種方式的實現(xiàn),而第二種方式則放在下章末尾簡略說明一下。10.2 塊與可執(zhí)行結(jié)構(gòu)所謂控制結(jié)構(gòu)由一個或多個語句塊和結(jié)構(gòu)構(gòu)成,其中必定顯式地或隱式地包含控制邏輯語句。根據(jù)相應(yīng)的邏輯控制條件,就可以選擇性地運(yùn)行某個特定的語句塊與結(jié)構(gòu)。一個塊就是一個由0個或多個語句與結(jié)構(gòu)構(gòu)成的序列,句法形式(R801)為: execution-part-construct構(gòu)成塊的語句與結(jié)構(gòu)的序列構(gòu)成一個程序單位,是一個某種意義上的整體,即或者整個塊被執(zhí)行,或者
5、整個塊都不被執(zhí)行,不能夠出現(xiàn)塊的某個部分被執(zhí)行的情形。不過也可能出現(xiàn)在整個塊被執(zhí)行的情況下,塊內(nèi)的某些語句沒有被執(zhí)行的情況,例如在塊內(nèi)的比較靠前的分支語句,常常能夠制止它后面的語句得到執(zhí)行,但是從語法意義上來看,整個塊的功能得到了完整的實現(xiàn),因此這種情形也被認(rèn)為是塊的完全執(zhí)行。所謂結(jié)構(gòu)就是由一個或多個語句塊或者結(jié)構(gòu),加上作用于這些塊的控制語句構(gòu)成。 結(jié)構(gòu)通常在塊前具有一個初始語句,而在塊后具有一個終止語句; 當(dāng)結(jié)構(gòu)包含不止一個塊時,結(jié)構(gòu)必定包含了用來選擇執(zhí)行哪個塊的條件語句,而一個塊是否被執(zhí)行,正是由結(jié)構(gòu)的作為條件語句的控制邏輯語句當(dāng)中的表達(dá)式?jīng)Q定的; 結(jié)構(gòu)也有可能在塊之間放置特定的語句,用來
6、決定相應(yīng)的塊是否被執(zhí)行; DO結(jié)構(gòu)專門用來決定一個塊可以被連續(xù)地執(zhí)行的次數(shù)?!纠?0-1】 下面給出的可執(zhí)行結(jié)構(gòu)控制了一個塊: IF(K=1)THEN !IF結(jié)構(gòu)的初始語句 X=K*2 !塊的第一個語句 Y=SIN(X) !塊的第二個語句 END IF !IF結(jié)構(gòu)的終止語句FORTRAN提供了三種能夠控制塊的可執(zhí)行結(jié)構(gòu): IF結(jié)構(gòu) CASE結(jié)構(gòu) DO結(jié)構(gòu)塊的一般規(guī)則如下: 首先執(zhí)行塊內(nèi)的第一個語句或結(jié)構(gòu),隨后的執(zhí)行順序就是語句的排列順序,除非中間包含控制結(jié)構(gòu)或語句改變這個順序。 一個塊作為一個整體,必須是完整地被包含在一個結(jié)構(gòu)當(dāng)中;一個塊也可以是空塊,即不包含任何語句與結(jié)構(gòu)。 在塊內(nèi)允許出現(xiàn)分
7、支結(jié)構(gòu)或控制結(jié)構(gòu),使得運(yùn)行序列能夠轉(zhuǎn)移到該塊內(nèi)的特定語句或結(jié)構(gòu)。 在塊內(nèi)的任意位置,都可以強(qiáng)制運(yùn)行的退出。 從塊的外部通過分支到達(dá)塊的內(nèi)部,哪怕是塊內(nèi)的第一個可執(zhí)行語句,都是禁止的。 塊內(nèi)可以引用過程。 結(jié)構(gòu)可以具有結(jié)構(gòu)名稱。 結(jié)構(gòu)名稱在結(jié)構(gòu)的初始語句和終止語句當(dāng)中的出現(xiàn),必須是成對的,也就是說或者同時出現(xiàn)在這兩個位置,或者都不出現(xiàn)。在上章我們討論了WHERE結(jié)構(gòu)與FORALL結(jié)構(gòu),它們似乎同樣具有控制結(jié)構(gòu)的功能,但實質(zhì)上它們都是屬于賦值語句。WHERE結(jié)構(gòu)可以包含多個塊,但是除了塊內(nèi)的某些數(shù)組元素被過濾網(wǎng)過濾掉,從而不參與計算之外,每個塊內(nèi)的每個語句,都必須被執(zhí)行。FORALL結(jié)構(gòu)只包含一個
8、塊,F(xiàn)ORALL對這個塊的執(zhí)行控制,不是反復(fù)地運(yùn)行這個塊,而是其中的每個語句都必須對指標(biāo)值集合里的所有元素執(zhí)行一次,然后才轉(zhuǎn)入下一個語句。在FORALL結(jié)構(gòu)里也可以引入過濾網(wǎng),以排除掉不符合條件的計算。10.3 IF結(jié)構(gòu)和IF語句一個IF結(jié)構(gòu)至多選擇結(jié)構(gòu)里的一個語句與結(jié)構(gòu)的塊來得到執(zhí)行。而一個IF語句至多控制一個語句的執(zhí)行。在下章后面會簡略討論到的算術(shù)IF語句與這里的IF語句沒有關(guān)系,算術(shù)IF語句是一種分支語句,并且是過時的。10.3.1 IF結(jié)構(gòu)IF結(jié)構(gòu)可以包含多個塊與多個邏輯表達(dá)式,還可能包含ELSE語句與ELSE IF語句。邏輯表達(dá)式總是放置在相應(yīng)的塊之前,因此IF結(jié)構(gòu)的執(zhí)行總是從邏輯表
9、達(dá)式開始的,一旦邏輯表達(dá)式取真值,則相應(yīng)的塊獲得執(zhí)行,整個IF結(jié)構(gòu)內(nèi)至多只有一個塊能夠被選擇執(zhí)行,而如果沒有ELSE語句的話,可能沒有塊滿足執(zhí)行的條件。一旦被選擇執(zhí)行的塊運(yùn)行完畢,或者不存在滿足執(zhí)行條件的塊,則整個IF結(jié)構(gòu)的運(yùn)行被終止。1. IF結(jié)構(gòu)的形式IF結(jié)構(gòu)的句法形式(R802)為: if-construct-name: IF(scalar-logical-expression)THEN block ELSE IF(scalar-logical-expression)THENif-construct-name block. ELSE if- construct-name block EN
10、D IF if-construct-nameIF結(jié)構(gòu)的一般規(guī)則如下: 至多只有一個結(jié)構(gòu)里的塊被執(zhí)行,或者沒有塊被執(zhí)行。 ELSE IF語句不能跟隨在ELSE語句后面。 不能出現(xiàn)分支到ELSE IF語句或ELSE語句的情形。 從IF結(jié)構(gòu)里的任意塊都可以分支到END IF語句,即隨時可以退出IF結(jié)構(gòu)。 結(jié)構(gòu)名稱必須成對出現(xiàn)在IF-THEN語句和END IF語句當(dāng)中。 ELSE IF語句和ELSE語句里的結(jié)構(gòu)名稱是可選的,如果有的話,必須和IF-THEN語句里的結(jié)構(gòu)名稱一致。 在同一個作用域單位內(nèi),同一個結(jié)構(gòu)名稱不能用于不同的命名結(jié)構(gòu)。2. IF結(jié)構(gòu)的運(yùn)行結(jié)構(gòu)里的邏輯表達(dá)式按照序列位置執(zhí)行,直到某個
11、表達(dá)式為真值,然后緊跟該表達(dá)式后面的塊得到執(zhí)行,該塊運(yùn)行完畢之后,整個IF結(jié)構(gòu)即退出運(yùn)行。在第一個真值表達(dá)式后面如果還存在真值表達(dá)式,則它們不影響對執(zhí)行塊的選擇。如果在該IF結(jié)構(gòu)內(nèi)(而不是它的子結(jié)構(gòu)內(nèi))找不到真值表達(dá)式,則ELSE語句后面的塊被執(zhí)行;如果沒有ELSE語句,則退出IF結(jié)構(gòu)。下面的圖10-1給出了IF結(jié)構(gòu)的運(yùn)行示意圖。圖10-1 IF結(jié)構(gòu)的運(yùn)行流示意圖【例10-2】 IF(I8.3)THEN X=0.0 Y=100 ELSE X=100 Y=0.0 END IF上例的執(zhí)行順序就是: 首先執(zhí)行I8.3,如果為真,則執(zhí)行X=0.0,Y=100; 如果為假,則執(zhí)行緊跟后面的ELSE語句。
12、 進(jìn)入ELSE語句后,執(zhí)行X=100,Y=0.0。 然后執(zhí)行END IF語句,退出該IF結(jié)構(gòu)。10.3.2 IF語句 一個IF語句用在只需要控制一個語句的場合。1. IF語句的形式IF語句的句法形式(R807)為; IF(scalar-logical-expression)action-statement【例10-3】 IF(X=0)Y=X+12. IF語句的運(yùn)行首先執(zhí)行邏輯表達(dá)式,如果為真值,則執(zhí)行IF語句里的作用語句(action-statement);如果為假,則退出該語句,執(zhí)行程序里跟在IF語句后面的其他語句。注意作用語句(action-statement)不能是一個IF語句,也不能是
13、一個END語句。如果邏輯表達(dá)式包含一個函數(shù)引用,那么邏輯表達(dá)式的運(yùn)行可能產(chǎn)生修改作用語句的副作用,這是允許的。作用語句能夠改變變量,或輸入輸出系統(tǒng)條件,或控制語句的狀態(tài),作用語句的例子包括賦值,WRITE,GO TO語句等;說明性語句,F(xiàn)ORMAT語句,和ENTRY語句等不屬于作用語句,而結(jié)構(gòu)也不能看成是作用語句。10.4 CASE結(jié)構(gòu)和IF結(jié)構(gòu)類似的是,CASE結(jié)構(gòu)也可以包含多個塊,而最終能夠獲得執(zhí)行的最多只能是一個。和IF結(jié)構(gòu)不同的是,CASE結(jié)構(gòu)的選擇是基于結(jié)構(gòu)開頭的SELECT CASE語句里的標(biāo)量表達(dá)式的取值,這個取值被稱為情況指標(biāo),它可以是離散型的各種標(biāo)量值,例如整型,字符型,邏輯
14、型,而在IF結(jié)構(gòu)里,用來進(jìn)行判別而提供選擇條件的是邏輯型取值,即只有.TURE.和.FALSE.兩個值。得到情況指標(biāo)之后,搜索所有的CASE語句里的情況選擇符的值,如果有與情況指標(biāo)匹配的,則執(zhí)行相應(yīng)的CASE語句里的塊,否則執(zhí)行具有默認(rèn)選擇符的CASE,如果不存在具有默認(rèn)選擇符的CASE,則退出。使用CASE結(jié)構(gòu)可以很自然地表達(dá)需要分情況考慮的問題,同時每種情況的定義必須是已知的?!纠?0-4】 設(shè)分段函數(shù):可以很自然地使用CASE結(jié)構(gòu)描述如下: SELECT CASE(x0) CASE(.TRUE.) YSIN(X) CASE(.FALSE.) YCOS(X)END SELECT【例10-5
15、】 一年中十二個月的天數(shù)也可以用CASE結(jié)構(gòu)表示如下:MONTHDAY :SELECT CASE(MONTH)CASE(2)DAYS28CASE(4,6,9,11) DAYS30CASE(1,3,5,7,8,10,12) DAYS31END SELECT MONTHDAY10.4.1 CASE結(jié)構(gòu)的形式CASE結(jié)構(gòu)的句法形式(R808)為: case-construct-name:SELECT CASE(case-expression) CASE(case-value-range-list)case-construct-name block CASE DEFAULTcase-construct
16、-name block END SELECT case-construct-name其中的情況表達(dá)式(case-expression)為標(biāo)量表達(dá)式,該表達(dá)式經(jīng)過計算得到的取值為情況指標(biāo)。其中的情況值范圍(case-value-range)即連同其括號稱為情況選擇符,表示它的取值所屬的離散區(qū)間,也可以就是一個單獨(dú)的值,它的句法形式(R814)為: case-value case-value : :case-value case-value :case-value即如果是區(qū)間的話,該區(qū)間可以是半邊開的。其中的情況值(case-value)是一個標(biāo)量初始化表達(dá)式,與情況表達(dá)式的類型等屬性一樣。所謂初
17、始化表達(dá)式即在編譯時可以取值的表達(dá)式,本質(zhì)上即常量表達(dá)式。它們的取值都只能是整型,字符型和邏輯型??梢钥吹皆贑ASE結(jié)構(gòu)里,包含了三種語句: SELECT CASE語句; CASE 語句; END SELECT語句。而在CASE語句當(dāng)中,跟在關(guān)鍵詞CASE后面的(case-value-range-list)或DEFAULT就是情況選擇符。CASE結(jié)構(gòu)的一般規(guī)則如下: 如果CASE結(jié)構(gòu)具有名稱的話,那么結(jié)構(gòu)名稱必須成對出現(xiàn)在SELECT CASE語句和END SELECT語句當(dāng)中。 情況選擇符后面如果出現(xiàn)結(jié)構(gòu)名稱的話,必須與SELECT CASE語句當(dāng)中的結(jié)構(gòu)名稱一致。 具有情況選擇符DEFAU
18、LT的CASE語句是可選的,如果它出現(xiàn)在結(jié)構(gòu)當(dāng)中的話,上述CASE結(jié)構(gòu)的句法形式并沒有要求它放置在結(jié)構(gòu)的最后。 在一個CASE結(jié)構(gòu)里,情況表達(dá)式與所有的情況值都必須屬于同一個類型,如果屬于字符型,它們可以具有不同的長度,但是種別參數(shù)必須一致。 情況值范圍里面出現(xiàn)冒號時,表示一個區(qū)間,而區(qū)間的構(gòu)成隱含著相應(yīng)的關(guān)系表達(dá)式。 情況值不能是邏輯型。 如果是字符型的話,則依據(jù)字符型的關(guān)系運(yùn)算規(guī)則確定相應(yīng)的取值范圍?!纠?0-6】 CASE(“ABOUT”:“Z”)里面的情況值范圍為按照與處理器相關(guān)的默認(rèn)字符類型的關(guān)系運(yùn)算,在ABOUT與Z之間的所有字符串。結(jié)構(gòu)當(dāng)中的表達(dá)式的取值完成后,必須保證最多只能有
19、一個情況選擇符的值與情況指標(biāo)值匹配,也即不允許在不同的情況之間情況值出現(xiàn)重復(fù)的情形。情況值DEFAULT與任何跟所有結(jié)構(gòu)內(nèi)的其他情況值都不匹配的情況指標(biāo)值匹配?!纠?0-7】 CALCU_AREA: SELECT CASE(OBJECT) CASE(RECTANGLE) CALCU_AREA AREA=LENGTH*WIDTH CASE(SQUARE) CALCU_AREA AREA=SIDE*SIDE CASE(CIRCLE) CALCU_AREA AREA=PI*RADIUS*2 END SELECT CALCU_AREA10.4.2 CASE結(jié)構(gòu)的運(yùn)行首先計算SELECT CASE語句當(dāng)中的作為標(biāo)量表達(dá)式的情況指標(biāo),它的值最多與結(jié)構(gòu)里的一個情況值匹配,與之匹配的情況值后面緊跟的塊得到執(zhí)行,然后退出結(jié)構(gòu)。程序進(jìn)入緊跟該結(jié)構(gòu)的END SELECT語句后面的可執(zhí)行語句或結(jié)構(gòu)。如果沒有與情況指標(biāo)值匹配的情況值,而結(jié)構(gòu)里包含了CASE DEFAULT語句,按照DEFAULT的定義,情況值這時必定與之匹配,因此執(zhí)行該語句后面的塊,然后退出該結(jié)構(gòu)。如果結(jié)構(gòu)當(dāng)中不存在CASE DEFAULT語句,又沒有與情況指標(biāo)值匹配的情況值,那么退出該結(jié)構(gòu),不執(zhí)行結(jié)構(gòu)里的任何塊。
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 茶山茶葉種植基地租賃與茶葉種植基地旅游開發(fā)合同
- 精準(zhǔn)定位倉單質(zhì)押融資服務(wù)合同
- 建筑工地安全防護(hù)終止服務(wù)合同書
- 便利店品牌直營店租賃及品牌維護(hù)合同
- Brand KPIs for hotels:Hyatt Regency in the United States-英文培訓(xùn)課件2025.5
- 2025年顧客關(guān)系管理與銷售技巧考試問答及答案
- 2025年創(chuàng)新思維能力考試試卷及答案探討
- 2025年心理調(diào)適與危機(jī)干預(yù)能力測試卷及答案
- 內(nèi)科系統(tǒng)常見疾病護(hù)理常規(guī)
- 車輛租賃公司試駕服務(wù)條款合同
- 廣東省潮州市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)
- 人教版PEP英語3年級全部單詞默寫表格以及背誦版本
- 人際關(guān)系與溝通技巧全書ppt完整版課件整本書電子教案最全教學(xué)教程
- T-CSCS 016-2021 鋼結(jié)構(gòu)制造技術(shù)標(biāo)準(zhǔn)
- 數(shù)據(jù)中心機(jī)房工程施工組織方案
- 績效管理全套ppt課件(完整版)
- 酒店二次供水應(yīng)急預(yù)案
- 句子專項復(fù)習(xí)(用)
- 土工布檢測報告土工布產(chǎn)品屬性
- 導(dǎo)流明渠混凝土施工方案
- JJF 1175-2021 試驗篩校準(zhǔn)規(guī)范_(高清-最新版)
評論
0/150
提交評論