Fortran的快速指南

2018-12-12 14:24 更新

Fortran語言 - 概述

Fortran語言,從公式翻譯系統(tǒng)獲得,是一種通用的,命令式編程語言。它用于數(shù)字和科學計算。

Fortran語言最初是由IBM在20世紀50年代的科學和工程應(yīng)用的發(fā)展。 Fortran語言統(tǒng)治這個規(guī)劃面積很長一段時間,并成為高性能計算很受歡迎,因為。

它支持:

  • 數(shù)值分析和科學計算
  • 結(jié)構(gòu)化編程
  • 陣列編程
  • 模塊化編程
  • 泛型編程
  • 在超級計算機的高性能計算
  • 面向?qū)ο蟮某绦蛟O(shè)計
  • 并行編程
  • 計算機系統(tǒng)之間的可移植性的合理程度

有關(guān)Fortran的事實

  • Fortran語言是由一個團隊,于1957年由約翰·巴克斯在IBM領(lǐng)導創(chuàng)建的。

  • 最初使用的名字寫在所有的資本,但是目前的標準和實現(xiàn)只需要第一個字母要大寫。

  • Fortran語言表示的公式轉(zhuǎn)換器。

  • 最初是為科學計算開發(fā)的,它必須為字符串和所需的通用編程其他結(jié)構(gòu)的支持非常有限。

  • 后來的擴展和發(fā)展,使它成為具有良好的便攜高水平的編程語言。

  • 原始版本的Fortran I,II和III現(xiàn)在已經(jīng)過時了。

  • 最早的版本仍然在使用的Fortran IV標準,和Fortran 66。

  • 最常見的是今天使用的版本是:Fortran 77的,90的Fortran和Fortran 95。

  • Fortran 77的字符串添加作為一個獨特的類型。

  • Fortran 90的加入各種各樣線程,和直接陣列處理。

Fortran語言 - 環(huán)境設(shè)置

在Windows中設(shè)置的Fortran

G95是GNU的Fortran多architechtural編譯器,用于在Windows中設(shè)置的Fortran。 Windows版本的模仿windows下MingW平臺使用UNIX環(huán)境。安裝程序完成這個功能并自動添加G95到Windows PATH變量。

您可以從這里得到G95的穩(wěn)定版本:

安裝設(shè)置迷你安裝設(shè)置

如何使用G95

在安裝過程中,如果選擇“推薦”選項G95會自動添加到您的PATH變量。這意味著,你可以簡單地打開一個新的命令提示符窗口,輸入“G95”,彈出編譯器。下面找到一些基本的命令,讓你開始。

命令描述
G95 -c hello.f90 編譯hello.f90到目標文件命名為hello.o
G95 hello.f90 編譯hello.f90和鏈接它來生成可執(zhí)行的a.out
G95 -c h1.f90 h2.f90 h3.f90 編譯多個源文件。如果一切順利的話,目標文件h1.o,h2.o和h3.o創(chuàng)建
G95 -o你好h1.f90 h2.f90 h3.f90 編譯多個源文件并將它們鏈接起來,以一個名為'你好'的可執(zhí)行文件

對于G95命令行選項:

-c Compile only, do not run the linker.
-o Specify the name of the output file, either an object file or the executable.

多個源和目標文件可以一次指定。 Fortran文件都通過“.F”,“.F”“。對于”結(jié)尾的名字所指出的,“.FOR”,“.F90”,“.F90”,“.F95”,“.F95”,“。 F03“和”.F03“。多個源文件可以指定。對象文件也可被指定,并且將被連接以形成一個可執(zhí)行文件。

Fortran語言 - 基本語法

的Fortran程序是由程序單元像一個主程序,模塊和外部子程序或程序的集合。

每個程序包含一個主程序和可以或可以不包含其它程序單元。主程序的語法如下:

program program_name      
implicit none      
! type declaration statements      
! executable statements  
end program program_name

Fortran中一個簡單的程序

讓我們寫一個程序,增加了兩個數(shù)字,并打印出結(jié)果:

program addNumbers                                          
! This simple program adds two numbers     
   implicit none
! Type declarations
   real :: a, b, result 
! Executable statements 
   a = 12.0
   b = 15.0
   result = a + b
   print *, 'The total is ', result                   
end program addNumbers        

當你編譯和執(zhí)行上面的程序,它會產(chǎn)生以下結(jié)果:

The total is 27.0000000    

請注意:

  • 所有Fortran程序啟動與關(guān)鍵字程序并結(jié)束與關(guān)鍵字結(jié)束程序,然后該程序的名稱。

  • 隱式無語句允許編譯器檢查你所有的變量類型正確聲明。你必須總是在每個節(jié)目開始使用隱無 。

  • 在Fortran語言注釋開始與感嘆號(!),因為在這之后的所有字符(除了在一個字符串)被編譯器忽略。

  • 打印*在屏幕上顯示命令數(shù)據(jù)。

  • 行代碼的縮進是保持一個程序讀取一個很好的做法。

  • Fortran的同時允許大寫和小寫字母。 Fortran語言是不區(qū)分大小寫,除了字符串。

基本

基本字符集的Fortran包含:

  • 字母A到Z和A ... Z
  • 數(shù)字0 ... 9
  • 下劃線(_)字符
  • 特殊字符=:+空白 - * /()[]。 $'! “%; <>?

令牌在基本字符集字符制成的。令牌可以是一個關(guān)鍵詞,一個標識符,常量,字符串文字或符號。

程序語句是由令牌。

識別碼

一個標識符是用于標識變量,過程或任何其它用戶定義的項目的名稱。在Fortran語言的名稱必須遵循以下規(guī)則:

  • 它不能超過31個字符。

  • 它必須由字母數(shù)字字符(字母表中的所有字母和數(shù)字0到9)和下劃線(_)。

  • 名稱的第一個字符必須是字母。

  • 名稱不區(qū)分大小寫

關(guān)鍵詞

關(guān)鍵字是特殊的單詞,語言的保留。這些保留字不能用作標識符或名稱。

下面的表格,列出了Fortran語言的關(guān)鍵字:

非I / O關(guān)鍵字
可分配分配分配分配數(shù)據(jù)塊
呼叫案件字符共同復(fù)雜
包含繼續(xù)周期數(shù)據(jù) DEALLOCATE
默認雙精度其他否則,如果
別處最終數(shù)據(jù)塊做到底最終功能萬一
結(jié)束接口前端模塊程序結(jié)束最終選擇結(jié)束子程序
結(jié)束類型到底哪里條目等價出口
外部功能如果含蓄
進出整數(shù)意圖接口
固有 LEN 合乎邏輯的
名單廢止只要操作者可選的
參數(shù)暫停指針私人的
程序上市真實遞歸結(jié)果
返回保存選擇案例停止子程序
目標然后類型類型() 使用
哪里
在I / O相關(guān)的關(guān)鍵字
退格關(guān) ENDFILE 格式查詢
打開打印倒帶

Fortran語言 - 數(shù)據(jù)類型

Fortran語言提供了五種內(nèi)部數(shù)據(jù)類型,但是,你可以得到你自己的數(shù)據(jù)類型為好。五個內(nèi)在的類型有:

  • 整型
  • 房地產(chǎn)類型
  • 復(fù)雜類型
  • 邏輯類型
  • 字符類型

整型

整數(shù)類型只能容納整數(shù)值。下面的例子中提取,可以在通常的4字節(jié)整數(shù)中保存的最大值:

program testingInt
implicit none
   integer :: largeval
   print *, huge(largeval)
end program testingInt

當你編譯和執(zhí)行上面的程序它產(chǎn)生以下結(jié)果:

2147483647

需要注意的是巨大()函數(shù)給出可由特定整數(shù)數(shù)據(jù)類型被保持的最大數(shù)目。還可以指定使用的那種符的字節(jié)數(shù)。下面的例子說明了這一點:

program testingInt
implicit none
   !two byte integer
   integer(kind=2) :: shortval
   !four byte integer
   integer(kind=4) :: longval
   !eight byte integer
   integer(kind=8) :: verylongval
   !sixteen byte integer
   integer(kind=16) :: veryverylongval
   !default integer 
   integer :: defval
        
   print *, huge(shortval)
   print *, huge(longval)
   print *, huge(verylongval)
   print *, huge(veryverylongval)
   print *, huge(defval)
end program testingInt

當你編譯和執(zhí)行上面的程序,它會產(chǎn)生以下結(jié)果:

32767
2147483647
9223372036854775807
170141183460469231731687303715884105727
2147483647

實型

它存儲浮點數(shù),例如2.0,3.1415,-100.876等

傳統(tǒng)上有兩種不同的現(xiàn)實類型,默認型和雙精度型。

然而,F(xiàn)ortran語言90/95提供了真實和整數(shù)數(shù)據(jù)類型通過一種說明,我們將在數(shù)字章節(jié)中研究精密的控制。

下面的例子說明了如何使用真實的數(shù)據(jù)類型:

program division   
implicit none  
   ! Define real variables   
   real :: p, q, realRes 
   ! Define integer variables  
   integer :: i, j, intRes  
   ! Assigning  values   
   p = 2.0 
   q = 3.0    
   i = 2 
   j = 3  
   ! floating point division
   realRes = p/q  
   intRes = i/j
   
   print *, realRes
   print *, intRes
end program division  

當你編譯和執(zhí)行上面的程序它產(chǎn)生以下結(jié)果:

0.666666687    
0

復(fù)雜類型

這個用于存儲復(fù)數(shù)。一個復(fù)雜的數(shù)字有兩部分,實部和虛部。兩個連續(xù)的數(shù)字存儲單元存儲這兩個部分。

例如,該復(fù)數(shù)(3.0,-5.0)等于3.0 - 5.0i

我們將詳細討論復(fù)雜類型,在數(shù)字章節(jié)。

邏輯類型

僅存在兩個邏輯值:.TRUE。.FALSE。

字符類型

字符類型存儲字符和字符串。字符串的長度可以通過LEN說明指定。如果未指定長度,它是1。

例如,

character (len=40) :: name  
name = “Zara Ali”

表達, 域名(1:4),將給予串“扎拉”。

隱式類型

Fortran語言的舊版本允許一個叫做隱式類型,也就是說,你不必在使用前聲明變量功能。如果變量未聲明,那么它的名字的第一個字母,將決定其類型。

開始以i的變量名,J,K,L,M,或n,被認為是為整數(shù)變量,其余都是真實的變量。但是,你必須為它良好的編程習慣聲明所有的變量。對于您的發(fā)言開始你的程序:

implicit none

這個語句關(guān)閉隱式類型。

Fortran語言 - 變量

變量是什么,但給我們的程序可以操縱一個存儲區(qū)的名稱。每個變量應(yīng)該具有特定的類型,它決定了大小和變量的存儲器的布局;可以存儲該存儲器內(nèi)的值的范圍內(nèi);和該組操作可以施加到可變。

變量的名稱可以由字母,數(shù)字和下劃線。在Fortran語言的名稱必須遵循以下規(guī)則:

  • 它不能超過31個字符。

  • 它必須由字母數(shù)字字符(字母表中的所有字母和數(shù)字0到9)和下劃線(_)。

  • 名稱的第一個字符必須是字母。

  • 名稱不區(qū)分大小寫。

基于基本類型前面的章節(jié)中介紹,下面是變量類型:

類型描述
整數(shù)它只能容納整數(shù)值。
真實它存儲浮點數(shù)。
復(fù)雜它用于存儲復(fù)數(shù)。
合乎邏輯的它存儲邏輯布爾值。
字符它存儲的字符或字符串。

變量聲明

變量在一個類型聲明語句一個程序(或子程序)的開頭聲明。

語法變量聲明如下:

type-specifier :: variable_name

例如,

integer :: total  	
real :: average 
complex :: cx  
logical :: done 
character(len=80) :: message ! a string of 80 characters

稍后,您可以將值分配給這些變量一樣,

total = 20000  
average = 1666.67   
done = .true.   
message = “A big Hello from Tutorials Point” 
cx = (3.0, 5.0) ! cx = 3.0 + 5.0i

您也可以使用內(nèi)部函數(shù)CMPLX,賦值給一個復(fù)數(shù)變量:

cx = cmplx (1.0/2.0, -7.0) ! cx = 0.5 – 7.0i 
cx = cmplx (x, y) ! cx = x + yi

下面的示例演示屏幕上變量聲明,分配和顯示:

program variableTesting
implicit none

   ! declaring variables
   integer :: total      
   real :: average 
   complex :: cx  
   logical :: done 
   character(len=80) :: message ! a string of 80 characters
   
   !assigning values
   total = 20000  
   average = 1666.67   
   done = .true.   
   message = "A big Hello from Tutorials Point" 
   cx = (3.0, 5.0) ! cx = 3.0 + 5.0i

   Print *, total
   Print *, average
   Print *, cx
   Print *, done
   Print *, message
end program variableTesting

當上述代碼被編譯和執(zhí)行時,它產(chǎn)生了以下結(jié)果:

20000
1666.67004    
(3.00000000, 5.00000000 )
T
A big Hello from Tutorials Point         

Fortran語言 - 常量

常數(shù)指的是程序不能在執(zhí)行期間改變的固定值。這些固定值也被稱為文字

常量可以是任何基本的數(shù)據(jù)類型,如整型常量,一個浮點常量,字符常量,復(fù)雜的常量或字符串文本。只有兩個邏輯常量:.TRUE。.FALSE。

該常量將被視為就像普通變量,但它們的值不能將其定義后進行修改。

命名常量和文字

有兩種類型的常量:

  • 字面常量
  • 命名常量

文字常量有值,但沒有名字。

例如,以下是文字常量:

類型
整型常量 01-1 300 123456789
實常數(shù) 0.0 1.0 -1.0 123.456 7.1E + 10 -52.715E-30
復(fù)常數(shù) (0.0,0.0)(-123.456E + 30,987.654E-29)
邏輯常量 。真正。 。假。
字符常量

“PQR”“一”“123'abc $%#@!”

“一帖”“”

“PQR''A''123”ABC $%#@!

'撇號'''

命名常量的值以及名稱。

命名常量應(yīng)當在程序或過程的開始進行聲明,就像一個變量的類型聲明,表明其名稱和類型。命名常量聲明的參數(shù)屬性。例如,

real, parameter :: pi = 3.1415927

下面的程序計算位移,由于在重力作用下垂直運動。

program gravitationalDisp
! this program calculates vertical motion under gravity 
implicit none  
   ! gravitational acceleration
   real, parameter :: g = 9.81   
   ! variable declaration
   real :: s ! displacement   
   real :: t ! time  
   real :: u ! initial speed  
   ! assigning values 
   t = 5.0   
   u = 50  
   ! displacement   
   s = u * t - g * (t**2) / 2  
   ! output 
   print *, "Time = ", t
   print *, 'Displacement = ',s  
end program gravitationalDisp

當上述代碼被編譯和執(zhí)行時,它產(chǎn)生了以下結(jié)果:

Time = 5.00000000    
Displacement = 127.374992    

Fortran語言 - 操作員

運算符是告訴執(zhí)行特定數(shù)學或邏輯操作的編譯器的符號。 Fortran語言提供了以下類型的運算符:

  • 算術(shù)運算符
  • 關(guān)系運算符
  • 邏輯運算符

讓我們來看看所有這些類型的運營商逐一。

算術(shù)運算符

下表列出了所有的Fortran支持的算術(shù)運算符。假設(shè)變量A持有5,然后變量B持有3:

顯示示例

操作者描述
+ 除了運營商,增加了兩個操作數(shù)。 A + B將給8
- 減法操作,減去從所述第一第二操作數(shù)。 A - B就給予2
* 乘法運算,乘兩個操作數(shù)。 A * B將給予15
/ 除法運算符,由去分子分裂分子。 A / B將給予1
** 乘方運算引發(fā)一個操作數(shù)到其他的力量。 A ** B就給予125

關(guān)系運算符

下表列出了所有的Fortran支持的關(guān)系運算符。假設(shè)變量A持有10和變量B持有20,則:

顯示示例

=
    操作者當量描述
    == .EQ。 檢查,如果兩個操作數(shù)的值相等與否,如果是,則條件變?yōu)檎妗? (A == B)是不正確的。
    / = .NE。 檢查,如果兩個操作數(shù)的值相等與否,如果值不相等,則條件變?yōu)檎妗? (A!= B)為真。
    > .GT。 檢查左操作數(shù)的值大于右操作數(shù)的值,如果是,則條件為真。 (A> B)是不正確的。
    .GE。 檢查左操作數(shù)的值大于或等于右邊的操作數(shù)的值,如果是,則條件為真。 (A> = B)是不正確的。
    T1 P1 = 1打印*,P1打印*,T1 P1 = P1 + 4 *打印,打印P1 *,T1 T1 = 8打印*,P1打印*,T1結(jié)束程序pointerExample

    當上述代碼被編譯和執(zhí)行時,它產(chǎn)生了以下結(jié)果:

    1
    1
    5
    5
    8
    8
    

    一個指針可以是:

    • 未定義
    • 關(guān)聯(lián)的
    • 解除關(guān)聯(lián)

    另外,在上述程序中,我們已關(guān)聯(lián)的指示器p1,與目標T1,使用=>運算符。相關(guān)的功能,測試指針的關(guān)聯(lián)狀態(tài)。

    廢止聲明的關(guān)聯(lián)從一個目標的指針。

    抵消不清空目標,因為可能存在一個以上的指針指向同一目標。然而,排空指針意味著無效也。

    例1

    下面的示例演示的概念:

    program pointerExample
    implicit none
       integer, pointer :: p1
       integer, target :: t1 
       integer, target :: t2
       p1=>t1
       p1 = 1
       Print *, p1
       Print *, t1
       p1 = p1 + 4
       Print *, p1
       Print *, t1
       t1 = 8
       Print *, p1
       Print *, t1
       nullify(p1)
       Print *, t1
       p1=>t2
       Print *, associated(p1)
       Print*, associated(p1, t1)
       Print*, associated(p1, t2)
       !what is the value of p1 at present
       Print *, p1
       Print *, t2
       p1 = 10
       Print *, p1
       Print *, t2
    end program pointerExample
    

    當上述代碼被編譯和執(zhí)行時,它產(chǎn)生了以下結(jié)果:

    1
    1
    5
    5
    8
    8
    8
    T
    F
    T
    952754640
    952754640
    10
    10
    

    請注意,每次運行代碼時,內(nèi)存地址會有所不同。

    例2

    program pointerExample
    implicit none
       integer, pointer :: a, b
       integer, target :: t
       integer :: n
       t= 1
       a=>t
       t = 2
       b => t
       n = a + b
       Print *, a, b, t, n 
    end program pointerExample
    

    當上述代碼被編譯和執(zhí)行時,它產(chǎn)生了以下結(jié)果:

    2  2  2  4
    

    Fortran語言 - 基本輸入輸出

    迄今為止,我們已經(jīng)看到,我們可以使用打印*語句讀取分別使用讀取*語句鍵盤和顯示輸出數(shù)據(jù)到屏幕上。輸入輸出的形式是自由格式的 I / O,它被稱為列表控制的輸入輸出。

    自由格式簡單的I / O的形式為:

    read(*,*) item1, item2, item3...
    print *, item1, item2, item3
    write(*,*) item1, item2, item3...
    

    然而,格式化I / O讓您的數(shù)據(jù)傳輸更多的靈活性。

    格式化輸入輸出

    格式化輸入輸出有語法如下:

    read fmt, variable_list 
    print fmt, variable_list 
    write fmt, variable_list 
    

    哪里,

    • FMT是格式規(guī)范

    • 可變列表被從鍵盤被讀或?qū)懺谄聊簧系淖兞康牧斜?/p>

    格式規(guī)范定義,其中顯示格式化的數(shù)據(jù)的方式。它由一個字符串,包含編輯描述符的括號中的列表。

    一個編輯描述符指定的精確格式,例如,寬度,其中顯示后小數(shù)點等,數(shù)字字符和數(shù)字。

    例如:

    Print "(f6.3)", pi
    

    下表描述了描述:

    描述符描述
    一世這是用于整數(shù)輸出。此采用的形式為“rIw.m',其中的R,W和M的含義在下面的表中給出。整數(shù)值是在他們的視場科幻權(quán)JUSTI網(wǎng)絡(luò)版。如果場寬度不是大到足以容納一個整數(shù)那么場是網(wǎng)絡(luò)連接有星號LLED。 打印“(3i5)”,I,J,K
    F 這是用于實數(shù)輸出。此采用的形式為“rFw.d',其中的R,W和D的含義在下面的表中給出。真正的價值在他們的網(wǎng)絡(luò)的視場右側(cè)JUSTI網(wǎng)絡(luò)版。如果場寬度不夠大以容納實數(shù)則場是音響LLED以星號。 打印“(f12.3)”,圓周率
    ?

    這是用于指數(shù)符號實際產(chǎn)出。在'E'描述語句的形式為'rEw.d',其中的R,W和D的含義如下表所示。真正的價值在他們的網(wǎng)絡(luò)的視場右側(cè)JUSTI網(wǎng)絡(luò)版。如果場寬度不夠大以容納實數(shù)則場是音響LLED以星號。

    請注意,打印出三位小數(shù),需要至少十的場寬度的實數(shù)。一個用于尾數(shù),兩個零,四項尾數(shù)和兩個用于指數(shù)本身的符號。一般來說,W≥D + 7。

    打印“(e10.3)”,123456.0給出了'0.123e + 06'
    ES 這是用于實際產(chǎn)出(科學記數(shù)法)。此采用的形式為“rESw.d',其中的R,W和D的含義在下面的表中給出。在“E”上面的描述符迪FF ERS稍微從傳統(tǒng)的著名“科學的C表示法”介紹。科學的C表示法具有范圍1.0尾數(shù)?10.0不像其具有在0.1到1.0的尾數(shù)對E描述符。真正的價值在他們的網(wǎng)絡(luò)的視場右側(cè)JUSTI網(wǎng)絡(luò)版。如果場寬度不夠大以容納實數(shù)則場是音響LLED以星號。這里還,寬度場必須滿足表達Wˉˉ≥D + 7 打印“(es10.3)”,123456.0給出了'1.235e + 05'
    一個這是用于字符輸出。這需要其中r和W的含義如下表中給出的形式“原始”。性格類型是在他們的網(wǎng)絡(luò)的視場右側(cè)JUSTI網(wǎng)絡(luò)版。如果場寬度不足夠大以容納字符串則場是音響與第一個“W”的字符串的字符LLED。 打印“(A10)”,STR
    X 這是用于空間輸出。這種形式定義的NX“,其中”n“是所需空間的數(shù)量。 打印“(5倍,A10)”,STR
    / 斜線描述 - 用于插入空行。這需要的形式'/',并強制下一個數(shù)據(jù)輸出為一個新行。 打印“(/,5倍,A10)”,STR

    以下符號用于與格式描述符:

    符號描述
    C 列號
    e 中位數(shù)為實際輸入或輸出的小數(shù)位的權(quán)
    要顯示的最小位數(shù)
    ? 空格數(shù)跳過
    - [R 重復(fù)計數(shù) - 的次數(shù)要使用的描述符的描述符或一組
    Wˉˉ 域?qū)挾?- 的字符數(shù)用于輸入或輸出

    例1

    program printPi
       pi = 3.141592653589793238 
       
       Print "(f6.3)", pi 
       Print "(f10.7)", pi
       Print "(f20.15)", pi 
       Print "(e16.4)", pi/100 
    end program printPi
    

    當上述代碼被編譯和執(zhí)行時,它產(chǎn)生了以下結(jié)果:

    3.142
    3.1415927
    3.141592741012573
    0.3142E-01
    

    例2

    program printName
    implicit none
    character (len=15) :: first_name
       print *,' Enter your first name.' 
       print *,' Up to 20 characters, please'
       read *,first_name 
       print "(1x,a)",first_name
    end program printName
    

    當上述代碼被編譯和執(zhí)行時,它產(chǎn)生了以下結(jié)果:(假設(shè)用戶輸入的名稱扎拉)

    Enter your first name.
       Up to 20 characters, please
       Zara 
    

    例3

    program formattedPrint
    implicit none
    real :: c = 1.2786456e-9, d = 0.1234567e3 
    integer :: n = 300789, k = 45, i = 2
    character (len=15) :: str="Tutorials Point"
    print "(i6)", k 
    print "(i6.3)", k 
    print "(3i10)", n, k, i 
    print "(i10,i3,i5)", n, k, i 
    print "(a15)",str 
    print "(f12.3)", d
    print "(e12.4)", c 
    print '(/,3x,"n = ",i6, 3x, "d = ",f7.4)', n, d
    end program formattedPrint
    

    當上述代碼被編譯和執(zhí)行時,它產(chǎn)生了以下結(jié)果:

    
    45
    045
    300789 45  2
    300789 45  2
    Tutorials Point
    123.457
    0.1279E-08
    
    n = 300789 d = *******
    

    該聲明的格式

    格式語句允許您在一個聲明中混合和匹配字符,整數(shù)和實輸出。下面的例子說明了這一點:

    program productDetails 
    implicit none 
       character (len=15) :: name
       integer :: id 
       real :: weight
       name = 'Ardupilot'
       id = 1
       weight = 0.08
       print *,' The product details are' 
       print 100
       100 format (7x,'Name:', 7x, 'Id:', 1x, 'Weight:')
       print 200, name, id, weight 
       200 format(1x, a, 2x, i3, 2x, f5.2) 
    end program productDetails
    

    當上述代碼被編譯和執(zhí)行時,它產(chǎn)生了以下結(jié)果:

    The product details are
    Name:       Id:    Weight:
    Ardupilot   1       0.08
    

    Fortran語言 - 文件輸入輸出

    Fortran語言,您可以讀取數(shù)據(jù),并將數(shù)據(jù)寫入到文件中。

    在最后一章,你看到了如何讀取數(shù)據(jù),并將數(shù)據(jù)寫入到終端。在本章中,您將學習用Fortran語言提供的文件輸入和輸出功能。

    可以讀取和寫入到一個或多個文件。開放,寫入,讀取和CLOSE語句,可以實現(xiàn)這一目標。

    打開和關(guān)閉文件

    使用文件之前,必須先打開該文件。 打開命令用來打開文件進行讀取或?qū)懭?。該命令的最簡單的形式是?

    open (unit = number, file = "name").
    

    然而,開放的聲明可能有一個一般形式:

    open (list-of-specifiers)
    

    下表介紹最常用的指示符:

    說明描述
    [UNIT =]ù 單元號ü可以是任何數(shù)量范圍9-99,它表明該文件,你可以選擇任何號碼,但在程序中每個打開的文件必須有一個唯一的編號
    IOSTAT = IOS 它是在I / O狀態(tài)標識符和應(yīng)為整數(shù)的變量。如果打開語句成功,則返回的IOS值為零其他非零值。
    ERR = ERR 這是任何錯誤的情況下,控制跳轉(zhuǎn)的標簽。
    FILE = FNAME 文件名,一個字符串。
    STATUS =站它顯示了該文件的先前狀態(tài)。一個字符串,可以有三個值新的,舊的或SCRATCH之一。劃痕文件被創(chuàng)建和刪除關(guān)閉時或程序結(jié)束。
    ACCESS = ACC 它是該文件的訪問模式??梢杂袃蓚€值,順序或直銷。默認值是連續(xù)的。
    FORM = FRM 它給該文件的格式的狀態(tài)。可以有格式化或者非格式化兩個值。默認值為UNFORMATTED
    RECL = RL 它指定每個記錄中直接訪問文件的長度。

    該文件已被打開后,它是由讀寫語句訪問。一旦這樣做,就應(yīng)該使用CLOSE語句關(guān)閉。

    close語句的語法如下:

    close ([UNIT=]u[,IOSTAT=ios,ERR=err,STATUS=sta])
    

    請注意,括號中的參數(shù)是可選的。

    本實施例說明打開一個新文件的某些數(shù)據(jù)寫入到文件中。

    program outputdata   
    implicit none   
    real, dimension(100) :: x, y  
    real, dimension(100) :: p, q
    integer :: i  
       ! data  
       do i=1,100  
       x(i) = i * 0.1 
       y(i) = sin(x(i)) * (1-cos(x(i)/3.0))  
       end do  
       ! output data into a file 
       open(1, file='data1.dat', status='new')  
       do i=1,100  
       write(1,*) x(i), y(i)   
       end do  
       close(1) 
    end program outputdata
    

    當上述代碼被編譯和執(zhí)行時,它創(chuàng)建的文件data1.dat和x和y數(shù)組值寫入到其中。然后關(guān)閉該文件。

    讀取和寫入到文件

    的讀寫語句分別用于讀和分別寫入到文件中。

    他們的語法如下:

    read ([UNIT=]u, [FMT=]fmt, IOSTAT=ios, ERR=err, END=s)
    write([UNIT=]u, [FMT=]fmt, IOSTAT=ios, ERR=err, END=s)
    

    大多數(shù)符的已在上表中進行討論。

    結(jié)束= S說明是一個語句標號所在的程序跳轉(zhuǎn),當它到達檔案結(jié)尾。

    此示例演示讀取和寫入到文件中。

    在這個項目中,我們從文件中讀取,我們在最后一個例子創(chuàng)建,data1.dat,并在屏幕上顯示。

    program outputdata   
    implicit none   
    real, dimension(100) :: x, y  
    real, dimension(100) :: p, q
    integer :: i  
       ! data  
       do i=1,100  
       x(i) = i * 0.1 
       y(i) = sin(x(i)) * (1-cos(x(i)/3.0))  
       end do  
       ! output data into a file 
       open(1, file='data1.dat', status='new')  
       do i=1,100  
       write(1,*) x(i), y(i)   
       end do  
       close(1) 
      
       ! opening the file for reading
       open (2, file='data1.dat', status='old')
      
       do i=1,100  
       read(2,*) p(i), q(i)
       end do 
       close(2)
       do i=1,100  
       write(*,*) p(i), q(i)
       end do 
    end program outputdata
    

    當上述代碼被編譯和執(zhí)行時,它產(chǎn)生了以下結(jié)果:

    0.100000001  5.54589933E-05
    0.200000003  4.41325130E-04
    0.300000012  1.47636665E-03
    0.400000006  3.45637114E-03
    0.500000000  6.64328877E-03
    0.600000024  1.12552457E-02
    0.699999988  1.74576249E-02
    0.800000012  2.53552198E-02
    0.900000036  3.49861123E-02
    1.00000000   4.63171229E-02
    1.10000002   5.92407547E-02
    1.20000005   7.35742599E-02
    1.30000007   8.90605897E-02
    1.39999998   0.105371222    
    1.50000000   0.122110792    
    1.60000002   0.138823599    
    1.70000005   0.155002072    
    1.80000007   0.170096487    
    1.89999998   0.183526158    
    2.00000000   0.194692180    
    2.10000014   0.202990443    
    2.20000005   0.207826138    
    2.29999995   0.208628103    
    2.40000010   0.204863414    
    2.50000000   0.196052119    
    2.60000014   0.181780845    
    2.70000005   0.161716297    
    2.79999995   0.135617107    
    2.90000010   0.103344671    
    3.00000000   6.48725405E-02
    3.10000014   2.02930309E-02
    3.20000005  -3.01767997E-02
    3.29999995  -8.61928314E-02
    3.40000010  -0.147283033    
    3.50000000  -0.212848678    
    3.60000014  -0.282169819    
    3.70000005  -0.354410470    
    3.79999995  -0.428629100    
    3.90000010  -0.503789663    
    4.00000000  -0.578774154    
    4.09999990  -0.652400017    
    4.20000029  -0.723436713    
    4.30000019  -0.790623367    
    4.40000010  -0.852691114    
    4.50000000  -0.908382416    
    4.59999990  -0.956472993    
    4.70000029  -0.995793998    
    4.80000019  -1.02525222    
    4.90000010  -1.04385209    
    5.00000000  -1.05071592    
    5.09999990  -1.04510069    
    5.20000029  -1.02641726    
    5.30000019  -0.994243503    
    5.40000010  -0.948338211    
    5.50000000  -0.888650239    
    5.59999990  -0.815326691    
    5.70000029  -0.728716135    
    5.80000019  -0.629372001    
    5.90000010  -0.518047631    
    6.00000000  -0.395693362    
    6.09999990  -0.263447165    
    6.20000029  -0.122622721    
    6.30000019   2.53026206E-02
    6.40000010   0.178709000    
    6.50000000   0.335851669    
    6.59999990   0.494883657    
    6.70000029   0.653881252    
    6.80000019   0.810866773    
    6.90000010   0.963840425    
    7.00000000   1.11080539    
    7.09999990   1.24979746    
    7.20000029   1.37891412    
    7.30000019   1.49633956    
    7.40000010   1.60037732    
    7.50000000   1.68947268    
    7.59999990   1.76223695    
    7.70000029   1.81747139    
    7.80000019   1.85418403    
    7.90000010   1.87160957    
    8.00000000   1.86922085    
    8.10000038   1.84674001    
    8.19999981   1.80414569    
    8.30000019   1.74167395    
    8.40000057   1.65982044    
    8.50000000   1.55933595    
    8.60000038   1.44121361    
    8.69999981   1.30668485    
    8.80000019   1.15719533    
    8.90000057   0.994394958    
    9.00000000   0.820112705    
    9.10000038   0.636327863    
    9.19999981   0.445154816    
    9.30000019   0.248800844    
    9.40000057   4.95488606E-02
    9.50000000  -0.150278628    
    9.60000038  -0.348357052    
    9.69999981  -0.542378068    
    9.80000019  -0.730095863    
    9.90000057  -0.909344316    
    10.0000000  -1.07807255    
    

    Fortran語言 - 程序

    過程是一組執(zhí)行一個明確的任務(wù),可以從你的程序中調(diào)用語句。信息(或數(shù)據(jù))被傳遞給調(diào)用的程序,向步驟作為參數(shù)。

    有兩種類型的程序:

    • 功能
    • 子程序

    功能

    函數(shù)是返回一個單一的量的過程。函數(shù)不應(yīng)該修改其參數(shù)。

    返回的數(shù)量被稱為函數(shù)值 ,并且它由函數(shù)名表示。

    句法:

    語法功能如下:

    function name(arg1, arg2, ....)  
       [declarations, including those for the arguments]   
       [executable statements] 
    end function [name]
    

    下面的示例演示一個名為功能area_of_circle。它計算半徑為r的圓的面積。

    program calling_func
       real :: a
       a = area_of_circle(2.0) 
       Print *, "The area of a circle with radius 2.0 is"
       Print *, a
    end program calling_func
    
    function area_of_circle (r)  
    ! this function computes the area of a circle with radius r     
       implicit none      
    ! function result     
       real :: area_of_circle   
    ! dummy arguments     
       real :: r     
    ! local variables     
       real :: pi    
       pi = 4 * atan (1.0)     
       area_of_circle = pi * r**2  
    end function area_of_circle
    

    當你編譯和執(zhí)行上面的程序,它會產(chǎn)生以下結(jié)果:

    The area of a circle with radius 2.0 is
       12.5663710   
    

    請注意:

    • 必須指定在兩個主程序隱無以及程序。

    • 在被調(diào)用函數(shù)的參數(shù)r被稱為偽參數(shù)

    結(jié)果選項

    如果你想返回的值存儲在其它一些名稱與功能名稱,您可以使用結(jié)果選項。

    您可以指定返回變量名:

    function name(arg1, arg2, ....) result (return_var_name)  
       [declarations, including those for the arguments]   
       [executable statements] 
    end function [name]
    

    子程序

    子程序沒有返回值,但可以修改其參數(shù)。

    句法

    subroutine name(arg1, arg2, ....)    
       [declarations, including those for the arguments]    
       [executable statements]  
    end subroutine [name]
    

    調(diào)用子程序

    您需要使用呼叫語句調(diào)用的子程序。

    下面的例子演示了一個子程序交換,改變其參數(shù)值的定義和使用。

    program calling_func
    implicit none
       real :: a, b
       a = 2.0
       b = 3.0
       Print *, "Before calling swap"
       Print *, "a = ", a
       Print *, "b = ", b
       call swap(a, b)
       Print *, "After calling swap"
       Print *, "a = ", a
       Print *, "b = ", b
    end program calling_func
    
       subroutine swap(x, y) 
       implicit none
       real :: x, y, temp   
       temp = x  
       x = y 
       y = temp  
    end subroutine swap
    

    當你編譯和執(zhí)行上面的程序,它會產(chǎn)生以下結(jié)果:

    Before calling swap
    a = 2.00000000    
    b = 3.00000000    
    After calling swap
    a = 3.00000000    
    b = 2.00000000   
    

    指定參數(shù)的意圖

    這樣做的目的屬性允許你指定與參數(shù)在程序中使用的意圖。下表提供的意圖屬性的值:

    作為說明
    意圖(中) 用作輸入值,而不是在功能改變
    意圖(出) 用作輸出值,它們都將被覆蓋
    進出意圖(INOUT) 參數(shù)都是使用和覆蓋

    下面的例子演示了這個概念:

    program calling_func
    implicit none
       real :: x, y, z, disc
       x= 1.0
       y = 5.0
       z = 2.0
       call intent_example(x, y, z, disc)
       Print *, "The value of the discriminant is"
       Print *, disc
    end program calling_func
    
    subroutine intent_example (a, b, c, d)     
       implicit none     
       ! dummy arguments      
       real, intent (in) :: a     
       real, intent (in) :: b      
       real, intent (in) :: c    
       real, intent (out) :: d   
       d = b*b - 4.0*a*c 
    end subroutine intent_example
    

    當你編譯和執(zhí)行上面的程序,它會產(chǎn)生以下結(jié)果:

    The value of the discriminant is
       17.0000000    
    

    遞歸過程

    遞歸當編程語言,您可以調(diào)用同一個函數(shù)內(nèi)的函數(shù)發(fā)生。這就是所謂的函數(shù)的遞歸調(diào)用。

    當一個過程調(diào)用本身,直接或間接地被稱為遞歸過程。你應(yīng)該通過其聲明之前遞歸字前面的聲明這種類型的程序。

    當一個函數(shù)被遞歸使用, 結(jié)果選項被使用。

    以下是一個例子,它計算階乘用于使用遞歸過程的給定數(shù)量:

    program calling_func
    implicit none
       integer :: i, f
       i = 15
       Print *, "The value of factorial 15 is"
       f = myfactorial(15)
       Print *, f
    end program calling_func
    
    recursive function myfactorial (n) result (fac)  
       ! computes the factorial of n (n!)      
       implicit none     
       ! function result     
       integer :: fac     
       ! dummy arguments     
       integer, intent (in) :: n     
       select case (n)         
       case (0:1)         
       fac = 1         
       case default    
       fac = n * myfactorial (n-1)  
       end select 
    end function myfactorial
    

    內(nèi)部程序

    當一個過程被包含在程序中,它被稱為程序的內(nèi)部程序。包含的內(nèi)部程序的語法如下:

    program program_name     
       implicit none         
       ! type declaration statements         
       ! executable statements    
       . . .     
       contains         
       ! internal procedures      
       . . .  
    end program program_name
    

    下面的例子演示了這個概念:

    program mainprog  
    implicit none 
    real :: a, b 
       a = 2.0
       b = 3.0
       Print *, "Before calling swap"
       Print *, "a = ", a
       Print *, "b = ", b
       call swap(a, b)
       Print *, "After calling swap"
       Print *, "a = ", a
       Print *, "b = ", b
     
       contains   
       subroutine swap(x, y)     
       real :: x, y, temp      
       temp = x 
       x = y  
       y = temp   
       end subroutine swap 
    end program mainprog   
    

    當你編譯和執(zhí)行上面的程序,它會產(chǎn)生以下結(jié)果:

    Before calling swap
    a = 2.00000000    
    b = 3.00000000    
    After calling swap
    a = 3.00000000    
    b = 2.00000000   
    

    Fortran語言 - 模塊

    模塊就像一個包,你可以保持你的功能和子程序,如果你正在編寫一個非常大的項目,或者你的函數(shù)或子程序可以在多個程序中使用。

    模塊為您提供多個文件之間的分裂你的程序的方式。

    模塊用于:

    • 包裝子程序,數(shù)據(jù)和接口塊。
    • 限定,可以由一個以上的程序中使用的全局數(shù)據(jù)。
    • 宣稱可以選擇的任何程序內(nèi)提供的變量。
    • 導入模塊完全,使用,到另一個程序或子程序。

    一個模塊的語法

    一個模塊由兩部分組成:

    • 規(guī)范一部分語句聲明
    • 一個包含子程序和函數(shù)定義的一部分

    模塊的一般形式是:

    module name     
       [statement declarations]  
       [contains [subroutine and function definitions] ] 
    end module [name]
    

    使用一個模塊到你的程序

    您可以將在通過使用語句程序或子程序模塊:

    use name  
    

    請注意

    • 您可以添加盡可能多的模塊可以根據(jù)需要,將各自在不同的文件,并單獨編譯。

    • 模塊可以以各種不同的程序中使用。

    • 模塊可以在同一程序中可使用多次。

    • 在模塊規(guī)范部分中聲明的變量是全局的模塊。

    • 一個模塊中聲明的變量成為在使用的模塊的任何程序或常規(guī)全局變量。

    • 使用聲明可以出現(xiàn)在主程序中,或它使用的程序或特定的模塊中定義的變量的任何其他子程序或模塊。

    下面的例子演示了這個概念:

    module constants  
    implicit none 
       real, parameter :: pi = 3.1415926536  
       real, parameter :: e = 2.7182818285 
    contains      
       subroutine show_consts()          
       print*, "Pi = ", pi          
       print*,  "e = ", e     
       end subroutine show_consts 
    end module constants 
    
    program module_example     
    use constants      
    implicit none     
       real :: x, ePowerx, area, radius 
       x = 2.0
       radius = 7.0
       ePowerx = e ** x
       area = pi * radius**2     
       call show_consts() 
       print*, "e raised to the power of 2.0 = ", ePowerx
       print*, "Area of a circle with radius 7.0 = ", area  
    end program module_example
    

    當你編譯和執(zhí)行上面的程序,它會產(chǎn)生以下結(jié)果:

    Pi = 3.14159274    
    e =  2.71828175    
    e raised to the power of 2.0 = 7.38905573    
    Area of a circle with radius 7.0 = 153.938049   
    

    模塊中的變量和子程序的無障礙

    缺省情況下,一個模塊中的所有的變量和子程序被提供給正在使用該模塊的代碼,通過使用語句的程序。

    但是,你可以控制的模塊代碼使用私人公共屬性的可訪問性。當你聲明一些變量或子程序為私有,這不是可用的模塊外。

    下面的例子說明了這一概念:

    在前面的例子中,我們有兩個模塊變量,e圓周率。讓我們把他們的私人和觀察輸出:

    module constants  
    implicit none 
       real, parameter,private :: pi = 3.1415926536  
       real, parameter, private :: e = 2.7182818285 
    contains      
       subroutine show_consts()          
       print*, "Pi = ", pi          
       print*, "e = ", e     
       end subroutine show_consts 
    end module constants 
    
    program module_example     
    use constants      
    implicit none     
       real :: x, ePowerx, area, radius 
       x = 2.0
       radius = 7.0
       ePowerx = e ** x
       area = pi * radius**2     
       call show_consts() 
       print*, "e raised to the power of 2.0 = ", ePowerx
       print*, "Area of a circle with radius 7.0 = ", area  
    end program module_example
    

    當你編譯和執(zhí)行上面的程序,它提供了以下錯誤信息:

       ePowerx = e ** x
       1
    Error: Symbol 'e' at (1) has no IMPLICIT type
    main.f95:19.13:
    
       area = pi * radius**2     
       1
    Error: Symbol 'pi' at (1) has no IMPLICIT type
    

    由于e圓周率,既被聲明為私有,module_example無法再訪問這些變量程序。

    然而,其他模塊的子程序可以訪問它們:

    module constants  
    implicit none 
       real, parameter,private :: pi = 3.1415926536  
       real, parameter, private :: e = 2.7182818285 
    contains      
       subroutine show_consts()          
       print*, "Pi = ", pi          
       print*, "e = ", e     
       end subroutine show_consts 
       function ePowerx(x)result(ePx) 
       implicit none
       real::x
       real::ePx
       ePx = e ** x
       end function ePowerx
        
       function areaCircle(r)result(a)  
    implicit none
       real::r
       real::a
       a = pi * r**2  
       end function areaCircle
        
    end module constants 
    
    program module_example     
    use constants      
    implicit none     
       call show_consts() 
       Print*, "e raised to the power of 2.0 = ", ePowerx(2.0)
       print*, "Area of a circle with radius 7.0 = ", areaCircle(7.0)  
    end program module_example
    

    當你編譯和執(zhí)行上面的程序,它會產(chǎn)生以下結(jié)果:

    Pi = 3.14159274    
    e = 2.71828175    
    e raised to the power of 2.0 = 7.38905573    
    Area of a circle with radius 7.0 = 153.938049   
    

    Fortran語言 - 內(nèi)部函數(shù)

    征函數(shù)是被提供作為Fortran語言的一部分的一些常見和重要的功能。我們的陣列,字符和字符串的章節(jié)已經(jīng)討論其中的一些功能。

    本征函數(shù)可以被歸類為:

    • 數(shù)值函數(shù)
    • 數(shù)學函數(shù)
    • 數(shù)字查詢函數(shù)
    • 浮點操作函數(shù)
    • 位操作功能
    • 字符函數(shù)
    • 種類函數(shù)
    • 邏輯函數(shù)
    • 陣列功能。

    我們在陣列章節(jié)討論的陣列功能。在下面的部分,我們提供的其他類別所有這些功能的簡要說明。

    在功能名稱列,

    • A代表任何類型的數(shù)值變量
    • R代表真實或整數(shù)變量
    • X和Y代表實際變量
    • Z表示復(fù)變
    • W代表真實的或復(fù)雜的變量

    數(shù)值函數(shù)

    功能描述
    ABS(A) 它返回一個絕對值
    AIMAG(Z) 它返回一個復(fù)雜的數(shù)Z的虛部
    AINT(A [,KIND]) 它截斷的小數(shù)部分趨向于零,返回一個真正的,整數(shù)。
    ANINT(A [,KIND]) 它返回一個真正的價值,最近的整數(shù)或整數(shù)。
    CEILING(A [,KIND]) 它返回最小整數(shù)大于或等于號A.
    CMPLX(X [,Y,KIND]) 它轉(zhuǎn)換成真正的變量X和Y以復(fù)數(shù)X + IY;如果Y不存在,則使用0。
    CONJG(Z) 它返回任何復(fù)數(shù)Z的復(fù)共軛
    DBLE(A) 把一路為雙精度實數(shù)。
    DIM(X,Y) 它返回X和Y的正差
    DPROD(X,Y) 它返回X和Y的雙精度真實的產(chǎn)品
    FLOOR(A [,KIND]) 它提供了小于或等于數(shù)A的最大整數(shù)
    INT(A [,KIND]) 將其轉(zhuǎn)換為數(shù)字(真實或整數(shù))為整數(shù),朝零截斷的實部。
    MAX(A1,A2 [,A3,...]) 它返回從參數(shù)的最大值,一切存在相同類型。
    MIN(A1,A2 [,A3,...]) 它返回從參數(shù)的最小值,都存在相同類型。
    MOD(A,P) 它被P返回A的剩余部分上師,這兩個參數(shù)是相同類型的(A-INT(A / P)×P)
    MODULO(A,P) 它返回一個模p:(A樓(A / P)×P)
    NINT(A [,KIND]) 它返回一個數(shù)字的最接近的整數(shù)
    REAL(A [,KIND]) 將其轉(zhuǎn)換為真正的類型
    SIGN(A,B) 它返回一個乘以P的標志的絕對值基本上它傳輸?shù)腂標志的為A.

    program numericFunctions
    implicit none  
       ! define constants  
       !define variables
       real :: a, b 
       complex :: z
       !values for a, b 
       a = 15.2345
       b = -20.7689
        
       write(*,*) 'abs(a): ',abs(a),' abs(b): ',abs(b)   
       write(*,*) 'aint(a): ',aint(a),' aint(b): ',aint(b) 
       write(*,*) 'ceiling(a): ',ceiling(a),' ceiling(b): ',ceiling(b)   
       write(*,*) 'floor(a): ',floor(a),' floor(b): ',floor(b)  
        
       z = cmplx(a, b)
       write(*,*) 'z: ',z   
    end program numericFunctions
    

    當你編譯和執(zhí)行上面的程序,它會產(chǎn)生以下結(jié)果:

    abs(a): 15.2344999   abs(b): 20.7688999    
    aint(a): 15.0000000  aint(b): -20.0000000    
    ceiling(a): 16  ceiling(b): -20
    floor(a): 15  floor(b): -21
    z: (15.2344999, -20.7688999)
    

    數(shù)學函數(shù)

    功能描述
    ACOS(X) 它返回反余弦在范圍(0π,),以弧度表示。
    ASIN(X) 它返回反正弦在范圍(-π/ 2,π/ 2),以弧度表示。
    ATAN(X) 它返回該范圍中的反正切(-π/ 2,π/ 2),以弧度表示。
    ATAN2(Y,X) 它返回反正切的范圍(-π,π),以弧度表示。
    COS(X) 它返回的參數(shù)以弧度的余弦值。
    COSH(X) 它返回參數(shù)的弧度的雙曲余弦值。
    EXP(X) 它返回X的指數(shù)值
    LOG(X) 它返回X的自然對數(shù)值
    LOG10(X) 它返回常用對數(shù)(基數(shù)為10)X的值
    SIN(X) 它返回的參數(shù)以弧度的正弦值。
    SINH(X) 它返回的參數(shù)以弧度的雙曲正弦值。
    SQRT(X) 它返回X的平方根
    TAN(X) 它返回參數(shù)的弧度正切。
    TANH(X) 它返回參數(shù)的弧度的雙曲正切值。

    下面的程序一個時間后分別射彈的計算的水平和垂直位置x和y,叔:

    其中,X = UT COS A和Y = UT罪 - 克T2 / 2

    program projectileMotion  
    implicit none  
       ! define constants  
       real, parameter :: g = 9.8  
       real, parameter :: pi = 3.1415927  
       !define variables
       real :: a, t, u, x, y   
       !values for a, t, and u 
       a = 45.0
       t = 20.0
       u = 10.0
       ! convert angle to radians  
       a = a * pi / 180.0  
       x = u * cos(a) * t   
       y = u * sin(a) * t - 0.5 * g * t * t  
       write(*,*) 'x: ',x,'  y: ',y   
    end program projectileMotion
    

    當你編譯和執(zhí)行上面的程序,它會產(chǎn)生以下結(jié)果:

    x: 141.421356  y: -1818.57861  
    

    數(shù)字查詢函數(shù)

    這些功能與整數(shù)的某型號和浮點運算工作。該函數(shù)返回相同種類的變量X,它可以是真實的,在某些情況下整數(shù)的數(shù)的屬性。

    功能描述
    數(shù)字(X) 它返回的模型的顯著位數(shù)。
    EPSILON(X) 它返回相比一個是幾乎可以忽略不計的數(shù)目。換句話說,它返回最小值,使得實(1.0,種類(X))+ EPSILON(x)不等于實(1.0,種類(X))。
    巨大的(X) 它返回模型的數(shù)量最多
    MAXEXPONENT(X) 它返回該模型的最大指數(shù)
    MINEXPONENT(X) 它返回模型的最低指數(shù)
    PRECISION(X) 它返回小數(shù)精度
    基數(shù)(X) 它返回該模型的基
    RANGE(X) 它返回十進制指數(shù)范圍
    TINY(X) 它返回該模型的最小正數(shù)

    浮點操作函數(shù)

    功能描述
    指數(shù)(x) 它返回一個型號的指數(shù)部分
    分數(shù)(X)的它返回一個數(shù)的小數(shù)部分
    NEAREST(X,S) 它返回給定方向最近的不同處理器編號
    RRSPACING(X) 它返回型號的鄰近給定數(shù)量的相對間距的倒數(shù)
    SCALE(X,I) 它乘以它的基地實到的整數(shù)次冪
    SET_EXPONENT(X,I)的它返回一個數(shù)的指數(shù)部分
    間距(X) 它返回型號附近給定數(shù)量的絕對間距

    位操作功能

    功能描述
    BIT_SIZE(I) 它返回該模型的比特數(shù)
    BTEST(I,POS) 位測試
    IAND(I,J) 邏輯與
    IBCLR(I,POS) 清除位
    IBITS(I,POS,LEN) 比特提取
    IBSET(I,POS) 設(shè)置位
    IEOR(I,J) 異或
    IOR(I,J) 包容OR
    ISHFT(Ⅰ,SHIFT) 邏輯移位
    ISHFTC(I,SHIFT [,SIZE]) 循環(huán)移位
    NOT(Ⅰ) 邏輯補

    字符函數(shù)

    功能描述
    ACHAR(Ⅰ) 它返回ASCII碼排序序列的第i個字符。
    ADJUSTL(STRING) 它通過調(diào)節(jié)移除任何前導空格和插入尾隨空白左弦
    ADJUSTR(STRING) 它的權(quán)利通過刪除尾隨空格和插入前導空格調(diào)整字符串。
    CHAR(I [,KIND]) 它返回特定機器科幻?整理序列中的第i個字符
    IACHAR(C) 它返回ASCII排序序列中字符的位置。
    ICHAR(C) 它返回機器(處理器)特定網(wǎng)絡(luò)?整理序列中的字符的位置。
    INDEX(STRING,SUBSTRING [,BACK]) 它返回子串的字符串中最左邊(最右邊如果返回.TRUE。)起始位置。
    LEN(STRING) 它返回字符串的長度。
    LEN_TRIM(STRING) 它返回一個字符串的長度沒有結(jié)尾的空白字符。
    LGE(STRING_A,STRING_B) 詞法大于或等于
    LGT(STRING_A,STRING_B) 詞法上大于
    LLE(STRING_A,STRING_B) 詞法小于或等于
    LLT(STRING_A,STRING_B) 詞法上小于
    REPEAT(STRING,NCOPIES) 串聯(lián)重復(fù)
    SCAN(STRING,SET [,BACK]) 它返回屬于集,或者0,如果沒有屬于字符串的最左邊(最右邊如果返回.TRUE。)字符的索引。
    TRIM(STRING) 刪除結(jié)尾的空白字符
    VERIFY(STRING,SET [,BACK]) 驗證字符集的字符串

    種類函數(shù)

    功能描述
    KIND(X) 它返回的那種類型的參數(shù)值。
    SELECTED_INT_KIND(R)的它返回的那種特定網(wǎng)絡(luò)版的指數(shù)范圍類型的參數(shù)。
    SELECTED_REAL_KIND([P,R]) 實樣類型的參數(shù)值,指定精度和范圍

    邏輯功能

    功能描述
    邏輯(L [,KIND]) 邏輯與不同種類類型參數(shù)類型的對象之間的轉(zhuǎn)換

    Fortran語言 - 數(shù)字精度

    我們已經(jīng)討論了,在舊版本的Fortran,有兩個真正的類型:默認的實型和雙精度型。

    然而,F(xiàn)ortran語言90/95提供了真實和整數(shù)數(shù)據(jù)類型通過一種 specifie精確的控制。

    那種屬性

    不同類型的數(shù)字是計算機內(nèi)部存儲方式不同。 那種屬性允許您指定一個數(shù)字在內(nèi)部存儲。例如,

    real, kind = 2 :: a, b, c
    real, kind = 4 :: e, f, g
    integer, kind = 2 :: i, j, k
    integer, kind = 3 :: l, m, n
    

    在上述聲明中,實變量E,F(xiàn)和g具有比真實變量a,b和c更精確。整數(shù)變數(shù)l,m和n,可以存儲較大的值,并具有用于存儲比整數(shù)變量I,J和k多個數(shù)字。雖然這是依賴于機器。

    program kindSpecifier
    implicit none
       real(kind = 4) :: a, b, c
       real(kind = 8) :: e, f, g
       integer(kind = 2) :: i, j, k
       integer(kind = 4) :: l, m, n
       integer :: kind_a, kind_i, kind_e, kind_l
       kind_a = kind(a)
       kind_i = kind(i)
       kind_e = kind(e)
       kind_l = kind(l)
       print *,'default kind for real is', kind_a
       print *,'default kind for int is', kind_i
       print *,'extended kind for real is', kind_e
       print *,'default kind for int is', kind_l
    end program kindSpecifier
    

    當你編譯和執(zhí)行上面的程序它產(chǎn)生以下結(jié)果:

    default kind for real is 4
    default kind for int is 2
    extended kind for real is 8
    default kind for int is 4
    

    查詢變量的大小

    有許多內(nèi)在的功能,使您可以詢問數(shù)字的大小。

    例如,BIT_SIZE(?。?/b>內(nèi)部函數(shù)指定用于存儲的位數(shù)。對于實數(shù), 精度(x)的內(nèi)部函數(shù),返回的精度小數(shù)位數(shù),而范圍(x)的內(nèi)部函數(shù)返回指數(shù)的十進制范圍內(nèi)。

    program getSize
    implicit none
       real (kind = 4) :: a
       real (kind = 8) :: b
       integer (kind = 2) :: i
       integer (kind = 4) :: j
    
       print *,'precision of real(4) =', precision(a)
       print *,'precision of real(8) =', precision(b)
       
       print *,'range of real(4) =', range(a)
       print *,'range of real(8) =', range(b)
       
    
       print *,'maximum exponent of real(4) =' , maxexponent(a)
       print *,'maximum exponent of real(8) =' , maxexponent(b)
      
       print *,'minimum exponent of real(4) =' , minexponent(a)
       print *,'minimum exponent of real(8) =' , minexponent(b)
       
       print *,'bits in integer(2) =' , bit_size(i)
       print *,'bits in integer(4) =' , bit_size(j)
       
    end program getSize
    

    當你編譯和執(zhí)行上面的程序它產(chǎn)生以下結(jié)果:

    precision of real(4) = 6
    precision of real(8) = 15
    range of real(4) = 37
    range of real(8) = 307
    maximum exponent of real(4) = 128
    maximum exponent of real(8) = 1024
    minimum exponent of real(4) = -125
    minimum exponent of real(8) = -1021
    bits in integer(2) = 16
    bits in integer(4) = 32
    

    獲取種類值

    Fortran語言提供了兩個內(nèi)部函數(shù)來獲得一種價值整數(shù)和實數(shù)的精度要求:

    • selected_int_kind(r)的
    • selected_real_kind([P,R])

    該selected_real_kind函數(shù)返回一個整數(shù),是必要的一個給定的小數(shù)精度p和小數(shù)指數(shù)范圍r的那種類型的參數(shù)值。小數(shù)精度是顯著的位數(shù),而小數(shù)指數(shù)范圍規(guī)定了最小和最大可表示數(shù)。因此,該范圍是從10-R 10 + R。

    例如,selected_real_kind(P = 10,R = 99)返回需要10精確到小數(shù)點的那種價值,射程至少10-99到10 + 99。

    program getKind
    implicit none
       integer:: i
       i = selected_real_kind (p = 10, r = 99) 
       print *,'selected_real_kind (p = 10, r = 99)', i
    end program getKind
    

    當你編譯和執(zhí)行上面的程序它產(chǎn)生以下結(jié)果:

    selected_real_kind (p = 10, r = 99) 8
    

    Fortran語言 - 程序庫

    有各種各樣的Fortran工具和庫。有些是免費的,有些是有償服務(wù)。

    以下是一些免費的庫:

    • RANDLIB,隨機數(shù)和統(tǒng)計分布發(fā)電機
    • BLAS
    • EISPACK
    • GAMS-NIST指南可用數(shù)學軟件
    • 從NIST一些統(tǒng)計數(shù)據(jù)和其他程序
    • LAPACK
    • LINPACK
    • MINPACK
    • 泥敷美容面膜
    • NCAR數(shù)學庫
    • 入Netlib集合的數(shù)學軟件,文件和數(shù)據(jù)庫。
    • ODEPACK
    • ODERPACK,一組例程的排名和排序。
    • Expokit計算矩陣指數(shù)
    • SLATEC
    • SPECFUN
    • STARPAC
    • StatLib統(tǒng)計庫
    • TOMS
    • 排序和合并字符串

    以下庫是不是免費的:

    • 在NAG Fortran數(shù)值庫
    • 在Visual Numerics的IMSL庫
    • 數(shù)字食譜

    Fortran語言 - 編程風格

    編程風格是所有關(guān)于在開發(fā)項目如下一些規(guī)則。這些好的做法傳授像可讀性價值觀和明確性到您的程序。

    一個好的程序應(yīng)該具有以下特點:

    • 可讀性
    • 正確的邏輯結(jié)構(gòu)
    • 自注釋和評論

    例如,如果你做類似下面的評論,它不會有很大幫助:

    ! loop from 1 to 10 
    do i=1,10  
    

    不過,如果你正在計算二項式系數(shù),需要這個循環(huán)NCR的那么像這樣的評論會有所幫助:

    ! loop to calculate nCr 
    do i=1,10
    
    • 縮進代碼塊,使代碼明確各級。

    • 自我檢查代碼,以確保零會有像師沒有數(shù)值誤差,負實數(shù)的負實數(shù)或?qū)?shù)的平方根。

    • 包括確保變量不采取非法或超范圍值,即輸入驗證規(guī)范。

    • 不把檢查哪里會是不必要的,減慢執(zhí)行。例如:

    real :: x 
    x = sin(y) + 1.0
    if (x >= 0.0) then
    z = sqrt(x)
    end if
    
    • 顯然,采用適當?shù)乃惴ň帉懙拇a。
    • 使用拆分延續(xù)標記'和'長表達式。
    • 做有意義的變量名。

    Fortran語言 - 調(diào)試程序

    調(diào)試器工具被用來搜索在程序中的錯誤。

    調(diào)試器程序通過代碼幾步之遙,可以讓你的程序的執(zhí)行過程中檢查變量和其他數(shù)據(jù)對象的值。

    它加載的源代碼,你都應(yīng)該運行調(diào)試器內(nèi)的程序。調(diào)試器調(diào)試程序是:

    • 設(shè)置斷點,
    • 通過源代碼步進,
    • 設(shè)置觀察點。

    斷點指定程序就停止了,代碼的臨界線后,專門。這些變量后,程序執(zhí)行在斷點處進行檢查。

    調(diào)試程序也被檢查行源代碼行。

    觀看點是在需要某些變量的值進行檢查,特別是后一個讀或?qū)懖僮鞯母鼽c。

    gdb調(diào)試器

    gdb調(diào)試器,GNU調(diào)試自帶的Linux操作系統(tǒng)。對于X窗口系統(tǒng),GDB帶有一個圖形界面和程序被命名為xxgdb。

    下表列出了GDB的一些命令:

    命令目的
    打破設(shè)置斷點
    開始執(zhí)行
    續(xù)繼續(xù)執(zhí)行
    下一個只執(zhí)行源代碼的下一行,沒有踏進任何函數(shù)調(diào)用
    由跨入一個函數(shù)在函數(shù)調(diào)用的情況下執(zhí)行的源代碼中的下一行。

    dbx調(diào)試器

    還有另外一個調(diào)試器,dbx調(diào)試器的Linux版本。

    下表列出了dbx中的一些命令:

    命令目的
    停止[VAR] 設(shè)置斷點時的變量var的值更改。
    停止[PROC] 輸入一個程序進程內(nèi),當它停止執(zhí)行
    停在[行] 它設(shè)置在指定行斷點。
    開始執(zhí)行。
    續(xù)繼續(xù)執(zhí)行。
    下一個只執(zhí)行源代碼的下一行,沒有踏進任何函數(shù)調(diào)用。
    由跨入一個函數(shù)在函數(shù)調(diào)用的情況下執(zhí)行的源代碼中的下一行。

    以上內(nèi)容是否對您有幫助:
    在線筆記
    App下載
    App下載

    掃描二維碼

    下載編程獅App

    公眾號
    微信公眾號

    編程獅公眾號

    <rt id="igkgy"></rt>
  • <tfoot id="igkgy"><tbody id="igkgy"></tbody></tfoot><code id="igkgy"></code>