PROG 1.4 昇順に整列化された整数データをファイルに書き出す

<問題>  0-999999 までの乱数10万個を昇順に整列化して、ファイルに書き出す




解答例

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


#define DATA_SIZE 100000
#define N 32768 /* 乱数の最大値 RAND_MAX 32767 + 1 */

int compare (const void *a, const void *b) {  /* p171 にある返り値 */
   return *(long *)a - *(long *)b; 
}

int main () {
   long data[DATA_SIZE];  /* Cの絵本 p14. intより範囲を大きく */
   long i; /* 配列の添え字は、0 - 99999 intより大きく */
   long n; /* 乱数値 も大きい */
   FILE *fp;  /* ファイルポインター p108 */

   srand((unsigned int)time(NULL));

   for (i = 0; i < DATA_SIZE ; i++) {
       n = (long)rand(); 
       n = N*(long)rand()+n; /* N進数を10進数に基数変換していると考える N進の1桁目+N進の0桁目とみよう */
       data[i] = n % (DATA_SIZE*10); /* N*10未満の乱数へ変換 */
   }

   qsort(data, DATA_SIZE, sizeof(long), compare); /* 配列dataが、昇順に整列化 */

   fp = fopen ("data.txt", "w"); /* ファイルdata.txtをwモードで、オープン。wはオーバーライト。ファイルポインターfp */ 
   for (i = 0; i < DATA_SIZE; i++) {
     fprintf(fp, "%ld\n", data[i]); /* 各行に配列の要素を書きこみ。この例では10万行に、100万未満の整数が昇順 */
   }
   fclose(fp); /* ファイルを閉じる */

   return 0;
}