情報通信工学科 2年 コンピュータ数値解析(学内専用)中川朋子


うまくうごかないとき
思ったように動かないときは:

「思ってること」と「実際」が どこで違ってるのかを見つけるため、
プログラムに、仮の printf を入れて、
 どこまでうまくいってて
 どこからおかしくなるのか
を調べます

例1:
for(i=0; i<5; i++){

という繰り返し部分があったら、そこに

for(i=0; i<5; i++){
  printf("i=%d\n", i );

のように入れると、
 思った回数繰り返してるのか、
 その前に終わっちゃうのか、
 思った以上に繰り返しちゃってるのか
わかります。
例2:
for(k=0; k<5; k++){
  fscanf(fin,"%f%, &a[k]);

という入力があったら、そこに

for(k=0; k<5; k++){
  fscanf(fin,"%f%, &a[k]);
  printf("a[%d]=%d\n", k, a[k] );

のように入れると、

実行時に
  a[0]=12.03
  a[1]=22.03
  a[2]=-2.45
  a[3]=987304720460978476222.03
のように出るので、
どこがおかしいのか(上記の例ならたぶんk=3から)わかります。

実行時に
  a[0]=12.03
  a[1]=22.03
  a[2]=-2.45
  a[926784053927164]=
のようになったのなら、
配列a[ ] の宣言がうまくいってない
(a[3]まで使えるつもりでいたが、実はa[2]までしか使えなかった)
ことがわかります。

よくある間違い

配列の宣言の時
folat a[5];
と書いたのなら、使える配列は
a[0], a[1], a[2], a[3], a[4] の5個です。
a[5]は使えません。

a[5]を使いたいのなら、配列の宣言の時
folat a[6];
と書きます。

例3:
0 で割り算しようとすると死んでしまうので、
割り算する前に分母を出力してみるのもよい方法です。

a[ i ][ j ]= a[ i ][ j ]/piv;

という割り算があったら、その

printf("piv=%fd\n", piv );
a[ i ][ j ]= a[ i ][ j ]/piv;

のように入れて、0になったりしてないか確かめます。

問題個所がわかったら

さっき入れた仮の printf は、
消してしまわないで
/**/ではさんで コメントにして殺しておきます。これをコメントアウトと言います。

for(i=0; i<5; i++){
/*  printf("i=%d\n", i );  */

やっぱりもう一度調べないといけなくなったときに すぐに復活できるためです。

すべての問題が解決した最後の最後に消しますが
開発途中の段階では消さずにコメントアウトが良いです。