ヒストグラム作成用のプログラム

値を格納した配列(float)と、その配列の要素数(int)を与えたら、
ヒストグラムhisto[ ]を出力してくれるプログラム。


具体的に、出力してくれるのは

ymax  : 配列に格納されていた値の中での最大値(小数点以下繰り上げ)
ymin  : 配列に格納されていた値の中での最小値(小数点以下繰り下げ)
width : ymax - yminです、と。
a <= value < b     histo[i] = hoge 
      : [a, b)に含まれる値を持つ配列の要素数hogeです、と。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

float fsort(float a[], int n);
float fhisto(float a[], int n);

int main(void)
{
	int i,n;
	printf("Enter n = ");
	scanf("%d",&n);
	printf("n = %d\n", n);

	float value[n];
	for(i=0;i<n;i++){
		printf("float value = ");
		scanf("%f",&value[i]);
	}

	fsort(value, n);
	fhisto(value, n);
	return 0;
}



float fsort( float value[], int n )
{
	long   i, j;
	for(i=0;i<n-1;i++){
		for(j=i+1;j<n;j++){
			if(value[j] > value[i]){
				float temp = value[i];
				value[i] = value[j];
				value[j] = temp;
			}
		}
	}
}



float fhisto(float a[], int n)
{
	int i, j, k;
	int width, y_max, y_min;
	float u_limit, l_limit;

	y_max = (int)a[0] + 1;
	y_min = (int)a[n-1] - 1;
	width = y_max - y_min;
	printf("\nymax = %d,   y_min = %d,   width = %d\n\n", y_max, y_min, width);

	int histo[width];
	for(i=0;i<width;i++){
		histo[i] = 0;
	}

	u_limit = (y_min + 1.0);
	l_limit =  y_min;

	for(k=0;k<width;k++){
		for(i=0;i<n;i++){
			if(a[i] < u_limit && a[i] >= l_limit){
				histo[k]++;
			}
		}
		u_limit++;
		l_limit++;
	}

	for(j=0;j<width;j++){
		printf("%d <= value < %d    histo[%d] = %d\n\n", 
				(y_min+j), (y_min+j+1), j+1, histo[j]);
	}
}