ヒストグラム作成用のプログラム
値を格納した配列(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]); } }