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 if(私の意見では) よりエレガントにする 1 つの方法は、範囲を並べ替え、すべての 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して負の値を取得します。

于 2013-06-28T09:25:30.627 に答える
1

スイッチケースを使用できます。角度を 180 で割ります (整数のままにしてください)。例: if(A>=1 & A <180) の場合、180 で割ると 0 が返されます。if(A>=180 & A<360) の場合、180 で割ると 1 が返されます。

または次のような状態がある場合

if(A>1 & A<=180) の場合、181 で割ります。それでも 0 になるので、大文字と小文字の切り替えを使用できます。

注: この場合、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 に答える