C语言编程,如何根据一个小范围值区间,查找一个对应关系表,获得一个对应值呢
例如电压值为2000~2026(mv),
其对应功率值为-52(dB),如何用C语言编程,完成建表,查表,获得结果呢?
/*17点:一一对应版本*/
#include <stdio.h>
#define NG (0xFF)
//data structure
typedef struct
{
int voltage;
int power;
}stVoltPowerTbl;
//table
const stVoltPowerTbl myTable[] =
{
{-19,1083},
{-18,1049},
{-17,1025},
{-16,996},
//add your data
};
int Find(int voltage)
{
int Ret = NG;
int i = 0;
for(i=0;i<((sizeof(myTable))/(sizeof(stVoltPowerTbl)));i++)
{
if(myTable[i].voltage == voltage)
{
Ret = myTable[i].power;
}
}
return Ret;
}
int main()
{
int Ret = 0;
Ret = Find(-17);
if(Ret != NG)
{
printf("power = %d \n",Ret);
}
else
{
printf("Error Voltage! \n");
}
return 0;
}
/*21点:根据范围求对应值版本*/
#include <stdio.h>
#define NG (0xFF)
//data structure
typedef struct
{
int power;
int minVoltage;
int maxVoltage;
}stVoltPowerTbl;
//table
const stVoltPowerTbl myTable[] =
{
{-55,2080,2094},
{-54,2060,2075},
{-52,2000,2026},
//add your data
};
int Find(int voltage)
{
int Ret = NG;
int i = 0;
for(i=0;i<((sizeof(myTable))/(sizeof(stVoltPowerTbl)));i++)
{
if((myTable[i].minVoltage < voltage)&&(myTable[i].maxVoltage > voltage))
{
Ret = myTable[i].power;
}
}
return Ret;
}
int main()
{
int Ret = 0;
Ret = Find(2001);
if(Ret != NG)
{
printf("power = %d \n",Ret);
}
else
{
printf("Error Voltage! \n");
}
return 0;
}
#include <stdio.h>
int pw[] = { - 19, -18, -17, ... 5 }; //这里的...的部分你自己填写下
int vot[] = { 1083, 1049, 1025, ... 834 };
int findOnEqu(int * arr, int n, int val)
{
for (int i = 0; i < n; i++)
{
if (val == arr[i]) return i;
}
return -1;
}
int main()
{
int n = findOnEqu(vot, 25, 830);
printf("%d", pw[n]);
return 0;
}
说明几点
(1)开头的两个数组必须是单向有序并且长度相等
(2)int n = findOnEqu(vot, 25, 830); 里面的25是你的表长,这里数了下,你有25行,也就是数组是25个元素,可以根据需要修改
(3)如果你需要查表中间没有的值,比如829也要返回-10
那么
if (val > arr[i]) return i - 1;
typedef struct{
int Signal;
int voltageMin;
int voltageMax;
}stVoltSignal;
//table
const stVoltSignal ValueTable[] =
{
{-55,2080,2094},
{-54,2060,2075},
{-53,2030,2050},
//add more
};
int FromVolFindSignal(int voltage)
{
int Ret = 0;
int i = 0;
for(i=0;i<((sizeof(ValueTable))/(sizeof(ValueTable)));i++)
{
if(ValueTable[i].voltageMax <= voltage)
{
if(i){
//传入电压值如果比一段小范围的最大值还大则取上一个信号值作为实际信号值
Ret = ValueTable[i-1].Signal;
return Ret;
}
else{
//如果是电压值比第一个的最大值还大,则认为是第一个的信号值
Ret = ValueTable[0].Signal;
return Ret;
}
}
}
//如果传入的电压值太小小,查表查不到,就只能按照表格中的最后一个数据来处理
Ret = ValueTable[i-1].Signal;
return Ret;
}
看你的需求应该是根据电压值来得到信号值吧!
说明:判断中不能直接用小范围的电压来判断,只能用小范围中的最大值来判断,因为电压的采样不会那么巧刚好是表格中的范围值内