第14回:総復習

先週の演習の解答です.


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

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

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


プログラム作成の手順

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

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

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

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

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


		

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


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

考え方: データを読み取り,if文で各ランクに該当するか確認しても良いが,ランクが増えると,if文が複雑になる.ここで,頭を使おう!

#include <stdio.h>

void main()
{
    int i, j;
    int data, rank, hist[11];
    FILE *fp;

    for(i=0; i<11; i++){
        hist[i] = 0;
    }

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

    for(i =0; i<100; i++){
        fscanf(fp, "%d", &data);
        rank = data/10;
        if(0<=rank && rank<=10){
            hist[rank]++;
        }
    }

    fclose(fp);

    for(i=0; i<11; i++){
        printf("\n%2d0- :%3d人 : ", i, hist[i]);
        for(j=0; j<hist[i]; j++){
            printf("*");
        }
    }
}


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

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

考え方:全てのデータについて,自分のデータより大きい点数のデータの数を数えれば,順位が求まる.

#include <stdio.h>

void main()
{
    int i, j;
    int data[100], jun[100];
    FILE *fp;

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

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

    fclose(fp);

    for(i=0; i<100; i++){
        jun[i] = 1;
        for(j=0; j<100; j++){
            if(data[j] > data[i]){
                jun[i]++;
            }
        }
        printf("%3d点 %3d位\n", data[i], jun[i]);
    }
}


【演習】

去年の問題をやってみよう

J.下記のC言語に関する文章中の( )を,答えなさい. (配点 30点)

 変数などが格納されている(A)を値とする変数を,(B)変数と呼ぶ.(B)変数へ(A)を代入するには,次のように行う.

int a;
int *p;
p = (C);

 文字列変数は,文字の(D)として表され,文字列の終わりを表す(E)を文字の後につける.
 関数へ値を渡す方法には,(F)と(G)がある.(F)では,呼び出す側へ値を戻せる数は,(H)である.(G)は,呼び出す側と関数側で同じ(A)を参照することになり,呼び出す側と関数側で複数の値や配列を共有できる.
 ファイルには,(I)形式と(J)形式がある.(I)形式のファイルは,エディタを用いて表示することができる.ファイルの読み書きの主な手順は,ファイルを(K)→ファイルの読み書き→ファイルを(L)である.現在ファイルを読み書きしている位置は,(M)により示される.
 コンピュータ画面の座標は,水平方向は左から右へ(N)し,垂直方向は下から上へ(O)する.

K.整数の格納された配列aに,数字の8が含まれるかどうか調べ,含まれている場合
「配列は8を含みます」
と画面に表示したい.配列から数字8を探すプログラムを完成せよ. (配点 20点)

#include <stdio.h>
main()
{
    int a[5] = {9, 8, 7, 6, 5};
    int i;

    ここを回答する
}


L.データ件数nと,浮動小数点配列fを受け取り,データの平均値(浮動小数点)を求めて返す関数heikinを作成せよ. (配点 20点)

M.あるクラスの生徒の身長(浮動小数点)が,番号順に1番から50番まで並んだファイルsincho.txtがある(人数は50人だとわかっているとする).問題Lで作成した平均値を求める関数を用いて(関数の定義も解答に含めること),ファイルの内容を配列に読み込み,クラスの生徒の平均身長を求め,結果を画面に表示するプログラムを作成せよ. (配点 30点)

sincho.txt の中身

175.3    ←1番目の生徒の身長
168.5    ←2番目の生徒の身長