先日は、

 

 

にて条件分岐について書きました。

 

 処理を行う際には、分岐が生じることがありましが、この分岐は条件によって処理が異なる場合に使用するので 【 条件分岐 】 とも言います。この条件分岐はプログラミング言語だと 【 if 】 を使用しますが、この判定方法はブール代数でも使用します。ブール代数では、ここに論理演算が含まれるのですが、この論理演算を電気に対して利用しても成立するので、ド・モルガンの法則が成立しているわけです。

 ド・モルガンの法則では、AND/OR/NOTがあれば全ての判定を作れる事が証明されているわけですが、コンピューターで使用されている論理ゲートはNANDが基準になっているので、NANDゲートをCMOSで構成して少電力で動作するNANDの構成を使って基本となる論理ゲートが生成されています。NANDの場合、

【 NOTゲート 】
  ■ NANDの入力を統合して、AND要素をなくす

【 ANDゲート 】
  ■ NANDの出力をNOTで反転

【 ORゲート 】
  ■ NANDの入力をNOTで反転

することで基本となる3つの回路を作ることが出来ます。この構造も日の入力をするものから構成できるので半導体を用意することで構築できるわけですが、回路内での判定を行うパーツを作る際にはトランジスタを用いて処理をすることになります。論理ゲートは、

  ■ 直列回路 : ANDゲート
  ■ 並列回路 : ORゲート

になるので、この判定部分にトランジスタを実装するとこの構造に出来るのですが、この判定を行う物を手作業で実装する場合にはスイッチを実装することになります。

 その為、中学校の物理のオームの法則のカリキュラムで登場する直列回路と並列回路の抵抗部分をスイッチに入れ替えて、抵抗と不極の間に豆電球を入れた回路を作って、スイッチのオンとオフの状態と豆電t級の点灯の関係性を心理地表を書いて確認してみるとこの2つの心理値表の結果は論理積と論理和と全く同じ状態になります。

 コレと全く同じことを、小学校の理科では、直流と交流のカリキュラムで行っているわけですが、このカリキュラムでは、スイッチの役割を電池が担っているので、電池の有無と電球の点灯の心理値表を作ってみると、これも論理積と論理和と全く同じ結果になります。

 このことから、 【 スイッチ 】 = 【 条件分岐 】 と考えることが出来るわけです。日常生活でも電気を使うので、【 ON / OFF 】 の切り替えは行っているはずなんですが、この時の処理も二値の状態で結果が変わっているので条件分岐になります。

 小学校の理科では、これを複数使用することによって結果が変わることを学ぶことになりますが、この内容を見ると、義務教育のカリキュラムでは理科の分野でプログラミング言語で使用する

  ■ 条件分岐
  ■ 論理演算

を扱う物理モデルを使用していることになります。閉回路内に電池との豆電球を配置して、その間にスイッチを入れた場合、


【 通電 】━┳━【 オン 】━【 点灯 】
       ┃
       ┗━【 オフ 】━【 消灯 】


と言う形になるわけですが、これが、


 【 条件分岐 】━【 True 】 ━【 点灯 】
     ┃
     ┗━━━━ 【 False 】━【 消灯 】


の様な状態になっています。このように判定を入れることで、回路内の状態を変更することが出来るので、通電したらその状態が維持されたものとは異なる挙動を実装できるわけですが。この場合、回路内で指定した工程に基づく処理の実行ではなく 【 入力の変化 】 のような 【 特定の条件 】 で変化するものを使用することになります。

 プログラミング言語では、これを 【 変数の値 】 などを基準にして判定が行えるようにifが実装されています。

 MakeCodeでも条件分岐のブロックが実装されており、それを使用することで判定を実装できるようになっています。条件分岐は、

 

 

のように判定によって結果が変わる処理になりますが、プログラミング言語だとifを使用します。このブロックについては、

 

 

 

のような形をしているので、この中に処理を実装する事になります。

 

 MakeCodeでは、



のような形で、一度だけ実行するものと、メインループに該当する物が用意されていますが、このループ内でなにかの判定を入れるときには条件分岐を実装することになります。

 

 

 メインループは内部の処理を無限ループで実行することになるので、この場所に表示を行う指定をすると、継続して表示が行われるようになります。MakeCodeで文字列の表示を指定すると、電光掲示板のように文字列がスクロールするように表示されるのですが、条件分岐についても判定を入れていない場合だとただの表示と同じなので、実装されたものがそのままヒョじされてしまいます。

 その為、



のような処理を実装すると画像が表示された後に文字列が表示されます。



 MakeCodeでの判定は六角形のブロック担っているのですが、ここで、入力の指定が出来るので、
 


のような判定を入れることも出来ます。コード自体は、
 
 
のようになりますが、この状態にすると、



が常に表示されており、



のようにロゴに触れると文字がヒョじされます。



そして、流れ終わると、判定が終了するので、ループ内の表示に戻ります。



 MakeCodeでは、Scratchと同様にイベントハンドラを独立させておいて、イベント単位で管理が出来るのですが、その条件自体を判定の中で使用することが出来ます。イベントハンドラは、【 イベント発生時の処理 】 なので、ボタンを押した時の処理を実装するものになりますが、これは 【 動作の実装 】 ですから、判断を行うことは出来ません。

 その為、 【 特定の条件でボタンが押された場合 】 のような判定の実装をする場合には、イベントハンドラではなく、条件分岐を用いることになります。こうした判定をするためにMakeCodeでは入力に対する判定も用意されているので



のような構成にすることが出来ます。実行すると常に 【 でなければ 】 の条件が反映されるので、その画像が表示されるので、


が表示されます。ボタンが押されるとそれぞれの判定が行われるので


のようになります。分岐ですが、

 ■ 【+】 : 判定を増やす
 ■ 【ー】 : 判定を減らす

事が出来るので、 【 でなければ 】 も削除できるのですが、削除をするとメインループ内に指定された処理が常に行われるようになり、判定が発生したときのみ指定した処理が実行されるようになります。この場合、



のような形になりますが、常に実行される部分が、



の表示で、ボタンが押された時に個別の処理が生じるようになります。

 この構造では、

 ■ 表示
 ■ 条件分岐

と言う処理が格納されており、常に生じるのは表示でその後、条件分岐が発生するようになっていますが、この処理は個別に分けて考えることが出来ますから、2つの処理が1つのループ内に格納された構造になっています。
 
 

  変数と定数

 

 先日の処理は、ボタンの状態の変化で判定を実装したわけですが、この時の判定は、ボタンが押された時というものになっています。実際にマイコンを使って制御をする場合だと、タクトスイッチの状態変化ですから、GPIOの端子の信号の有無を検知して動くことになりますから、プログラミング言語で処理をする場合だとブール値で判定をするようなものになります。この条件を通常のプログラミング言語で考えた場合、
 
  ■ ON   : True
  ■ OFF : False
 
のような考え方になると思うのですが、MakeCodeでブロックを使う場合には、判定部分をそのまま使用できるようになっています。

 このように実際には二値で動いている物の場合、数字のように決まった状態ではありませんから、任意の数値を格納できる状態にして置かなければならないわけですが、この時に使用するのが変数になります。
 
 変数と定数については、中学校1年生の数学登場しますが、

 ■ 定数 : アラビア数字
 ■ 変数 : アルファベット

を用いて記述を行います。これは 【 項 】 と言う処理を一つにまとめた構造物を使う時に使用するのですが、この形にすると 【 数式を加算の状態に出来る 】 ので、プログラミング言語の順次と同じ状態に出来ます。つまり、アルゴリズムを用意して現在の状態に追加していくような形に出来るので、【 加工を行うときの工程表 】 のような形で4季を整形できるようになっています。

 中学校で登場する方程式や関数はこの形になっているのですが、この構造を簡素な形にする時に因数分解を行うことになります。

 項のカリキュラムは、【 工程表を数式で示す方法 】 になりますが、この時に

  ■ 確定した値
  ■ 任意の値を代入できるもの

を使う事になりますが、関数のように 【 変数に任意の値を代入して解を求めることが出来るもの 】 を扱う際には、便宜上、任意の値を代入できる変数を用意して処理をすることになります。
 
 プログラミング言語でも変数と定数を使う事になりますが、先日の判定を見ても二値を用意して1を取得している状態ですから、件分岐を実装する場合にも変数を用いることになります。

 

 

  変数を使う

 

 MakeCodeもScratchと同様に変数を作ることが出来るので、新規変数を作成した後に、
 
   ■ 変数の初期化
   ■ 変数の実装
 
 を行うことが出来ます。プログラミング言語には

  ■ 変数の宣言
  ■ 変数の初期化

の2つが存在するのですが、宣言は名称と型を指定してそれを使えるようにする処理で、初期化は、プログラムを実行した際に常にその値でスタートできるように予め値を指定しておく処理になります。

 初期化については、始点と終点が決まっていて、その間を移動する様な処理を実装する際に必要になりますが、初期化をせずに移動だけ実装した場合には、
 

 
のような動作になりますから、意図した結果とは異なるものが出来てしまいます。コレに対して、初期化を入れて調整をすると、
 

 
のようになるので処理が終わると始点の戻ってくるので、始点と終点の間でのみ移動するようになります。
 
 

  変数の登録

 

 変数を使用する際には登録することになりますが、

 

 

のメニューの変数をクリックすると、

 

 

が表示されるで、【 変数を追加する... 】 をクリックします。すると、

 

 

のようなダイアログが出るので、名前をつけて 【 OK 】 ボタンをクリックします。今回は、

 

 

のようにTESTにしておきました。この状態で【 OK 】ボタンをクリックすると、
 
 
のように変数が使用できるようになります。
 
 

  処理を実装する

 

 作った変数ですが、ブロックの中に包含して使用することになります。今回は、

 

 

のような感じにしてみました。まず、

 

 

が初期化なので、最初だけ変数を0にしています。コレを行うことで、プログラムが実行されたときには常に変数は0の状態からスタートします。そして、処理を行うメインループの部分ですが、

 

のようにしています。これが値を増やすブロックと値自体を使用するブロックになりますが、最初に、数値を増やしてその後表示をするようになっています。そのままだとものすごおい勢いで数値が変わるので、一時停止を入れてタイミングを調整しています。こうすることで、特定のタイミングで数値が増えて更新されるので、100MSごとに数値が書き換わるようになります。

 

 

 

  イベントハンドラを使う 

 

  先程のコードは自動処理になりますが、ボタンの入力に対応させて数値を変化させることも出来ます。

 

のようなコードにした場合、

 

の部分で初期化をして、

 

 

の部分で表示をするので、そのまま実行すると0が表示されるのですが、

 

 

のようにボタンの動作でのイベントで数値を変えるようにすると、変数が書き換わるので、表示を変更することが出来ます。実行すると、

 

 

の状態になり、何もしないとその状態が維持されます。そして、

 

 

のようにボタンを押すと

 

 

のように数値が増えます。この状態で、Bボタンを押すと

 

 

のようになり、数値が変わります。

 

 

 このプログラムでは、メインループで常に値を更新しているわけではないので、値が固定された状態になっており、ボタンを押したイベントによって数値が変わるようになっています。そして、表示は変更後の値を表示できるので、押した回数で

 

 

 

のように値を変更することが出来ます。このプログラムでは左で増えて右で減ると言う状態にしていますが、数直線の構造を考えると、右で増えて左で減るほうが自然な気がしますから、操作を考える場合には、そうした部分にも気を配ることになります。