Fortran

Fortran総合練習問題

小さな課題を解き、実行結果と境界値を確認して理解を固めます。

Fortran入門の講座一覧

01

基本問題:温度変換

摂氏を入力し、華氏へ変換してください。式はfahrenheit = celsius * 9.0 / 5.0 + 32.0です。整数ではなくrealを使う理由も説明できるようにしましょう。

確認するケース
  • 摂氏0度が華氏32度になるか
  • 摂氏100度が華氏212度になるか
  • 負の温度を入力しても計算できるか
02

配列問題:統計値

10個の実数を配列へ入れ、合計、平均、最大値、最小値、平均以上の個数を表示してください。組み込み関数を使う版と、doで自分で計算する版を比べます。

解答の中心部分FORTRAN
average = sum(values) / real(size(values))
print *, 'sum:', sum(values)
print *, 'max:', maxval(values)
print *, 'min:', minval(values)
print *, 'above:', count(values >= average)

平均以上を「平均より大きい」とするのか「平均以上」とするのかで結果が変わります。条件を日本語で書いてからコードへ直しましょう。

03

ファイル問題:測定値の集計

measurements.txtの数値を最後まで読み込み、件数、合計、平均をsummary.txtへ書き出してください。ファイルが開けない場合、空ファイルの場合、途中に不正な値がある場合をどう扱うかも考えます。

実装のチェックリストFORTRAN
open(newunit=unit, file='measurements.txt', status='old', &
     action='read', iostat=ios)
! iosを確認する
! doとread(iostat=ios)で値を読む
! countが0なら平均を計算しない
! writeでsummary.txtへ保存する
04

解答例と次の課題

解答はまず自分で作成し、入力例で結果を確認してから次の例と比べてください。

配列集計の完全な例FORTRAN
program summary
    implicit none
    real :: values(5) = [12.0, 18.0, 15.0, 20.0, 10.0]
    real :: average
    average = sum(values) / real(size(values))
    print *, 'count:', size(values)
    print *, 'average:', average
    print *, 'above:', count(values >= average)
end program summary
実行結果OUTPUT
 count:           5
 average:   15.0000000
 above:           3

次は、派生型へ測定値と日時をまとめる、モジュールへ統計処理を移す、CやPythonから呼び出す、OpenMPやMPIで並列化する、といった発展へ進めます。詳細はGNU Fortran公式マニュアルで確認してください。