/*
第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 ) );
}