小さい字は補足説明なので、読み飛ばしてもいいです。
ただ長方形の面積を求めるだけでは面白くないので、 短辺を長辺より長く入れたら警告を表示して計算してくれないプログラム (menseki2.f)を作ってみよう。
implicit none real :: tanpen, tyouhen, menseki print *,"長方形の短辺を入力して下さい" read *,tanpen print *,"長方形の長辺を入力して下さい" read *,tyouhen if(tanpen < tyouhen) then menseki=tanpen*tyouhen print *,"長方形の面積は:",menseki else print *,"短辺が長辺より長いので計算しません" end if end
ここで登場する
if(条件A) then 操作B else 操作C end if
という構文は、条件Aを満たす場合は、操作Bを実行し、
満たさない場合は操作Cを実行しなさいということ
(テキスト参照箇所:
3.2. ブロックIF構文)。
「条件Aを満たす場合は、操作Bを実行しなさい」ということだけを指定し、
条件Aを満たさない場合は、特になにもしないということであれば、
以下のように else は書かなくていい。
if(条件A) then 操作B end if
あるいは単に
if(条件A) 操作B
と1行に書くこともできる。
if文の中の条件文に使う比較演算子は、以下のように書く。 「BをAに代入する」ときは、A=Bを用いたが、 if文で「AとBが等しい」ことを表すのは、A==Bを用いて代入を表す=とは 区別しているので注意すること。
a==b | aとbが等しいならば |
a/=b | aとbが等しくないならば |
a > b | aがbより大きいならば |
a >= b | aがb以上ならば |
a < b | aがbより小さいならば |
a <= b | aがb以下ならば |
複数の条件を「かつ」や「または」で組み合わせたいときは、 ((条件1).and.(条件2)) や ((条件1).or.(条件2)) を使う。 例えば、 a<x かつ x<b なら if((a<x).and.(x<b)) と書くし、 x<a または b<x なら if((x<a).or.(b<x)) と書く。
aとbが整数型であれば、a==b は意味を持つが、 aとbが実数型の場合、a==b というのは、ほぼ起きないことである。 計算の結果、ちょうど a==10になるときといっても、 実数型の場合、 実際には、a=9.99999999999だったり、a=10.000000001だったりなわけである。 だから、例えば小数第1位を四捨五入して 10.0になってほしいとういことであれば、 if((9.95<a).and.(a<10.05))みたいに書く必要がある。 コンパイラーによっては、整数型のaとbに対してa==bみたいな書き方を するとエラーを出してくれるかもしれないが、 みなさんのTDM-gccのgfortranコンパイラーはエラーを出さずに、 ある精度内でa==bを判定してくれるようだ (動画の後半で実験してみた)。 ちなみに、整数型でa, bを宣言する場合は、以下のように integer を使う。
integer::a,b
さて、短辺を長辺より長く入れたら計算しないで終わってしまうのでは 今ひとつ面白みがないので、 短辺を長辺より短く入れてくれるまでデータ入力を繰り返す プログラム(menseki3.f)を作ってみよう。
implicit none real :: tanpen, tyouhen, menseki do print *,"長方形の短辺を入力して下さい" read *,tanpen print *,"長方形の長辺を入力して下さい" read *,tyouhen if(tanpen < tyouhen) exit print *,"短辺は長辺より短くして下さい" end do menseki=tanpen*tyouhen print *,"長方形の面積は:",menseki end
ここで登場する
do 操作A if(条件B) exit 操作C end do
という構文は、 条件B が満たされない限りはいつまでも操作A, 操作C を繰り返すということ (テキスト参照箇所: 5.1. 決まった回数の単純な繰り返し、 5.3. 途中で抜ける)。
menseki3.f90 を参考にして、 ある条件 (例えば「体積が1000以上になる」とか) を満たすまでデータ入力を繰り返し、 三角形・台形などの幾何学図形の面積や、 円錐・球などの立体の体積を求めるプログラムを作りなさい (長方形の面積はここに書いてあるのでダメ)。 WebClassの「プログラム課題2」から、 プログラム本体(例えば kadai2.f90 とか)をアップロードし、 こんな感じの 実行画面 (仮にエラーが取れずにどうしても実行できなかった場合は、 コンパイル時にエラーが出ている画面) を写真で撮影したものをアップロードする。
以下は、参考までに動画内で作っていたクイズのプログラム。 「!」から改行までは、コメントとなるのでプログラムと関係ないことを書ける。 プログラムの一部を無効にしたい場合に、 その行頭に「!」をつけて、その部分を無効にすることを 「コメントアウトする」と言ったりする。
implicit none ! クイズのプログラム integer::n print*, "次の作曲家で最も生誕年が早いのは?" print*, "1. バッハ" !1685-1750 print*, "2. ビバルディ" !1678-1741 print*, "3. ブラームス" !1833-1897 print*, "4. ベートーベン" !1770-1827 print*, "5. ボロディン" !1833-1887 do read*,n if (n==2) exit print*, "不正解です!" print*, "選び直して下さい" end do print*, "正解です!" end