書式

数値の全体の桁数や小数点以下の桁数といった出力形式のことを「書式」 (format) といいます.

入出力における書式の指定

次のプログラムは,整数を10桁,浮動小数点数を全体10桁・小数点以下5桁で画面に出力します.

program work1201
  implicit none
  integer :: n
  do n = 1, 5
     write(*,'(I10,I10,F10.5)') n, n**3, sqrt(dble(n))
  end do
  stop
end program work1201

このプログラムを実行すると,次のような出力が得られます. (1行目の数字は桁数を見やすくするためにつけた番号で,画面には表示されません.)

123456789012345678901234567890
         1         1   1.00000
         2         8   1.41421
         3        27   1.73205
         4        64   2.00000
         5       125   2.23607

2つの整数 n と n**3 がそれぞれ10桁,浮動小数点数 sqrt(dble(n)) が全体10桁・小数点以下5桁で結果が表示されていることがわかります. 書式の指定は I10F10.5 など「編集記述子」で行います.

いろいろな編集記述子

編集記述子は整数型と実数型で異なります.

整数型

整数型データの書式指定には Iw または Iw.m 型の編集記述子を用います. それぞれ次のような意味があります.

Iw        整数を w 桁で出力する.
Iw.m      整数を w 桁で出力する.符号なし整数が少なくとも m 桁になるように,
          必要なら先頭に 0 を付加する.w >= m でなければならない.

以下に例を示します.

    整数値     編集記述子      出力欄
-----------------------------------------------------------------
     12345     I5              12345
    -12345     I5              *****
     12345     I10                  12345
     12345     I10.6               012345
    -12345     I10.7             -0012345

指定した書式で表示できない場合は ***** のようになってしまうので注意しましょう.

実数型

実数型データの書式指定には Fw.d または Ew.d 型の編集記述子を用います. w は欄の幅(全体の桁数), d は小数部の桁数を表します. E 型の編集記述子は実数を仮数部と指数部(基数は10)に分けて表示します. 例えば, 0.12E+03 は 0.12×10^3 を表します.

    実数値     編集記述子     出力欄
-----------------------------------------------------------------
   123.456     F7.2            123.46
  -123.456     F10.5          -123.45600
   12.3456     F5.3           *****
  0.012345     E12.5           0.12345e-01
  -123.456     E12.5          -0.12346e+03
   1.23456     E5.2           *****

実数型の書式を使う場合は次の点に注意しましょう.

文字型

文字型データの書式指定には Aw 形編集記述子を用います. w は欄の幅を表します.

    文字列     編集記述子     出力欄
-----------------------------------------------------------------
   'ABCDE'     A              ABCDE
   'ABCDE'     A7               ABCDE
   'ABCDE'     A3             ABC

文字型データの場合,欄が不足すると文字列が切り捨てられて表示されます.

X形編集記述子

X 形編集記述子は「空白」を意味します. 一般に nX と書き,出力においては n 個の空白の表示,入力においては n 桁だけ読み飛ばす(入力を無視する)ことを意味します.

反復可能編集記述子

I 形, F 形, E 形, A 形, X 形などの編集記述子は 3I5 のように左側に繰り返し回数(この例では 3)を指定することができます.

write(*,'(3I5)') (i, i = 1, 5)

は整数を5桁で3個ずつ表示します.

12345678901234567890
    1    2    3
    4    5

前回までの課題

やり残している課題があればそれを片付けましょう.

今週の問題

ユークリッドの互除法

2つの整数 a, b の最大公約数は次の「ユークリッドの互除法」によって求めることができる. 変数 a, b, m, n, k は integer 型とする.

ユークリッドの互除法によって最大公約数を求める関数副プログラム gcm() を作成せよ.

! 2つの整数 a, b の最大公約数を求める関数
integer function gcm(a, b)
  implicit none
  integer :: a, b, m, n, k

  m = a
  n = b
  do
     !*****************************************************************
     ! この部分を自分で考えましょう
     !*****************************************************************
  end do

  return
end function gcm

! gcm() のチェックプログラム
program main
  implicit none
  integer :: a, b, gcm

  write(*,*) 'Input A and B'
  read(*,*) a, b
  write(*,*) gcm(a, b)

  stop
end program main

最小公倍数

2つの整数 a, b の最小公倍数を求める関数 lcm() を作成せよ. 最大公約数を求める関数 gcm() を利用してよい.

! 2つの整数 a, b の最小公倍数を求める関数
integer function lcm(a, b)
  implicit none
  integer :: a, b

  !*****************************************************************
  ! この部分を自分で考えましょう
  !*****************************************************************

  return
end function lcm

! lcm() のチェックプログラム
program main
  implicit none
  integer :: a, b, gcm

  write(*,*) 'Input A and B'
  read(*,*) a, b
  write(*,*) lcm(a, b)

  stop
end program main

最大公約数 (2)

3個の整数 a, b, c の最大公約数を求める関数 gcm3() を作成せよ. 2つの整数 a, b の最大公約数を求める関数 gcm() を利用してよい.

! a, b, c の最大公約数を求める
integer function gcm3(a, b, c)
  implicit none
  integer :: a, b, c
  integer :: gcm

  !*****************************************************************
  ! ここを自分で考えましょう
  !*****************************************************************

  return
end function gcm3