• 締切済み

C言語についての質問です><

0から100までの乱数を発生させ要素20個の整数配列aに乱数を格納し、 その配列を大きい順番に並び替える。 その際もともと格納されていた配列の場所もあわせて 表示するプログラムを示せ。 乱数発生にはsrand関数とrand 関数を使います。 二次元配列を使うこと. プログラムリソースとプログラム解説をつけてほしいです>< 例 number place a[0]=98 3 a[1]=94 19 a[2]=90 1 のようになるようにお願いしますm(_ _)m

みんなの回答

回答No.2

他の人のソースコードを読むのも勉強になると思うので。 「二次元配列を使うこと.」の条件はコードの可読性が著しく損なわれるので無視しました。 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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 関数と手続き???????

    整数乱数を200個発生して配列に格納する関数と、与えられた整数配列の全要素の平均と標準偏差を求める手続きのプログラムを早急に教えて下さい。二つのモジュールを同じプログラムで使用するんだそうです。誰か助けて下さい

  • C言語プログラミングについて

    「要素数10の配列を準備する。 配列の各要素に0.0~1.0の乱数を入れる。 各配列に入力された乱数を出力する。 配列をオリジナル関数hanteiに渡す。 数hantei内において,各要素の値が0.5以上であれば1 , 0.5未満であれば0を出力する。」 C言語でこのような問題があるのですがどのように作ればよろしいのでしょうか? ちなみに以下のように作ってみて、「argcは一度も使用されていない」「argvは一度も使用されていない」とエラー(警告)が出てしまいました。修正、もしくは正しいプログラムを教えてくれませんか? #include <stdio.h> #include <time.h> #include <stdlib.h> #define SIZE 10 int hantei(double num) { return num>=0.5; } int main(int argc,char *argv[]) { double number[SIZE]; int i; srand((unsigned)time(NULL)); for(i=0;i<SIZE;i++) number[i]=(double)rand() / RAND_MAX; //手抜き乱数 for(i=0;i<SIZE;i++) { printf("%f %d\n",number[i], hantei(number[i])); } return 0; }

  • C言語の配列のコピーについて質問です。

    intを要素とする二つの配列a、bとその配列の要素数を受け取り、配列aのすべての要素の値を配列bにコピーする関数を定義し、その関数の機能を確認するプログラム作成するという問題について質問です。 (1)配列aを配列bに「先頭から順番に」コピーする関数を作成する (2)配列aを配列bに「後ろから順番に」コピーする関数を作成する ただし、配列の要素数(例では4)が変更されても処理できる関数を作成したいです。また、配列の要素の値は関数main()内で表示したいです。 [ヒント] (1)関数宣言の例 void array_copy(コピー元の配列, コピー先の配列, 配列の要素数) [実行結果の例] (1)先頭から順番にコピーする コピー前 a[0]: 1 b[0]: 0 a[1]: 2 b[1]: 0 a[2]: 3 b[2]: 0 a[3]: 4 b[3]: 0 コピー後 a[0]: 1 b[0]: 1 a[1]: 2 b[1]: 2 a[2]: 3 b[2]: 3 a[3]: 4 b[3]: 4 (2)後ろから順番にコピーする コピー前 a[0]: 1 b[0]: 0 a[1]: 2 b[1]: 0 a[2]: 3 b[2]: 0 a[3]: 4 b[3]: 0 コピー後 a[0]: 1 b[0]: 4 a[1]: 2 b[1]: 3 a[2]: 3 b[2]: 2 a[3]: 4 b[3]: 1 #include <stdio.h> void array_copy() から始めて int main(void) { とプログラムを作成したいのですが教えてください。

  • 整数分割

    乱数で発生させた整数を配列に格納してその配列の整数を桁ごとに分割する簡単な方法はありますか。 例えば123を1と2と3に分割 整数を文字列に直して分割しようとしたけど整数は配列に格納されている (a[0]=123のように)のでできません。javaでプログラムを教えてください

  • このプログラムにアドバイスをください

    問題が  ・100個の要素を持った一次元配列をmain()関数内で宣言 ・一次元配列と要素数を引数として持つ関数seisei() ・関数seisei()は乱数を使い渡された配列を0~99の整数で初期化する。 ・一次元配列、要素数そして変数のポインタを引数としてもつ関数goukei() ・関数goukei()は渡された配列に格納された数値の合計を計算し、渡された変数のポインタにその合計値を代入する。 と問題があり、下記のようにプログラムを作ったんですが、どうしてもコンパイルできません。どなたかご指摘よろしくお願いします。 #include <stdio.h> #include <time.h> void seisei(int *,int); void goukei(int *, int, int*); int i, *sum; int main() { int a[100],sum; seisei(a,100); goukei(a,100,&sum); printf("sum:%d\n",&sum); return 0; } void seisei(int *a[i], int n) { srand(time(NULL)); for(i = 0; i <= n; i++){ *a[i] = rand() % 100; } } void goukei(int *a[i],int n,int *sum) { *sum = 0; for(i = 0; i <= n; i++){ *sum += *a[i]; } }

  • 乱数をC言語で

    乱数をC言語でプログラムしたいのですが、 rand関数を使わずに作らなきゃいけないという事なんですが 一度作ってはみたもののうまく乱数にできずに困っています できれば教えていただきたいです

  • C言語について教えてください。

    二次元配列でまとめられた「配列で実現する文字列」の文字と文字列を表示する関数を定義し、その関数の機能を確認するプログラムを作成する。 ただし、以下の例のように文字列の個数が変更されても処理できる関数を作成する。 また、文字列の文字の個数は最大9とする(一次元配列の要素数は10とする) さらに、関数printf()をできるだけ用いない。 (1)二次元配列でまとめられたすべての文字列を「一度に」表示する関数を定義する (2)二次元配列でまとめられたすべての文字列の文字を「一度に」表示する関数を定義する。このとき、前回の課題で定義した「すべての文字を表示する関数print_all_char()」を新しく定義する関数から呼び出して用いる。 (3)二次元配列に各文字列を格納してまとめるとき、初期化ではなく、配列の宣言・定義の後で、関数strcpy()を用いること(例では、初期化によりまとめている) [例] char astr[][10] = { "ABCD", "EFGHIJ", }; [実行結果の例] すべての文字列の表示 ABCD EFGHIJ すべての文字列の文字の表示 A B C D E F G H I J [ヒント] (1)二次元配列でまとめられた文字列の文字あるいは文字列を表示する関数<返却値型><関数名>(二次元配列の受け渡しに対応した仮引数の宣言、文字列の数) (2)文字列の数を求める。二次元配列のすべての要素に文字列が格納されている場合、文字列の数=二次元配列の要素数(一次元配列の数) =sizeof(astr)/sizeof(astr[0]) ただし、sizeof演算子の生成する型はsize_t型である。 この問題について教えてください。問題丸投げだとは分かっていますがどうしても分かりません。教えてください。ちなみに前回の課題の定義は下の通りです。 void print_all_char(char *chs) { while(*chs!='\0') { printf("%c\n",*chs); chs++; } } よろしくお願いします。

  • C言語のことで…

    C言語のポインタの勉強をしているのですが、 9×9の整数型2次元配列を格納する関数kuku_makeを作成。 結果確認はmainで上記関数を呼び出して結果を表示。 void kuku_make(int kuku[][9]) 方向性だけでもいいので教えてください。

  • c言語配列拡張

    c言語配列拡張 20個の要素からなる実数配列 x[ ] から、小さい添え字からn個の要素までの 最大値を取り出すプログラムを作成する。計算する要素の数nはキーボード から入力するか乱数で決定するかは乱数により得る。 a. 乱数が奇数の場合はキーボードから入力する。 b.乱数が偶数の場合この乱数の数を用いる。 誰が知ったら教えてください!

  • 0 からa-1 までの整数の乱数をn 個発生させ、発生した整数のヒスト

    0 からa-1 までの整数の乱数をn 個発生させ、発生した整数のヒストグラムをプリントアウトしたいです.また,a とnはコマンドラインから引き渡します 0 からa-1 までの整数を発生する乱数の書き方は (int)((double)rand()/((double)RAND_MAX+1) *a); プログラムをRandHist としたとき RnadHist 10 1000 と入力すれば 0 982 1 1035 2 956 3 1102 ・ ・ 9 971 などと。出力されるようなプログラムを作る問題ですが,a とn は、任意に変えられるように したいです. どなたか教えてください.

このQ&Aのポイント
  • NECノートパソコンPC_NS150GABでWindows11に切り替えたら、ウエブ画面の印刷ができなくなりました。
  • 質問内容は、NECノートパソコンPC_NS150GABでWindows11にアップグレードした後、ウエブ画面の印刷ができなくなった状況についてです。
  • Windows11への切り替え後、NECノートパソコンPC_NS150GABでウエブ画面の印刷ができなくなりました。解決策を教えてください。
回答を見る

専門家に質問してみよう