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

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

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

オンライン用テキストの準備中:7/22(水)までに用意します。 小さい字は補足説明なので、読み飛ばしてもいいです。

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

目次

プログラム例題(配列、ファイルで入出力)

配列

 まあ、1次元配列(要はベクトル)ぐらいは使ってみよう。 ちなみにマトリクス構造解析で多用する マトリクス($k_{ij}$とか)は2次元配列で与える。 クラスの一人一人の試験の点数を読み込んで、 平均点と不合格者(60点未満の人)の番号を出力するプログラムを作ってみよう。


       implicit none            ! 暗黙の型宣言を無効にする
          real :: tensuu(100)   ! 点数を入れる実数形の1次元配列
       integer :: i,ninzuu      ! 繰り返しステップ数、人数
          real :: goukei        ! 全員の点数の合計
! データ入力
        read *, ninzuu
         do i=1,ninzuu
            read *, tensuu(i)
         end do
! 合計点の計算
         goukei=0.
         do i=1,ninzuu
            goukei=goukei+tensuu(i)
         end do
! 合計点を人数で割って平均点を出す
           print *,"平均点は:",goukei/ninzuu
! 不合格者番号の表示
         do i=1,ninzuu
            if(tensuu(i) < 60. ) then
               print *,"不合格者番号:",i
            end if
         end do
       end

まずはプログラムについて少々。

	  real :: tensuu(100) 

 これは tensuu(1)~tensuu(100) までの 100個の成分を取り得る 1次元配列(まあ1次元だからベクトルと言ってもいいけど)を宣言している テキスト参照箇所: 6.1. 1次元配列)。

              ! 点数を入れる実数形の1次元配列

! (半角文字のびっくりマーク)を書いたところから改行までは コメントとみなされるので注釈とかを書ける テキスト参照箇所: 1.2.2 自由形式)。 但し、6桁目(2行をつなぐ際に&を書く桁)には ! は書けない。

       integer :: i,ninzuu      ! 繰り返しステップ数、人数

do文の繰り返しステップ数i、 人数を入れる変数ninzuuを整数形で宣言する。 繰り返しの回数など、 数を数えたりする場合の数字は整数形にして、 実数形とは区別して扱う テキスト参照箇所: 4.1. 実数型と整数型)。

         do i=1,ninzuu
            read *, tensuu(i)
         end do

まず、i=1 のとき tensuu(1) を読み込み、次に i=2 のとき tensuu(2) を 読み込み……と続けていって、最後に i=ninzuu となり tensuu(ninzuu) を 読み込む テキスト参照箇所: 5.1. 決まった回数の単純な繰り返し)。

         goukei=0.
         do i=1,ninzuu
            goukei=goukei+tensuu(i)
         end do

まず、doループに入る前に、 goukei=0.としてgoukeiの値を0に初期化しておく。 i=1 のとき goukei=0+tensuu(1) つまり goukei=tensuu(1) となる。
i=2 のとき goukei=goukei+tensuu(2) つまり goukei=tensuu(1)+tensuu(2) となる。
これをi=3以降も を続けていって、
i=ninzuu のとき goukei=goukei+tensuu(ninzuu) つまり goukei=tensuu(1)+tensuu(2)+.....+tensuu(ninzuu) となる。
テキスト参照箇所: 5.1. 決まった回数の単純な繰り返し

           print *,"平均点は:",goukei/ninzuu

実数形を整数形で割る場合は答えは実数形になると思うので、 特に形を一致させる必要はないと思うが、 ninzuu を実数形にする必要のある場合は、real(ninzuu)のように すると実数形に変換される。 例えば、 整数形の10を整数形の3で割ると、 剰余演算となり 答えが整数形の3になったりするので、 実数として割られることを期待する変数は real で実数形に変換する 必要がある。 逆に x**3 などを計算する場合、3 が整数であれば、 コンピューターは素直に x*x*x を計算してくれるが、 x**3. などと書いてしまうと、コンピューターは (x**2.999999999 を計算する場合と同じように対数を取ったりして?) すごく難しい計算をしてしまうので、計算時間の無駄になってしまう。 (テキスト参照箇所: 4.1.3. 型の変換 )。

 さて、このプログラムを実行すると、 最初に人数の入力を求められて、その後、 人数ぶんの点数の入力を求められるが、 これをいちいちキーボードから打ち込むのではめんどくさいし、 間違いが起きやすい。 こういう場合は、入力データをファイルにして入力してみよう。 まず、エディターで

10
95.
20.
65.
70.
50.
0.
80.
100.
45
60

みたいな入力データを作って保存しよう。 「ファイルの種類」は、 プログラムと同様に「テキストドキュメント(*.txt)」として、 ファイル名を例えば tensuu.d とする場合は、 "tensuu.d" と「"」でファイル名を挟んで保存する(ワードパッドの場合)。 (上の例は、1行目に人数の10人が、2行目から11行目までに 10人ぶんの点数が並んでいる)。 gfortran heikin.f90 -o heikin でコンパイルしたら、

heikin < tensuu.d

のように実行してみてほしい。 ファイルから入力されて実行されると思う。 「<」は、tensuu.d を heikin に入れるという左向き矢印の意味。 実行結果が画面に表示されただろうか。 この画面に表示された実行結果を、 ファイルに出力することもできる。 例えば、 画面に表示される実行結果を kekka.out というファイルに出力 したい場合は、

heikin < tensuu.d > kekka.out 

のように打つ。 「>」は、kekka.outに入れるという右向きの矢印の意味。

先頭目次

プログラム課題3:

if文やdo文など、これまで出てきたコマンドを使って、 heikin.f90 を、 最高点の人の番号と点数も出力できるように 改造せよ。 最高点の人が2人以上いた場合に対応できるようにすることは求めない。 もちろん、対応できるようにして構わないし、 標準偏差も出すとか、他にも機能を加えても構わない。 最高点を出せても出せなくても、 WebClassの「プログラム課題3」から、 プログラム本体(例えば kadai3.f90 とか)と、 入力ファイル(例えば tensuu.d とか)と 出力ファイル(例えば kekka.out とか)を それぞれアップロードし、 こんな感じの 実行画面 (仮にエラーが取れずにどうしても実行できなかった場合は、 コンパイル時にエラーが出ている画面) を写真で撮影したものをアップロードする。