BohYoh.comトップページへ

基本情報技術者試験 平成15年度・春期・午後 問10 ソースプログラム

C言語講座へ  情報処理技術者試験対策講座へ  情報処理技術者試験対策講座(C言語)へ 
/*
    基本情報技術者試験          平成15年度・春期・午後 問10
                                BohYoh Shibata PREPARATION
*/

#include <stdio.h>

typedef struct {
    int     Temp   ;      /* 温度                           */
    double  Ratio  ;      /* センサ出力値の比率(実測値)       */
    double  Step   ;      /* 1℃当たりの増分               */
} CURVE ;

void   SetupCurve( CURVE * , int );
double GetK ( int , CURVE * , int );
#define   ITEMS  7

main()
{
    int    Degree ;
    double k ;
    CURVE  Curve[ ITEMS ] = {
        { -40 , 0.20 , 0.0 },{ -20 , 0.60 , 0.0 },
        { -10 , 0.80 , 0.0 },{   0 , 1.00 , 0.0 },
        {  10 , 1.17 , 0.0 },{  30 , 1.50 , 0.0 },
        {  50 , 1.80 , 0.0 } };

    SetupCurve( Curve , ITEMS );
    printf( " 温度  温度補正係数\n" );
    for( Degree = -40 ; Degree <= 50 ; Degree++ ) {
        k = GetK( Degree , Curve , ITEMS );
        printf( "  %3d     %4.2f \n", Degree, k );
    }
}

void SetupCurve( CURVE *p, int Points )
{
  /* 温度補正テーブルを初期化する */
    int  i ;
    for( i = 0 ; i < Points - 1 ; i++ ,  p++ ){
        p->Step = ( (p+1)->Ratio - p->Ratio ) / ( (p+1)->Temp - p->Temp);
    }
}

double GetK( int Temp , CURVE *p , int Points )
{
 /* 温度補正係数Kを返却値として返す */
    int   i,j,n ;
    i = 0 ; j = Points - 1 ;
    if ( ( Temp < p->Temp ) || ( Temp > (p+j)->Temp ) )
        return 0.0; /* 温度範囲外のときは,0.0 を返す */

 /* 温度補正テーブルの最後の要素の温度と一致した場合 */
    if ( Temp == ( p+j )->Temp )
        return 1.0 / ( p+j )->Ratio;

 /* 温度補正テーブルを二分探索法で探索する */

    while( 1 ) {
        n = ( i + j ) / 2 ;
        if ( ( Temp >= ( p+n )->Temp ) &&
           ( Temp < ( p+n+1 )->Temp ) ) break;

        if ( Temp < ( p+n )->Temp )  j = n;
        else i = n + 1 ;
    }

  p += n ;
  return  1.0 / ( p->Ratio + p->Step * ( Temp - p->Temp ) );
}