見出し画像

(答案提出)C言語教室 第4回 - 配列を関数に渡す - 蛇足編

先日アップした記事の、補足蛇足記事です。
kznさんにご教授いただいた内容を反映させました。
元の記事はこちら。

ハードコーディング

答案提出したプログラムでは、計算対象とするデータをハードコードしていました。

	a[0] = 2;
	a[1] = 9;


サンプル数を変更しやすくする(動的配列)

何個のサンプルデータを生成させるのかについてを、変数sで変更できるようにします。

	int* a;

	a = (int*)malloc(sizeof(int) * s);
	if (a == NULL) exit(0);


ランダムな数値を取得する

どうせなら0 - 9の範囲の数字をランダムに発生させて、平均と最大値を求めてみたいと考えました。

	for (i = 0; i < s; i++) {
		a[i] = rand() % 10;
		++b[ a[i] ];
	}


結果の検証

ついでに、ランダムに発生させた数値がどれくらい分散しているのかについて、それぞれの発生回数をカウントして表示させるようにしました。

	for (i = 0; i < s; i++) {
		a[i] = rand() % 10;
		++b[ a[i] ];
	}

	printf("Average = %f\n", ave(a, s));
	printf("Max = %d\n", max(a, s));

	for (i = 0; i < 10; i++) {
		printf("%d の出現回数 = %d\n", i, b[i]);
		t += b[i];
	}

	printf("サンプル総数 = %d\n", t);

(動作環境;https://9cguide.appspot.com/web_picoc_em.html )


動作環境による影響?(ランダム値のシード)

乱数発生については、異なるシードを都度与えないと結果が同じになることを想定していたのですが、この動作環境では毎回異なる結果が得られます。

(一般的には時間をシードとして与えると思うのですが、そのためにtime.hをincludeしようとすると、実行時にスクリプトエラーになります。)


実行結果例

	Average = 4.425000
	Max = 9
	0 の出現回数 = 105
	1 の出現回数 = 109
	2 の出現回数 = 89
	3 の出現回数 = 101
	4 の出現回数 = 104
	5 の出現回数 = 107
	6 の出現回数 = 92
	7 の出現回数 = 96
	8 の出現回数 = 113
	9 の出現回数 = 84
	サンプル総数 = 1000


サンプルコード

/* main.c */ 

#include <stdio.h>

#include <stdlib.h>

#define INT_MIN (-2147483648)

double ave(int* x, int y) {
	int i;
	double sum = 0.0;

	for (i = 0; i < y; i++) {
 		sum += x[i];
	}

	return sum / y;
}

int max(int* x, int y) {
	int i;
	int m;

	m = INT_MIN;
  
	for (i = 0; i < y; i++) {
		m = (x[i] > m) ? x[i] : m;
	}
    
	return m;
}

void main() { 
	int i, s = 1000, t = 0;
	int b[10] = {0};
	int* a;

	a = (int*)malloc(sizeof(int) * s);
	if (a == NULL) exit(0);

	for (i = 0; i < s; i++) {
		a[i] = rand() % 10;
		++b[ a[i] ];
	}

	printf("Average = %f\n", ave(a, s));
	printf("Max = %d\n", max(a, s));

	for (i = 0; i < 10; i++) {
		printf("%d の出現回数 = %d\n", i, b[i]);
		t += b[i];
	}

	printf("サンプル総数 = %d\n", t);
}

プログラミング、楽しい!

ここまで読んでいただいて、有難うございました。

(コンピューター関連の昔話です)


いいなと思ったら応援しよう!

Akio van der Meer
これまでの収益は全て、それを必要としておられる方々へ、支援機関を通して寄付させていただきました。この活動は今後も継続したいと思っています。引き続きよろしくお願いいたします。