ページ 11

意図しない出力がでます。

Posted: 2019年7月10日(水) 20:38
by kappa_kei
ランダム数字を発生させた関数で、同一数字が出たら再計算させるプログラムの
つもりでしたが、終わらず再計算後を繰り返えしてしまいます。
  X ,Y は整数

コード:

void keisan(int x,int y){

	static int flag;
 	int temp = 0;
 	int num[x];
 	if(flag == 0){
 	srand((unsigned int)time(NULL));
 	         flag =1;}
 	rand();rand();rand();rand();rand();rand(); // 空回し

 	for(int i = 0;i < x;+i++){
 		 num[i] = rand()%y+1;
 		 }
 	for(int i = 0;i < x;i++){         //昇順に並べ替え
 		for(int j = 0; j < x;j++){
 			if(num[i] < num[j]){
 				temp = num[i];
 				num[i] = num[j];
 				num[j] = temp;  }
 			 		}
 		}
 	/*  同一数字があれば再帰  */
 	while(num[0] == num[1] || num[1] == num[2] || num[2] == num[3] ||
				 num[3] == num[4] || num[4] == num[5] || num[5] == num[6]){
	  printf("NG ");
	  keisan(x,y);
 	}for(int i = 0;i < x;i++){
 		printf("%d ",num[i]);
 	}printf("\n");
 }

結果:
NG 4 14 15 16 31 32 34      // NGの時、ここで終わらせたいのに繰り返すのはなぜですか?
NG NG NG NG NG 3 6 7 8 13 14 25

Re: 意図しない出力がでます。

Posted: 2019年7月10日(水) 22:27
by みけCAT
理由は、再帰呼び出ししても呼び出し元のnumは書き換わらないことです。
そのため、whileの条件がひとたび真になると、無限に計算を繰り返してしまいます。

Re: 意図しない出力がでます。

Posted: 2019年7月10日(水) 23:49
by kappa_kei
みけCATさん、回答ありがとうございます。
>呼び出し元のnumは書き換わらない
while( )内の事でしょうか?
keisan( )し直しても、numの中身って変わってないのですか?
基本を理解してないので申し訳ありません。

Re: 意図しない出力がでます。

Posted: 2019年7月11日(木) 01:33
by みけCAT
numはstaticではないので、
keisanが呼び出されるたびに新しいnumが作られ、それに対する書き込みが行われます。
再帰呼び出しした先では新しいnumに対する操作を行い、呼び出し元のnumは参照しません。

Re: 意図しない出力がでます。

Posted: 2019年7月12日(金) 20:33
by kappa_kei
みけCATさん
そうなんですね。
ありがとうございました。