基本情報技術者試験 平成15年度・春期・午後 問10 ソースプログラム
/*
基本情報技術者試験 平成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 ) );
}