繁体   English   中英

多个If-Else语句VS。 在While循环中使用C语言切换语句

[英]Multiple If-Else Statements VS. Switch Statements within While Loop for C Language

这是我在这里的第一篇文章。 第一次学习C来构建机器人! :)

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

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

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

不,该代码无法使用switch编写。

case的值必须是常数,并且是整数。 您可以使用case 4611:但不能使用“大小写> 360”。

因此,除非您想要数百个case语句(不需要),否则使用switch很难翻译代码。

更新使它(在我看来)更优雅的一种方法是对范围进行排序,并依靠s在else if所有条件下else if已经检查过的下限来减少重复:

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 )来捕获负值来解决此问题。

首先,您的范围未排序,这会使您可能想要做的事情有些混乱。 重新整理一下代码:

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);
}

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

或者您有以下情况

if(A> 1&A <= 180)然后除以181。它将仍然为0,然后可以使用切换大小写。

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

如果要避免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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM