【简答题】
试题三(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)_____));
}