<問題> 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; }