第13回:ヒストグラムと順位つけ

冬休み前に行った演習の,解答です.


100人の試験結果のデータ testdata.txt(100点満点で正の整数)を読み込んで,試験の平均値を求めるプログラムを作ろう.

これができた人は,標準偏差を求めてから各点数の偏差値を求めてみよう.

さらに,できた人は,関数の演習で作成した並べ替える関数を使って,成績のよい順に並べ替えて,結果を別のファイルに保存してみよう.


プログラム作成の手順

1.ここでは,人数があらかじめ100人とわかっているとして,手始めに平均点だけを求めることを考えよう.

2.次に,標準偏差を求めてみよう.

3.各人の偏差値を求める準備として,うえのプログラムを改良してデータを配列に読み込んでから平均値を求めてみよう.

ここまでは,前回解説しました.


4.次に各点数の偏差値を求めてみよう.

ファイルからデータを読み込めてしまえば,もう一度やったことのあるプログラムと同じです.

偏差値の求め方:

 偏差値=(得点−平均値)/標準偏差*10+50

#include <stdio.h>
#include <math.h>

void main()
{
    int i;
    int data[100], hensa[100];
    float sum=0, sum2=0, ave, sigma;
    FILE *fp;

    fp = fopen("testdata.txt", "r");
    if(fp == NULL) return;

    sum = 0;

    for(i = 0; i<100; i++){
        fscanf(fp, "%d", &(data[i]));
        sum += data[i];
        sum2 += data[i] * data[i];
    }

    fclose(fp);

    ave = sum / 100;
    sigma = sqrt((100 * sum2 - (sum * sum)) / 100 /(100 - 1));
    printf("平均値=%f\n", ave);
    printf("標準偏差=%f\n", sigma);

   for(i =0; i<100; i++){
        hensa[i] = (data[i] - ave) / sigma * 10 + 50;
        printf("%d 番目の人の偏差値: %f\n", i+1, hensa[i]);
    }
}

5.入力されたアルファベットの小文字の文字列をabc順に並べ替えるプログラムを参考にして,成績のよい順に並べ替えてみよう.

........
void swap(int *a, int *b)
{
     int t;
     t = *a;
     *a = *b;
     *b = t;
}

void sort(int *s, int n)
{
    int i, j;

    for(i=0; i < n-1; i++){
        for(j=i+1; j < n; j++){
            if(s[i] > s[j]){
                  swap(&(s[i]), &(s[j]));
            }
        }
    }
}

........
        sort(data, 100);
........

【演習】

1. 得点を10点幅で区切って,(0〜9, 10〜19, ...., 90〜99,100の11ランク)各ランクの度数分布(ヒストグラム)を求めよ.

実行例:

0-9:12人
10-19:14人
20-29:9人
....
100:1人

2. 各得点の順位を求めよ.ただし,同じ点数の者が2名いたら,次の点数の者の順位は,一つ飛ぶ.

たとえば,47点が53位で,47点の者が2名いたとすると,46点の者は,55位となる.