- 締切済み
C言語についての質問です><
0から100までの乱数を発生させ要素20個の整数配列aに乱数を格納し、 その配列を大きい順番に並び替える。 その際もともと格納されていた配列の場所もあわせて 表示するプログラムを示せ。 乱数発生にはsrand関数とrand 関数を使います。 二次元配列を使うこと. プログラムリソースとプログラム解説をつけてほしいです>< 例 number place a[0]=98 3 a[1]=94 19 a[2]=90 1 のようになるようにお願いしますm(_ _)m
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- hanabutako
- ベストアンサー率54% (492/895)
他の人のソースコードを読むのも勉強になると思うので。 「二次元配列を使うこと.」の条件はコードの可読性が著しく損なわれるので無視しました。 C99対応のコンパイラーを使ったのでレガシーなものではコンパイルできないかもしれません。 0から100までは0 <= x < 100と考えてプログラムを書きました。100を含む場合はELM_RAND_MAXの値を変更してください。 random_element構造体に数値を入れるnumberと元の位置を入れるorig_posをもたせ、/dev/urandomの値を使って初期化した乱数列を使って初期値を代入した後に、qsortでソートしました。 #include <err.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #define NUM_ELMS 20 #define ELM_RAND_MAX 100 /* structure to store random number and its original position. */ struct random_element { int number; int orig_pos; }; /* compare function for sorting the elements */ static int random_element_compare(const void *s0, const void *s1) { const struct random_element *a, *b; a = s0; b = s1; return b->number - a->number; } static void print_random_elements(struct random_element *a, int nmemb) { for (int i = 0; i < nmemb; i++) { (void)printf("a[%d]=%d %d\n", i, a[i].number, a[i].orig_pos); } } int main(void) { unsigned int seed; struct random_element a[NUM_ELMS]; FILE *fp; /* set srand */ fp = fopen("/dev/urandom", "r"); if (fp == NULL) err(errno, "fopen urandom"); (void)fread(&seed, sizeof(seed), 1, fp); (void)fclose(fp); srand(seed); /* initialize */ for (int i = 0; i < NUM_ELMS; i++) { a[i].number = ELM_RAND_MAX * (double)rand() / (double)RAND_MAX; a[i].orig_pos = i; } /* print elements before sorted */ (void)printf("Before:\n"); print_random_elements(a, NUM_ELMS); qsort(a, NUM_ELMS, sizeof(a[0]), random_element_compare); /* print sorted result. */ (void)printf("\nAfter:\n"); print_random_elements(a, NUM_ELMS); } 実行例: Before: a[0]=11 0 a[1]=1 1 a[2]=85 2 a[3]=69 3 a[4]=56 4 a[5]=92 5 a[6]=77 6 a[7]=73 7 a[8]=39 8 a[9]=60 9 a[10]=72 10 a[11]=0 11 a[12]=18 12 a[13]=35 13 a[14]=51 14 a[15]=23 15 a[16]=47 16 a[17]=48 17 a[18]=23 18 a[19]=3 19 After: a[0]=92 5 a[1]=85 2 a[2]=77 6 a[3]=73 7 a[4]=72 10 a[5]=69 3 a[6]=60 9 a[7]=56 4 a[8]=51 14 a[9]=48 17 a[10]=47 16 a[11]=39 8 a[12]=35 13 a[13]=23 18 a[14]=23 15 a[15]=18 12 a[16]=11 0 a[17]=3 19 a[18]=1 1 a[19]=0 11