基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成15年 春期 基本情報技術者 午後 問10
問10   C言語

 次の C プログラムの説明及びプログラムを読んで,設問に答えよ。

〔プログラムの説明〕

 ある圧電センサ(加えた圧力の大きさに応じて電圧を発生する装置)の温度補正を 行うための温度補正係数を求めるプログラムを作成する。 この圧電センサは,周囲の温度によって出力特性が変化するので,出力値を補正する必要がある。 周囲の温度に対する圧電センサの出力値の変化を実験で調べたところ,表の結果が得られた。 この表は,0 ℃での出力値を 1.00 としたときの比率を表したものである。

表 周囲の温度とセンサ出力値比率

温度 センサ出力値比率
−40 ℃0.20
−20 ℃0.60
−10 ℃0.80
0 ℃1.00
10 ℃1.17
30 ℃1.50
50 ℃1.80

 圧電センサの出力値を,測定時の周囲の温度に依存しない値に補正するため, この表のデータを基にして温度補正係数 K を求める。 圧電センサの出力値に K を乗算することによって温度補正を行う。

(1) 表のデータから温度補正テーブルを作成する。 温度補正テーブルは,構造体の配列で実現する。


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

(2) 温度補正テーブルを初期化する関数 SetupCurve と, 温度補正係数 K を求める関数 GetK を作成する。
(3) GetK は,温度 Degree に対応する温度補正係数Kを求めるため, 温度補正テーブルを二分探索法で探索する。 温度範囲は,−40 ℃以上,50 ℃以下とする。 温度補正テーブルに該当する温度値がないときは,温度 Degree に対するセンサ出力値比率を 線形補間して求め,この値の逆数を K として返す。

(4) 主プログラムは,この二つの関数の動作を検証するため, −40 〜 50 ℃の温度補正係数 K を,1 ℃ 刻みで求めて表示するテストプログラムである。 表示例は,次のとおりである。

温度  温度補正係数
-40   5.00
-39   4.55
-38   4.17
-37   3.85
-36   3.57
-35   3.33
-34   3.13
-33   2.94
-32   2.78
-31   2.63
-30   2.50
-29   2.38
-28   2.27
-27   2.17
-26   2.08
-25   2.00
   :

〔プログラム〕

#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->Step = (  ) / ( (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 =  ;
        if ( ( Temp >= ( p+n )->Temp ) &&
           ( Temp < ( p+n+1 )->Temp ) ) break ;
        if ( Temp < ( p+n )->Temp )  j = n ;
        else  ;
    }
  p += n ;
  return  1.0 / ( p->Ratio + p->Step * (  ) );
}

基本情報技術者試験


設問  プログラム中の に入れる正しい答えを, 解答群の中から選べ。

a に関する解答群

ア p--     イ p++    ウ p->Temp++

エ p += 3    オ p += 7

b に関する解答群

ア (p-1)->Ratio - p->Ratio    イ (p-1)->Ratio - (p+1)->Ratio

ウ p->Ratio - (p-1)->Ratio    エ p->Ratio - ( p->Ratio - 1 )

オ (p+1)->Ratio - p->Ratio

c に関する解答群

ア ( i + j ) / 2    イ ( i * j ) / 2

ウ ( i % j ) / 2    エ ( i + j ) * 2

オ ( i % j ) * 2

d に関する解答群

ア i = 0    イ i = n - 1    ウ i = n + 1

エ j = n    オ j = n + 1

e に関する解答群

ア Temp - p->Step    イ Temp - p->Temp    ウ Temp + p->Temp

エ p->Temp - n    オ p->Temp - Temp

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

解答 d ←クリックすると正解が表示されます

解答 e ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]