• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:初心者です。お助けください。)

初心者のための関数の説明とSortの問題

このQ&Aのポイント
  • 初心者向けの関数の説明とSortの問題について解説します。
  • NumberCOM関数は重複のない30個の乱数を生成し、配列に格納して表示します。
  • Sort関数は配列COMとMANの要素を小さい順に並べ替えて表示しますが、Sortした後のCOM配列の要素数が正しくない場合があります。これの解決策についても説明します。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★重複を避ける部分がおかしいです。 ・重複を避ける処理を入れているのにその中で発生させた乱数は重複のチェックを  行っていません。また、その乱数を com[a]、com[b] の2つに代入しています。  この時点で重複データを避ける処理になっていません。無意味でしょうが…。 ・私なら下のようにしますけど。参考に。 サンプル: // 重複チェック用 int DoubleCheck( int *com, int size, int check ) {  int i;    for ( i = 0 ; i < size ; i++ ){   if ( com[i] == check ){    return 1; // 重複あり   }  }  return 0; // 重複なし } // 乱数 int NumberCOM( int *com, int size ) {  int i;  srand( 0475u );    for ( i = 0 ; i < size ; i++ ){   do {    com[ i ] = (rand() / (RAND_MAX + 1.0) * 100);   } while ( DoubleCheck(com,i,com[i]) );      printf( "%d,", com[i] );  }  printf( "\n" );  return 0; ←これ忘れずに(戻り値が int で宣言しているから) } その他: ・上記のサンプルのように『重複チェック関数』を作った方が処理がわかりやすくなると思います。  重複の処理は NumberCOM() 関数の do-while 文で行っています。  重複があると DoubleCheck() 関数で 1 が返されるため do-while 文を繰り返して新しい乱数を  com[i] にセットします。その後に重複しなくなるまで do-while 文を繰り返します。 ・以上。参考に。

koko9i
質問者

お礼

恥ずかしながら、関数に関して間違った解釈をしてました。 ご指摘ありがとうございます。 それにgood ideaまで出していただいて。 参考になりました。 これからは、複雑になったら分けるというのを基本にします。

その他の回答 (2)

回答No.3

  #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int work[100]; int i, j, temp; srand((unsigned)time(NULL)); for(i = 0; i < 100; i ++) work[i] = i; for(i = 99; i > 1; i --){ j = ((double)rand() / RAND_MAX) * i ; temp = work[j]; work[j] = work[i]; work[i] = temp; } for(i = 0; i < 100; i ++) printf("%d ", work[i]); return 0; }  

回答No.1

NumberCOMが生成した値に重複があります。

関連するQ&A