fortran教程[共91頁]

上傳人:gfy****yf 文檔編號:72706316 上傳時間:2022-04-09 格式:PPT 頁數(shù):91 大?。?81KB
收藏 版權(quán)申訴 舉報 下載
fortran教程[共91頁]_第1頁
第1頁 / 共91頁
fortran教程[共91頁]_第2頁
第2頁 / 共91頁
fortran教程[共91頁]_第3頁
第3頁 / 共91頁

下載文檔到電腦,查找使用更方便

12 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《fortran教程[共91頁]》由會員分享,可在線閱讀,更多相關(guān)《fortran教程[共91頁](91頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、Fortran發(fā)展簡史發(fā)展簡史 n1954:IBM 在 IBM 704 上發(fā)展 n1957:IBM發(fā)表,F(xiàn)ortran Formula Translator n1966:American Standards Association 制訂 Fortran 66 n鑑於各家編輯器無法相容,故統(tǒng)一標準 nAmerican Standards Association:美國國家標準局(ANSI)的前身 n1978:ANSI 公布 Fortran 77 標準 n刪去部分內(nèi)容,新增邏輯與輸出入方面的功能 n1992:國際標準組織 ISO 公布 Fortran 90 標準 n與 77 版本差異大 n加入物件導(dǎo)

2、向、提供指標與加強陣列功能、自由格式寫作 n1997:國際標準組織 ISO 公布 Fortran 95 標準 n加強平行運算 nFortran 200 x 書面格式書面格式 nFixed Format是舊式的寫法,有較多的限制,F(xiàn)ixed Format副檔名用 *.F 或 *.FOR 。nFree Format則是Fortran 90以後新增的作法,以副檔名做為區(qū)隔,F(xiàn)ree Format使用 *.F90。 nFixed Format(固定格式)(固定格式)n字元位置意義: 第 1 字元:如果是字母 C 或 c 或是星號 *,本行視為註解 第 1-5 字元:空白,或是一組數(shù)字為本行程式的代號

3、第 6 字元:放上 0 以外的字元,表示為接續(xù)上一行程式碼 第 7-72 字元:程式碼寫作區(qū)域 第 73 字元以後:不使用,編輯器會忽略,有些則發(fā)出錯誤訊息 程式碼之間多餘的空格不具意義,僅作分隔與方便閱讀 配合打孔卡片所發(fā)展,F(xiàn)ortran 90之後可採用Free Format n例如: 1:C FIXED FORMAT 2: PROGRAM FIXED 3: READ (*,10) A,B4: 10 FORMAT (F5.1,F5.1)5: SUM = A + B6: WRITE (*,20) 7: +SUM8: 20 FORMAT (1X,F6.1)9: END nFree Format

4、(自由格式)(自由格式)nFortran 90 開始使用,附加檔名為 *.F90 n不再規(guī)定第幾字元有何特定用途 n驚嘆號!後都是註解 n每行可以寫作 132 字元 n如有行號放在每行最前面 n程式連接符號改為&,放在每行程式碼最前或最後,表連結(jié)前一行或是下一行 n例如:1:! free format 2: program free 3: read (*,10) a,b4:10 format (f5.1,f5.1)5: sum=a+b6: write (*,20) & 7: sum8:20 format (1x,f6.1)9: end輸出入指令輸出入指令 nWRITE write(*,*) H

5、ello *星號意義: n前者代表使用預(yù)設(shè)輸出裝置(一般即為螢?zāi)唬?n後者代表不特別設(shè)定輸出格式 嚴謹用法: write(UNIT=*,FMT=*) Hello ! 使用預(yù)設(shè)輸出裝置,不設(shè)定特別格式 write(6,*) Hello ! 使用螢?zāi)惠敵觯辉O(shè)定特別格式 write(UNIT=6,FMT=*) “Hello” ! 最嚴謹?shù)膶懛?輸出字串若包含有單或雙引號,請參考字串宣告 格式化請參見FORMAT nPRINTprint *, Hello print指令沒有指定輸出裝置的能力,只能針對螢?zāi)惠敵?nREADread (*,*) a 讓使用者能透過鍵盤輸入變數(shù)內(nèi)容 *星號意義: n前者代

6、表使用預(yù)設(shè)輸入裝置(一般為鍵盤) n後者代表不指定輸入格式 嚴謹用法: read(UNIT=*,FMT=*) Hello ! 使用預(yù)設(shè)輸入裝置,不指定輸入格式 read(5,*) Hello ! 使用鍵盤輸入,不指定輸入格式 read(UNIT=5,FMT=*) Hello ! 最嚴謹?shù)膶懛?注意事項: 輸入字串無須加上雙引號,但字串中若有空格或逗號,將被視為兩筆資料,比如: nread (*,*) a, b 若輸入 Happy Birthday,則a=Happy,b=Birthday nread (*,*) a 若輸入 Happy Birthday,則a=Happy nFORMAT a =

7、12.3456 write (*,*) a write (*,100) a 100 format(f5.2) 則前者輸出結(jié)果為12.3456,後者為12.34 f5.1代表使用5個字元長度顯示浮點數(shù),其中小數(shù)佔1位 1. 簡化的用法1:將輸出格式寫在write指令中 write (*,(1x,f5.2) a 優(yōu)點: 減少程式行數(shù)及行號使用 容易閱讀(不用另找行號、FORMAT) 缺點: 格式複雜時,程式碼混亂 格式設(shè)定相同時,無法重複利用 2. 簡化的用法2: 不同格式控制指令,(1x,f5.2)可以移去逗號移去逗號簡化成format (1xf5.2) 重複相同格式(a3,a3)不可以不可以簡

8、化成(a3a3),改用format (2a3) 若有不同格式時,如(1xf5.2 , 1xf5.2 , 1xf5.2)則改用format (3(1xf5.2) 3. 字串可以直接寫入格式內(nèi): write (*,(a4,I1) 1+2=,1+2 write (*,(1+2=,I1) 1+2 輸出均為 1+2=3 。上例中單雙引號混用,但F77只用使用單引號: write (*,(1+2=,I1) 1+2 4. 使用字串變數(shù)做為格式條件,如: character(len=10) fmtstring fmtstring = (f5.1) write (*,fmtstring) 123.4 好處在於,

9、若執(zhí)行階段輸出變數(shù)超過5個字元,可經(jīng)由如:fmtstring(3:3)=“8”, 使得格式成為(f8.1),以容納更大的數(shù)字 5. 常見錯誤: 變數(shù)型態(tài)與格式型態(tài)不符:比如變數(shù)為整數(shù)123,卻給定字串型態(tài)A3 早期應(yīng)用在印表機輸出時,第一個字元被做為控制字元,所以早期程式設(shè)計師習(xí) 慣上每一行最前面預(yù)留一個空白(1X),但多數(shù)編輯器已經(jīng)取消這個設(shè)計 6. 通常設(shè)計師建議,不要將format集中排列,如此不利於搜尋。最好將format直接 放在write之下、甚至用上述寫入write中。(但有些format被重複使用,所以非每 行write都有format伴隨)變數(shù)型態(tài)變數(shù)型態(tài)n基本概念基本概念以

10、整數(shù)為例: integer a a為自己取的變數(shù)名稱,代表一個儲存整數(shù)的空間位置,稱為變數(shù) 宣告後透過該名稱來給予或提供變數(shù)內(nèi)容,如: 1. program example 2. integer a, b 3. a = 3 ! 將a變數(shù)設(shè)定為3 4. b = a * 2 ! 將b變數(shù)設(shè)定為a*2,即3*2 5. print *, a=, a ! 寫出a的內(nèi)容 6. print *, b=, b ! 寫出b的內(nèi)容 7. stop 8. end example 執(zhí)行結(jié)果 a= 3 b= 9 使用注意: 等號意義代表將左邊變數(shù)的內(nèi)容,設(shè)定成右邊的數(shù)值或計算結(jié)果 名稱命名等原則及注意事項,請參考變數(shù)宣

11、告 n整數(shù)型態(tài)整數(shù)型態(tài) (INTEGERAL)integer a 1. 使用注意: 計算結(jié)果無條件捨去小數(shù)部分 常見錯誤!如:a=3/2 a=1 、a=1/2 a=0 宣告未指定長度時,通常表示為長整數(shù) 2.長整數(shù) - 使用4位元組(4 bytes, 32 bits) integer(kind=4) a ! F90新增作法 integer(4) b ! INTEGER*4 c ! F77傳統(tǒng)作法 可儲存範圍:-2,147,483,648 +2,147,483,647 3. 短整數(shù) - 使用2位元組(2 bytes, 16 bits) integer(kind=2) a ! F90新增作法 in

12、teger(2) b ! INTEGER*2 c ! F77傳統(tǒng)作法 可儲存範圍:-32,768 +32,767 4. 部分編譯器支援 - 使用1位元組(1 bytes, 8 bits) integer(kind=1) a ! F90新增作法 integer(1) b ! INTEGER*1 c ! F77傳統(tǒng)作法 可儲存範圍:-128 +127 n浮點數(shù)型態(tài)浮點數(shù)型態(tài) (REAL)real a 未指定kind值時,通常宣告為單精準度(kind=4) 1. 單精準度 - 使用4位元組(4 bytes, 32 bits) real(kind=4) a ! F90新增作法 real(4) b !

13、REAL*4 c ! F77傳統(tǒng)作法 可表示範圍(PC):1.18*10-38 3.40*1038 單精準度有效位數(shù)為6-7位,注意可能有以下問題:a = 1000000. + 0.1 a = 1000000. 常見錯誤,大數(shù)加小數(shù)! 2. 雙精準度 - 使用4位元組(8 bytes, 64 bits) real(kind=8) a ! F90新增作法 real(8) b ! REAL*8 c ! F77傳統(tǒng)作法 可表示範圍(PC):2.23*10-308 1.79*10308 雙精準度有效位數(shù)為15位 3. 使用注意: 常數(shù)部分請加上.0,如3 3.0(只加.亦可) real a a= 1.

14、5+3./2. a= 3.0 (3.與2.被視為浮點數(shù)) a= 1.5+3/2 a= 2.5 (3/2視為整數(shù),小數(shù)無條件捨去) 常見錯誤! 雙精準度(REAL*8),常數(shù)請加上d0,如3 3.d0 常見 忽略! 或採用 a = 1.0_4 表示 kind = 4 a = 1.0_8 表示 kind = 8 可用科學(xué)記號表示法,如 10,000,000,000 = 1E10 (1D10 代表雙精準度) 0.0000000001 = 1E-10 (1D-10代表雙精準度) n複數(shù)型態(tài)複數(shù)型態(tài) (COMPLEX)complex a (複數(shù)由實部與虛部組成,a=x+yi,x 為實部、y 為虛部,皆為

15、實數(shù)型態(tài)) 1. 使用注意: 設(shè)定數(shù)值a = (x,y) ! a = x + yi ,若x=1.5,y=2.5,a=1.5 + 2.5i a = (1.5,2.5) ! a = 1.5 + 2.5i a = 1.5 ! a = 1.5 + 0i 2. 單精準度 - 使用兩個單精準浮點數(shù) complex(kind=4) a ! F90新增作法 complex(4) b ! COMPLEX*8 c ! F77傳統(tǒng)作法 3. 雙精準度 - 使用兩個雙精準浮點數(shù) complex(kind=8) a ! F90新增作法 complex(8) b ! COMPLEX*16 c ! F77傳統(tǒng)作法 n字元與

16、字串字元與字串 (CHARACTER)character a (此例僅能儲存一個字元) 1. 長度超過一個字元時,需指定長度,如需十個字元長度時: character(len=10) a ! F90新增作法 character(10) b ! CHARACTER*10 c ! F77傳統(tǒng)作法 CHARACTER*(10) d ! 2. 使用注意: 設(shè)定字串變數(shù): a = Hello ! F90使用單或雙引號來包裝字串 b = Hello ! F77使用單引號來包裝字串 c = Thats right ! 使用雙引號中,有單引號不受影響 d = Thats right ! 使用單引號,字串又包含

17、單引號時,請連續(xù)使用兩個單引號 e = “”“Hello”“” ! 使用雙引號,字串又包含雙引號時,請連續(xù)使用兩個雙引號,本例輸出為Hello 設(shè)定部分字串: string(1:4) = Good ! 指定1-4字元 string(5:5) = ! 指定第5字元 string(6:) = morning ! 指定第6個字元以後的字串 使用 / 連接兩字串:string_a = string_b / string_c 副程序中宣告為不定長度(依呼叫端長度決定) n邏輯變數(shù)邏輯變數(shù) (LOGICAL)logical a 1. 使用注意: 設(shè)定邏輯變數(shù): a = .true. ! 設(shè)定為真 a =

18、.false. ! 設(shè)定為假 使用 WRITE 輸出時,僅顯示 T 或 F但實務(wù)上邏輯變數(shù)很少用於輸出 2. 通常不指定使用空間大小,由編輯器自行決定,最少只需1個位元(1 bit) 若指定使用4個位元組時(4 bytes, 32 bits) logical(kind=4) a ! F90新增作法 LOGICAL*4 b ! F77傳統(tǒng)作法 LOGICAL(4) c ! F77傳統(tǒng)作法 (也可使用2個位元組,將上例4換為2即可) n自訂資料型態(tài)自訂資料型態(tài) (TYPE) - F90新增新增舉例來說,若程式中需記錄一個人的姓名、身高、體重、血型,則需要宣告四個變數(shù),透過自訂型態(tài),我們可以訂定一個

19、人員基本資料的資料型態(tài),其中將包含上述的各項資料型態(tài),該資料型態(tài)變數(shù)使用起來就像是Visual Basic的物件。以下舉實例說明:! 建立名稱為person的自訂資料型態(tài) type : person character(len=25) : name ! 記錄姓名 integer(kind=2) : length ! 記錄身高 integer(kind=2) : weight ! 記錄體重 character(len=2) : blood ! 記錄血型 end type person ! 自訂資料型態(tài)結(jié)束,本例中person型態(tài)包括了四個元素 type(person) : a ! 宣告一個per

20、son型態(tài)的變數(shù) read(*,*) a%name ! 讀取變數(shù)a的姓名資料,變數(shù)與元素間以隔開 write(*,*) a%name ! 列印變數(shù)a的姓名資料 a = person(Frank,172,75,O) ! 直接設(shè)定所有資料nKIND的應(yīng)用的應(yīng)用 - F90新增新增宣告INTEGER與REAL時,KIND值將影響可儲存範圍與有效位數(shù),以PC來說:integer(kind=1):-128 +127 integer(kind=2):-32,768 +32,767 integer(kind=4):-2,147,483,648 +2,147,483,647 real(kind=4):1.18

21、*10-38 3.40*1038 ,有效6-7位 real(kind=8):2.23*10-308 1.79*10308 ,有效15位 以下兩個函數(shù)可以判斷要記錄數(shù)值值域範圍所需的kind值。一般雖無須使用,但若程式有需要在不同電腦系統(tǒng)間移植,由於可儲存位數(shù)的差異,若能依實際需要查詢該系統(tǒng)的kind值,可使程式維持正確性 SELECTED_INT_KIND(n) 傳回需要記錄 n 位整數(shù)時,所應(yīng)宣告的kind值 傳回 -1 時,表示無法提供該數(shù)值值域範圍 SELECTED_REAL_KIND(n,e) 傳回需要記錄 n 位有效位數(shù)、指數(shù)達到 e 位的浮點數(shù)所需kind值 傳回 -1 表示無法滿

22、足所要求有效位數(shù) 傳回 -2 表示無法滿足所要求指數(shù)範圍 傳回 -3 表示兩者都無法滿足 舉例:integer, parameter : short_int = SELECTED_INT_KIND(3)integer, parameter : long_real = SELECTED_REAL_KIND(9,30)integer(kind = short_int) : a = 172real(kind = long_real) : b = 1.23456789D25 變數(shù)宣告變數(shù)宣告 變數(shù)名稱命名原則注意: 名稱可使用英文字母a-z、底線_、數(shù)字0-9(首字需為英文字母) 變數(shù)名稱長度,F(xiàn)77

23、規(guī)定至少支援1-6個字元,F(xiàn)90支援1-31個字元 雖未規(guī)定,但建議不要與執(zhí)行指令相同(比如PRINT) 建議取有意義的英文單字,增加程式可讀性並減少出錯的機會 一般變數(shù)宣告請參閱:變數(shù)型態(tài) 注意內(nèi)定型態(tài)的影響: 變數(shù)不一定需經(jīng)過宣告才能使用,未經(jīng)過宣告之變數(shù),依變數(shù)第一個字母決定型態(tài) 未經(jīng)宣告下,第一個字母 i,j,k,l,m,n 的變數(shù)將被視為整數(shù)型態(tài),其他的則為浮點數(shù);但可透過IMPLICIT來改變此預(yù)設(shè)狀態(tài) 建議所有變數(shù)仍應(yīng)宣告,以瞭解記憶體使用情況並能降低人為錯誤發(fā)生 可配合IMPLICIT NONE指令限制所有變數(shù)需經(jīng)宣告才能使用,以降低人為錯誤發(fā)生,比如變數(shù) i 打成 j 可用p

24、arameter宣告變數(shù)為常數(shù),以減少錯誤並增加執(zhí)行速度 equivalence則是在特殊情況下可減少記憶體的浪費以及增加速度 宣告結(jié)構(gòu)注意: 宣告的位置要在可執(zhí)行敘述之前,在數(shù)值計算或是輸出入指令後就不能再宣告 DATA也是宣告的一部份,也只能放在執(zhí)行指令前 通常program後接著implicit,然後宣告變數(shù),最後是DATA nIMPLICIT未經(jīng)宣告變數(shù),編輯器會以其第一個字母決定型態(tài),此稱為內(nèi)定型態(tài)。 預(yù)設(shè)的狀況是,第一個字母 i,j,k,l,m,n 的變數(shù)將被視為整數(shù)型態(tài),其他的則為浮點數(shù)。 IMPLICIT可以用來改變與關(guān)閉內(nèi)定型態(tài)。 1. 使用方式: implicit inte

25、ger(A,B,C) ! A,B,C開頭變數(shù)視為整數(shù) implicit integer(A-D,X,Y) ! A-D,X,Y開頭變數(shù)視為整數(shù) implicit real(L-P) ! L-P開頭變數(shù)視為實數(shù) implicit none ! 關(guān)閉此項服務(wù),所有變數(shù)皆需經(jīng)過宣告 2. 一個程式單元可以有一個以上 IMPLICIT 敘述,但是所有 IMPLICIT 敘述必須在該程式單位所有其他宣告敘述之前才行。通常就是在program指令下一行。 3. 如果設(shè)定 IMPLICIT NONE,則所有使用者定義的名稱都必須宣告其型態(tài),未定義型態(tài)的名稱會產(chǎn)生編譯時期錯誤。也就是說,會強迫你宣告所使用到的每

26、一個變數(shù)名稱。強烈建議初學(xué)者使用,因為助教實在太常遇到同學(xué)把變數(shù)名稱給拼錯或是型態(tài)錯誤(比如i,j,k,l,m,n開頭的變數(shù)預(yù)設(shè)為整數(shù))。 4. 一個程式單元只能有一個 IMPLICIT NONE 敘述,也不能有其他的 IMPLICIT 敘述。n給定初值給定初值.DATA變數(shù)宣告後,可利用等號來給定初值,如: real pi pi = 3.14159 但若要給初值的變數(shù)很多,程式便顯得雜亂,請參考: 利用 DATA/./ 指令,依序給定變數(shù)初值 real a, b complex c character(10) string data a, b, c, string /1.0, 2.0, (3

27、.0,4.0), Hello/ 則依順序,a=1.0 ,b=2.0 ,c=(3.0,4.0) ,string = Hello 使用在陣列變數(shù)中,更顯其方便:real a(4) data a /1.0 , 2.0 , 3.0 , 4.0/ F90可以將宣告與初值寫在同一行程式碼中: real : pi = 3.14159 integer : count = 0 此時冒號不可省略 給定整數(shù)資料時,可以2、8、16進位方式 若要給定28(十進位),可採用: a = B11100 ! B 代表二進位 (Binary) - 0,1 a = O34 ! O 代表八進位 (Octal) - 0,1,2,3,

28、4,5,6,7 a = Z1C ! Z 代表十六進位 - 0,1,2,3,4,5,6,7,8,9,A,B,C,D,EnPARAMETERPARAMETER (pi=3.14159) 可將變數(shù)pi視為常數(shù)使用,通常目的在簡化程式碼、減少錯誤、方便修改以及增加可讀性 area = pi * radius*2 可讀性較 area = 3.14159 * radius*2 更好 若需將3.14159改為其他數(shù)字時,只需修改如:PARAMETER (pi=3.14) 1. 注意事項: 數(shù)值只能設(shè)定一次 在程式碼中不可去改變常數(shù)的內(nèi)容 2. 將PARAMETER (pi=3.14159)改為一般變數(shù)pi=

29、3.14159,程式仍可執(zhí)行,但設(shè)定為常數(shù)後: 若程式碼有修改該常數(shù)內(nèi)容時,編譯階段會有錯誤訊息 若變數(shù)內(nèi)容在執(zhí)行階段不會改變,改為常數(shù)將可增加執(zhí)行速度 3. F90中,變數(shù)與常數(shù)宣告可以寫入同一行: real, parameter : pi=3.14159 ! pi前的冒號不能省略 冒號在告訴編輯器,宣告型態(tài)與設(shè)定已經(jīng)完畢,冒號後開始給定變數(shù)名稱nEQUIVALENCE(等位宣告)(等位宣告)integer a,b equivalence (a,b) 則變數(shù) a,b 將使用同一個記憶體空間,只是有兩個名稱 1. 用途之一: 程式中的暫時變數(shù),有時程式需要一些暫時使用的資料變數(shù),通常設(shè)計師會宣

30、告一個temp變數(shù),但如此程式可讀性降低,但若每一個都各自宣告又浪費記憶體空間,此時可以利用equivalence,讓多個暫存變數(shù)使用同一記憶體空間。 比如: integer temp_count, temp_record equivalence (temp_count, temp_record) 需注意兩個暫存變數(shù)未被同時使用,否則產(chǎn)生錯誤 2. 用途之二: 在陣列資料中,如某一位置經(jīng)常被使用,則可以利用equivalence提昇效率。 比如: equivalence (array(2,3,4), a) 程式中需使用 array(2,3,4) 的地方改以 a 代替,除了精簡版面,系統(tǒng)在陣列的

31、處理上需從陣列起始位置換算array(2,3,4)的記憶體位置,而 a 則可以直接獲得,可提昇效率流程控制與邏輯運算流程控制與邏輯運算nThe Logical IF StatementIF (logical expression) statementnThe Arithmetic IF StatementIF (arithmetic expression) num1,num2,num3 expression 0 then goto num3 nThe IF-ENDIF StatementIF () THEN . . (statement group) . ENDIF .nThe ELSE St

32、atementThe IF-ENDIF Statement IF () THEN . . (statement group 1) . ENDIF IF () THEN . . (statement group 2) . ENDIFThe ELSE Statement IF () THEN . . statement to be executed if is .TRUE. . ELSE . . statement to be executed if is .FALSE. . ENDIFnThe ELSE-IF StatementIF () THEN . . (statement group 1)

33、 . ELSEIF () THEN . . (statement group 2) . ELSEIF () THEN . . (statement group 3) . ELSEIF () THEN . . (statement group n) . ELSE . . (all false statement group) . ENDIFnNesting IF-ENDIF StructuresIF () THEN . . IF () THEN . . ENDIF . . ENDIFnLogical ExpressionnLOGICAL TypeThe s are logical express

34、ions, which can only have values .TRUE. and .FALSE. nLogical expressionsnRelational expressions (comparisons) nLogical variable n.NOT. logical expressions (logical complement) nLogical expressions .AND. Logical expressions (logical conjunction) nLogical expressions .OR. Logical expressions (logical

35、disjunction) nLogical expressions .EQV. Logical expressions (logical equivalence) nLogical expressions .NEQV. Logical expressions (logical differ) nRelational expressions compare two numeric or character quantities, and have the following form: quantity quantity nRelational operator (quantity quanti

36、ty)F77使用縮寫F90可用符號代表意義.EQ.= equal to.NE./= not equal to.LT. greater than.LE.= greater than or equal tonLogical operatorsAB.NOT. AA .AND. BA .OR. BA .EQV. BA .NEQV. BTrueTrueFalseTrueTrueTrueFalseTrueFalseFalseFalseTrueFalseTrueFalseTrueTrueFalseTrueFalseTrueFalseFalseTrueFalseFalseTrueFalsen浮點數(shù)與字元的邏輯

37、運算浮點數(shù)與字元的邏輯運算n浮點數(shù) Example:na = (3.*0.5)* 2b = 3.- b - a 不會等於 0.0 ,(b-a .EQ. 0.0) is .FALSE. n理論上 b - a 應(yīng)等於 0.0 ,但受計算浮點數(shù) a 時有效位數(shù)的影響,(3.*0.5)即產(chǎn)生誤差,再平方後只是接近 3. 的數(shù)字但並不等於 3. ,所以 (b-a .EQ. 0) 邏輯值為 .FALSE. n將 a 值做螢?zāi)惠敵?,得?a = 0.0?可能是輸出格式的限制,所見為近似值(如已四捨五入) n一般會採絕對或相對誤差來判斷,如if (abs(b-a) .LE. 0.000001) then .

38、或if (abs(b-a)/b .LE. 0.000001) then . 註:abs函數(shù)可以傳回絕對值 n上例中,若改為 a = (4.*0.5)* 4 - 3. ,因 (4.*0.5) 得到 2. 沒有有效位數(shù)不足的問題,所以 b - a 值會等於 0.0 n字元的比較:n字元可以比較大小,依其ASCII編碼順序a b , ascii(a)=97,ascii(b)=98A a , ascii(A)=65,ascii(a)=97 ! ascii非內(nèi)建函數(shù),只是為了表達方便,請參考ichar n字串比較時,則依字母順序一一比較下來abcd axyznSELECT CASEF90新增,但幾乎所有

39、F77編譯器都有支援SELECT CASE (variable) CASE (value-1) . . (statement group 1) . CASE (value-2) . . (statement group 2) . CASE (value-3) . . (statement group 3) . CASE DEFAULT . . (all false statement group) . END SELECTn補充說明:ncase default 區(qū)段非必要 nCASE(value) 中,(value)可用(value1:value2),如 1:5 表示當(dāng) 1變數(shù)5 時執(zhí)行該區(qū)段

40、 n可取代IF-ELSE IF,但只接受整數(shù)、字元、邏輯變數(shù),不能使用浮點數(shù)和複數(shù) nCASE中的數(shù)值,必須是常數(shù) nGOTO在F77以前做為流程與迴圈控制,但由於容易造成程式結(jié)構(gòu)混亂、降低可讀性、並產(chǎn)生錯誤,所以不建議使用。Example 1: (IF-ELSE) if (a .GE. 60) then goto 100 print *, pass! goto 200100 print *, 200 stopExample 2: (LOOP) sum = 0 count = 1100 if (count .GT. 10) then goto 200 sum = sum + count cou

41、nt = count + 1 goto 100200 print *, sum stopnPAUSE.CONTINUE.STOPnPAUSE程式執(zhí)行至此,會暫停,並等待使用者按下 ENTER 鍵後繼續(xù),在有大量資料作螢?zāi)惠敵鰰r使用 nCONTINUE表示繼續(xù)往下執(zhí)行,而就算沒有這行,也會繼續(xù)啊.在F77中,通常只是為了方便閱讀程式碼,比如與GOTO配合做迴圈使用時 nSTOP結(jié)束程式執(zhí)行,比如在 IF 中,當(dāng)某條件成立或不成立,程式就必須中斷使用此指令要小心,以免反致程式結(jié)構(gòu)混亂,不該終止被終止 迴圈迴圈nThe CONTINUE and GOTO statementsn由於 GOTO 的使用

42、不當(dāng)將造成程式結(jié)構(gòu)混亂,且其閱讀性差,從 Fortran 77 開始,已經(jīng)不建議使用 GOTO ,而利用 DO 指令。 n利用GOTO強制程式回到特定指令行,形成迴圈: . statement preceding loop . CONTINUE . loop body . GOTO . statement following loop . nloop body 需加入迴圈終止判斷,Conditional termination of loop execution nIF GOTO nIF THEN . statement to be executed just prior . to leavi

43、ng the loop at this point. GOTO ENDIF nIndexed Looping = * . top of indexed loop . 100 CONTINUE IF ( .GT. GOTO 199 . . loop statement . = + GOTO 100 * . bottom of indexed loop . 199 CONTINUEnDO statements (Indexed Looping)Fortran 77語法: DO = , . . loop statement . CONTINUE 1. 第一次執(zhí)行DO指令, = 2. 每執(zhí)行一次迴圈l

44、oop statement,就會加上 但迴圈中不可透過其他程式碼改變 數(shù)值,編譯時將發(fā)生錯誤 DO 100 count = 1,10 ! 行號 100 表示迴圈程式碼結(jié)束位置 i = i + 1 ! 改變計數(shù)器的值,編譯時將產(chǎn)生錯誤訊息 100 CONTINUE 3. 當(dāng) ,繼續(xù)重複迴圈 , 迴圈結(jié)束後, 一定大於 4. , 可以使用常數(shù)或變數(shù) 但需注意的是,變數(shù)僅在進入迴圈時被讀取一次,迴圈中改變不影響迴圈 執(zhí)行狀況 program test integer start , end , inc , i start = 1 end = 10 inc = 1 do i = start, end,

45、 inc ! 用enddo做迴圈程式碼結(jié)束位置,F(xiàn)90標準,77多支援 start = 3 end = end - 1 inc = -2 print *, i , end ! 可觀察到變數(shù)內(nèi)容的改變不影響 i 從 1 累加到 10 enddo print *, i end5. 可以是負數(shù),EX:DO i = 10, 1, -1 6. 若未提供,預(yù)設(shè)為 1 EX: 如要計算 2+4+6+8+10+12 ,標準的: ans = 0 ! 給定初值,變數(shù)宣告後初值不一定會是 0 DO 100 count = 2,12,2 ! 行號 100 表示迴圈程式碼結(jié)束位置 100 ans = ans + cou

46、nt CONTINUE指令沒有實際的用途,利用其做為程式碼的包裝,方便閱讀: ans = 0 ! 給定初值,變數(shù)宣告後初值不一定會是 0 DO 100 count = 2,12,2 ans = ans + count 100 CONTINUE ! 迴圈結(jié)束後, count = 14Fortran 90語法:(不需label,使用 enddo 做為結(jié)束,多數(shù)F77已支援) do = , . . loop statement . end do 以上例而言 ans = 0 ! 給定初值,變數(shù)宣告後初值不一定會是 0 do count = 2,12,2 ans = ans + count end do

47、 ! 迴圈結(jié)束後, count = 14 Nested Loops: A loop body may itself contain a loop, and such nesting may be arbitrarily deep. do i = 1, 5 do j = 1, 3 print *, a(i,j) ! 共執(zhí)行 15 次 print 指令 (5*3) end do end donDO WHILEdo while (logical expression) ! 邏輯運算成立時,執(zhí)行迴圈內(nèi)容 . . end do DO 迴圈用在可事先知道或控制迴圈執(zhí)行次數(shù),DO WHILE 迴圈則是不能預(yù)

48、知執(zhí)行次數(shù)時,比如猜數(shù)字程式。nCYCLE, EXITCYCLE、 EXIT 為 Fortran 90新增,但多數(shù) 77 的編譯器可用 CYCLE 指令可以略過程式區(qū)塊中,CYCLE 指令後面的所有所有程式碼,直接跳下一次迴圈執(zhí)行。 EX:對某些較小的資料量採取忽略的動作 do while (.true.) print *, Speed = ? (must 99) read *, speed if (speed .LT. 100) cycle ! 當(dāng)speed小於100時,重新開始迴圈 . end do EXIT 可以直接結(jié)束迴圈執(zhí)行。 EX:做數(shù)字總和,有一千筆資料,但若資料為0表示資料已結(jié)

49、束,可利用 EXIT 提早結(jié)束迴圈。 do i = 1, 1000 sum = sum + a(i) if (a(i) .EQ. 0) exit ! 當(dāng)條件成立,提前結(jié)束陣列 enddon迴圈命名迴圈命名迴圈經(jīng)過命名後,配合end do、cycle、exit的使用,可加強程式可讀性以減少出錯,並能使結(jié)構(gòu)更具彈性。 命名方法: : do . 配合使用:在 end do、cycle、exit 後面加上 EX: outer: do i = 1, 10 ! 將第一層迴圈命名為 outer inner: do j = 1, 10 ! 將第二層迴圈命名為 inner . if (i = 3) exit o

50、uter ! 當(dāng)i=3,直接跳離外部迴圈,進行 i=4 迴圈 if (j = 5) cycle inner ! 當(dāng)j=5,忽略內(nèi)部迴圈剩下的程式區(qū)塊 . enddo inner enddo outer陣列陣列n一維陣列一維陣列宣告方式: () data type可用integer、real、complex、logical也可用自訂型態(tài)type 產(chǎn)生 size 組記憶體位置,size 必須是常數(shù),EX: integer parameter : count = 10 real a(10), b(count) ! a, b均為包含10個實數(shù)的陣列 各種宣告方式: integer a(10) ! 最簡

51、單的方法 integer, dimension(10) : a ! F90 另一種寫法 INTEGER a ! F77 的作法,先宣告型態(tài),配合下行 DIMENSION a(10) ! 再宣告 a 的容量大小 叫用方法:() integer a(10) read *, a(2) ! 從鍵盤輸入數(shù)值,置入 a 陣列中第二組記憶體位置 print *, a(2) ! 將 a 陣列中第二組記憶體位置內(nèi)容印出n宣告指定索引值宣告指定索引值宣告方式: (:) integer a(0:10) real b(-100:100) 基本的陣列宣告,如 real a(10) 則 a(n) 代表陣列 a 中第 n

52、組記憶體位置內(nèi)容,但經(jīng)常為了可讀性問題,如數(shù)列 a0,a1,a2,a3,.,a9 ,共十個元素,若宣告為 a(10),則 a(1) = a0 a(2) = a1 在使用上會造成混淆,所以在宣告陣列時可以利用 a(0:10) ,則 a(0) = a0 a(1) = a1 不會造成混淆,此時,a(0)代表陣列 a 中第 1 組記憶體位置內(nèi)容,a(n)代表陣列 a 中第 n+1 組記憶體位置內(nèi)容。 即,宣告 a(i:j),則 a(i+n) 代表第 n+1 個記憶體位置內(nèi)容。n二維陣列二維陣列宣告方式: () integer a(3,4) real b(0:5,10) 舉例:使用 C(10,4) 記錄

53、班級十位同學(xué),四個科目分數(shù)如下表:座號國文英文數(shù)學(xué)歷史180857580290858090375809085.資料可對應(yīng)如下:座號國文英文數(shù)學(xué)歷史1C(1,1)C(1,2)C(1,3)C(1,4)2C(2,1)C(2,2)C(2,3)C(2,4)3C(3,1)C(3,2)C(3,3)C(3,4).所以座號 2 同學(xué)的數(shù)學(xué)分數(shù),就是 C(2,3) 各種宣告方式: integer a(10,10) ! 最簡單的方法 integer, dimension(10,10) : a ! F90 另一種寫法 INTEGER a ! F77 的作法,先宣告型態(tài),配合下行 DIMENSION a(10,10)

54、! 再宣告 a 的容量大小n多維陣列多維陣列宣告方式: (),最多到七維陣列 integer a(3,4,5) read *, a(2,2,3) print *, a(2,2,3)n記憶體配置記憶體配置DIMENSION A(5), B(0:4), C(3,4), E(12)A:A(1)A(2)A(3)A(4)A(5)B:B(0)B(1)B(2)B(3)B(4)C:C(1,1)C(1,2)C(1,3)C(1,4)C(2,1)C(2,2)C(2,3)C(2,4)C(3,1)C(3,2)C(3,3)C(3,4) equivalence C,EC:E:C(1,1) C(2,1) C(3,1) C(1

55、,2) C(2,2) C(3,2) C(1,3) C(2,3) C(3,3) C(1,4) C(2,4) C(3,4)E(1)E(2)E(3)E(4)E(5)E(6)E(7)E(8)E(9)E(10)E(11)E(12)Columnwise storage of data: addr(a(i,j) = addr(a(1,1)+(j-i)*lda +(i-1) lda is the Leading Dimension of A效率注意,一起使用的資料,放在同一Column:資料不連續(xù),效率差資料連續(xù),效率好do i = 1, 5 sum = sum + a(1,i)enddodo i = 1,

56、5 sum = sum + a(i,1)enddo另外,多維陣列在處理記憶體位置較耗時,使用時須注意。n大小限制大小限制以 Compaq Visual Fortran 6.5 為例,整個程式使用記憶體大小以 256MB 為上限。參考錯誤訊息如下:-Linker Tools Warning LNK4084total image size size exceeds max (256MB); image may not runThe application exceeds the limit of 256 megabytes. -n設(shè)定初值設(shè)定初值.DATA.隱藏式迴圈隱藏式迴圈和一般變數(shù)相同,同樣

57、可以利用DATA來給定初值 integer A(5) data A/1,2,3,4,5/ ! A(1)=1,A(2)=2,A(3)=3,A(4)=4,A(5)=5 data A/5*3/ ! /5*3/表示有5個3,等於/3,3,3,3,3/ ! A(1)=3,A(2)=3,A(3)=3,A(4)=3,A(5)=3 data (A(i),i=2,4) /2,3,4/ ! 使用隱藏式迴圈,只設(shè)定A(i), i=2,3,4 ! A(2)=2,A(3)=3,A(4)=4, A(1)及A(5)未設(shè)定 integer B(2,3) data ( (B(i,j),i=1,2) , j=1,3 ) /1,2

58、,3,4,5,6/ ! 巢狀隱藏式迴圈,B(1,1)=1, B(2,1)=2, B(1,2)=3, B(2,2)=4, B(1,3)=5 ,B(2,3)=6 Fortran 90新增:(省去DATA) integer : a(5) = (/1,2,3,4,5/) ! 直接宣告並給初值,但必須5個元素都給 ! A(1)=1,A(2)=2,A(3)=3,A(4)=4,A(5)=5 integer : a(5) = (/1,(2,i=2,4),5/) ! 結(jié)合隱藏式迴圈 ! A(1)=1,A(2)=2,A(3)=2,A(4)=2,A(5)=5 integer : a(5) = (/(i,i=1,5)

59、/) ! A(i)=i, i=15nALLOCATABLE - Fortran 90新增新增 一般在宣告陣列時必須指定大小,但有些問題在執(zhí)行階段才知道需要多大的陣列,這時經(jīng)常的解決辦法就是宣告一個足夠大的陣列,並告知使用者操作限制,如: integer student(100), stu_count print *,輸入學(xué)生人數(shù)(MAX:100) read *, stu_count do i = 1, stu_count print *, 請輸入第,i,位同學(xué)成績 read *, student(i) end do .Fortran 90則可以透過ALLOCATABLE來解決這個問題: int

60、eger, allocatable : student(:) ! 宣告一個可變大小的一維陣列 integer : stu_count print *,輸入學(xué)生人數(shù): read *, stu_count allocate( student(stu_count) ) ! 配置stu_count個記憶體空間 do i = 1, stu_count print *, 請輸入第,i,位同學(xué)成績 read *, student(i) end do .n宣告注意:這裡需要 allocatable 和 allocate 兩個指令的配合,allocatable配合陣列宣告時使用,但陣列大小以:代替即可;當(dāng)知道所

61、需陣列大小時,再以 allocate 配置記憶體空間大小。 n配置是否成功:由於記憶體是有限的,不一定每次都會配置成功,如何得知是否配置成功?可寫成 allocate( student(stu_count), stat=error ) ,error是宣告好的整數(shù)變數(shù),若成功,error傳為 0 ,其他數(shù)值表示失敗。 n解除配置空間:當(dāng)該空間使用完畢,也可以透過 deallocate 指令來釋放配置空間: 如:deallocate( student ) 完整的語法如下: DEALLOCATE ( object , object ., STAT=sv ) object:Is a structure

62、 component or the name of a variable, and must be a pointer or allocatable array. sv:Is a scalar integer variable in which the status of the deallocation is stored. n多維陣列:integer, allocatable : stu_2(:,:) ! 兩個冒號代表二維陣列integer, allocatable : stu_3(:,:,:) ! 三個冒號代表三維陣列allocate( stu_2(3,3) )allocate( stu

63、_2(4,4,4) ) n指定索引座標範圍:integer, allocatable : stu_1(:)integer, allocatable : stu_2(:,:) ! 兩個冒號代表二維陣列allocate( stu_1(-3:3) )allocate( stu_2(-3:3,0:5) ) n相關(guān)函數(shù):allocated 可傳回陣列是否已經(jīng)配置記憶體nALLOCATED檢查一可變大小的矩陣是否已經(jīng)配置記憶體,函數(shù)會傳回一個邏輯值。如: if ( .not. allocated(a) ) then allocate( a(5) ) end if 上例中,檢查陣列 a 是否已經(jīng)配置,若無,

64、則配置 5 個記憶體空間。 相關(guān)指令請參考:allocatable函式函式函式是Subroutine(副程式)與Function(自訂函數(shù))的統(tǒng)稱。 迴圈可以讓程式在相同的地方重複執(zhí)行某一段程式碼,函式則可以在不同的地方被重複使用,二者的應(yīng)用範圍不同。 撰寫程式時,當(dāng)某一段具備特定功能的程式碼被重複撰寫時,可以將之包裝成函式,在使用時叫用該段函式(比如使用CALL指令呼叫副程式),如此可使得程式撰寫更有效率,可讀性也增加許多。nSubroutine(副程式)(副程式)舉例如下: ! 使用者輸入兩個數(shù)字,傳入swap函式做交換後輸出 ! 本例可用DO迴圈,但利用函式,在程式其他部分也可以呼叫函式

65、功能 program Swap_2_Real do while (.true) read *, value1, value2 ! 使用這從鍵盤輸入兩數(shù)字 if (value1 .eq. value2) stop ! 若輸入兩數(shù)字相同,則停止程式 call swap(value1, value2) ! 呼叫 swap函式,做兩數(shù)交換 print *, value1, value2 ! 將交換之兩數(shù)印出 end do stop end! 交換兩數(shù)的函式 - swap subroutine swap(a, b) real a, b real temp temp = a ! 將 a 值先做保留 a =

66、 b ! 將 b 的值置入 a 記憶體位置中 b = temp ! 將剛剛保留下的 a 值置入 b 記憶體位置中 return ! 返回呼叫程式 end 語法: Calling programs (main program, subroutines) CALL () - Called programs (subroutines, intrinsic functions) SUBROUTINE () END SUBROUTINE (Fortran 77只用END) - Note:Arguments are passed by reference: that is, their addresses are passed.注意事項: 副程式的命名應(yīng)有意義並且不隨意變更,因為副程式可能提供多個程式呼叫使用,甚至由團隊中不同人員叫用;修正時,需修改原程式叫用部分並更新相關(guān)文件。 原始檔中,未規(guī)定主程式program與副程式subroutine先後順序;但編譯後執(zhí)行,主程式會被自動執(zhí)行,副程式則是被動需被叫用才執(zhí)行。 要返回主程式使用return指令,return可放在副程式中任意位置;使用sto

展開閱讀全文
溫馨提示:
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)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔

相關(guān)搜索

關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!