[itbase2019]Fortran 実習 サブルーチンと関数 練習問題

練習問題 1

キーボードから温度を入力し, 飽和水蒸気圧を計算するプログラムを作りなさい. ただし, 飽和水蒸気圧を計算する部分はサブルーチンまたは関数の形にすること. また, そのプログラムを用いて, 0℃, 100℃における飽和水蒸気圧を計算しなさい. さらに, 富士山の山頂 (標高 3776 m, 気圧約 650 hPa) において水が沸騰する温度を求めなさい.

なお, 飽和水蒸気圧は下のように表されることを用いてよい.

<URL:https://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2019/images/eq_tetens.png>

ここで, T は温度 [℃], a = 7.5, b = 237.3 である.

この式は, Tetens (1930) による水の表面での飽和水蒸気圧の式である. (飽和水蒸気圧は, 液体の H2O の表面上と固体の H2O (氷) の表面上では異なる.)

ヒント

  • 順番に少しずつ作ってみましょう.
  • 画面に "Input a temperature (degrees Celsius): " と表示して入力を促します.
  • キーボードから入力した温度を変数に読み込みます.
  • 関数 (例えば calcsatvappress; calculate saturation vapor pressure) を定義します.
    • 引数は温度です.
    • 関数内で飽和蒸気圧を計算します.
    • 戻り値に計算結果を代入します.
  • 主プログラムから関数を呼び出します.
  • 結果を画面に出力します.
  • プログラムの計算は正しいか考えてみましょう.
    • 日常生活の中で良く知っている条件で飽和蒸気圧を計算して確認しましょう.
  • 富士山の山頂での沸騰する温度を求めるには, 使った関数に様々な温度を代入してそれらしい値を探してみます.
    • もちろん, 飽和蒸気圧の式を温度を求める式に書き直すことで求めることもできます.

練習問題 2

(練習問題 1 で作ったプログラムを基にして,) キーボードから温度, 湿度, 気圧を入力し, 空気分子中に含まれる 水蒸気分子の割合を計算するプログラムを作りなさい. そのプログラムを用いて今日の神戸市において, 空気分子 10000 個の中に 何個の水蒸気分子が含まれているか求めなさい.

なお, 今日の神戸市の温度, 湿度, 気圧は<ここ>で調べることができる.

ヒント

  • 「湿度」とは何であるか考えてみましょう?
    • 湿度 100% とはどういう状態でしょう?
  • 空気分子中の水蒸気分子の割合は, 水蒸気圧 (水蒸気の分圧) と気圧 (全圧) の比と等しいです. 「普通」は.

練習問題 3

キーボードから整数 n を入力し, 1! + 2! + 3! + ... + n! (! は階乗を表す) を計算するプログラムを作りなさい. ただし, それぞれの整数の階乗を計算する部分はサブルーチンまたは関数の形にすること.

ヒント

  • 順番に少しずつ作ってみましょう.
  • 画面に "Input a number: " と表示して入力を促します.
  • キーボードから入力した整数を変数 n に読み込みます.
  • 関数 calcfact を定義します.
    • 引数は整数 n です.
    • 関数内で n の階乗を計算します.
    • 戻り値に計算結果を代入します.
  • 主プログラムから関数 calcfact を繰り返し呼び出し, 戻り値の和を計算します.

練習問題 4

1 月 1 日から 1 年分の日数とその月と日を表示するプログラムを作りなさい. ただし, 1 月 1 日からの日数を基にして, それが何月何日になるかを計算する部分は サブルーチンの形にすること.

出力例 (閏年でない場合)

$ ./showcal
    0     1/ 1
    1     1/ 2
    2     1/ 3
    3     1/ 4
    4     1/ 5
    ...
   30     1/31
   31     2/ 1
   32     2/ 2
    ...
  362    12/29
  363    12/30
  364    12/31

ヒント

  • 順番に少しずつ作ってみましょう. 一つのやり方は, 下のような方法でしょう.
    • 1 月 1 日からの日数である 0, 1, 2, ..., 364 までをループさせます.
    • それぞれの数字に対して, それが何月何日になるかを求めて表示させましょう.
  • サブルーチン calcmonthday を定義します.
    • 引数は一つの整数と, 答えとなる二つの整数 (月と日) です.
    • サブルーチンの中で月と日を計算します.

      • 入力した日数 (n) が 1 月の総日数 (31) よりも小さければ, 答えは 1 月 n+1 日です.
      • 入力した日数 (n) が 1 月の総日数 (31) よりも大きければ, n = n - 31 を計算します.
      • n が 2 月の総日数 (28) よりも小さければ, 答えば 2 月 n+1 日です.
      • n が 2 月の総日数 (28) よりも大きければ...

      ...

    • 引数の月と日の変数に答えを代入します.
  • 主プログラムからサブルーチン calcmonthday を呼び出します.
  • 結果を画面に出力します.
    • 上の出力例のようにするためには書式を工夫する必要があるかもしれません.
  • サブルーチンを呼び出すときに与える日数を繰り返しにより 0 から 364 まで繰り返します.

練習問題 5

<このデータファイル>は, 世界の国の首都の経度と緯度のリストです.

このリストを使って, 神戸 (東経 135.2 度, 北緯 34.7 度) から近い順に 国の名前を出力するプログラムを作りなさい. ただし, 神戸市からそれぞれの国の首都までの距離を計算する部分はサブルーチンまたは関数の形にすること.

注意

ファイルの冒頭 2 行は, ファイルの内容の説明文です. ただし, Fortran ではヘッダーの文字が邪魔になるかもしれません. 下のような方法で回避することができる.

  • ファイルを読み込む部分の最初に,

    read( <装置番号>, * )

    をヘッダーの行の回数だけ繰り返せばヘッダー部分を読み飛ばすことができる.

  • あるいは, Fortran プログラムでファイルの数値を読む前に, エディタを使ってファイルの中のヘッダーを削除してしまうと簡単である.
  • 国の名前は数字ではありませんので, 整数型や実数型の変数に読み込むことはできません. 文字型の変数を使いましょう.

ヒント

  • 順番に少しずつ作ってみましょう.
  • 国の名前と各国の首都の経度, 緯度をそれぞれ別々の配列に読み込みます.
  • 神戸市からある経度, 緯度の地点までの距離を計算するサブルーチンまたは関数を定義します.
  • 各国の首都の神戸からの距離を納める配列を用意し, 上で作成したサブルーチンまたは関数を繰り返し使うことによってすべての首都の神戸からの距離を計算します.
  • 各国の首都の神戸からの距離を基にして, 順番を入れ替えましょう.
  • 結果を画面に出力します.
Last modified:2020/01/16 10:15:11
Keyword(s):
References:[[itbase2019]惑星学実験実習の基礎II]