第15回 いつも心にカーソルを「2.分岐する」

15−2 分岐する

コンピュータがプログラムを実行する、特にBASICプログラムの場合、大抵の部分をランタイムが仲介して実行してくれますが、どちらにしてもプログラム側から見た場合には、同時には1つの事しか処理できません。
これは今のコンピュータの仕組み上、仕方がないことですが、それがあまりにも速すぎるため複数同時に動いているように見えるだけです。
同時に1つの動作しか出来ない、ということを言い換えてみるならば、プログラムとはランタイムが実行すべき『道筋』を書き綴ったものだと言えるのではないでしょうか?
つまり、1つの処理をすべく、何者かがプログラムを指示通りに順に実行している訳です。
この道筋が、単なる直線道路だったら、それほど問題はありませんが、それでは複雑な処理が出来ませんので、何処か途中で『分かれ道』を用意しなければならない場合があります。
もし、分かれ道が用意できなければ、

    「ここまでのデータをセーブしますか?(はい/いいえ)」

などと言う選択の余地はなくなってしまいますね。

このようにプログラム上には、何らかの分かれ道が必要になるのですが、そんなプログラムの『分岐点』を決める代表的なコマンドには、次の2種類が用意されています。

1つは「もし、ある条件が成り立つならば○○、そうでなければ××」という分岐点です。
ある意味、「YESかNOか」というような二者択一のようにも見えますが、むしろ『1対多』と考えた方が使いやすいでしょう。

ある条件が成り立てばA、そうでなければBを実行するという場合『If 〜 Then 〜 Else 〜 End if』というコマンドを使います。
書式は次の通りです。
    
    If 条件 Then
        {A}
    Else
        {B}
    End If
    
条件とは、具体的には「条件式」になりますが、例えば、
    
    If GetEventType()=NsbKeyorButton Then
    
このように「=」で結んだ「式」で表すのが一般的です。
先にも、If〜Thenは、二者択一というより、1対多になると説明しましたが、これは Elseの部分(Else節、と言います)を省略できるからです。
    
    If 条件 Then
        {A}
    End If
    
単にこれだけでもコマンドとして立派に機能しますので、色々な条件から1つが決定した時だけ何かを行いたい時には、If〜Then〜End Ifを使います。
細かい話になりますが、BASICの歴史上、Else節が登場したのは、If〜Thenに比べてそれほど古くないため1対多のイメージが定着しています。
使う側から見れば、2つまでの条件だったら、Ifを使うと覚えておけば十分です。

 Elseの有無に関わらず、Ifで始めて、End Ifで終わる、という基本的なルールを守っていれば、この構造を『入れ子』にすることも可能です。
    
    If 条件 Then
        {A}
    Else
     If 別の条件 Then
        {B}
     Else
        {C}
     End If
    End If
    
ちょっとスッキリしませんが、この入れ子によって、2つの条件を判断させ、3つの処理に分岐することが出来ます。
ただ、見た目があまり「スマート」ではありませんので、『ElseIf』というコマンド(Else If、の場合も有)を搭載したBASICもあるようです。
    
    If 条件 Then
        {A}
    ElseIf 別の条件 Then
             {B}
        Else
             {C}
    End If
    
どちらにしろ、1対多の原則から考えれば、Elseの後にもう1回Ifを続けるのはスマートではありませんし、実は、Elseの後にすぐIfが続くと、コンパイラやランタイムが解釈ミスをする場合もあるようなので、一応、心に留めておいて下さい。
基本的に、IfとEnd Ifが対になっているのですが、一見すると「このIfはどこまでが範囲なの?」と混乱する場合もあります。あまり複雑な条件分岐には Ifを使わないのが賢い選択です。

 一方、多くの条件から1つを決めて分岐させたい場合がないわけでもありません。そんな複数の中から1つを選ぶ場合には『条件選択』の「Select Case〜End Select」を使うのが一般的です。
書式としては以下の通りで、Case Elseの部分は必要なければ省略することができます。
    
    Select Case 条件
        Case 値1
            {A}
        Case 値2
            {B}
        Case 値3
            {C}
        Case Else
            {D}
    End Select
    
これは「条件」で与えられたものと同じ「Case」の部分を実行しますので、1つの条件に対して幾つもの選択肢がある場合に使います。
例えば、先ほどの If〜Thenで登場したサンプル、
    
    If GetEventType()=NsbKeyorButton Then
    
という部分は「もし、ボタンかキーが押されたら」というNS Basicのイベント処理では、よく登場する分岐点ですが、その後の処理には、
    
    strKey=GetKey()
    Select Case strKey
        Case &h1 'ボタン1(スケジュール)が押されたら
             {A}
        Case &h2 'ボタン2(アドレス帳)が押されたら
             {B}
        Case &h3 'ボタン3(ToDoリスト)が押されたら
             {C}
        Case &h4 'ボタン4(メモ帳)が押されたら
             {D}
        Case Else 'それ以外だったら
             {E}
    End Select
    
これらのように、どのボタンが押されたのかチェックをする処理が続くのが一般的でしょう。
いくつもボタンがあるPalmですが、Case節によってまとまっているので、それなりに見やすく、また、理解はしやすいですね。
もし、この部分をIf〜Thenで書いたら、とてもゴチャゴチャしたプログラムになることは、お分かり頂けると思います。
    
    strKey=GetKey()
    If strKey=&h1 Then
        {A}
    Else
        If strKey=&h2 Then
            {B}
        Else
            If strKey=&h3 Then
                 {C}
            Else
                If strKey=&h4 Then
                    {D}
                Else
                    {E}
                End If
            End If
        End If
    End If
    
 このようにプログラム中では、何らかの分岐が必要なポイントがいくつか登場します。
その場合、何らかの条件で分岐させる必要がありますが、それらを実現するため If〜Then〜End Ifと、Select Case〜End Selectの2種類のコマンドが用意されています。
それぞれの特徴と違いを理解して適切に使えるようにしましょう。

前へ     目次へ     次へ

第15回 いつも心にカーソルを「2.分岐する」