/*
    第2種情報処理技術者試験    平成8年度・秋期・午後 問11
                                BohYoh Shibata PREPARATION
*/

#include    <stdio.h>
typedef struct    {
    int     Temp   ;  /* 温度                    */
    float   Ratio  ;  /* センサ出力値比率(実測値)*/
    float   Step   ;  /* 作業変数                */
    } CURVE ;
void    SetupCurve( CURVE *, int );
float   GetKvalue(  int, CURVE *, int );
main()
{
    int Temp ;
    float   k ;
    CURVE   Curve[ 7 ] = {
        { -40, 0.30, 0.0 },{ -20, 0.70, 0.0 },{ -10, 0.90, 0.0 },
        {   0, 1.00, 0.0 },{  10, 1.10, 0.0 },{  30, 1.60, 0.0 },
        {  50, 1.70, 0.0 } };
    SetupCurve( Curve, 7 );
    for ( Temp = -40 ; Temp <= 50 ; Temp++ ) {
        k = GetKvalue( Temp, Curve, 7 );
        printf( "%d ℃のときの温度補正係数は %f です。\n", Temp, 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  ) ;
    }
}

float   GetKvalue( int Temp, CURVE *p, int Points )
{
    int   i, j, n ;
    i = 0 ; j = Points - 1 ;
    if ( ( Temp < p->Temp ) || (Temp > (p+j)->Temp ) )
        return 0.0 ;  /* 温度が範囲外のときは 0.0 を返す */
    while ( 1 ) {
        n = ( i + j ) / 2 ;
        if ( Temp >= (p+n)->Temp ) {
             if (n   >= Points - 1)     break;
             if (Temp < (p+n+1)->Temp ) break;
             i = n + 1 ;
        } else    j = n ;
    }
    p += n ;
    return  1.0 / ( p->Ratio + p->Step * ( Temp - p->Temp ) );
}