1

这是我在此的头一篇博文。第一次学C搭建机器人!:)

switch 语句是否是表达下面多个 if-else 语句的更好选择?我的意思是这段代码工作正常。但我只是对 switch 语句很好奇,并想了解它们。

如果是,我不确定该怎么做。我在谷歌上进行了广泛的搜索,但对那里的复杂程序感到越来越害怕。:/

while(1)
{
    signed float A;

    A = get_angle();    

    if (A > 540 && A <= 700)
    {
        put_speed(200, 600);       //function to specify duty cycle and speed
    }
    else if (A > 1 && A <= 180)
    {
        put_speed (600, 200);
    }   
    else if (A > 180 && A <= 360)
    {
        put_speed(600, 100);
    }   
    else if (A > 360 && A <= 540)
    {
        put_speed(100, 600);
    }   
    else
    {
        put_speed(600, 600);
    }
}   // End of While
4

4 回答 4

3

不,该代码不可能用switch.

的值case必须是常数和整数。您可以拥有case 4611:但不能拥有“case a > 360”。

因此,除非您想要数百条case语句(您不需要),否则代码不容易翻译为使用switch.

更新使其(在我看来)更优雅的一种方法是对范围进行排序,并通过依赖已经在所有else ifs 中检查的下限来减少重复:

while(1)
{
    const float A = get_angle();

    if (A > 1 && A <= 180)
    {
        put_speed (600, 200);
    }   
    else if (A <= 360)
    {
        put_speed(600, 100);
    }   
    else if (A <= 540)
    {
        put_speed(100, 600);
    }   
    else if (A <= 700)
    {
        put_speed(200, 600);
    }
    else
    {
        put_speed(600, 600);
    }
}

这个新版本假定get_angle()永远不会返回负值,如果发生这种情况,它将选择错误的选择。您可以通过添加额外的if第一个来解决此问题,以捕获负值。

于 2013-06-28T09:25:30.627 回答
2

首先,您的范围没有排序,这使您可能想做的事情有点混乱。稍微重新排列你的代码:

if      (A >   1 && A <= 180)
{
    put_speed (600, 200);
}   
else if (A > 180 && A <= 360)
{
    put_speed(600, 100);
}   
else if (A > 360 && A <= 540)
{
    put_speed(100, 600);
}   
else if (A > 540 && A <= 700)
{
    put_speed(200, 600);       //function to specify duty cycle and speed
}
else
{
    put_speed(600, 600);
}

您可以看到范围或多或少是 180 的倍数。但是,范围的末端并不是我所想的那样(我原本预期的是 720,而不是 700)。

正如您的代码一样,将其编写为开关会很困难/适得其反,但您可以使用除法,特别是如果 700 是一个错字:

switch ((int)(floor((a - 1) / 180)))
{
   case 0: //1 to 180
       put_speed(600, 200);
       break;

   case 1: //181 to 360
       put_speed(600, 100);
       break;

   case 2: //361 to 540
       put_speed(100, 600);
       break;

   case 3: //541 to 720
       if (a <= 700) //Odd
       {
           put_speed(200, 600);
           break;
       }
       //fallthrough for 701 to 720 (v. strange)

   default:
       put_speed(600, 600);
}
于 2013-06-28T10:44:51.367 回答
1

您可以使用开关盒。只需将角度除以 180(保持整数)。例如: if(A>=1 & A <180) 则除以 180 将返回 0。 if(A>=180 & A<360) 然后除以 180 将返回 1。

或者如果您有条件,例如

if(A>1 & A<=180) 然后除以 181。它仍然会得到 0,然后你可以使用 switch case。

注意:在这种情况下 If-else 会更有效,但你想学习它,所以这是我的建议。

于 2013-06-28T09:37:08.057 回答
1

如果你想避免if-else你可以处理一组坐标,还要注意你必须用f所有这些文字作为后缀

#include <stdio.h>

int main(void)
{
    const float a[][4] = {
        {540.f,700.f,200.f,600.f},
        {1.f,180.f,600.f,200.f},
        {180.f,360.f,600.f,10.f},
        {360.f,540.f,100.f,600.f},
        {0.f,0.f,600.f,600.f}
    };
    size_t i, count = sizeof(a) / sizeof(a[0]);
    float A = 200.f;

    for (i = 0; i < count; i++) {
        if ((A > a[i][0] && A <= a[i][1]) || (i == count - 1)) {
            printf("%.0f %.0f\n", a[i][2], a[i][3]);
            break;      
        }
    }
    return 0;
}
于 2013-06-28T09:56:25.070 回答