[Google] [ウィキペディア] [附属図書館] [ シラバス ] (構力I) (構力II) (構造メモ) (構造実験) (フォートラン) (後藤資料)

マトリクス構造解析II 第2回

(マトリクス構造解析 第10回)

小さい字は補足説明なので、読み飛ばしてもいいです。

このページのオリジナルの作者は 後藤文彦です。
クリエイティブ・コモンズ・ライセンス
マトリクス構造解析オンライン授業用テキスト
第10回オンライン授業

目次

プログラム例題(if構文、do構文)

 ただ長方形の面積を求めるだけでは面白くないので、 短辺を長辺より長く入れたら警告を表示して計算してくれないプログラム (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==baとbが等しいならば
a/=baとbが等しくないならば
a > baがbより大きいならば
a >= baがb以上ならば
a < baがbより小さいならば
a <= baが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. 途中で抜ける)。

プログラム課題2:

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