サイトマップ / C言語講座出入り口総目次目次:関数>平均と標準偏差

青い直線

平均と標準偏差

青い直線

[トークンの取り出し]←このソース→[sscanf( )とsprintf( )]

/* ソースプログラムの説明 */

/* 今日は少し実用的なプログラムを作ります。キーボードから浮動小数点数を入力し、その平均標準偏差を求めます。

キーボードからの浮動小数点数の入力でscanf( )を使うと、符号と数字と小数点以外の入力があると入力が正常に行われません。入力に失敗した時、変換できなかった文字が標準入力に残り、それが次のscanf( )に取り込まれ、プログラムの動作が異常になります。そこで、今回は充分大きなchar型の配列を用意して、fgets( )でこの配列へ標準入力(キーボード)から文字列を取り込み、sscanf( )を使って浮動小数点数に変換します。

sscanf( )は変換に成功した数を戻り値として返すので、これを利用して変換がうまくいったか判断し、変換に失敗したらメッセージを表示してプログラムを終了させます。

fgets( )sscanf( )

fgets( )とsscanf( )の簡単な説明を示します。nは入力する文字数です。

    #include  <stdio.h>
    char *fgets(char *s, int n, FILE *fp);

    例:fgets(s, n, fp);

    実行結果    戻り値
    成功        s
    失敗        NULL
    #include  <stdio.h>
    int sscanf(const char *buf, const char *format, ...);

    例:sscanf(buf, format, ...);

    実行結果    戻り値
    成功        変換に成功した変換の数
    失敗        -1

今回のプログラムでは、規定の数の浮動小数点数を変換したら、その平均と平方和を求めます。平方和とはそれぞれの数を2乗したものの合計です。平方和を浮動小数点数の個数で割ったものから、平均の2乗を引き、その値の絶対値の平方根を求めると、標準偏差が求められます。

下記に絶対値を求める標準ライブラリ関数と、平方根を求める標準ライブラリ関数の簡単な説明を示します。

    #include  <math.h>
    double fabs(double x);

    例:y = fabs(double x);

    戻り値    絶対値

    #include <math.h>
    double  sqrt(double x);

    例:y = sqrt(x);

xは0以上の数です。

*/

/* ここからソースプログラム */

#include  <stdio.h>
#include  <math.h>            /* sqrt(  ), fabs(  ) で必要 */
#include  <stdlib.h>          /* exit(  ) で必要 */

#define NUM  5              /* 入力する浮動小数点数の個数 */

void main(void);

void main(void)
{
    char buff[256];         /* fgets(  ) で取り込んだ文字列をしまう */
    double val[NUM];        /* sscanf(  ) で変換した浮動小数点数をしまう */
    int i;
    double sum = 0.0;        /* 和 */
    double sumsq = 0.0;      /* 平方和 */
    double mean;             /* 平均 */
	
    for (i = 0; i <NUM; i++) {
        printf("(%d) 浮動小数点数を入力して下さい\t", i + 1);
                /* 標準入力から buff に文字列を読み込む */
        fgets(buff, sizeof(buff), stdin);

        if(!sscanf(buff, "%lf", &val[i])) {    /* 数字以外が入力されたら */
             fprintf(stderr, "不正な入力!");
                                                     /* メッセージを表示して */
            exit(2);                                 /* 終了 */
        }

        sum = sum + val[i];                     /* 合計を求める */
        sumsq = sumsq + val[i] * val[i];        /* 平方和を求める */
    }

    printf("平均 %lf\n", mean = sum / NUM);        /* 平均を計算して表示 */
    printf ("標準偏差 = %lf\n",                    /* 標準偏差を求めて表示 */
                sqrt(fabs(sumsq /NUM - mean * mean)));
}

/* ここまでソースプログラム */

/* ソースプログラムの終わりの二つの printf( )に注目して下さい。引数に式を取ることもできます。mean = sum / NUM では、sum / NUM で平均を求め、その結果がmeanに代入され、それが評価され、評価の結果がprintf( )に渡されます。 */

[トークンの取り出し]←このソース→[sscanf( )とsprintf( )]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:関数>平均と標準偏差