C言語の問題について

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

C言語の問題について

下のプログラムにおいて実行結果は 02134 になります。 この02134になる過程は分かるのですが、時間がかかってしまいます。 iListとiGeneをいちいち紙に書き出さなければならないのでしょうか? 法則的なものが存在するとすれば、教えてください。 #include<stdio.h> #define MAX 5 void func(int *iGene); int main(void) { int i; int iGene[MAX]={0,1,0,0,0}; func(iGene); for(i=0;i<MAX;i++) { printf("%d",iGene[i]); } return (0); } void func(int *iGene) { int i,j; int iBuff; int iList[MAX]; for(i=0;i<MAX;i++) { iList[i]=i; } for(i=0;i<MAX;i++) { iBuff=iList[iGene[i]]; for(j=iGene[i]+1;j<MAX-i;j++) { iList[j-1]=iList[j]; } iGene[i]=iBuff; } } よろしくお願いします。

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

  • ベストアンサー
  • 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

  • C言語のプログラムでおかしな動作をするのですが教えて頂けないでしょうか?

    VisualStudio2008使用しています。 問題は、サイコロを200回振ってその出た目の数の個数分*を表示するプログラムです。 サイコロの目はランダムで出しています。 次のプログラムは正常に動作するものです。 /* #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 200 int DICE(int min,int max); int main() { int n,i,j; int y[7]={0}; srand((unsigned int)time(NULL)); for(i=0;i<N;i++){ n=DICE(1,6); y[n]++; } for(i=1;i<7;i++){ printf(" %2d: ",i); for(j=0;j<y[i];j++){ printf("*"); } printf("\n"); } return 0; } int DICE(int min,int max) { return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } */ 次のプログラムが問題で、授業で先生が配列にはstaticをおまじないとしてつけないと暴走すると言われたので、つけて見ると明らかに間違ってると思われるプログラムで動作するのですが原因を教えて頂けないでしょうか? 以下問題のプログラム! 配列の前にstaticをつけたら、添え字をいくつにしても正常に動作します。普通は添え自分しか領域って確保されないですよね??? /* #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 200 int DICE(int min,int max); int main() { int n,i,j; //以下が問題の配列宣言 static int y[2]={0}; srand((unsigned int)time(NULL)); for(i=0;i<N;i++){ n=DICE(1,6); y[n]++; } for(i=1;i<7;i++){ printf(" %2d: ",i); for(j=0;j<y[i];j++){ printf("*"); } printf("\n"); } return 0; } int DICE(int min,int max) { return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } 質問の意味が正確に伝わらなかった場合は補足しますので、ご回答よろしくお願いします。

  • C言語で再帰的処理が出来ない理由

    以下のサイトでC言語の勉強をしているのですが、このサイトのソースコードをコピペして実行してみたら上手くいきませんでした。 http://wisdom.sakura.ne.jp/programming/c/c30.html ========================== #include<stdio.h> void func(int ); int main() { func(0); printf("プログラムを終了します"); return 0; } void func(int max) { if (max <= 10000) { printf("%d\r",max); func(max + 1); } } ========================== 実行してみると、何故か4700~4800の辺りで止まってエラーになってしまいます。 どうしてエラーになるのでしょうか?

  • C言語の実行について、

    #include <stdio.h> #define N 2 void main(void) { int i ,j ; for( i=1 ; i <= N ; ++i) { for( j=i ; j < N+2 ; ++j) { printf("j=%d\n",j); } printf("i=%d\n",i); } } を実行すると、 j=1,j=2,j=3,i=1,j=2,j=3,i=2となったんですが、 どういった順序で行われているのでしょうか? よろしくお願いします。

  • C言語の問題です!!

    C言語の問題です。次の問題でプログラムを作ってみたのですがどうでしょうか?もし小さな間違いであったら訂正をお願いします。全然違う場合はそのように回答してください。初心者なものでよろしくお願いします。 ・1~100までの整数値を画面に表示せよ. ただし,数値を10個表示するごとに改行すること. #include<stdio.h> int main(void){ int i,j; for(i=1;i<=100;i++){    for(j=1;j<=9;j++) printf("%3d",i+j); i=i+9; putchar("\n"); } return(0); }

  • Cの素人がやってしまう・・・と言われた使い方

    関数set()を作って、下にコメントアウトされているプログラム と全く同じ動作をするプログラムを完成させよ。 main内部を変更してはならない。 関数set()内では鈎括弧を使用してはならない。 という問題で、終わるときにチェックされたのですが どうもsetでの中身が素人がよくやるやつ、といわれました。 int x[MAX]とやれ?ということなのでしょうか それともやはり&(*(x+i))の部分がおかしいということでしょうか? 確かにアドレスにアドレスを聞いているような理解としか、今は言いようがないのですが そいえば前回&*を使ってる人がいるけど・・・という話を聞きました 何かご指摘あればうれしいです 以下がコードになります。 #include <stdio.h> #define MAX 10 void set(int *x); int main() { int x[MAX]; int j; set(x); printf("KEKKA\n"); for (j = 0; j < MAX; ++j) { printf("%d\n", x[j]); } return 0; } void set(int *x) { int i; for(i = 0; i < MAX; ++i){ scanf("%d",&(*(x+i))); } } /* int main() { int x[MAX]; int j; for (j = 0; j < MAX; ++j) { scanf("%d", &x[j]); } printf("KEKKA\n"); for (j = 0; j < MAX; ++j) { printf("%d\n", x[j]); } return 0; } */

  • C言語

    下のようにするだけでなぜ、画面上に数字が表示されるのでしょうか? #include <stdio.h> #include <stdlib.h> #define KOSU 100 void main(void) { int ary[KOSU]; int key; int i; for (i = 0; i < KOSU; i++){ ary[i] = rand(); printf("%8d", ary[i]); } }

  • クイックソート

    #include<stdio.h> #include<stdlib.h> #define MAX 10 int comp(const void *i,const void *j); int main(void) { int sort[MAX], i ; for(i=0 ; i<MAX ; i++){ sort[i] = rand(); } qsort(sort, MAX, sizeof(int), comp); for( i=0; i<MAX ; i++) printf("%d\n", sort[i]); return 0; } int comp (const void *i, const void *j) { return *(int*)i - *(int*)j; } これはクイックソートのプログラムなのですが、 int comp (const void *i, const void *j) { return *(int*)i - *(int*)j; } この部分がわかりません。ここでソートしているのですか?

  • c言語で大きな値の階数を求めたいのですが

    c言語で関数を用いてn!を求めるプログラムを作ったのですが、 nの値が大きくなると0という値になってしまって正しい値が出てきません。 プログラムをどの様に修正したらきちんとnの値が大きくなっても 正しく値が表示されるでしょうか? ソースはこちらです。 #include <stdio.h> int func(int i); int func(int i){ if(i == 0) return 1; else return (i*func(i-1)); } void main(){ printf("%d",func(90)); /*90!を求める*/ } よろしくお願いします。

  • プログラミングCの質問です

    現在10×10の市松模様を表示させるというプログラムを作成しています。 #define文、IF文、for文の使用、printfを使って■と□を表示させることが条件です。 間違っているところの指摘をお願いします。 #include <stdio.h> #define N 10 int main(void) { for( i=1 ; i<=N ; ++i ) { for( j=1 ; j<=N ; ++j ) } if( (i+j) % 2 ){ printf("■"); }else printf("□"); } printf("\n"); i++; } return 0; }

  •  現在、私はC言語を学んでいます。

     現在、私はC言語を学んでいます。  プログラミングの初期の初期の問題なんですが、 「Hello World」という有名なプログラムがありますよね? それについての質問です。 #include<stdio.h> main() { printf("Hello World"); return 0; } も #include<stdio.h> main(void) { printf("Hello World"); return 0; } も #include<stdio.h> int main() { printf("Hello World"); } もちゃんと表示できます。 ここで質問です。 int main(void) int main() main() main(void) はどう違うんですか? あと、 return 0; はあっても無くてもいいようなんですが どういう意味があるんでしょうか?