解答例12-1

【問1】

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

#define N 10
int data[N] = { 80, 76, 59, 87, 66, 54, 40, 78, 94, 61 };

int get_goukei( void );
double get_bunsan( double avg );

int main( void )
{
        double heikin, bunsan, hensa;
        int goukei;
        
        goukei = get_goukei();
        heikin = ( double ) goukei / N;
        bunsan = get_bunsan( heikin );
        hensa = sqrt( bunsan );
        
        printf( "合計点  : %d\n", goukei );
        printf( "平均点  : %f\n", heikin );
        printf( "分散   : %f\n", bunsan );
        printf( "標準偏差 : %f\n", hensa );
        
        return 0;
}

/*** 合計を求める関数 ***/
int get_goukei( void )
{
        int i, sum = 0;
        for ( i = 0; i < N; i++ ) {
                sum = sum + data[i];
        }
        return sum;
}

/*** 分散を求める関数 ***/
double get_bunsan( double avg )
{
        int i;
        double disp = 0.0;

        for ( i = 0; i < N; i++ ) {
                disp = disp + ( data[i] - avg ) * ( data[i] - avg );
        }
        return disp / N;
}

【問2】

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

#define N 10

int get_goukei( int *p );
double get_bunsan( int *p, double avg );

int main( void )
{
        double heikin, bunsan, hensa;
        int goukei;
        int data[N] = { 80, 76, 59, 87, 66, 54, 40, 78, 94, 61 };

        goukei = get_goukei( data );
        heikin = ( double ) goukei / N;
        bunsan = get_bunsan( data, heikin );
        hensa = sqrt( bunsan );
        
        printf( "合計点  : %d\n", goukei );
        printf( "平均点  : %f\n", heikin );
        printf( "分散   : %f\n", bunsan );
        printf( "標準偏差 : %f\n", hensa );
        
        return 0;
}
/*** 合計を求める関数 ***/
int get_goukei( int *p )
{
        int i, sum = 0;
        for ( i = 0; i < N; i++ ) {
                sum = sum + *p;
                p++;
        }
        return sum;
}

/*** 分散を求める関数 ***/
double get_bunsan( int *p, double avg )
{
        int i;
        double disp = 0.0;

        for ( i = 0; i < N; i++ ) {
                disp = disp + ( *p - avg ) * ( *p - avg );
                p++;
        }
        return disp / N;
}

※ グローバル変数を用いて各関数共通で配列を参照している【問1】と、 ローカル変数を用いて引数で配列のアドレスを渡している【問2】では、 【問2】の方が関数の独立性が高く、配列data も安全なものになっています。

戻る


banner初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved