Fortran的快速指南

2018-12-12 14:24 更新

Fortran語言 - 概述

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

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

它支持:

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

有關(guān)Fortran的事實(shí)

  • Fortran語言是由一個(gè)團(tuán)隊(duì),于1957年由約翰·巴克斯在IBM領(lǐng)導(dǎo)創(chuàng)建的。

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

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

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

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

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

  • 最早的版本仍然在使用的Fortran IV標(biāo)準(zhǔn),和Fortran 66。

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

  • Fortran 77的字符串添加作為一個(gè)獨(dú)特的類型。

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

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

在Windows中設(shè)置的Fortran

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

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

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

如何使用G95

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

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

對(duì)于G95命令行選項(xiàng):

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

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

Fortran語言 - 基本語法

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

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

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

Fortran中一個(gè)簡單的程序

讓我們寫一個(gè)程序,增加了兩個(gè)數(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        

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

The total is 27.0000000    

請(qǐng)注意:

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

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

  • 在Fortran語言注釋開始與感嘆號(hào)(!),因?yàn)樵谶@之后的所有字符(除了在一個(gè)字符串)被編譯器忽略。

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

  • 行代碼的縮進(jìn)是保持一個(gè)程序讀取一個(gè)很好的做法。

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

基本

基本字符集的Fortran包含:

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

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

程序語句是由令牌。

識(shí)別碼

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

  • 它不能超過31個(gè)字符。

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

  • 名稱的第一個(gè)字符必須是字母。

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

關(guān)鍵詞

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

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

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

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

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

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

整型

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

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

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

2147483647

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

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

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

32767
2147483647
9223372036854775807
170141183460469231731687303715884105727
2147483647

實(shí)型

它存儲(chǔ)浮點(diǎn)數(shù),例如2.0,3.1415,-100.876等

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

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

下面的例子說明了如何使用真實(shí)的數(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  

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

0.666666687    
0

復(fù)雜類型

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

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

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

邏輯類型

僅存在兩個(gè)邏輯值:.TRUE。.FALSE。

字符類型

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

例如,

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

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

隱式類型

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

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

implicit none

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

Fortran語言 - 變量

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

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

  • 它不能超過31個(gè)字符。

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

  • 名稱的第一個(gè)字符必須是字母。

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

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

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

變量聲明

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

語法變量聲明如下:

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,賦值給一個(gè)復(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

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

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

Fortran語言 - 常量

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

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

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

命名常量和文字

有兩種類型的常量:

  • 字面常量
  • 命名常量

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

例如,以下是文字常量:

類型
整型常量 01-1 300 123456789
實(shí)常數(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 $%#@!

'撇號(hào)'''

命名常量的值以及名稱。

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

real, parameter :: pi = 3.1415927

下面的程序計(jì)算位移,由于在重力作用下垂直運(yùn)動(dòng)。

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

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

Time = 5.00000000    
Displacement = 127.374992    

Fortran語言 - 操作員

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

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

讓我們來看看所有這些類型的運(yùn)營商逐一。

算術(shù)運(yùn)算符

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

顯示示例

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

關(guān)系運(yùn)算符

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

顯示示例

=

    • 操作者當(dāng)量描述
      == .EQ。 檢查,如果兩個(gè)操作數(shù)的值相等與否,如果是,則條件變?yōu)檎妗? (A == B)是不正確的。
      / = .NE。 檢查,如果兩個(gè)操作數(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

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

      1
      1
      5
      5
      8
      8
      

      一個(gè)指針可以是:

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

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

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

      抵消不清空目標(biāo),因?yàn)榭赡艽嬖谝粋€(gè)以上的指針指向同一目標(biāo)。然而,排空指針意味著無效也。

      例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
      

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

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

      請(qǐng)注意,每次運(yùn)行代碼時(shí),內(nèi)存地址會(huì)有所不同。

      例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
      

      當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(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ù)的方式。它由一個(gè)字符串,包含編輯描述符的括號(hào)中的列表。

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

      例如:

      Print "(f6.3)", pi
      

      下表描述了描述:

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

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

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

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

      以下符號(hào)用于與格式描述符:

      符號(hào)描述
      C 列號(hào)
      e 中位數(shù)為實(shí)際輸入或輸出的小數(shù)位的權(quán)
      要顯示的最小位數(shù)
      ? 空格數(shù)跳過
      - [R 重復(fù)計(jì)數(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
      

      當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(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
      

      當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(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
      

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

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

      該聲明的格式

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

      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
      

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

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

      Fortran語言 - 文件輸入輸出

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

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

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

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

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

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

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

      open (list-of-specifiers)
      

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

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

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

      close語句的語法如下:

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

      請(qǐng)注意,括號(hào)中的參數(shù)是可選的。

      本實(shí)施例說明打開一個(gè)新文件的某些數(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
      

      當(dāng)上述代碼被編譯和執(zhí)行時(shí),它創(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ù)符的已在上表中進(jìn)行討論。

      結(jié)束= S說明是一個(gè)語句標(biāo)號(hào)所在的程序跳轉(zhuǎn),當(dāng)它到達(dá)檔案結(jié)尾。

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

      在這個(gè)項(xiàng)目中,我們從文件中讀取,我們?cè)谧詈笠粋€(gè)例子創(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
      

      當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(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í)行一個(gè)明確的任務(wù),可以從你的程序中調(diào)用語句。信息(或數(shù)據(jù))被傳遞給調(diào)用的程序,向步驟作為參數(shù)。

      有兩種類型的程序:

      • 功能
      • 子程序

      功能

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

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

      句法:

      語法功能如下:

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

      下面的示例演示一個(gè)名為功能area_of_circle。它計(jì)算半徑為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
      

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

      The area of a circle with radius 2.0 is
         12.5663710   
      

      請(qǐng)注意:

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

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

      結(jié)果選項(xiàng)

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

      您可以指定返回變量名:

      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)用的子程序。

      下面的例子演示了一個(gè)子程序交換,改變其參數(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
      

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

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

      指定參數(shù)的意圖

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

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

      下面的例子演示了這個(gè)概念:

      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
      

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

      The value of the discriminant is
         17.0000000    
      

      遞歸過程

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

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

      當(dāng)一個(gè)函數(shù)被遞歸使用, 結(jié)果選項(xiàng)被使用。

      以下是一個(gè)例子,它計(jì)算階乘用于使用遞歸過程的給定數(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)部程序

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

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

      下面的例子演示了這個(gè)概念:

      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   
      

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

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

      Fortran語言 - 模塊

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

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

      模塊用于:

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

      一個(gè)模塊的語法

      一個(gè)模塊由兩部分組成:

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

      模塊的一般形式是:

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

      使用一個(gè)模塊到你的程序

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

      use name  
      

      請(qǐng)注意

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

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

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

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

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

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

      下面的例子演示了這個(gè)概念:

      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
      

      當(dāng)你編譯和執(zhí)行上面的程序,它會(huì)產(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   
      

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

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

      但是,你可以控制的模塊代碼使用私人公共屬性的可訪問性。當(dāng)你聲明一些變量或子程序?yàn)樗接?,這不是可用的模塊外。

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

      在前面的例子中,我們有兩個(gè)模塊變量,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
      

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

         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
      

      當(dāng)你編譯和執(zhí)行上面的程序,它會(huì)產(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ù)學(xué)函數(shù)
      • 數(shù)字查詢函數(shù)
      • 浮點(diǎn)操作函數(shù)
      • 位操作功能
      • 字符函數(shù)
      • 種類函數(shù)
      • 邏輯函數(shù)
      • 陣列功能。

      我們?cè)陉嚵姓鹿?jié)討論的陣列功能。在下面的部分,我們提供的其他類別所有這些功能的簡要說明。

      在功能名稱列,

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

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

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

      當(dāng)你編譯和執(zhí)行上面的程序,它會(huì)產(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ù)學(xué)函數(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的自然對(duì)數(shù)值
      LOG10(X) 它返回常用對(duì)數(shù)(基數(shù)為10)X的值
      SIN(X) 它返回的參數(shù)以弧度的正弦值。
      SINH(X) 它返回的參數(shù)以弧度的雙曲正弦值。
      SQRT(X) 它返回X的平方根
      TAN(X) 它返回參數(shù)的弧度正切。
      TANH(X) 它返回參數(shù)的弧度的雙曲正切值。

      下面的程序一個(gè)時(shí)間后分別射彈的計(jì)算的水平和垂直位置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
      

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

      x: 141.421356  y: -1818.57861  
      

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

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

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

      浮點(diǎn)操作函數(shù)

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

      位操作功能

      功能描述
      BIT_SIZE(I) 它返回該模型的比特?cái)?shù)
      BTEST(I,POS) 位測(cè)試
      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(Ⅰ) 邏輯補(bǔ)

      字符函數(shù)

      功能描述
      ACHAR(Ⅰ) 它返回ASCII碼排序序列的第i個(gè)字符。
      ADJUSTL(STRING) 它通過調(diào)節(jié)移除任何前導(dǎo)空格和插入尾隨空白左弦
      ADJUSTR(STRING) 它的權(quán)利通過刪除尾隨空格和插入前導(dǎo)空格調(diào)整字符串。
      CHAR(I [,KIND]) 它返回特定機(jī)器科幻?整理序列中的第i個(gè)字符
      IACHAR(C) 它返回ASCII排序序列中字符的位置。
      ICHAR(C) 它返回機(jī)器(處理器)特定網(wǎng)絡(luò)?整理序列中的字符的位置。
      INDEX(STRING,SUBSTRING [,BACK]) 它返回子串的字符串中最左邊(最右邊如果返回.TRUE。)起始位置。
      LEN(STRING) 它返回字符串的長度。
      LEN_TRIM(STRING) 它返回一個(gè)字符串的長度沒有結(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]) 驗(yàn)證字符集的字符串

      種類函數(shù)

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

      邏輯功能

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

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

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

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

      那種屬性

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

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

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

      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
      

      當(dāng)你編譯和執(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(ⅰ)內(nèi)部函數(shù)指定用于存儲(chǔ)的位數(shù)。對(duì)于實(shí)數(shù), 精度(x)的內(nèi)部函數(shù),返回的精度小數(shù)位數(shù),而范圍(x)的內(nèi)部函數(shù)返回指數(shù)的十進(jìn)制范圍內(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
      

      當(dāng)你編譯和執(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語言提供了兩個(gè)內(nèi)部函數(shù)來獲得一種價(jià)值整數(shù)和實(shí)數(shù)的精度要求:

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

      該selected_real_kind函數(shù)返回一個(gè)整數(shù),是必要的一個(gè)給定的小數(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ù)點(diǎn)的那種價(jià)值,射程至少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
      

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

      selected_real_kind (p = 10, r = 99) 8
      

      Fortran語言 - 程序庫

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

      以下是一些免費(fèi)的庫:

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

      以下庫是不是免費(fèi)的:

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

      Fortran語言 - 編程風(fēng)格

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

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

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

      例如,如果你做類似下面的評(píng)論,它不會(huì)有很大幫助:

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

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

      ! loop to calculate nCr 
      do i=1,10
      
      • 縮進(jìn)代碼塊,使代碼明確各級(jí)。

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

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

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

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

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

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

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

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

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

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

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

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

      gdb調(diào)試器

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

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

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

      dbx調(diào)試器

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

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

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

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

      掃描二維碼

      下載編程獅App

      公眾號(hào)
      微信公眾號(hào)

      編程獅公眾號(hào)