オンライン用テキストの準備中:7/22(水)までに用意します。 小さい字は補足説明なので、読み飛ばしてもいいです。
まあ、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に入れるという右向きの矢印の意味。
if文やdo文など、これまで出てきたコマンドを使って、 heikin.f90 を、 最高点の人の番号と点数も出力できるように 改造せよ。 最高点の人が2人以上いた場合に対応できるようにすることは求めない。 もちろん、対応できるようにして構わないし、 標準偏差も出すとか、他にも機能を加えても構わない。 最高点を出せても出せなくても、 WebClassの「プログラム課題3」から、 プログラム本体(例えば kadai3.f90 とか)と、 入力ファイル(例えば tensuu.d とか)と 出力ファイル(例えば kekka.out とか)を それぞれアップロードし、 こんな感じの 実行画面 (仮にエラーが取れずにどうしても実行できなかった場合は、 コンパイル時にエラーが出ている画面) を写真で撮影したものをアップロードする。