IT pass HikiWiki - [itbase2023]Fortran 実習 サブルーチンと関数 練習問題 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

{{toc_here}}

#= 練習問題 1
#
#ジョギング時の消費カロリー (kcal) は, 大雑把にその人の体重 (kg) と距離 (km) の積となるそうです.
#
#キーボードから体重とジョギングの距離を入力し,
#消費カロリーを計算するプログラムを作りなさい.
#ただし, 体重と距離から消費カロリーを計算する部分は関数の形で書くこと.
#
#
#== ヒント
#
#* 順番に少しずつ作ってみましょう.
#* 画面に "Input a weight (kg): " と表示して入力を促します.
#* キーボードから入力した体重を変数 weight に読み込みます.
#* 画面に "Input a distance (km): " と表示して入力を促します.
#* キーボードから入力した距離を変数 distance に読み込みます.
#* 関数 calccalory を定義します.
#  * 引数は weight と distance です.
#  * 関数内で消費カロリーを計算します.
#  * 戻り値 calory に計算結果を代入します.
#* 主プログラムから関数 calccalory を呼び出します.
#* 結果を画面に出力します.


= 練習問題 1

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

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

((<URL:https://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2023/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) を定義します.
  * 引数は温度です.
  * 関数内で飽和蒸気圧を計算します.
  * 戻り値に計算結果を代入します.
* 主プログラムから関数を呼び出します.
* 結果を画面に出力します.
* プログラムの計算は正しいか考えてみましょう.
  * 日常生活の中で良く知っている条件で飽和蒸気圧を計算して確認しましょう.
* 富士山の山頂での沸騰する温度を求めるには, 使った関数に様々な温度を代入してそれらしい値を探してみます.
  * もちろん, 飽和蒸気圧の式を温度を求める式に書き直すことで求めることもできます.
* ((<プログラム例|URL:http://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2023/fortran_program/satpress.f90>))


= 練習問題 2

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

なお, 今日の国内の温度, 湿度, 気圧は((<<ここ>|URL:http://www.jma.go.jp/jp/amedas_h/today-63518.html>))で調べることができる.

== ヒント

* 「湿度」とは何であるか考えてみましょう.
  * 湿度 100% とはどういう状態でしょう?
* 「普通」は, 空気分子中の水蒸気分子の割合は, 水蒸気圧 (水蒸気の分圧) と気圧 (全圧) の比と等しいです.
#* ((<プログラム例|URL:http://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2023/fortran_program/satpress_h2omol.f90>))


= 練習問題 3

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

== ヒント

* 順番に少しずつ作ってみましょう.
* 画面に "Input a number: " と表示して入力を促します.
* キーボードから入力した整数を変数 n に読み込みます.
* サブルーチン calcfact を定義します.
  * 引数は整数 n と n! の計算結果です.
  * サブルーチン内で n の階乗を計算します.
* 主プログラムから関数 calcfact を繰り返し呼び出し, 戻り値の和を計算します.
#* ((<プログラム例|URL:http://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2023/fortran_program/sumfact.f90>))


= 練習問題 4

((<<このデータファイル>|URL:https://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2023/fortran_data/country-capitals.txt>))は,
世界の国の首都の経度と緯度のリストです.

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

== 注意

ファイルの冒頭 2 行は, ファイルの内容の説明文です.
ただし, Fortran ではヘッダーの文字が邪魔になるかもしれません. 下のような方法で回避することができる.
* ファイルを読み込む部分の最初に,
    read( <装置番号>, * )
  をヘッダーの行の回数だけ繰り返せばヘッダー部分を読み飛ばすことができる.
* あるいは, Fortran プログラムでファイルの数値を読む前に, エディタを使ってファイルの中のヘッダーを削除してしまうと簡単です.

* 国の名前は数字ではありませんので, 整数型や実数型の変数に読み込むことはできません. 文字型の変数を使いましょう.

== ヒント

* 順番に少しずつ作ってみましょう.
* 国の名前と各国の首都の経度, 緯度をそれぞれ別々の配列に読み込みます.
* 神戸市からある経度, 緯度の地点までの距離を計算するサブルーチンまたは関数を定義します.
  * サブルーチンまたは関数の中の計算内容は, 「((<変数・配列・演算 練習問題|[itbase2022]Fortran |[itbase2023]Fortran 実習 変数・配列・演算 練習問題>))」が参考になるでしょう.
* 各国の首都の神戸からの距離を納める配列を用意し, 上で作成したサブルーチンまたは関数を繰り返し使うことによってすべての首都の神戸からの距離を計算します.
* 各国の首都の神戸からの距離を基にして, 順番を入れ替えましょう.
  * 順番の入れ替える作業もサブルーチンにできると良いでしょう.
  * 順番を入れ替える処理内容は, 「((<入出力・条件分岐・繰り返し 練習問題|[itbase2022]Fortran |[itbase2023]Fortran 入出力・条件分岐・繰り返し 練習問題>))」が参考になるでしょう.
* 結果を画面に出力します.
#* ((<プログラム例|URL:http://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2023/fortran_program/distance_countries.f90>))


#= 練習問題 5
#
#1 月 1 日から 1 年分の日数とその月と日を表示するプログラムを作りなさい.
#ただし, 1 月 1 日からの日数を基にして, それが何月何日になるかを計算する部分は
#サブルーチンの形にすること.
#
#== 出力例 (閏年でない場合)
#
#  $ ./showcal
#      1     1/ 1
#      2     1/ 2
#      3     1/ 3
#      4     1/ 4
#      5     1/ 5
#      ...
#     31     1/31
#     32     2/ 1
#     33     2/ 2
#      ...
#    363    12/29
#    364    12/30
#    365    12/31
#
#
#== ヒント
#
#* 順番に少しずつ作ってみましょう.
#  一つのやり方は, 下のような方法でしょう.
#  * 1 月 1 日からの日数である 1, 2, 3, ..., 365 までをループさせます.
#  * それぞれの数字に対して, それが何月何日になるかを求めて表示させましょう.
#* サブルーチン 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 まで繰り返します.
#* ((<プログラム例|URL:http://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2023/fortran_program/showcal.f90>))