効率よく作業を行うためのヒントに記載されている、「簡単な例でテストしてみましょう」という方針に従いましょう。
例えば、次のようなプログラムを実行させたが、プログラムが何をしているのか、分からなかったとします。
プログラム例
program reidai4_6implicit noneinteger::i,j,n,k(8,8) n=8 k(1,1)=1 do i=1,n-1 do j=2,i k(i+1,j)=k(i,j-1)+k(i,j) end do k(i+1,1)=1 k(i+1,i+1)=1 end do do i=1,n write(*,'(8i4)') (k(i,j),j=1,i) end do stopend program reidai4_6実行例
[hamano@localhost Fortran90_95]$ ifort reidai4_6.f90
[hamano@localhost Fortran90_95]$ ./a.out
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
ちなみにこれは、2項係数を計算する(通称パスカルの三角形)ためのプログラムです。
繰り返し回数が多い(n=8)の上、添え字がiとjの2種類あって分かりにくいですね。こういうときは、繰り返し回数を減らして、iとjの値と、計算結果を全部書き出して見ましょう。
[hamano@localhost Fortran90_95]$ cp reidai4_6.f90 reidai4_6_chk.f90
チェックのためのプログラム
program reidai4_6_chk
implicit noneinteger::i,j,n,k(8,8) n=3 k(1,1)=1 do i=1,n-1 do j=2,i print *, 'i=',i,'j=',j k(i+1,j)=k(i,j-1)+k(i,j) print *,'A' print *, 'RHS: k(i+1,j)=',k(i+1,j),' LHS: k(i,j-1)=',k(i,j-1),' k(i,j)=',k(i,j) print * !空白行を出力 end do print *,'i=',i k(i+1,1)=1 k(i+1,i+1)=1 print *,'B' print *,'i+1=',i+1 print *,'k(i+1,1)=',k(i+1,1) print *,'k(i+1,i+1)=',k(i+1,i+1) print * end do print * do i=1,n!8 write(*,'(A,i5,5x,8i4)') 'i=',i,(k(i,j),j=1,i) end do stopend program reidai4_6_chk
朱書した部分がチェックのために加えた箇所です。このプログラムを実行させてみましょう。
[hamano@localhost Fortran90_95]$ ifort reidai4_6_chk.f90
[hamano@localhost Fortran90_95]$ a.out
i= 1
B
i+1= 2
k(i+1,1)= 1
k(i+1,i+1)= 1
i= 2 j= 2
A
RHS: k(i+1,j)= 2 LHS: k(i,j-1)= 1 k(i,j)= 1
i= 2
B
i+1= 3
k(i+1,1)= 1
k(i+1,i+1)= 1
i= 1 1
i= 2 1 1
i= 3 1 2 1
n=3ぐらいまでなら手で計算過程を追うのもそれほど難しいことではありません。
上のように「どこで、どんな計算をしているか」をすべて書き出せば、手作業での計算結果とプログラムの計算結果を比較するのは容易です。
動作の把握の難しいプログラムはこのようにして、中身を把握しましょう。