情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

学生でも社会人でも分かる!!初めてのプログラミング入門 第9回 変数と分岐の組み合わせ

2017/02/21

第8回

↑ ↑ ↑

前回は変数と繰り返しを組み合わせる方法について解説しましたが、今回は変数と分岐を組み合わせる方法について解説したいと思います。

変数と分岐の組み合わせ

まず、分岐についてちょっとだけ復習しましょう。この連載記事では第6回の記事で分岐について解説していました。

HiMacroExにおいて分岐は下のように記述するのでした。

プログラムの一部

    ・・・    

GetClip
クリップボードに記憶されているデータを分岐のために取り出す。

    ・・・    

<Switch>
分岐を開始する。

<Case foo>
クリップボードから取り出したデータがfooである場合に次の命令から次の場合分け命令の前までの命令を順番に実行する。

    ・・・    

<Case bar>
クリップボードから取り出したデータがbarである場合に次の命令から次のデフォルト命令の前までの命令を順番に実行する。

    ・・・    

<Default>
クリップボードから取り出したデータがfooでもbarでもない場合に次の命令から分岐終了命令の前までの命令を順番に実行する。

    ・・・    

</Switch>
分岐を終了する。

    ・・・    

まず、最初のGetClip命令でクリップボードに記憶されているデータを分岐のために取り出していたのでした。

そして、実際の分岐はこのデータに基づいて行われるのでした。

しかし、実はHiMacroExではGetClip命令を使用する代わりに分岐開始命令の>の直前に繰り返し開始命令の場合と同じように変数を指定することによりクリップボードに記憶されているデータではなく変数に格納されているデータに基づいて分岐を行うことができます。

たとえば、下のようにします。

プログラムの一部

    ・・・    

#x = 10
変数x10を格納する。

    ・・・    

<Switch #x>
分岐を開始する。

<Case foo>
変数xに格納されているデータがfooである場合に次の命令から次の場合分け命令の前までの命令を順番に実行する。

    ・・・    

<Case bar>
変数xに格納されているデータがbarである場合に次の命令から次のデフォルト命令の前までの命令を順番に実行する。

    ・・・    

<Default>
変数xに格納されているデータがfooでもbarでもない場合に次の命令から分岐終了命令の前までの命令を順番に実行する。

    ・・・    

</Switch>
分岐を終了する。

    ・・・    

また、実はHiMacroExでは場合分け命令のデータにも具体的なデータの代わりに変数を指定することができます。変数を指定するには場合分け命令でデータを記述していた部分に#と変数名を記述します。

そして、データとして変数を指定した場合には変数に格納されているデータがそのまま場合分け命令のデータとなります。

たとえば、下のようにします。

プログラムの一部

    ・・・    

#x = 10
変数x10を格納する。

    ・・・    

#y = 5
変数y5を格納する。

    ・・・    

GetClip
クリップボードに記憶されているデータを分岐のために取り出す。

    ・・・    

<Switch>
分岐を開始する。

<Case #x>
クリップボードから取り出したデータが変数xに格納されているデータと同じである場合に次の命令から次の場合分け命令の前までの命令を順番に実行する。

    ・・・    

<Case #y>
クリップボードから取り出したデータが変数yに格納されているデータと同じである場合に次の命令から次のデフォルト命令の前までの命令を順番に実行する。

    ・・・    

<Default>
クリップボードから取り出したデータが変数xに格納されているデータと同じでもなく変数yに格納されているデータと同じでもない場合に次の命令から分岐終了命令の前までの命令を順番に実行する。

    ・・・    

</Switch>
分岐を終了する。

    ・・・    

このように変数と分岐を組み合わせることにより、より簡単に柔軟な分岐を行うことが可能となります。

変数と分岐を組み合わせる必要があるプログラムとしては、たとえば、ユーザに入力してもらったデータに基づいて別々の処理を行うプログラムがあります。

たとえば、ユーザが男性を意味するmと入力したか、女性を意味するfと入力したか、それ以外を入力したかでメッセージボックスに表示するメッセージを変えるプログラムは下のように書くことができます。

プログラム15

1
MsgBox 男性の方はmと入力し、女性の方はfと入力してください。
メッセージボックスを表示する。

2
#gender = InputBox
ユーザにデータを入力させるためのダイアログボックスを開き、そこでユーザが実際に入力したデータを変数genderに格納する。

3
<Switch #gender>
分岐を開始する。

4
<Case m>
変数genderに格納されているデータがmである場合に次の命令から次の場合分け命令の前までの命令を順番に実行する。

5
MsgBox あなたは男性なのですね!
メッセージボックスを表示する。

6
<Case f>
変数genderに格納されているデータがfである場合に次の命令から次のデフォルト命令の前までの命令を順番に実行する。

7
MsgBox あなたは女性なのですね!
メッセージボックスを表示する。

8
<Default>
変数genderに格納されているデータがmでもfでもない場合に次の命令から分岐終了命令の前までの命令を順番に実行する。

9
MsgBox あなたは男性でも女性でもないのですね!
メッセージボックスを表示する。

10
</Switch>
分岐を終了する。

このプログラムを実行すると、最初に下のようなメッセージボックスが表示されます。

メッセージボックス

「OK」ボタンをクリックすると、下のようなダイアログボックスが表示されます。何か文字を入力します。

ダイアログボックス

「OK」ボタンをクリックすると、入力した文字に応じて適切なメッセージボックスが表示されます。

メッセージボックス

変数と値の比較

前のセクションでは変数に格納されているデータがある値と等しいかどうかに基づいて分岐を行っていました。

しかし、HiMacroExでは変数に格納されているデータがある値より大きいかとか、逆にある値より小さいかとかに基づいて分岐を行うこともできます。

これを行うには前々回の記事で紹介した数値の比較を行う計算を使用します。

詳細については前々回の記事を参照していただきたいですが、数値の比較を行う計算とは2つの数値の内、小さい方を選んだり、逆に、大きい方を選んだりする計算のことでした。

たとえば、MIN(10,100)の計算結果は10となり、MAX(10,100)の計算結果は100となります。

これは正に、2つの数値の内、小さい方を選んだり、逆に、大きい方を選んだりする計算に他なりません。

さて、MIN(X,Y)という計算を行った結果が、Xだった場合、これは何を意味するでしょうか? ただし、ここでXYは何らかの数値であるものとします。

MIN(X,Y)という計算はXYの内、小さい方を選ぶという計算なのですから、この計算の結果がXだったということはXYの内、Xの方が小さいか、XYは等しいということを意味します(Xの方が小さい場合だけでなく、XYが等しい場合もあり得ますので注意してください)。

逆に、MIN(X,Y)の計算結果が、Yだった場合は何を意味するでしょうか?

上と同じように考えれば、XYの内、Yの方が小さいか、XYは等しいということを意味します。

ですから、数値の比較を行う計算の結果を利用すれば、2つの数値の大小に基づいた分岐を行うことができるのです。

たとえば、変数xに格納されているデータが100より大きいかどうかに基づいて分岐を行うには、変数xに格納されているデータと100の内、変数xに格納されているデータの方が大きいかどうかに基づいて分岐を行わなければならないということです。変数xに格納されているデータの方が大きい場合と変数xに格納されているデータの方が小さいか、あるいは、変数xに格納されているデータと100が等しい場合の2つに分岐するということです。

つまり、逆に言えば、変数xに格納されているデータの方が小さいか、あるいは、変数xに格納されているデータと100は等しいかどうかに基づいて分岐を行わなければならないということです。

ですから、まずMIN(#x,100)を計算し、結果を適当な変数に格納します。

そうすると、この適当な変数のデータはどうなるかと言うと、変数xに格納されているデータが100より小さいか、100である場合には変数xに格納されているデータそのものが格納されることになるはずです。そして、逆に、変数xに格納されているデータが100より大きい場合には100が格納されることになるはずです。

ですから、この適当な変数のデータが変数xに格納されているデータと等しいか、あるいは、100と等しいかに基づいて分岐を行えば、それは結局変数xに格納されているデータが100より大きいかどうかに基づいて分岐を行うことができたということになります。

具体的に、プログラムの一部として書いてみると下のようになります。

プログラムの一部

    ・・・    

#x = 10
変数x10を格納する。

    ・・・    

#y = MIN(#x,100)
変数yに変数xに格納されているデータと100の内、小さい方を格納する。

<Switch #y>
分岐を開始する。

<Case #x>
変数yに格納されているデータが変数xに格納されているデータである場合(変数xに格納されているデータが100以下である場合)に次の命令から次の場合分け命令の前までの命令を順番に実行する。

    ・・・    

<Case 100>
変数yに格納されているデータが100である場合(変数xに格納されているデータが100より大きい場合)に次の命令から次の分岐終了命令の前までの命令を順番に実行する。

    ・・・    

</Switch>
分岐を終了する。

    ・・・    

上のプログラムの場合、1つ目の分岐の中に記述しなければならないのが変数xに格納されているデータが100以下である場合に実行したい命令となり、2つ目の分岐の中に記述しなければならないのが変数xに格納されているデータが100より大きい場合に実行したい命令となります。

上のプログラムは若干流れを追うのが難しいかもしれませんので詳細に解説しておきましょう。

今、上のプログラムは変数xに格納されているデータが100より大きいかどうかに基づいて分岐を行うものであるはずですので、これを確かめるには、

  • 変数xに格納されているデータが99以下である場合
  • 変数xに格納されているデータが100である場合
  • 変数xに格納されているデータが101以上である場合

に分けて考えると良いです。

まず、1つ目、変数xに格納されているデータが99以下である場合、変数yに格納されるのは必ず変数xに格納されているデータとなります。ですから、この場合は必ず1つ目の分岐の中の命令が実行されるということになります。1つ目の分岐の中の命令は変数xに格納されているデータが100以下である場合に実行したい命令だったはずですから、この場合は正しい分岐が行われているということです。

次に、2つ目、変数xに格納されているデータが100である場合、変数yに格納されるのは必ず100となります。何故なら、この場合MIN(#x,100)の計算結果はMIN(100,100)の計算結果と同じで、必ず100になるからです。今、変数xに格納されているデータも100なのですから、この場合は必ず1つ目の分岐の中の命令が実行されるということになります。1つ目の分岐の中の命令は変数xに格納されているデータが100以下である場合に実行したい命令だったはずですから、この場合も正しい分岐が行われているということです。

最後に、3つ目、変数xに格納されているデータが101以上である場合、変数yに格納されるのは必ず100となります。そして、変数xに格納されているデータは100ではありませんから、この場合は必ず2つ目の分岐の中の命令が実行されるということになります。2つ目の分岐の中の命令は変数xに格納されているデータが100より大きい場合に実行したい命令だったはずですから、やはりこの場合も正しい分岐が行われているということです。

という訳で、結局、詳細に上のプログラムの流れを確認してみた結果、正しい処理が実現されていることが分かりました。

このようなプログラミングパターンを使えば変数と値の大小比較や変数と別の変数の大小比較による分岐を行うことができ、より柔軟なプログラムを書くことができます。

ちなみに、上のプログラムの場合は変数xに格納されているデータが100より大きいかどうかに基づいて分岐を行っていましたが、逆に、変数xに格納されているデータが100より小さいかどうかに基づいて分岐を行うには上のプログラムとは対照的なプログラミングパターンを用いることになります。

具体的に書いてみると下のようになります。

プログラムの一部

    ・・・    

#x = 10
変数x10を格納する。

    ・・・    

#y = MAX(#x,100)
変数yに変数xに格納されているデータと100の内、大きい方を格納する。

<Switch #y>
分岐を開始する。

<Case #x>
変数yに格納されているデータが変数xに格納されているデータである場合(変数xに格納されているデータが100以上である場合)に次の命令から次の場合分け命令の前までの命令を順番に実行する。

    ・・・    

<Case 100>
変数yに格納されているデータが100である場合(変数xに格納されているデータが100より小さい場合)に次の命令から次の分岐終了命令の前までの命令を順番に実行する。

    ・・・    

</Switch>
分岐を終了する。

    ・・・    

要は、MIN(#x,100)の代わりにMAX(#x,100)としなければなりません。それ以外は同じです。

また、変数xに格納されているデータが100以上であるかどうかに基づいて分岐を行うには変数xに格納されているデータが100より大きいかどうかに基づいて分岐を行うプログラミングパターンの場合分け命令の順序を逆転させます。

そして、変数xに格納されているデータが100以下であるかどうかに基づいて分岐を行うには変数xに格納されているデータが100より小さいかどうかに基づいて分岐を行うプログラミングパターンの場合分け命令の順序を逆転させます。

何故逆転させなければならないか(何故逆転させるだけで良いのか)については敢えてこの記事では説明しないでおきたいと思います。読者の皆さんに対する課題として残しておきます。

さて、これらのプログラミングパターンは若干ややこしいかもしれませんが、非常に有用で、よく使うことになるはずですので是非マスターしましょう。

最後に、このプログラミングパターンを用いたプログラムの例として、ユーザに年齢を入力してもらい、その年齢に応じて様々なメッセージが書かれたメッセージボックスを表示するプログラムを書いてみることにします。

プログラム16

1
MsgBox 年齢を入力してください。
メッセージボックスを表示する。

2
#age = InputBox
ユーザにデータを入力させるためのダイアログボックスを開き、そこでユーザが実際に入力したデータを変数ageに格納する。

3
#s1 = MAX(#age,10)
変数s1に変数ageに格納されているデータと10の内、大きい方を格納する。

4
<Switch #s1>
分岐を開始する。

5
<Case #age>
変数s1に格納されているデータが変数ageに格納されているデータである場合(変数ageに格納されているデータが10以上である場合)に次の命令から次の場合分け命令の前までの命令を順番に実行する。

6
<Case 10>
変数s1に格納されているデータが10である場合(変数ageに格納されているデータが10より小さい場合)に次の命令から次の分岐終了命令の前までの命令を順番に実行する。

7
MsgBox この年でプログラミング勉強してるなんてすごい!
メッセージボックスを表示する。

8
<pause>
プログラムの実行を中断する。

9
</Switch>
分岐を終了する。

10
#s2 = MAX(#age,30)
変数s2に変数ageに格納されているデータと30の内、大きい方を格納する。

11
<Switch #s2>
分岐を開始する。

12
<Case #age>
変数s2に格納されているデータが変数ageに格納されているデータである場合(変数ageに格納されているデータが30以上である場合)に次の命令から次の場合分け命令の前までの命令を順番に実行する。

13
MsgBox これからも新しいことをどんどんやっていきましょう!
メッセージボックスを表示する。

14
<Case 30>
変数s2に格納されているデータが30である場合(変数ageに格納されているデータが30より小さい場合)に次の命令から次の分岐終了命令の前までの命令を順番に実行する。

15
MsgBox 頑張ってください!
メッセージボックスを表示する。

16
</Switch>
分岐を終了する。

このプログラムを実行すると、最初に下のようなメッセージボックスが表示されます。

メッセージボックス

「OK」ボタンをクリックすると、下のようなダイアログボックスが表示されます。何か数値を入力します。

ダイアログボックス

「OK」ボタンをクリックすると、入力した文字に応じて適切なメッセージボックスが表示されます。

メッセージボックス

つづく

今回は変数と分岐を組み合わせる方法について解説しました。

変数と分岐を組み合わせることにより、より柔軟な分岐を行うことができるようになります。

次回は変数と繰り返しと分岐の全部を組み合わせる方法について解説したいと思います。

そして、次回がこの連載記事の最終回となります。

↓ ↓ ↓

第10回

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-プログラミング, 講座