次のプログラムを作成します。
2つの整数の組を何件かキーボードから読み込んで、2つの整数の和、差、積、商、余りを計算し、読み込んだ2つの整数値と共に出力する。また、データの入力件数と2つの整数の差が正になる件数を数えて出力する。
この例題は、例題1)のプログラム例 1c に「データの入力件数を数える」ことと、「差が正になる件数を数える」こと、また「それらを出力する」ことを追加するだけです。
このプログラムのアルゴリズムを次に示します。青字が例題1)のプログラム例 1c のアルゴリズムに追加した部分です。
- ★ 2つの整数データを読み込む。データが終わりの時は★★印に飛ぶ。
- データの入力件数を数える。
- 和と差を計算する。
- 2つの整数の差が正になる件数を数える。
- 積と商と余りを計算する。
- 2つの値と、計算結果をすべて出力する。
- 繰り返し計算を行うために処理の流れを★印に戻す。
- ★★データの入力件数と差が正になる件数を出力する。
- 終わり。
データの入力件数は、データを読んでから次のデータを読み込むまでの間に数えます。差が正になる件数は、差の計算をしてから、次のデータを読み込むまでの間に数えます。ここに示したアルゴリズムの通りである必要はありません。
次にプログラムの例を示します。
例題2)のプログラム例
行 | プログラム |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
c Example 2 四則演算2
c 建築学科 2年 xxxxxxx my name
c234567890 file=reidai2.f
integer m,n,wa,sa,seki,sho,amari,i,j
* 初期値 設定
i=0
j=0
* 繰り返しデータを読み込む
101 continue
write(*,*) ' input m,n = '
read(*,*,end=901) m, n
* 入力件数
i=i+1
* 和、差の計算
wa=m+n
sa=m-n
* 差が正になる件数
if(sa.gt.0) then
j=j+1
end if
* 積、商、余りの計算
seki=m*n
sho=m/n
amari=m-n*sho
* 出力
write(*,*) m,n,wa,sa,seki,sho,amari
go to 101
* 件数の出力
901 continue
write(*,*)
write(*,*) ' 入力件数 =',i
write(*,*) ' 差が正になる件数 =',j
*
stop
end
|
このプログラムでは、まとまった処理ごとにコメント行を入れています。1カラム目に * が記述されている行はコメント行です。例題1)のプログラム例 1c を変更した部分について説明します。
4行目 integer m,n,wa,sa,seki,sho,amari,i,j
データの入力件数を数える変数i と差が正になる件数を数える変数j を整数型と定義するため integer文に追加します。
6行目 i=0
と
13行目 i=i+1
6行目と13行目はデータの入力件数を数えるために挿入したものです。この部分に関係するプログラムの流れは次のようになっています。
i=0
┌→ 101 continue
│ :
│ i=i+1
│ :
└── go to 101
6行目の i=0 で初めに変数i の値をゼロにしておきます。13行目の i=i+1 は変数i の値に 1 を加えて、変数i に代入するという意味で、結果として変数i の値が1つ増えます。繰り返しのループの中で i=i+1 が実行されるたびに 実行された回数がカウントされていることになります。データが入力されると必ずこの文が実行されるので、データの入力件数を数えていることになります。
7行目 j=0
と
18行目 if(sa.gt.0) then
19行目 j=j+1
20行目 end if
この部分は差が正になる件数を数えるために挿入したものです。この部分に関係するプログラムの流れは次のようになっています。
j=0
┌→ 101 continue
│ :
│ if(sa.gt.0) then ─┐
│ j=j+1 │ ブロックif
│ end if ─┘
│ :
└── go to 101
7行目の j=0 で初めに変数j の値をゼロにしてから19行目の j=j+1 を実行することで、この文が実行される回数を数えています。データの入力件数はループの中を通過する件数を無条件に数えればよかったのですが、今度は「差が正の時」という条件がついています。この条件を満たしている時だけ j=j+1 を実行するようにしたのが18行目から20行目までのブロックifです。( )の中の論理式 sa.gt.0 が真(すなわち 変数sa > 0 )の時、if文と endif文の間に記述されている文 j=j+1 を実行します。
ブロックif文 による判断の詳細はFortranの文法を参照してください。
29行目 901 continue
30行目 write(*,*)
31行目 write(*,*) ' 入力件数 =',i
32行目 write(*,*) ' 差が正になる件数 =',j
データの入力件数と差が正になる件数を出力する部分です。これらの件数はデータの入力が終わったときに変数i と j に数えられていますので、データの入力が終わった時の飛び先の文(ここでは29行目の文番号 901を持つ continue文)より後に記述します。
30行目の write文は、出力の並びの記述がないので空の行を出力(改行)します。31行目の write文は、文字列「 入力件数 =」と変数i の値を出力します。
32行目の write文は、文字列「 差が正になる件数 =」と変数jの値を出力します。
|