- ベストアンサー
C言語の問題について
- C言語の問題に関して、プログラムの実行結果や処理過程について質問があります。
- プログラムの実行結果は02134になるが、その過程について時間がかかるため、早く知りたい。
- iListとiGeneを紙に書き出さなければならない処理があるが、法則的なものがあれば教えてほしい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 >実行結果を簡単に求める方法はないものかと思ったもので・・・ プログラムとしては「簡単」は「内容をどれだけ理解しているか」とほぼ等価です。 今回の質問であれば、fucn()の以下の処理のデータのやり取りをどれだけ詳細に理解できているかにかかります。 -------------- この部分(見やすいようににちょっといじってます) for( i = 0; i < MAX; i++ ) { //☆ここでiBuffに入れる値 iBuff = iList[iGene[i]]; // このforループのjに入る値 for( j = (iGene[i] + 1); j < (MAX - i); j++ ) { iList[j - 1] = iList[j]; } iGene[i] = iBuff; } -------------- 特に注意しなくてはいけないのは、 iGene[]の内容はmain()のiGene[]を値渡しで渡しているわけですが、この内容は「MAX-1」を超えてはいけないことです。 理由はわかりますか? 例えば、 -------------- #define MAX 5 iGene[0] = 10; -------------- だったと仮定します。 そうすると、上記func()のforループの「i=0」の場合 iBuff = iList[iGene[i]]; は iBuff = iList[10]; と置き換えることができます。 iList[]の定義は、「int iList[MAX];」ですから、 MAXを置きかえれば「int iList[5];」となります。 つまり、定義されていない領域を参照してしまうことになり不定値による動作となります=バグです。 こういったことに気づけるかどうかが、処理内容を理解しているかどうかの一つのカギになります。
その他の回答 (1)
- arain
- ベストアンサー率27% (292/1049)
>法則的なものが存在するとすれば、教えてください。 法則はソースの処理内容が全てです。 >この02134になる過程は分かるのですが、時間がかかってしまいます。 >iListとiGeneをいちいち紙に書き出さなければならないのでしょうか? 極端ですが、いちばん簡単で確実な解法ではあります。 多少でも早くしたいのであれば、どれだけソースの行っている内容を「頭の中だけで」理解できるかということにつきます。 わからなければ、ソースのどこでどんな処理を行っているかコメントとして記載してみましょう。 理解する手助けになります。
補足
レスありがとうございます。 プログラムの7行目 int iGene[MAX]={0,1,0,0,0}; をたとえば int iGene[MAX]={2,1,2,0,1}; などと変えたとき、実行結果を簡単に求める方法はないものかと思ったもので・・・ やはり頭の中で順序立てていくしかなさそうですね。
お礼
詳しい解説ありがとうございました。 プログラムを作るときには後でわかりやすいようコメントを付けて作るとよいのかもしれませんね。