2.プログラムの制御

(1)条件分岐(IF文,SELECT CASE文)
   制御構造を持たないプログラムは,上から下ヘ,左から右へ向かって実行
   される。しかし,定められた条件によって複数の選択肢から1つを選び,そ
   れを実行する場合もある。このような処理を実行するために,IF文,
   SELECT…CASE文などがある。

(a) IF文〜条件式が”真”か”偽”かを評価した結果に基づいて,条件付き
   の実行や分岐を行うフロー制御ステートメント。
    (条件式は,計算結果として常に”真”の場合−1,”偽”の場合0を返す。論理式またはブール式とも呼ばれる。)

  構文1:(ブロック形式)

     IF 条件式A THEN
         
        ステートメントブロック 1       →条件式Aが真の場合に実行

     ELSEIF 条件式B THEN

        ステートメントブロック 2       →条件式Bが真の場合に実行

     ELSEIF 条件式C THEN

        ステートメントブロック 3       →条件式Cが真の場合に実行

     ELSE

        ステートメントブロック 4       →上の条件のいずれにも該当しない場合に実行

     END IF
                 ステートメントブロックは,1行以上の複数のステートメントから成る。

 ブロック形式のIF文には,様々なバリエーションがある。

   バリエーション1(ELSEIF文が省略された場合)
       IF 条件式A THEN
         ステートメントブロック 1
       ELSE
         ステートメントブロック 2
       END IF
               
   バリエーション2(ELSEIF文〜ELSE文が省略された場合)
       IF 条件式A THEN
         ステートメントブロック 1
       END IF

   バリエーション3(ブロック形式が二重にネストされた場合)
       IF 条件式A THEN
         ステートメントブロック 1
       ELSE
         IF 条件式B THEN
            ステートメントブロック 2
         ELSE
            ステートメントブロック 3
         END IF
       END IF
               上の例はネストしない形式でも記述できる。

  構文2(1行形式)

     IF 条件式 THEN 文1 ELSE 文2
         条件式が真ならば,文1を実行。偽ならば,文2を実行。

   例1) IF x>xmax THEN xmax=x
             ・・・もしxがxmaxよりも大きいならば,xmaxにxの値を代入
   
   例2) IF x>=60.THEN a$=”OK” ELSE a$=”NG”
             ・・・もしxが60.以上ならば文字変数a$にOK,そうで
               ないならばNGを代入

  ・関係演算子(数値や文字列の大小関係を比較)

      関係演算子             意味
        =                等しい
       <>               等しくない
        >                より大きい
        <                より小さい
       >=                 以上
       <=                 以下

    ※ IF文の等号(=)は論理的に等しいことを意味し,算術代入文のそれ
      は変数に値を代入することを意味する。

  ・論理演算子(複数の条件式を組み合わせて,複雑な条件式を作る場合に使用)

      論理演算子             意味
        AND              論理積(かつ)
        OR               論理和(または)
        NOT            否定(オペランドのビットを反転)

(b) SELECT CASE文〜テスト式の値に従って,複数のステートメント
                  ブロックを実行するフロー制御ステートメント

     SELECT CASE テスト式     テスト式:テスト式として変数名,数式,文字式がくる。
        CASE <式1>         式1:テスト式と同じデータ型の1つまたはそれ以上の数値,式で指定する。
          ステートメントブロック 1
        CASE <式2>
          ステートメントブロック 2
        CASE ELSE
          ステートメントブロック 3
        END SELECT

   例)  INPUT ”Temperature=”;temp
         SELECT CASE temp
           CASE IS <= 10
              PRINT ”cold”
           CASE 11 TO 16
              PRINT ”cool”
           CASE 17 TO 28
              PRINT ”warm”
           CASE IS >= 29
              PRINT ”hot”
           CASE ELSE
              PRINT ”There is an error  in this input data”
           END SELECT

     ※アンダーラインで示したCASE以下の<式>の表記は,大きく3通りある。
     ・CASE 式1[,式2,式3,・…]    →テスト式の値が式1又は式2……
                               又は式nに等しいならば,すぐ下
                               のステートメントブロックを実行
     ・CASE 式1 TO 式n         →テスト式の値が式1から式nまでの
                              値に等しいならばすぐ下のステート
                              メントブロックを実行
     ・CASE IS 関係演算子 式     →テスト式の値と式の大小関係を比較
                              して真ならばすぐ下のステートメント
                              ブロックを実行

  <SELECT CASE文とブロック形式のIF文の違い〉
    SELECT CASE文→1つの式を評価した結果に従い,分岐する。
    ブロック形式のIF文→1つ以上,複数の別々の式を評価して分岐出来る。
                 (なお,SELECT CASE文はブロック形式のIF文
                  を用いても記述出来る。)

 問題 QBアドバイザーを活用して,SELECT CASE文の関連項目 ON…GOSUB
     ,ON…GOTO文に関するヘルプ画面を印刷し,その使用方法を理解せよ。
     なお,Quick Basic Handbook P20〜21にSELECT CASE文との比較が記されている。

(2)繰り返し制御文(FOR〜NEXT文,その他)
  繰り返しを行うためのループは,プログラムの一連のステートメントを必要な
 回数だけ実行させるものである。ループは簡潔で分かりやすいプログラムを記述
 するために極めて有効である。
  この繰り返し制御と先の条件分岐は,プログラムの作成上最も重要な役割を果
 たし,これらを自由自在に用いてはじめて有用なプログラムを記述出来る。

 (a) FOR〜NEXT文 :指定回数分,繰り返し計算を実行

   FOR ループ変数 =初期値 TO 最終値 [STEP 増分値]

    繰り返される             →ループ変数を初期値から増分値ずつ増し,
    ステートメントブロック          最終値になるまで繰り返す。

   NEXT ループ変数
                         STEP以下を省略した場合は,デフォルトの増分値は1と見倣される。
                         常にループの先頭でループ変数と最終値を比較する。このため初期値
                         の与え方によっては,ループが全く実行されない場合もある。

   例)     t=0.
          FOR i=1 TO 100       繰り返し計算が終了すると,変数
            t=t+x(i)             t に x(1)〜x(100)の合計値
          NEXT i                が代入されている。

   多重ループ〜ループは,次のように多重構造とすることが出来る。この場合,
            ループ変数は内側のループから先にカウントされる。

   例1)   FOR i=1 TO 100
            FOR j=1 TO 10
                FOR k=1 TO 50
          
                NEXT k
                FOR m=1 TO 20

                NEXT m
            NEXT j
         NEXT i

   例2) 間違いの例(理由:互いのループが交差している)
         
         FOR i=1 TO 100
         
           FOR j=1 TO 300

         NEXT i

           NEXT j

     ※ FOR〜NEXT文からの抜け出し  →ループ内でEXIT FOR文を実行
                     する。抜けた後はNEXTの次の文に制御が移る。
          例) IF s>100 THEN EXIT FOR
                     sが100を越えたらループから抜ける。

(b)その他の繰り返し制御文
   @ WHILE〜WEND文
        WHILE 条件式
          ステートメントブロック       条件式が真である間,繰り返し実行
        WEND

   A DO WHILE〜LOOP文,DO〜LOOP WHILE文
        DO WHILE 条件式
          ステートメントブロック       条件式が真である間,繰り返し実行
        LOOP                  上のWHILE〜WEND文に同じ

        DO
          ステートメントブロック       条件式に拘らず最初の1回は実行,
        LOOP WHILE 条件式       その後は上記に同じ

   B DO UNTIL〜LOOP文,DO〜LOOP UNTIL文
        DO UNTIL 条件式         条件式が真になるまで繰り返し実行
          ステートメントブロック        (条件式成立でループを抜ける)
        LOOP

        DO
          ステートメントブロック       条件式に拘らず最初の1回は実行,
        LOOP UNTIL 条件式       その後は上記に同じ

      ※ DO〜LOOPからの抜け出し→ループ内のEXIT DO文を実行

 問題 その他の繰り返し制御文に掲げたヘルプ画面を印刷し,使用方法について理解せよ。
     なお,Quick Basic Programming Guide P81〜88,Handbook P29〜33も参照せよ。

目次へ戻る