ページ 11

コードの間違いを指摘して下さい

Posted: 2014年8月12日(火) 16:48
by mkt
AOJの問題 http://judge.u-aizu.ac.jp/onlinejudge/d ... d=ITP1_6_C に関してなのですが、以下のコードでプログラムを実行したのですが、自分の環境では「default.exe は動作を停止しました。」 となってしまいます。コードのどこが間違っているかを教えてください。どうかよろしくお願いします。

コード:

#include <stdio.h>
 
int main(void){
    int room[4][3][10];
    int b,f,r,v;
    int N,i;
    for(b=0;b<4;b++){
        for(f=0;b<3;f++){
            for(r=0;r<10;r++){
                room[b][f][r]=0;
            }
        }
    }
    scanf("%d",&N);
    for(i=0;i<N;i++){
        scanf("%d %d %d %d",&b,&f,&r,&v);
        room[b-1][f-1][r-1]+=v;
    }
    for(b=0;b<4;b++){
        for(f=0;f<3;f++){
            for(r=0;r<10;r++){
                printf(" %d",room[b][f][r]);
            }
        printf("\n");
        }
    if(b<3)
        printf("####################");
    }
    return 0;
}
        

Re: コードの間違いを指摘して下さい

Posted: 2014年8月12日(火) 18:35
by a5ua
8行目:fに関するfor文に、bが使われています。
for(f=0;b<3;f++){

Re: コードの間違いを指摘して下さい

Posted: 2014年8月12日(火) 18:42
by amehirune
mkt さんが書きました:

コード:

#include <stdio.h>

    int room[4][3][10];
    int b,f,r,v;
    int N,i;
    for(b=0;b<4;b++){           //①
        for(f=0;b<3;f++){         //②
            for(r=0;r<10;r++){    //③
                room[b][f][r]=0;  //④
            }
        }
    }

 
はい、a5uaさんの仰る通りだと思われます。
配列の要素数をオーバーして格納してますね…
というか、これは、無限ループに陥っていないでしょうか?(^^;)

①ここでは4回のループを設定していますね。ここは問題ありません。
②問題はここです。本来ならばここで3回繰り返す…という意味だと思うのですが、よく見てください!b<3となってませんか!?
 ②~④の間で、変数bの値が変動するような命令は見られませんので、この②ループを脱出することはありません。
 そして、fの値が無限大に大きくなってしまうのです。
③省略
④ここで配列に代入しているようですが…要素数は[4][3][10]のはずが、fの値が無限大に大きくなっていってしまうので、
 f=3になった時点で配列オーバー、実行を停止してしまう、というような感じでしょうか。

ひとまずこれかな?と思ったのでかかせていただきました。
オフトピック
専門用語をあまり覚えていないので、「ここはこれじゃないだろー(この言葉じゃないだろー)」ってことが結構あるかもです…
[追記]いろいろ間違ってたので訂正しましたorz

Re: コードの間違いを指摘して下さい

Posted: 2014年8月12日(火) 20:55
by mkt
a5ua様
端的な回答ありがとうございました。

amehirune様
詳細な回答ありがとうございました。なぜ「default.exe は動作を停止しました。」 となったのかが分かりました。