这是我在这里的第一篇文章。第一次学习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
答案 0 :(得分:3)
不,该代码无法使用switch
进行编写。
case
的值必须是常量和整数。你可以有case 4611:
但不是'case a&gt; 360" 。
因此,除非您需要数百个case
语句(否则),否则代码不易翻译为使用switch
。
更新让我(在我看来)更优雅的一种方法是订购范围,并依靠已在所有else if
s中检查过的下限来减少重复:
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
来修复此问题,以捕获负值。
答案 1 :(得分: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);
}
答案 2 :(得分:1)
您可以使用开关盒。只需将角度除以180(保持整数)。 例如: if(A> = 1&amp; A&lt; 180)然后用180除以将返回0。 if(A> = 180&amp; A&lt; 360)然后除以180将返回1.
或者如果你有条件,如
如果(A> 1&amp; A&lt; = 180)则除以181.它仍将导致0,然后您可以使用switch case。
注意:在这种情况下,If-else会更有效率,但你想学习它,所以这是我的建议。
答案 3 :(得分: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;
}