Fortran基礎(chǔ).ppt_第1頁
Fortran基礎(chǔ).ppt_第2頁
Fortran基礎(chǔ).ppt_第3頁
Fortran基礎(chǔ).ppt_第4頁
Fortran基礎(chǔ).ppt_第5頁
已閱讀5頁,還剩86頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

2、、自由格式寫作 1997:國際標(biāo)準(zhǔn)組織 ISO 公布 Fortran 95 標(biāo)準(zhǔn) 加強(qiáng)平行運(yùn)算 Fortran 200 x,書面格式,Fixed Format是舊式的寫法,有較多的限制, Fixed Format副檔名用 *.F 或 *.FOR 。 Free Format則是Fortran 90以後新增的作法,以副檔名做為區(qū)隔,F(xiàn)ree Format使用 *.F90。,Fixed Format(固定格式) 字元位置意義: 第 1 字元:如果是字母 C 或 c 或是星號 *,本行視為註解 第 1-5 字元:空白,或是一組數(shù)字為本行程式的代號 第 6 字元:放上 0 以外的字元,表示為接續(xù)上一行程

3、式碼 第 7-72 字元:程式碼寫作區(qū)域 第 73 字元以後:不使用,編輯器會(huì)忽略,有些則發(fā)出錯(cuò)誤訊息 程式碼之間多餘的空格不具意義,僅作分隔與方便閱讀 配合打孔卡片所發(fā)展,F(xiàn)ortran 90之後可採用Free Format,例如: 1:C FIXED FORMAT 2: PROGRAM FIXED 3: READ (*,10) A,B 4: 10 FORMAT (F5.1,F5.1) 5: SUM = A + B 6: WRITE (*,20) 7: +SUM 8: 20 FORMAT (1X,F6.1) 9: END,Free Format(自由格式) Fortran 90 開始使用,附

4、加檔名為 *.F90 不再規(guī)定第幾字元有何特定用途 驚嘆號!後都是註解 每行可以寫作 132 字元 如有行號放在每行最前面 程式連接符號改為 image may not runThe application exceeds the limit of 256 megabytes. -,設(shè)定初值.DATA.隱藏式迴圈,和一般變數(shù)相同,同樣可以利用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個(gè)3,等於/3,3,3,3,3/ ! A(1)=3,A

5、(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,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/)

6、! 直接宣告並給初值,但必須5個(gè)元素都給 ! 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)/) ! A(i)=i, i=15,ALLOCATABLE - Fortran 90新增,一般在宣告陣列時(shí)必須指定大小,但有些問題在執(zhí)行階段才知道需要多大的陣列,這時(shí)經(jīng)常的解決辦法就是宣告一個(gè)足夠大的陣列,並告知使用者操作限制,如: integer student

7、(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來解決這個(gè)問題: integer, allocatable : student(:) ! 宣告一個(gè)可變大小的一維陣列 integer : stu_count print *,輸入學(xué)生人數(shù): read *, stu_count allocate( student(stu_count) ) !

8、 配置stu_count個(gè)記憶體空間 do i = 1, stu_count print *, 請輸入第,i,位同學(xué)成績 read *, student(i) end do .,宣告注意: 這裡需要 allocatable 和 allocate 兩個(gè)指令的配合,allocatable配合陣列宣告時(shí)使用,但陣列大小以:代替即可;當(dāng)知道所需陣列大小時(shí),再以 allocate 配置記憶體空間大小。 配置是否成功: 由於記憶體是有限的,不一定每次都會(huì)配置成功,如何得知是否配置成功?可寫成 allocate( student(stu_count), stat=error ) ,error是宣告好的整數(shù)變

9、數(shù),若成功,error傳為 0 ,其他數(shù)值表示失敗。 解除配置空間: 當(dāng)該空間使用完畢,也可以透過 deallocate 指令來釋放配置空間: 如:deallocate( student ) 完整的語法如下: DEALLOCATE ( object , object ., STAT=sv ) object:Is a structure component or the name of a variable, and must be a pointer or allocatable array. sv:Is a scalar integer variable in which the statu

10、s of the deallocation is stored.,多維陣列: integer, allocatable : stu_2(:,:) ! 兩個(gè)冒號代表二維陣列 integer, allocatable : stu_3(:,:,:) ! 三個(gè)冒號代表三維陣列 allocate( stu_2(3,3) ) allocate( stu_2(4,4,4) ) 指定索引座標(biāo)範(fàn)圍: integer, allocatable : stu_1(:) integer, allocatable : stu_2(:,:) ! 兩個(gè)冒號代表二維陣列 allocate( stu_1(-3:3) ) allo

11、cate( stu_2(-3:3,0:5) ) 相關(guān)函數(shù): allocated 可傳回陣列是否已經(jīng)配置記憶體,ALLOCATED,檢查一可變大小的矩陣是否已經(jīng)配置記憶體,函數(shù)會(huì)傳回一個(gè)邏輯值。如: if ( .not. allocated(a) ) then allocate( a(5) ) end if 上例中,檢查陣列 a 是否已經(jīng)配置,若無,則配置 5 個(gè)記憶體空間。 相關(guān)指令請參考:allocatable,函式,函式是Subroutine(副程式)與Function(自訂函數(shù))的統(tǒng)稱。 迴圈可以讓程式在相同的地方重複執(zhí)行某一段程式碼,函式則可以在不同的地方被重複使用,二者的應(yīng)用範(fàn)圍不同

12、。 撰寫程式時(shí),當(dāng)某一段具備特定功能的程式碼被重複撰寫時(shí),可以將之包裝成函式,在使用時(shí)叫用該段函式(比如使用CALL指令呼叫副程式),如此可使得程式撰寫更有效率,可讀性也增加許多。,Subroutine(副程式),舉例如下: ! 使用者輸入兩個(gè)數(shù)字,傳入swap函式做交換後輸出 ! 本例可用DO迴圈,但利用函式,在程式其他部分也可以呼叫函式功能 program Swap_2_Real do while (.true) read *, value1, value2 ! 使用這從鍵盤輸入兩數(shù)字 if (value1 .eq. value2) stop ! 若輸入兩數(shù)字相同,則停止程式 call s

13、wap(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 = b ! 將 b 的值置入 a 記憶體位置中 b = temp ! 將剛剛保留下的 a 值置入 b 記憶體位置中 return ! 返回呼叫程式 end,語法: Calling programs (main program, subroutines) CA

14、LL () - Called programs (subroutines, intrinsic functions) SUBROUTINE () END SUBROUTINE (Fortran 77只用END) - Note:Arguments are passed by reference: that is, their addresses are passed.,注意事項(xiàng): 副程式的命名應(yīng)有意義並且不隨意變更,因?yàn)楦背淌娇赡芴峁┒鄠€(gè)程式呼叫使用,甚至由團(tuán)隊(duì)中不同人員叫用;修正時(shí),需修改原程式叫用部分並更新相關(guān)文件。 原始檔中,未規(guī)定主程式program與副程式subroutine先後順序;

15、但編譯後執(zhí)行,主程式會(huì)被自動(dòng)執(zhí)行,副程式則是被動(dòng)需被叫用才執(zhí)行。 要返回主程式使用return指令,return可放在副程式中任意位置;使用stop會(huì)使主程式也停止。 呼叫端可以是主程式,也可以是副程式。 Fortran 90 進(jìn)一步支援副程式自己呼叫自己,稱為遞迴。 副程式除傳遞進(jìn)入的變數(shù)外,可以獨(dú)立宣告屬於自己的變數(shù),既使變數(shù)名稱與主程式相同亦可。 副程式傳遞變數(shù)採用傳址呼叫(call by address / call by reference),即傳遞記憶體位置,前例中,value1 和 a 指著相同的記憶體位置。 註:另一種稱傳值呼叫,在副程式中傳遞變數(shù)也會(huì)有獨(dú)立的記憶體位置,改變內(nèi)

16、容不影響呼叫端的變數(shù)內(nèi)容。,Function(自訂函數(shù)),舉例如下: ! 使用者輸入數(shù)字 x,計(jì)算 x2 - 2x + 1 值 program func_test real x, y do while (.ture.) ! 設(shè)定為無窮迴圈 read *, x ! 使用者輸入 x y = f(x) ! 呼叫 f 函數(shù)計(jì)算 x2 - 2x + 1 print *, y ! y = f(x)、print *, y 兩行可合併為 print *,f(x) end do end - real function f(x) ! 宣告函數(shù) f 傳回的型態(tài)為real real x f = x*2 2*x + 1

17、 return end,語法: Calling programs (main program, subroutines) () - Called programs (functions) FUNCTION () END FUNCTION (Fortran 77只用END) - Passed by address: if an actual argument is a variable name, array name, array element or a substring Passed by value: if the actual argument is any other expres

18、sion (including a constant),注意事項(xiàng): 函數(shù)型態(tài)的宣告可以寫在函數(shù)的最開頭,如 real function f(x)或是放在變數(shù)宣告區(qū)塊,如 function f(x) real f, x 呼叫端可將函數(shù)名稱做 EXTERNAL 宣告,表示該名稱不是變數(shù),而是函數(shù)名稱。當(dāng)函數(shù)名稱做為變數(shù)傳遞時(shí),不可省略。 叫用時(shí)不需使用 CALL 指令,直接寫出名稱即可,如 print *, f(x) a = f(1.0) + f(2.0) b = f( f(1.0) ) 傳遞變數(shù)若非運(yùn)算式或常數(shù),則採傳址呼叫,但在function中,一般不會(huì)去改變該變數(shù)的內(nèi)容,這是一個(gè)不成文的習(xí)

19、慣。若要改變傳入變數(shù)的內(nèi)容,請改用subroutine。,Statement Function,若函數(shù)只包含一個(gè)運(yùn)算式,又只在同一個(gè)主程式或函式中被使用,可以使用 statement function 的寫法,在 Function 中的例子變成: program func_test real x, f f(x) = x*2 2*x + 1 ! 直接定義函數(shù) do while (.ture) read *, x ! 使用者輸入 x print *, f(x) ! 呼叫 f 函數(shù)計(jì)算 x2 - 2x + 1,並輸出 end do end,語法: ()= 注意事項(xiàng): 上例中 real x, f f(

20、x) = x*2 2*x + 1 叫用時(shí)不一定只能使用 f(x),可以是其他變數(shù)、常數(shù)或是運(yùn)算式,如 print *, f(a) , f(1.0) , f(a+2.0) , f(f(a),COMMON(全域變數(shù)),不同的函式間,除了透過參數(shù)的傳遞來共享記憶體外,還可以經(jīng)由全域變數(shù)讓不同的函式中變數(shù),使用相同的記憶體位置。請先看一個(gè)簡單的範(fàn)例如下: program common_ex integer a, b common a, b a = 99 b = 100 call ShowCommon() end subroutine ShowCommon() integer num1, num2 co

21、mmon num1, num2 print *, num1, num2 return end,執(zhí)行結(jié)果輸出所得為99,100 其變數(shù)參照方式是以位置對應(yīng),上例中,主程式端宣告為全域變數(shù)第一個(gè)為 a ,第二個(gè)是 b ;而副程式 ShowCommon 中第一個(gè)是 num1 ,第二個(gè)是 num2 ;所以 num1 會(huì)指到同為第一個(gè)變數(shù) a 的記憶體位置,num2 則會(huì)指到同為第二個(gè)變數(shù) b 的記憶體位置。,利用位置對應(yīng)的小技巧:(也讓你更清楚什麼是位置對應(yīng)的關(guān)係) 主程式:common a,b integer a,b 副程式:common num integer num(2) ! 則num(1)對應(yīng)

22、到主程式的 a ,num(2)對應(yīng)到主程式的 b,分組宣告: 由於是按位置對應(yīng),在全域變數(shù)多時(shí),宣告將成為困擾,假設(shè)共有十個(gè)全域變數(shù),但副程式只需要最後兩個(gè),仍要全部宣告: 主程式program_main:common a,b,c,d,e,f,g,h,i,j 副程式subroutine_1:common p,q,r,s,t ! 只用前個(gè)變數(shù),故宣告?zhèn)€即可 副程式subroutine_2:common p,q,r,s,t,u,v,w,x,y ! 只用到最後兩個(gè),但需全部宣告 既使副程式subroutine_2只用到主程式中i,j兩變數(shù),但由於全域變數(shù)是以宣告順序來對應(yīng),所以在副程式中,仍須宣告十

23、個(gè)全域變數(shù),如此才能對應(yīng)到我們要的第八和第九個(gè)變數(shù)i.j。 要解決這個(gè)問題,讓程式碼更簡明,可以用以下的方法將全域變數(shù)分組 主程式: common /group1/ a, b common /group2/ c, d 副程式-1: common /group1/ num1. num2 ! 分別對應(yīng)到主程式的 a, b 副程式-2: common /group2/ num1. num2 ! 分別對應(yīng)到主程式的 c, d,注意事項(xiàng): 宣告成 COMMON 的變數(shù),不能使用 DATA 來給定初值。 全域變數(shù)和傳遞參數(shù)一樣都可以讓不同的程序使用相同的變數(shù)內(nèi)容,使用時(shí)機(jī)有何不同呢?一般來說,若有許多不同

24、的程序都會(huì)使用到相同的記憶體區(qū)塊,便可以考慮宣告成全域變數(shù)。 全域變數(shù)不能宣告為常數(shù)。 全域變數(shù)宣告型態(tài)需一致,否則將造成讀取資料的錯(cuò)誤:(全域變數(shù)只是使用相同的記憶體區(qū)塊起始位置,至於區(qū)塊大小以及解碼方式,按宣告型態(tài)而定) 主程式:common a real a a = 1.0 副程式:common num integer num ! 則num對應(yīng)到主程式的 a ! 但 a 為浮點(diǎn)數(shù),num 為整數(shù) print *, num ! 輸出為 1065353216 上例來說,主程式 a = 1.0 ,浮點(diǎn)數(shù)表示法將記錄為 00111111100000000000000000000000,但 num

25、 為整數(shù),只讀取 2 位元組,且用一般二進(jìn)位補(bǔ)數(shù)表示法解讀,所得為 1065353216。 若num宣告為短整數(shù)(2位元組),又會(huì)有不同的結(jié)果。,BLOCK DATA,上前一段 DATA 的範(fàn)例中,若要使用 DATA 給定初值,需使用 BLOCK DATA 敘述。我們稍微修改範(fàn)例如下: program common_ex integer a, b, c, d common a, b ! 放在不具名的全域變數(shù)空間中 common /group1/ c, d ! 放在分組名稱為 group1 的全域變數(shù)空間中 print *, a, b, c, d end,block data implicit

26、none integer a, b common a, b data a, b /99, 100/ integer c, d common /group1/ c, d data c, d /101, 102/ end data block 執(zhí)行結(jié)果為: 99 100 101 102 注意事項(xiàng): BLOCK DATA 類似副程式,但是不需要被別人呼叫。 在主程式執(zhí)行前就會(huì)生效,意即主程式執(zhí)行前,初值已寫入記憶體區(qū)塊中。 該段程式碼只放置與宣告有關(guān)的敘述,不可有設(shè)定初值以外的指令出現(xiàn)。 全域變數(shù)不能宣告為常數(shù),故不能出現(xiàn) PARAMETER 。,傳址呼叫問題與技巧,字串傳遞問題: 副程式中需要宣告

27、不定長度的字串(即字串長度由父程序中決定) function test(a,b,c) character*(*) a ! F77語法 character(*) b ! F90語法 character(len=*) c ! F90語法 . end function,檔案處理,在檔案處理中,如果處理的檔案都是循序檔(sequential files),即檔案中每一記錄 都是循序?qū)懭氲模?而且也必須循序讀出。表示要在循序檔中讀出一特定記錄, 之前所有記錄必須先讀出。另一種檔案稱為直接接達(dá)檔(direct-access files),檔案中每一記錄可以直接讀寫, 通常是經(jīng)由記錄號碼。直接接達(dá)檔中所有記

28、錄, 其長度必須相同, 而且不能更動(dòng)。循序檔中的記錄長度可以變動(dòng)。 檔案也可分成有格式和無格式兩種。目前提及的檔案都是有格式的。有格式的檔案中記錄所含資訊是用外顯字元的形式表示,而無格式的檔案中記錄則是用 二進(jìn)形式表示。因此無格式的檔案中記錄的確實(shí)形式, 隨機(jī)器而有所不同。,OPEN, CLOSE, 和 INQUIRE 敘述 開檔 在使用檔案輸入或輸出之前,檔案必須先標(biāo)明所用的單位規(guī)定式號碼。 OPEN 敘述的一般形式為 OPEN ( open-list ) 其中 open-list必須包括,單位規(guī)定式 單位規(guī)定式的形式為, UNIT = integer-exp 或 integer-exp 其

29、中 integer-exp 的數(shù)值是零或正整數(shù), 指定檔案的單位號碼。 READ 或 WRITE 敘述使用此單位號碼讀寫其連接的檔案。使用第二種形式時(shí), integer-exp必須是open-list的第一項(xiàng)。,FILE = 子句 FILE = 子句的形式為, FILE = char-exp 其中 char-exp (略去末尾的空白)是單位號碼所連接的檔案名稱。 STATUS = 子句 STATUS = 子句的形式為, STATUS = char-exp 其中 char-exp (略去末尾的空白) 之值是下列之一: OLD 舊檔, 必須用 FILE = 子句規(guī)定檔名。 NEW 新檔, 必須用 FILE = 子句規(guī)定檔名。 SCRATCH 草稿檔, 必須不用檔名。 UNKNOWN 未知檔, 以上皆非。 若省略 STATUS = 子句, 則預(yù)設(shè)為未知檔。 IOSTAT = 子句 FILE = 子句的形式為, IOSTAT = int-var 其中 int-var 之值為零或正整數(shù)。 開檔順利, 則為零。否則為正整數(shù), 代表系統(tǒng)手冊中的錯(cuò)誤信文之號碼。 ERR = 子句 ERR = 子句的形式為, ERR = n 其中 n 規(guī)定若在開檔發(fā)生錯(cuò)誤時(shí),所要

溫馨提示

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

最新文檔

評論

0/150

提交評論