c++ 如何避免IF ELSE语句

3hvapo4f  于 2023-01-18  发布在  其他
关注(0)|答案(4)|浏览(195)

我有下面的代码,看起来不太好。我可以用什么方法使它看起来更好呢?想象一下有很多IF ELSE语句。作为一个例子,我想区分左边比右边小还是大。并且增加了更多的距离。(这是关于一个机器人,它应该能探测到它前面的障碍物。)

distance1 = left_LOX.distance();
distance2 = middle_LOX.distance();
distance3 = right_LOX.distance();

if (distance1 < 100 || distance2 < 100 || distance3 < 100)
  distance_case = 1;
else if (distance1 < 300 || distance2 < 300 || distance3 < 300)
  distance_case = 2;
else
  distance_case = 3;

// Abfragen für die Automatik
switch (distance_case)
{
case 1:
  target = 0;
  robot.Stop();
  delay(2000);
  break;
case 2:
  target = 4000;
  robot.Forward();
  break;
case 3:
  target = 6000;
  robot.Forward();
  break;
}

如果能有个办法让它变得更好就好了。

d7v8vwbk

d7v8vwbk1#

如果distance_case没有长期使用,您可以直接使用if ... else if ... else块。它不必要地引入了没有用途的新变量。或者定义一个enum,如果您看到,长期来看,会有很多这样的情况。Reader也可以快速地理解这些值。

uz75evzq

uz75evzq2#

dmin= min(left_LOX.distance(), middle_LOX.distance(), right_LOX.distance());
if (dmin < 100)
{
    target = 0;
    robot.Stop();
    delay(2000);
}
else if (dmin < 300)
{
   target = 4000;
   robot.Forward();
}
else
{
   target = 6000;
   robot.Forward();
}
nvbavucw

nvbavucw3#

如果你有很多距离(几百,几千),那么首先把所有的距离分组到一个容器中,比如vector,然后使用标准算法,就比较容易了。这是假设您在使用的esp 32平台/编译器上有可用的C++ std库-它应该至少可以达到C++11 -参见例如https://medium.com/geekculture/modern-c-with-esp32-dcd3918dd978

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    // Just an example vector initialisation - replace this with the required x_Lox.distance() calls.
    std::vector<int> distances = {300, 500, 500, 200, 100 };
    const auto min = *std::min_element(distances.begin(), distances.end());
    
    std::cout << "Min distance: " << min;

    return 0;
}

一旦你有了最小距离,你就可以运行各种情况来处理。这是基于你只对最短距离感兴趣的假设来选择你的机器人的动作。如果你有更复杂的逻辑,代码也会变得更复杂。

ilmyapht

ilmyapht4#

如果你觉得更合适的话你可以加进去。

distance_case = (distance1 < 100 || distance2 < 100 || distance3 < 100) + 
                (distance1 < 300 || distance2 < 300 || distance3 < 300) + 
                (distance1 >= 300 || distance2 >= 300 || distance3 >= 300);

相关问题