题库 题库

【简答题】

试题三(15分,每空3分)
  阅读以下说明和C语言函数,将应填入___(n)___处的字句写在答题纸的对应栏内。
[说明]
  某种传感器的输出值Ratio 依赖于环境温度temp(-40℃≦temp≦50℃)。对一组环境温度值(ITEMS 个),人们已经测量得到了相应的Ratio 值(见表1)。该表粗略地描述了曲线Ration(temp) 。
     
  校正系数K是Ratio 的倒数,因此也依赖于环境温度temp 。在数据处理中,人们需要用更多的列表值细致地描述曲线K(temp ),如表2所示。在表2中,各温度值所对应的K值是对表1进行线性插值再求倒数得到的,具体的计算方法如下:
  1. 根据temp 值,在表1中用二分法查找;
  2. 若找到相应的温度值,则按相应的Ratio 值求倒数得到K值;
  3. 若没找到相应的温度值,则可确定temp 所在的温度区间[Tp1,Tp2] ,同时获得了相应的Ratio1 和Ratio2 ,再按如下公式计算K值:
   Step = (Ratio1 - Ratio2)/(Tp1 - Tp2)
   K = 1.0/(Ratio1 + Step * (temp - Tp1))
  在程序中,当temp 高于50℃或低于-40℃时,设定K=0。
[程序]
   #include <stdio.h> typedef struct{
    int Temp;   /*环境温度*/
    double Ratio; /*传感器的输出值*/
   }CURVE;
  #define ITEMS 7
  double GetK(int,CURVE *,int);
  void main()
  { int Degree;
   double k;
   CURVE Curve[ITEMS] = {{-40,0.2},{-20,0.60},{-10,0.8},{0,1.0},
              {10,1.17},{30,1.50},{50,1.8}};
   printf(" 环境温度校正系数\n");
   for(Degree = -40;Degree <= 50; Degree++){
    k = GetK(Degree,Curve,ITEMS);
    printf("%3d %4.2f\n",Degree,k);
   }
  } 
  double GetK(int Temp,CURVE *p,int n)
  {  /* 用二分法在n个元素的有序表p中查找与Temp 对应的传感器输出值*/
   int low,high,m;
   double Step;
   low = 0;
   high = n-1;
   if ((Temp < p->Temp)||(Temp > (p+high)->Temp))
    return 0.0;  /* 超出温度范围时返回0.0*/
   while (low <= high){
    m =_____(1)_____;
    if (Temp == (p+m)->Temp)
     return _____(2)_____ ;
    if (Temp < (p+m)->Temp) high = m-1;
    else low = _____(3)_____ ;
   }
   p += high; Step = (_____(4)_____)/((p+1)->Temp - p->Temp);
   return 1.0/(p->Ratio + Step * (_____(5)_____));
  } 

参考答案

(1) (low + high) / 2
(2) 1.0 / (p+m)->Ratio
(3) m + 1
(4) (p+1)->Ratio - p->Ratio
(5) Temp - p->Temp

相关试题