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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kappa_kei

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

#1

投稿記事 by kappa_kei » 5ヶ月前

ランダム数字を発生させた関数で、同一数字が出たら再計算させるプログラムの
つもりでしたが、終わらず再計算後を繰り返えしてしまいます。
  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

アバター
みけCAT
記事: 6244
登録日時: 9年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 5ヶ月前

理由は、再帰呼び出ししても呼び出し元のnumは書き換わらないことです。
そのため、whileの条件がひとたび真になると、無限に計算を繰り返してしまいます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kappa_kei

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

#3

投稿記事 by kappa_kei » 5ヶ月前

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

アバター
みけCAT
記事: 6244
登録日時: 9年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 5ヶ月前

numはstaticではないので、
keisanが呼び出されるたびに新しいnumが作られ、それに対する書き込みが行われます。
再帰呼び出しした先では新しいnumに対する操作を行い、呼び出し元のnumは参照しません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kappa_kei

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

#5

投稿記事 by kappa_kei » 4ヶ月前

みけCATさん
そうなんですね。
ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る