阅读以下说明和C程序,将应填入(n)处。[说明] 某种传感器的输出值Ratio依赖于环境温度temp(-40℃≤te

10 查阅

阅读以下说明和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(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对应的传感器输出值,表中的元素已经按照温度值

软考初级