我正在构建一个简单的C项目(对于arduino),我遇到过这个问题。实际上并不是那种语言特定的,它更像是算法优化。
所以,我需要检查传感器读数的X值。
If X <5 ...
else if x<10...
else if x<15...
else if x<20...
然后在每个子句中我都有相同的for循环,但迭代会根据X的值而改变。
从一般意义上讲,这些条件如何被统一的东西取代?我记得这些&#34;渐变&#34;或者&#34;练级&#34;高中的问题,但我们仍然使用if条款。
答案 0 :(得分:2)
在下面的评论中,您已经说过(参考使用数组的条形下的第二个解决方案):
我实际上不需要第二个维度,因为值范围是在第一个维度/列中定义的(5 10 15 20等)
在这种情况下,它比下面的解决方案简单得多:
int loops = ((X / 5) + 1) * 5;
...假设X
是int
。这使用整数除法,它截断(例如,4 / 5
为0
),加1,然后将结果乘以5.这里只是对于现场示例,JavaScript中的相同内容(在JavaScript中,由于数字总是浮点数,我们必须添加一个地板方法,但你不需要在Java中使用它):
var X;
for (X = 0; X < 25; ++X) {
var loops = (Math.floor(X / 5) + 1) * 5;
console.log("X = " + X + ", loops = " + loops);
}
&#13;
然后在每个子句中我都有相同的for循环,但迭代会根据X的值而改变。
我将变量设置为迭代次数,然后将for
循环放在if
/ else
序列之后。
int loops;
if (X < 5) {
loops = /*whatever*/;
} else if (X < 10) {
loops = /*whatever*/;
} else if (X < 15) {
loops = /*whatever*/;
// ...and so on...
} else {
loops = /*whatever for the catch-all case*/;
}
for (int i = 0; i < loops; ++i) {
// ...
}
如果您试图避开if
/ else
,如果只有少量可能的传感器值,则可以使用switch
代替if
有些语言编译成跳转表,效率很高。
如果您希望将范围保留为数据而不是else
/ int[][] values = {
{5, 500},
{10, 700},
{15, 800},
{20, 1200},
{0, 1500} // 0 is a flag value
};
序列,则可以使用值数组:
int[]
(我使用X < entry[0]
数组,但它可能是一个很好的干净类实例。)
然后循环遍历数组,查找entry[0]
为真的第一个条目(或0
为int loops = 0; // 0 will never be used, but the compiler doesn't know that
for (int[] entry : values) {
if (entry[0] == 0 || X < entry[0]) {
loops = entry[1];
break;
}
}
的位置),以标记最后一个条目。
for
...后跟loop
循环使用{{1}} s。
答案 1 :(得分:0)
由于您的间隔是5的乘积,因此可以将X除以5并将结果用作数组中的索引。
const size_t loops[] = {someval, anotherval, ..., lastval};
size_t i, nloops = loops[X / 5];
for (i = 0; i < nloops; i++) {
...
}