情報通信工学科 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 );
*/
やっぱりもう一度調べないといけなくなったときに すぐに復活できるためです。
すべての問題が解決した最後の最後に消しますが
開発途中の段階では消さずにコメントアウトが良いです。