Lesson 7 - 条件分岐(2)

Lesson 6では2分岐の方法まで扱いましたが,3分岐以上はどうすればよいでしょうか。これには2つの方法があります。


1つは,ElseIf(Else If の2語でなく,1語で ElseIf)を使う方法です。

Lesson 6の後半に出てきたプログラムを再掲します。

#prompt
Dim A As Double
Input A
If A>0 Then
    Print A;"は正の数です。"
Else
    Print A;"は正の数ではありません。"
End If
Print "終わり"

これの「正の数でない」という判定は,さらに細かく分けて「負の数」と「ゼロ」の2つに分けることが可能です。これは,正の数でないと判定されたときにそれがさらに「負かゼロか」を判定すればよいのですから,以下のように書けます。

#prompt
Dim A As Double
Input A
If A>0 Then
    Print A;"は正の数です。"
Else
    If A<0 Then
        Print A;"は負の数です。"
    Else
        Print A;"はゼロです。"
    End If
End If
Print "終わり"

しかし,この場合のように「Elseの直後にIfの条件文が来る」場合には,もっと簡単な書き方が存在します。それが「ElseIf」なのです。

#prompt
Dim A As Double
Input A
If A>0 Then
    Print A;"は正の数です。"
ElseIf A<0 Then
    Print A;"は負の数です。"
Else
    Print A;"はゼロです。"
End If
Print "終わり"

ElseIf は,ElseIfの上に書かれたIf(あるいはElseIf)の条件が成り立たなかった場合にさらに条件判断をして,それが成り立ったときに次のElse(あるいはElseIf,End If)の部分まで文を実行します。
なお,ElseIf は複数あっても構いません。If 文は一般に以下のように書けます。

[共通の処理]
  ・
  ・

If [条件1] Then
    [条件1成立時に実行する文]
ElseIf [条件2] Then
    [条件1が不成立で条件2成立時に実行する文]
ElseIf [条件3] Then
    [条件1〜2が不成立で条件3成立時に実行する文]
ElseIf [条件4] Then
    [条件1〜3が不成立で条件4成立時に実行する文]
ElseIf [条件5] Then
  ・
  ・
  ・
Else
    [すべての条件が不成立時に実行する文]
End If

[共通の処理]
  ・
  ・

実行例です。

? 120
120 は正の数です。
終わり
? -10
-10 は負の数です。
終わり
? 0
0 はゼロです。
終わり
? 5
5 は正の数です。
終わり

もちろんIfの時同様に,ElseIf があって Else 以下のない

#prompt
Dim A As Double
Input A
If A>0 Then
    Print A;"は正の数です。"
ElseIf A<0 Then
    Print A;"は負の数です。"
End If
Print "終わり"

のような形でもOKです。

上側の If あるいは ElseIf で条件式が成り立つと,それより下側の ElseIf の中の文は,条件が成り立っても実行されません。例えば

#prompt
Dim A As Double
Input A
If A>=10000 Then
    Print A;"は5桁以上あります。"
ElseIf A>=1000 Then
    Print A;"は4桁以上あります。"
ElseIf A>=100 Then
    Print A;"は3桁以上あります。"
End If
Print "終わり"

のような時に Input 文で A の値を 2000 に設定したとします。この場合,A の値は「A>=1000」と「A>=100」の2つの条件式に合致しますが,実際に実行されるのは「Print A;"は4桁以上あります。"」だけで,これより下に書かれた「Print A;"は3桁以上あります。"」は実行されません。両方実行したいのであれば,以下のように書いて下さい。

#prompt
Dim A As Double
Input A
If A>=10000 Then
    Print A;"は5桁以上あります。"
End If
If A>=1000 Then
    Print A;"は4桁以上あります。"
End If
If A>=100 Then
    Print A;"は3桁以上あります。"
End If
Print "終わり"

若干面倒ですが,このように分けて下さい。

問10 Input文を用いて点数を入力し,点数によって以下のようなメッセージを表示せよ。

80点以上100点以下あなたはすばらしい!
60点以上80点未満もう少しだ!
30点以上60点未満努力が足りないようですね。
0点以上30点未満ちゃんと勉強してますか?
それら以外テストの点数を入力してね。

本当に長くなりましたが,次で条件分岐は終わりです。
もう1つの複数方向への条件分岐の方法は,条件が「=」を用いるものだけであるときに役立ちます。

それではまず下の例を見て下さい。

#prompt
Dim A As Double, B As Double, P As String
Input "1つ目の値は>",A
Input "2つ目の値は>",B
Input "計算の種類は>",P

If P="+" Then
    Print A+B
ElseIf P="-" Then
    Print A-B
ElseIf P="*" Then
    Print A*B
ElseIf P="/" Then
    Print A/B
ElseIf P="^" Then
    Print A^B
Else
    Print "計算できません。"
End If

実行例

1つ目の値は> 5
2つ目の値は> 8
計算の種類は> +
13
1つ目の値は> 7
2つ目の値は> 6
計算の種類は> *
42

これ,簡単な電卓というわけです。(プログラムが初めての方なら,ちょっとプログラマーになった気分がしませんか?・・・それはさておき)このように,If・ElseIf を延々と使えば何分岐でも可能です。しかしこの例のように,条件文が等式(イコールで結んだ式)だけの場合に限っては,次の例に挙げる Select Case 文が有効です。

#prompt
Dim A As Double, B As Double, P As String
Input "1つ目の値は>",A
Input "2つ目の値は>",B
Input "計算の種類は>",P

Select Case P
Case "+"
    Print A+B
Case "-"
    Print A-B
Case "*"
    Print A*B
Case "/"
    Print A/B
Case "^"
    Print A^B
Case Else
    Print "計算できません。"
End Select

まず最初に,どの変数によって条件が分かれるかを選び,Select Case [変数] のように書きます(なお[変数]の部分は,「A+3」のような変数を含んだ式であっても構いません)。
次に Case [値] を並べていきます。この[値]が当初与えた[変数]の値と一致していれば,そこから次の「Case」あるいは「End Select」まで文が実行されます。また Case Else は,他の[値]のどれにも一致しないときに実行される文で,必要がなければなくてもよいです。
最後の End Select は,「End If」と同様「ここまでが条件分岐されている部分である」ことを表します。

[共通の処理]
  ・
  ・

Select Case [変数]
Case [値1]
    [変数]と[値1]が等しいときに実行される文
Case [値2]
    [変数]と[値2]が等しいときに実行される文
Case [値3]
    [変数]と[値3]が等しいときに実行される文
Case [値4]
  ・
  ・
  ・
Case Else
    どの条件にも合致しなかったときに実行する文
End Select

[共通の処理]
  ・
  ・

なお,Select Case も ElseIf の場合と同様「複数の条件に当てはまった時は一番上の条件だけが適用」されます。

注:VisualBasicなどで使用できる「Case A, B, C」のような列挙形式の Select Case 文は,ActiveBasicでは使用できません(Ver3.12 / Ver4.00β3 現在)のでご注意下さい。

問11 Input文で2つの数値を入力し,以下の条件に従って値を表示せよ。

戻る