1242_C语言实现简单的查表

全部学习汇总: GreyZhang/c_basic: little bits of c. (github.com)

C语言的基础的语法以及最基本的用法其实是很简单的,但是如果能够用这些简单的组合解决实际的问题有时候思维需要进行灵活的变通。这种变通一般就是软件设计之中的抽象技术,如果提到抽象有人会感觉不熟悉、困惑,那么最简单的学习理解方式就是结合实际的例子做一个类比。这一次来总结一下C语言中常用的一个技巧——查表法。

通常来说,简单的处理使用查表法的时候都是为了追求开发上的快速而决定的。查表不见得会是最简单、高效的方式,但是查表法在理解以及实施上比较有优势。接下来,结合几个例子来看看常用的查表法的用法。

1, 给出1~5任意一个数,求其 10倍的数值。

通常,习惯性思维是直接去一个数值乘以10即可。但是这个是问题足够简单的时候,初级的工程师能够有这样的直觉考虑才会能够快速给出这样的答案。如果,对这个简单的算法也不熟悉该如何处理呢?很简单的处理方式就是查表法。

既然是查表,那么总该有一个表。表是什么呢?就是我们面临问题的输入条件以及(输出结果或者决断行为)。一定要有一个基本的概念,表的输出不一定是一个数学概念上的数据,这个数据是程序意义上的数据。对于输入来说,亦是如此。那么,既然明确了表是一个输入输出的对应关系,那么如何构建这样的一个表呢?

输入12345
输出1020304050

如上,这样的输入输出关系表就可以构建出来了。那么,接下来的问题就是如何利用C语言表达出来并且能够做出相关的处理。联想基本的C语言元素,数组很自然就可以作为其中的一个可选的实施方式。为了能够让数组对象实施到这样的方案中,这个表的附加信息可以进行扩充,具体如下:

输入12345
输出1020304050
数组索引01234

这样,有了两个数组以及两个数组的索引情况,相关的查找就很容易实现了。一个简单的实现例子如下:

编译之后的运行效果:

从上面的结果看,输出结果是正确的。但是,相比于直接求值这个方面在实现上既不简单又不是那么高效。但是,从实践上来说,实现方式有一个很通用的模板可以套用。

2. 基于上面的例子,来考虑另外一个例子。还是上面的列表,假如我们现在面临的情况是根据电路中的一个阻值来求解电压,而这个变化又不是线性的。我们得到了一个如下的表格:

输入(电阻值)12345
输出(电压)1021304257
数组索引01234

如果表格的内容是上面的情况,我们的输出无法通过简单的数学公式来进行表述的时候,查表在工程实践上不管是从实施、效率还有准确性等方面都有一定的可取之处了。类似的,我们可以写出如下的程序:

程序的编译运行效果:

3. 连续表的实现。

还是基于上面的第一个例子,加入这个表述的就是电阻电压的关系,而我们知道了其中每一段都是线性或者近似线性的关系。我们就可以根据详细的输入来获取输出的对应关系的估算值。

输入12345
输出1020304050
数组索引01234

针对上面的表,设计程序如下:

编译以及运行的效果:

说明,关于上面的map的使用,参考: GreyZhang/c_units: A small piece of code which can be reuse anywhere, I call it a unit. This is a collection of unit in C language! Ok, yes, it would be my toolbox. (github.com)

从上面的运行结果看,这个查表实现了一个线性估计的查表功能。类似的处理还有,根据输入的数值,向上或者向下取整等操作。或者,实现四舍五入之类的运算。

4. 表格输出不再是纯数据,而是指针。这样,不仅可以实现数字类数据的操作,还能够实现对函数的操作。接下来,修改表格的输入以及输出对应关系,在输出表中填入指向函数的指针。

这里专门用了乱序的输入以及重复的输出选择,仅仅是为了表明查表功能的灵活性。自然,其他的可能性的属性也可以在这样的查表中增加,比如如果相关动作分布有线性关系,也可以进行一个限值判断执行不同的逻辑。

5. 继续做另外的思考,其实输入表业不见得必须得是一个数字表。我们也可以进行变通让这个变成不同的形式,典型的可以是复杂的数据结构或者前面用过的函数指针。当然,函数指针本身也算得上是一种数据结构。

在C语言设计中,查表其实不算是什么高级技术。但是在汽车电子嵌入式的应用软件设计中,查表是非常常用的一种手段。自然,我们有其他的设计方式让我们的软件更加简洁高效,但是查表可以做到“一招鲜”,因为这种处理方式足够简单也的确是十分可靠。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值