-Fortran- 出力の書式関数

入出力の際に数値や文字を整形して体裁を整えるには,書式を指定します.
以下に,書式付き出力の例を示すためのプログラム例を示します.

PROGRAM format
  CHARACTER(30):: CHAR1 = 'Fortran is'
  CHARACTER(20):: CHAR2 = ' FOrmula TRANslation.'
  WRITE(*,'(a7)') CHAR1
  WRITE(*,'(a,a)') CHAR1, CHAR2
  WRITE(*,'(a,a)') TRIM(CHAR1), TRIM(CHAR2)

 

END PROGRAM format
 
このプログラムをコンパイル,実行すると以下のようになります.

$ gfortran format.f90
$ ./a.out
Fortran
Fortran is                     FOrmula TRANslation.
Fortran is FOrmula TRANslation.
 
上記のように,write文の括弧内のカンマの右側に')'という区切りを設けて,その括弧内に書式を記述します.
文字型変数の場合には,'(a*)'という書式を用い,'*'の部分には整数(変数名ではなく数字)を書きます.そうすると,文字列の先頭からその整数の個数分の文字が出力されます.なお,整数を省略すると,変数の全ての文字が出力されます.
上記の例では,'WRITE(*,'(a7)') CHAR1'として文字列'CHAR1'の先頭の7文字分を出力しています.
また,5行目のようにWRITE(*,'(a,a)') CHAR1, CHAR2とすると,2つの文字型変数の後続の空白部分も含む全ての文字列が出力されます(3行目で'CHARACTER(20):: CHAR2 = ' FOrmula TRANslation.''として,'FOrmula'の前に半角の空白があることに注意).
 
組込み関数を使用すると,後続の空白を取り除いた文字列が出力されます .

また,以前の投稿にもあるように,キーボード入力を促す際には,以下の出力を行います.
      WRITE(*,fmt='(a)', advance='no''Input n: '
書式の'(a)'出力対象はWRITE文の後に続く文字定数'Input n: 'です.
また,'advance='no''は,改行を抑制する指定です.コンパイラによっては,
      WRITE(*,'(a)', advance='no''Input n: '
      WRITE(*,'(a\)''Input n: '
としても良いようですが,gfortranではコンパイルエラーとなります.ちなみに,デフォルトでは,'advance='yes''という設定になっており'WRITE'文は1回実行される毎に改行を行う設定となっています.,'advance='no''は,改行を抑制する指定です.


次に,整数型,および実数型の変数に対する書式付き出力プログラム例を示します.

PROGRAM format
  IMPLICIT NONE
  INTEGER:: i, ivar(4) = (/ (i, i = 1001, 1004) /)
  REAL(8):: xvar(4) = (/ 1.234d1, 0.0d0, -1.234d-2, -9.999d-1 /)
 
  DO i = 1, 4
    WRITE(*,'(i10, f10.2, e12.4)') ivar(i), xvar(i), xvar(i)
  ENDDO

 

END PROGRAM format
 
このプログラムをコンパイル,実行すると以下のようになります.
$ gfortran format.f90
$ ./a.out
      1001     12.34  0.1234E+02
      1002      0.00  0.0000E+00
      1003     -0.01 -0.1234E-01
      1004     -1.00 -0.9999E+00

このプログラムでは,整数型変数ivar(i)の出力書式に関して,'i10'という書式が指定されています.これは,全体の文字数を10個分確保して,その中に右詰めで整数値を書き出すという書式です.もし,全体の文字数が足りないとオーバーフローを起こして,文字数分の*が出力されて,値は確認できません(以下の例は.'i2'とした例).

**     12.34  0.1234E+02
**      0.00  0.0000E+00
**     -0.01 -0.1234E-01
**     -1.00 -0.9999E+00

続いて,''は,全体の文字数を10個確保して,その中で小数点以下2桁の数値を右詰めで書く書式です.
全体の文字数をw,小数点以下の数値の個数をdとすると,小数点と1の位の数値,また,マイナス符号が付く文字数を考慮すると,w≧d+3であることが最低限必要になります.
例えば,-10を'f5.2'という書式で出力しようとすると,-10.00と文字数が6個必要になるので,オーバーフローを起こしてしまいます.

数値計算では,上記のような'f5.2'という形式よりも,'e12.4'のような指数形式の書式(出力)が使われる場合が多くなります.'e12.4'は,全体の文字数を12個確保して,10の指数形式(12.34 を 0.1234x10^2と表す形式)で,小数点以下を4桁表示する書式です.
全体の文字数と小数点以下の数値の個数をそれぞれw,およびdと表すとき,w≧d+7であることが必要となります(指数の符号,数値2桁分,E,先頭の符号,1の位の数値,小数点の文字数が必要であるため).

同様な書式を繰り返し利用するには,以下のような書式指定があります.
    WRITE(*,'(4e12.4)') xvar(1:4)
この書式では,同じ行に'e12.4'の書式で4つの出力が行われます.