C语言编程,如何根据一个值,查找一个对应关系表,获得对应值呢?

C语言编程,如何根据一个小范围值区间,查找一个对应关系表,获得一个对应值呢
例如电压值为2000~2026(mv),图片说明
其对应功率值为-52(dB),如何用C语言编程,完成建表,查表,获得结果呢?

4个回答

/*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;
}
u010626906
gg思无邪 不知道你的边界值是包含还是不包含,根据情况自己判断是使用大于号还是大于等于号
一年多之前 回复
u010626906
gg思无邪 完完全全想要拿来主义,鄙视你这种行为,几位回复的内容,怎么说也给了思路,自己再稍加修改,就ok了,谁能有你自己更明白自己要解决的问题。你现在的问题不是不会c语言,而是你根本就不想动脑子,鄙视
一年多之前 回复
u010626906
gg思无邪 楼主在17点的时候贴出的表,并不是21点修改的这个样子,在开始的时候,你可能自己都没明白自己想要什么。
一年多之前 回复
u010626906
gg思无邪 懂的人会选这个,C语言走表法
一年多之前 回复
#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;

caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 回复秋葵炒辣椒: 我回答你了,看代码之后我的说明(3)
一年多之前 回复
qq_38496394
秋葵炒辣椒 老师,如果是这种情况呢,我的电压值是一个小范围,如:电压值830-840,但对应的功率值是唯一的值-10,这种又怎么用C语言实现呢
一年多之前 回复

最简单暴力方法可以构建一个数组,例如 a[1083]=-19,a[1049]=-18。
如果值很大可以将其排序,例如1083排在第一位可以用i=1,a[1]=1083,b[1]=-19来表示,之后可以根据收到的电压值查询得i的值进而查到功率值。

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;

}
看你的需求应该是根据电压值来得到信号值吧!
说明:判断中不能直接用小范围的电压来判断,只能用小范围中的最大值来判断,因为电压的采样不会那么巧刚好是表格中的范围值内

u014799914
huhuren12 回复骆驿: 我在答案区改了,而且注释也写上了
一年多之前 回复
u010626906
gg思无邪 回复huhuren12: 可能是笔误,你改了之后的代码,比较的思路也是很奇特。另外如果不想代码太乱,请在评论的时候使用插入代码段。
一年多之前 回复
u010626906
gg思无邪 回复huhuren12:sizeof(数组)/sizeof(数组的第一个元素)才是数组元素的个数,你写的不对,可能是
一年多之前 回复
u014799914
huhuren12 回复huhuren12: 这个太乱看不清楚
一年多之前 回复
u014799914
huhuren12 回复秋葵炒辣椒: 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; }
一年多之前 回复
u014799914
huhuren12 回复骆驿怎么回漏掉呢,任何一个都不会漏掉的
一年多之前 回复
u010626906
gg思无邪 回复: 第一: for(i=0;i<((sizeof(ValueTable))/(sizeof(ValueTable[0])));i++)判断条件漏了第一个元素。第二:你没好好审题
一年多之前 回复
u010626906
gg思无邪 哥们儿
一年多之前 回复
qq_38496394
秋葵炒辣椒 是的,我的电压值是一个小范围变化的值,只要是这个小范围的值就会对应一个功率值,不知道这样如何实现。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐