プログラムの中身が分かりません。どうしたらよいですか

効率よく作業を行うためのヒントに記載されている、「簡単な例でテストしてみましょう」という方針に従いましょう。

例えば、次のようなプログラムを実行させたが、プログラムが何をしているのか、分からなかったとします。

プログラム例

program reidai4_6
implicit none
integer::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
 stop
end 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 none
integer::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
 stop

end 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ぐらいまでなら手で計算過程を追うのもそれほど難しいことではありません。

上のように「どこで、どんな計算をしているか」をすべて書き出せば、手作業での計算結果とプログラムの計算結果を比較するのは容易です。

動作の把握の難しいプログラムはこのようにして、中身を把握しましょう。