fortran95的使用方法1_第1頁
fortran95的使用方法1_第2頁
fortran95的使用方法1_第3頁
fortran95的使用方法1_第4頁
fortran95的使用方法1_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第10章 基本計算(二)選擇控制結構 在上章我們可以看到,賦值語句之所以能夠驅動計算過程的運行,除了賦值語句本身構成完整的運算求值指令之外,計算機本身所具有的串行機制保證了,只要把執(zhí)行語句與說明語句串列下來,然后保證數(shù)據(jù)對象流的暢通,計算機就能夠按照語句序列的次序依次執(zhí)行下來,從而完成相應的計算任務。不過分析一下我們的實際計算任務,就會發(fā)現(xiàn)真正完全可以只需要按照一個固有計算序列算下來,就可以完成計算的問題只是少數(shù)簡單的問題而已,稍微復雜點的問題往往都需要在計算過程當中出現(xiàn)某種判別問題,使得計算途徑可以分支,對不同的情形,會有不同的計算途徑與不同的計算結果;還會出現(xiàn)反復進行同一種運算,然后再在適

2、當?shù)臈l件下跳出循環(huán)的情形,如果只是使用串行序列來描述此時的運算過程,會使得程序的寫作充滿重沓的語句。顯然這些類型的計算任務,或者是語句串行序列無法描述的,或者是描述發(fā)生令人難以忍受的。所以一種描述計算過程的語言,除了可以構成串行的計算序列之外,還必須能夠控制這個序列有可能出現(xiàn)的選擇分支與循環(huán)的情形,這就是所謂語言的控制結構。本章和下章,我們將分別討論FORTRAN所提供的兩種類型的控制結構以及相應的控制語句: 選擇控制結構; 循環(huán)控制結構。把程序序列當中的控制結構清晰地加以強調出來,實際上既有助于程序的閱讀,也是符合人的思維的清晰性原則的,因此控制結構的規(guī)范化正是編程語言追求結構化的一個主要著

3、力點,但是在早期FORTRAN版本里面,并沒有完全意識到結構化編程風格的重要性,因此引入了一些常常破壞結構的轉移控制語句,而FORTRAN語言的現(xiàn)代版本還沒有完全放棄它們,但不提倡使用,這些轉移控制語句我們在下章也將簡略地討論到。10.1 執(zhí)行順序一個完整的FORTRAN程序,或程序單位,就給出了一個由可執(zhí)行語句引導的語句執(zhí)行序列,這個序列就是語句在程序里面出現(xiàn)的序列,稱為正常運行序列。但是某些可執(zhí)行結構或可執(zhí)行語句,能夠控制實際的語句運行不止是按照語句書寫的序列進行,這樣的可執(zhí)行結構或語句包括控制結構和分支語句??刂普Z句執(zhí)行序列有兩種基本風格: 使用可執(zhí)行結構,使得程序能夠選擇性地運行程序序

4、列里某個特定位置的語句塊或結構。 使用能夠分支到程序其他任意位置的語句的可執(zhí)行語句。一般說來,上面的第一種方式具有更好的可閱讀性和可維護性,因此我們將詳細討論第一種方式的實現(xiàn),而第二種方式則放在下章末尾簡略說明一下。10.2 塊與可執(zhí)行結構所謂控制結構由一個或多個語句塊和結構構成,其中必定顯式地或隱式地包含控制邏輯語句。根據(jù)相應的邏輯控制條件,就可以選擇性地運行某個特定的語句塊與結構。一個塊就是一個由0個或多個語句與結構構成的序列,句法形式(R801)為: execution-part-construct構成塊的語句與結構的序列構成一個程序單位,是一個某種意義上的整體,即或者整個塊被執(zhí)行,或者

5、整個塊都不被執(zhí)行,不能夠出現(xiàn)塊的某個部分被執(zhí)行的情形。不過也可能出現(xiàn)在整個塊被執(zhí)行的情況下,塊內的某些語句沒有被執(zhí)行的情況,例如在塊內的比較靠前的分支語句,常常能夠制止它后面的語句得到執(zhí)行,但是從語法意義上來看,整個塊的功能得到了完整的實現(xiàn),因此這種情形也被認為是塊的完全執(zhí)行。所謂結構就是由一個或多個語句塊或者結構,加上作用于這些塊的控制語句構成。 結構通常在塊前具有一個初始語句,而在塊后具有一個終止語句; 當結構包含不止一個塊時,結構必定包含了用來選擇執(zhí)行哪個塊的條件語句,而一個塊是否被執(zhí)行,正是由結構的作為條件語句的控制邏輯語句當中的表達式決定的; 結構也有可能在塊之間放置特定的語句,用來

6、決定相應的塊是否被執(zhí)行; DO結構專門用來決定一個塊可以被連續(xù)地執(zhí)行的次數(shù)?!纠?0-1】 下面給出的可執(zhí)行結構控制了一個塊: IF(K=1)THEN !IF結構的初始語句 X=K*2 !塊的第一個語句 Y=SIN(X) !塊的第二個語句 END IF !IF結構的終止語句FORTRAN提供了三種能夠控制塊的可執(zhí)行結構: IF結構 CASE結構 DO結構塊的一般規(guī)則如下: 首先執(zhí)行塊內的第一個語句或結構,隨后的執(zhí)行順序就是語句的排列順序,除非中間包含控制結構或語句改變這個順序。 一個塊作為一個整體,必須是完整地被包含在一個結構當中;一個塊也可以是空塊,即不包含任何語句與結構。 在塊內允許出現(xiàn)分

7、支結構或控制結構,使得運行序列能夠轉移到該塊內的特定語句或結構。 在塊內的任意位置,都可以強制運行的退出。 從塊的外部通過分支到達塊的內部,哪怕是塊內的第一個可執(zhí)行語句,都是禁止的。 塊內可以引用過程。 結構可以具有結構名稱。 結構名稱在結構的初始語句和終止語句當中的出現(xiàn),必須是成對的,也就是說或者同時出現(xiàn)在這兩個位置,或者都不出現(xiàn)。在上章我們討論了WHERE結構與FORALL結構,它們似乎同樣具有控制結構的功能,但實質上它們都是屬于賦值語句。WHERE結構可以包含多個塊,但是除了塊內的某些數(shù)組元素被過濾網過濾掉,從而不參與計算之外,每個塊內的每個語句,都必須被執(zhí)行。FORALL結構只包含一個

8、塊,F(xiàn)ORALL對這個塊的執(zhí)行控制,不是反復地運行這個塊,而是其中的每個語句都必須對指標值集合里的所有元素執(zhí)行一次,然后才轉入下一個語句。在FORALL結構里也可以引入過濾網,以排除掉不符合條件的計算。10.3 IF結構和IF語句一個IF結構至多選擇結構里的一個語句與結構的塊來得到執(zhí)行。而一個IF語句至多控制一個語句的執(zhí)行。在下章后面會簡略討論到的算術IF語句與這里的IF語句沒有關系,算術IF語句是一種分支語句,并且是過時的。10.3.1 IF結構IF結構可以包含多個塊與多個邏輯表達式,還可能包含ELSE語句與ELSE IF語句。邏輯表達式總是放置在相應的塊之前,因此IF結構的執(zhí)行總是從邏輯表

9、達式開始的,一旦邏輯表達式取真值,則相應的塊獲得執(zhí)行,整個IF結構內至多只有一個塊能夠被選擇執(zhí)行,而如果沒有ELSE語句的話,可能沒有塊滿足執(zhí)行的條件。一旦被選擇執(zhí)行的塊運行完畢,或者不存在滿足執(zhí)行條件的塊,則整個IF結構的運行被終止。1. IF結構的形式IF結構的句法形式(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結構的一般規(guī)則如下: 至多只有一個結構里的塊被執(zhí)行,或者沒有塊被執(zhí)行。 ELSE IF語句不能跟隨在ELSE語句后面。 不能出現(xiàn)分支到ELSE IF語句或ELSE語句的情形。 從IF結構里的任意塊都可以分支到END IF語句,即隨時可以退出IF結構。 結構名稱必須成對出現(xiàn)在IF-THEN語句和END IF語句當中。 ELSE IF語句和ELSE語句里的結構名稱是可選的,如果有的話,必須和IF-THEN語句里的結構名稱一致。 在同一個作用域單位內,同一個結構名稱不能用于不同的命名結構。2. IF結構的運行結構里的邏輯表達式按照序列位置執(zhí)行,直到某個

11、表達式為真值,然后緊跟該表達式后面的塊得到執(zhí)行,該塊運行完畢之后,整個IF結構即退出運行。在第一個真值表達式后面如果還存在真值表達式,則它們不影響對執(zhí)行塊的選擇。如果在該IF結構內(而不是它的子結構內)找不到真值表達式,則ELSE語句后面的塊被執(zhí)行;如果沒有ELSE語句,則退出IF結構。下面的圖10-1給出了IF結構的運行示意圖。圖10-1 IF結構的運行流示意圖【例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、 進入ELSE語句后,執(zhí)行X=100,Y=0.0。 然后執(zhí)行END IF語句,退出該IF結構。10.3.2 IF語句 一個IF語句用在只需要控制一個語句的場合。1. IF語句的形式IF語句的句法形式(R807)為; IF(scalar-logical-expression)action-statement【例10-3】 IF(X=0)Y=X+12. IF語句的運行首先執(zhí)行邏輯表達式,如果為真值,則執(zhí)行IF語句里的作用語句(action-statement);如果為假,則退出該語句,執(zhí)行程序里跟在IF語句后面的其他語句。注意作用語句(action-statement)不能是一個IF語句,也不能是

13、一個END語句。如果邏輯表達式包含一個函數(shù)引用,那么邏輯表達式的運行可能產生修改作用語句的副作用,這是允許的。作用語句能夠改變變量,或輸入輸出系統(tǒng)條件,或控制語句的狀態(tài),作用語句的例子包括賦值,WRITE,GO TO語句等;說明性語句,F(xiàn)ORMAT語句,和ENTRY語句等不屬于作用語句,而結構也不能看成是作用語句。10.4 CASE結構和IF結構類似的是,CASE結構也可以包含多個塊,而最終能夠獲得執(zhí)行的最多只能是一個。和IF結構不同的是,CASE結構的選擇是基于結構開頭的SELECT CASE語句里的標量表達式的取值,這個取值被稱為情況指標,它可以是離散型的各種標量值,例如整型,字符型,邏輯

14、型,而在IF結構里,用來進行判別而提供選擇條件的是邏輯型取值,即只有.TURE.和.FALSE.兩個值。得到情況指標之后,搜索所有的CASE語句里的情況選擇符的值,如果有與情況指標匹配的,則執(zhí)行相應的CASE語句里的塊,否則執(zhí)行具有默認選擇符的CASE,如果不存在具有默認選擇符的CASE,則退出。使用CASE結構可以很自然地表達需要分情況考慮的問題,同時每種情況的定義必須是已知的。【例10-4】 設分段函數(shù):可以很自然地使用CASE結構描述如下: SELECT CASE(x0) CASE(.TRUE.) YSIN(X) CASE(.FALSE.) YCOS(X)END SELECT【例10-5

15、】 一年中十二個月的天數(shù)也可以用CASE結構表示如下: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結構的形式CASE結構的句法形式(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其中的情況表達式(case-expression)為標量表達式,該表達式經過計算得到的取值為情況指標。其中的情況值范圍(case-value-range)即連同其括號稱為情況選擇符,表示它的取值所屬的離散區(qū)間,也可以就是一個單獨的值,它的句法形式(R814)為: case-value case-value : :case-value case-value :case-value即如果是區(qū)間的話,該區(qū)間可以是半邊開的。其中的情況值(case-value)是一個標量初始化表達式,與情況表達式的類型等屬性一樣。所謂初

17、始化表達式即在編譯時可以取值的表達式,本質上即常量表達式。它們的取值都只能是整型,字符型和邏輯型??梢钥吹皆贑ASE結構里,包含了三種語句: SELECT CASE語句; CASE 語句; END SELECT語句。而在CASE語句當中,跟在關鍵詞CASE后面的(case-value-range-list)或DEFAULT就是情況選擇符。CASE結構的一般規(guī)則如下: 如果CASE結構具有名稱的話,那么結構名稱必須成對出現(xiàn)在SELECT CASE語句和END SELECT語句當中。 情況選擇符后面如果出現(xiàn)結構名稱的話,必須與SELECT CASE語句當中的結構名稱一致。 具有情況選擇符DEFAU

18、LT的CASE語句是可選的,如果它出現(xiàn)在結構當中的話,上述CASE結構的句法形式并沒有要求它放置在結構的最后。 在一個CASE結構里,情況表達式與所有的情況值都必須屬于同一個類型,如果屬于字符型,它們可以具有不同的長度,但是種別參數(shù)必須一致。 情況值范圍里面出現(xiàn)冒號時,表示一個區(qū)間,而區(qū)間的構成隱含著相應的關系表達式。 情況值不能是邏輯型。 如果是字符型的話,則依據(jù)字符型的關系運算規(guī)則確定相應的取值范圍?!纠?0-6】 CASE(“ABOUT”:“Z”)里面的情況值范圍為按照與處理器相關的默認字符類型的關系運算,在ABOUT與Z之間的所有字符串。結構當中的表達式的取值完成后,必須保證最多只能有

19、一個情況選擇符的值與情況指標值匹配,也即不允許在不同的情況之間情況值出現(xiàn)重復的情形。情況值DEFAULT與任何跟所有結構內的其他情況值都不匹配的情況指標值匹配?!纠?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結構的運行首先計算SELECT CASE語句當中的作為標量表達式的情況指標,它的值最多與結構里的一個情況值匹配,與之匹配的情況值后面緊跟的塊得到執(zhí)行,然后退出結構。程序進入緊跟該結構的END SELECT語句后面的可執(zhí)行語句或結構。如果沒有與情況指標值匹配的情況值,而結構里包含了CASE DEFAULT語句,按照DEFAULT的定義,情況值這時必定與之匹配,因此執(zhí)行該語句后面的塊,然后退出該結構。如果結構當中不存在CASE DEFAULT語句,又沒有與情況指標值匹配的情況值,那么退出該結構,不執(zhí)行結構里的任何塊。

溫馨提示

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

評論

0/150

提交評論