next up previous contents
Next: 例外処理 Up: 条件分岐を描く Previous: ふつうの条件分岐

多重条件分岐

 

多重条件分岐には、ふつう switch 文を使う。 まずは例をみてほしい。これは符号を返す関数である。

switch{
    case x>0:
        return 1
    case x=0:
        return 0
    case x<0:
        return -1
}

このように、分岐先が3つ以上になるのが多重分岐である。 それぞれの条件式は、 case  を使って書く。

もし貴方がC言語を知っていれば、次のような書き方をしたくなるかもしれない。

switch(n%3){
    case 0:
        print 3の倍数
    case 1:
        print あまり1
    case 2:
        print あまり2
}

このような書き方も可能である。 これは、

switch{
    case n%3=0:
        print 3の倍数
    case n%3=1:
        print あまり1
    case n%e=2:
        print あまり2
}

と書いたのと同じ結果となる。

また、複数の条件式を並べて書くこともできる。 さらに、どの条件式にも当てはまらない場合の処理を、 default  を使って書くことができる。 default の時は、PAD図の中には何も文字は書かれない。 では、例を見てみよう。 これは、与えられた数列の中の数を1、1桁の素数、その他に分類してそれぞれ 個数を数えるプログラムである。

{
    one = 0
    prime = 0
    others = 0
}

for(i = 1, N){
    switch(A[i]){
        case 1:
            one = one + 1
        case 2:
        case 3:
        case 5:
        case 7:
            prime = prime + 1
        default:
            others = others + 1
    }
}

case default の条件式の中身を省略し、その条件に当てはまる 場合には何もしないことを表すこともできる。 その場合には、条件式の後に空行のみを入れる。 例えば、

switch{
    case x%3=0:

    case x%3=1:
        move(+1)
    case x%3=2:
        move(-1)
}

と書いて、

というPAD図を描くことができる gif

switch文でも、{ の前で改行することが可能である。 また、空白も適当に入れて構わない。 この辺りのことについては、反復やふつうの条件分岐と同じである。 また、 case default などの分岐ラベルは、きちんと1行に書か なければいけない。 よって、

switch{
    case n > 0  &&
         m > 0:
                print n*m > 0
    case n < 0: print n < 0
}

のような書き方は不正である。

ここで、 if 〜 else if 〜 else  を使っ て多重条件分岐を書く場合について述べておこう。 次の例を見てほしい。

if(x>0)
    return 1
else if(x=0)
    return 0
else
    error
}

これは switch を使って、

switch{
    case x>0:
        return 1
    case x=0:
        return 0
    default:
        error
}

と書いたのと全く同じ結果となる。

但し、次のように、 else if の間に改行をいれてしまうと、これは if 〜 else if 〜 else とは見なされなくなってしまう。

if(x>0)
    return 1
else
if(x=0)
    return 0
else
    error

この場合の出力結果は次のようになる。 ただの if 〜 else 文のネストとなっている。

このように、 if文を使う時には注意が必要である。 思っていたのと違った形のPAD図が描かれた時には、ここに書いてあることを 思い出して、もう一度見直してみてほしい。 逆に、これらをうまく使うと、場合によって出力の形を変えてみることも可能に なる。



Masayuki Kuwada
Fri Nov 8 15:33:42 JST 1996