第13回:ファイルの徹底復習

ファイルからデータを読み込んで計算を行うことができていないようなので,もう一度,復習しましょう.

まずは,演習の答えを解説します.そして,成績を処理するプログラムを作ってみましょう.


【第9回演習の答え】

角度を0度から360度まで変えたときの,角度,sin, cosの各値をコンマ","で区切ってファイルに出力するプログラムを作ろう.ファイル名は,"sincos.csv"としよう.

sin, cosの関数は,すでにシステムに用意されています.数学関数を使うには,

#include <math.h>

として,プログラムの最初で関数の定義を読み込む必要があります.それぞれ,

double sin(double x);

double cos(double x);

と定義されています.ここで,注意しなくてはいけないのは,三角関数の角度の単位はラジアンであるということです.

プログラムの作り方:

1.まずはじめに,画面に結果を表示する(ファイルを使わない)ものを作る.

#include <stdio.h>

void main()
{
    int i;

    for(i=0; i<360; i++){
        printf("%d,%f,%f\n", i, sin(i*3.1415/180), cos(i*3.1415/180));
    }
}

2.次に,ファイルに出力するように書き換える.

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

void main()
{
    int i;
    FILE *fp;

    fp = fopen("sincos.csv", "w");
    if(fp == NULL) return;

    for(i=0; i<360; i++){
        fprintf(fp, "%d,%f,%f\n", i, sin(i*3.1415/180), cos(i*3.1415/180));
    }

    fclose(fp);
}

結果の例: 

0, 0.000000, 1.000000
1, 0.017452, 0.999848
2, 0.034898, 0.999391
....

ファイルが出力できたら,できたファイルをエクセルを用いて開いてみよう.

ここで,もう一度,ファイル入出力とキーボード入力画面出力との違いを確認しておこう.


【第10回演習の答え】

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

プログラム作成の手順

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

#include <stdio.h>

void main()
{
    int i;
    int data;
    float sum;
    FILE *fp;

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

    sum = 0;

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

    fclose(fp);

    printf("平均値=%f\n", sum/100);
}

ここで,平均を求める際に,(整数)÷(整数)の形で計算すると,結果も整数になってしまうので,注意しよう.

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

標準偏差:

 標準偏差=

平方根は,sqrt()関数を用いて求めることができます.

使い方:

 #include <math.h>

 double sqrt(double x);

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

void main()
{
    int i;
    int data;
    float sum, sum2, sigma;
    FILE *fp;

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

    sum = 0;
    sum2 = 0;

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

    fclose(fp);

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

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

#include <stdio.h>

void main()
{
    int i;
    int data[100];
    float sum;
    FILE *fp;

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

    data = 0;

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

    fclose(fp);

    printf("平均値=%f\n", sum/100);
}

これで,データを読み込むことができた.

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

偏差値の求め方:

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

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

6.ここまでは,データの数が100とわかっていたが,データの数がわからない場合はどうしたらよいか.


【第11回演習の答え】

sin, cos の値を計算して保存するプログラムの結果をファイルから読み込んで,

Y = sin(X),Y = cos(X),のグラフを表示するプログラムを作成してみよう.

コンピュータの画面の座標は,一般の感覚とは上下逆であることに注意しよう.

1.まず,ウォーミングアップに,for文を用いて同心円を描いてみよう.

#include <stdio.h>
#include "mogra.f"

void main()
{
    int r;

    g_init(640,480);

    for(r15; r=<10; r+5){
        circle(320, 240, r*5, r);
    }

    gend();
}

2.次に,計算をしながら結果を画面に表示してみよう.

#include <stdio.h>
#include <math.h>
#include "mogra.f"

void main()
{
    int x, y;
    g_int(640,480);

    for(x=0; x<640; x++){
            y = 240 - 100 * sin(3.1415*x/320);
            pset(x, y, 0);
    }

        gend();
}

3.ファイルからデータを読み込んで,画面にグラフを描くようにしてみよう.


【演習】

今日は,上記の

の4つを理解し,完成させる. わからなかったら冬休みの宿題.