書式
数値の全体の桁数や小数点以下の桁数といった出力形式のことを「書式」 (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桁で結果が表示されていることがわかります.
書式の指定は I10
や F10.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 *****
実数型の書式を使う場合は次の点に注意しましょう.
Fw.d
形編集記述子では,符号と小数点のための欄を考慮して,w>d+2
でなければならない.Ew.d
形編集記述子では,符号,整数部の 0,小数部,指数部のための欄を考慮して,w>d+7
でなければならない.
文字型
文字型データの書式指定には 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 型とする.
- step 1: a, b をそれぞれ変数 m, n に代入する.(引数 a, b の値を変更しないようにするため)
- step 2: m を n で割ったあまりを k とする.
- step 3: k が 0 なら n が求める最大公約数である.k が 0 でなければ step 4 へ.
- step 4: m に n の値を代入し,n に k の値を代入して step 2 へ戻る.
ユークリッドの互除法によって最大公約数を求める関数副プログラム 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