阅读以下说明和C程序,将应填入(n)处。 [说明] 某种传感器的输出值Ratio依赖于环境温度temp(-40℃≤temp≤50℃)。对一组环境温度值(ITEMS个),人们已经测量得到了相应的Ratio值(见表1)。该表粗略地描述了曲线Ratio(t

admin2008-04-03  32

问题 阅读以下说明和C程序,将应填入(n)处。
[说明]
   某种传感器的输出值Ratio依赖于环境温度temp(-40℃≤temp≤50℃)。对一组环境温度值(ITEMS个),人们已经测量得到了相应的Ratio值(见表1)。该表粗略地描述了曲线Ratio(temp)。

   校正系数K是Ratio的倒数,因此也依赖于环境温度temp。在数据处理中,人们需要用更多的列表值细致地描述曲线K(temp),如表2所示。在表2中,各温度值所对应的K值是对表1进行线性插值再求倒数得到的,具体的计算方法如下:
   1.根据temp值,在表1中用二分法查找;
   2.若找到相应的温度值,则按相应的Ratio值求倒数得到K值:
   3.若没找到相应的温度值,则可确定temp所在的温度区间[Tp1, Tp2],同时获得了相应的Ratio1和Ratio2,再按如下公式计算K值:
   Step=(Ratlo1-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

解析 本题考查了线性插值计算及二分查找。
   函数GetK(int Temp,CURVE *p,int n)用二分法在n个元素的有序表p中查找与Temp对应的传感器输出值,表中的元素已经按照温度值有序排列。进行二分查找时,首先计算表的中间位置,即[(low+high)/2],若待查元素等于中间位置上的元素,则查找成功并结束查找过程;若待查元素大,则在后半区间([m+1,high])继续进行二分查找:否则,在前半区间(pow,m-1])进行二分查找。如下图所示。
   
   以查找温度值-25为例,由于-25<0,因此设置下一个查找区间为[0,2],如下图所示。
   
   由于-25<-20,所以取high等于m-1,进一步,由于-25>-40,所以取low等于 m+1,如下图所示,至此,由于查找区间为空(10w>high),则可确定查找失败。
   
   因此,空(1)处应填入“(low+high)/2”,空(3)处应填入“m+1”。根据题干的描述,若找到相应的温度值,则按相应的Ratio值求倒数得到K值,因此空(2)处应填入“1.0/(p+m)->Ratio”。若未找到相应的温度值,则结束查找时low>high。
   根据题干中描述的线性插值再求倒数计算方法和p+=high:可得到计算Step和K的算式:
   Step=((p+1)->Ratio-p->Ratio)/(Tp1-Tp2)
   K=1.0/(p->Ratio+Step*(Temp-p->Temp))
转载请注明原文地址:https://kaotiyun.com/show/IsjZ777K
0

最新回复(0)