• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語の問題について)

C言語の問題について

このQ&Aのポイント
  • C言語の問題に関して、プログラムの実行結果や処理過程について質問があります。
  • プログラムの実行結果は02134になるが、その過程について時間がかかるため、早く知りたい。
  • iListとiGeneを紙に書き出さなければならない処理があるが、法則的なものがあれば教えてほしい。

質問者が選んだベストアンサー

  • ベストアンサー
  • arain
  • ベストアンサー率27% (292/1049)
回答No.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];」となります。 つまり、定義されていない領域を参照してしまうことになり不定値による動作となります=バグです。 こういったことに気づけるかどうかが、処理内容を理解しているかどうかの一つのカギになります。

last-symph
質問者

お礼

詳しい解説ありがとうございました。 プログラムを作るときには後でわかりやすいようコメントを付けて作るとよいのかもしれませんね。

その他の回答 (1)

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

>法則的なものが存在するとすれば、教えてください。 法則はソースの処理内容が全てです。 >この02134になる過程は分かるのですが、時間がかかってしまいます。 >iListとiGeneをいちいち紙に書き出さなければならないのでしょうか? 極端ですが、いちばん簡単で確実な解法ではあります。 多少でも早くしたいのであれば、どれだけソースの行っている内容を「頭の中だけで」理解できるかということにつきます。 わからなければ、ソースのどこでどんな処理を行っているかコメントとして記載してみましょう。 理解する手助けになります。

last-symph
質問者

補足

レスありがとうございます。 プログラムの7行目 int iGene[MAX]={0,1,0,0,0}; をたとえば int iGene[MAX]={2,1,2,0,1}; などと変えたとき、実行結果を簡単に求める方法はないものかと思ったもので・・・ やはり頭の中で順序立てていくしかなさそうですね。

関連するQ&A