先日は、

 

■ ペンを使う (ループを使う) 【 Scratch 】

 

にてScratchで反復処理とブロック定義による処理をまとめて使用する方法について書きました。Scratchでループを使う場合、

 

 

のように制御から選択する事にあんりますが、この中に

 

 

のように回数指定型の物と無限ループの指定が出来るようになっています。ループについては、挙動のパターンが出来て理う場合だとそれをそのまま回数を指定して繰り返すk十が出来るようになっているので、

 

 

のようにすると、

 

 

のように三角形を描くことができます。また、この状態に対して移動を追加すると、

 

 

のような感じになりますが、これを実行すると、

 

 

のようになります。そして、これに対して、X字句の移動を加えると、

 

 

のような二回転を追加する事が出来るのですが、

 

 

のようにY軸の変化を加えると、上下方向の変化を追加する事が出来ます。

 

 この状態だと三角形の描画に対して多重ループを入れて

 

 

のようにすると、

 

 

のような形状を描くことができます。多重ループについては、多次元配列を作る時にも使用しますが、二次元配列については、九九の表もそれに含まれます。これについては、

 

 ■ 数値と式とグラフ

の中でも触れていますが、

 

 

のような表を作る際には、

 

 

のように多重ループ構造を作るだけで作る事が出来ます。これは単純な二次元配列なので、9まで増加するループを9回行うだけなので、こうした簡素なコードで九九の表を作る事が出来ます。

 

 先日は、ブロック定義について書きましたが、この考え方としては、【 処理単位で分ける 】 方法になります。

 

 例えば、

 

 

のような処理をする場合、

 

 

のようなブロックを並びで作れますが、この処理も

 

 

のように三角形を描く部分とこの形状を描いた後に動かすための

 

 

の部分があります。これが揃って一つの処理の中に実装されている訳ですが、この2つは完全に別の処理です。と言う事は、この処理の工程としては、3x+bのような一次関数のように変数項を組み合わせたような構造に分けることができます。

 

 この時の処理自体を合成関数のように使用できるのが関数になりますが、Scratchではブロックを定義する事で同様の処理を実装する事が出来ます。ブロックを定義する時には、ブロック定義を選択して 【 ブロックを作る 】 を選ぶことになりますが、

 

 

の場所にある 【 ブロックを作る 】 の部分をクリックすると、

 

のようなダイアログが出てきます。ここで引数の指定もできますが、前回は処理の実装のみを行うので、名称だけを追加して

 

 

のようにして追加をすると、

 

 

のようにブロックを作りました、ブロックを定義すると、

 

    イベント用のブロック

    処理用のブロック

 

の2つが追加されるので、イベント用のブロックに実装したい処理を組み合わせて

 

 

にしました、これで 【 図形を作る 】 のブロックを配置すると、実装されている処理を呼び出す事が出来るようになります。これを移動側にも実装して

 

 

のようにすると、

 

 

のようになりますから、イベントハンドラとして動作する部分を

 

 

から

 

 

のようにする事が出来ます。初期化もまとめることが出来るので、最終的には、

 

 

のような構造にする事が出来ます。当然、処理その物は同じなので、実行すると初期化され

 

 

のようになりスペースキーを押すと

 

 

のように動きます。この処理については高校だと合成関数が全く同じ考え方なので、その処理がベクトルの空間的な変化を及ぼす恒等式と考えるとイメージがしやすいと思いますし、中学校の数学だと、項のを使った式のイメージになりますが、変数項を用意した時に、項には

 

    符号 : 減算

    係数 : 乗算

    分母 : 除算

    指数 : 累乗

 

を実装できます。その為、項の値を確定させるための演算を行う事になりますから、処理の結果が処理の構造体である事はイメージしやすいと思いますし変数項自体が式の構造上処理で出来ているのでアルゴリズムが処理の構造体と言うのイメージしやすいのではないかなと思います。

 

 このように先日は、反復処理とその反復処理もネストが出来る事について触れましたが、こう言った構造についても処理単位で分けることが出来るので、ブロックを定義する事によって処理単位で構造を分けることでイベント部分の構造を簡素にすることが出来ることについて書きましたが、今回は、条件分岐について書こうかなと思います。

 

 合成関数については、関数と言う全く異なる処理が雲合わさってできるものになりますが、日常だと調理をする場合が合成関数と全く同じ状態になっています。調理は工程が存在していますから、処理が連続する事で完成品になる訳ですが、この時に別の工程で調理された物を組み合わせる事になりますから、全く別の関数の結果を合成して最終的な結果を導き出すような流れになっています。例えば、麺類だとスープと面とトッピングの調理の工程は違いますが、それを組み合わせているので。構造的には項を使った式と同じになりますが、この3つの物は異なる種類や製造工程による味の違いがあるので、カテゴリー以外は定数化していません。つまり、この三つの構成要素は変数項と言う事になります。そして、この項を構成しているものは材料となる変数を調理と言う数式による加工によって成立している訳ですから、ここには処理が存在しています。つまり、変数項を使った関数が調理の段階で存在している事になります。と言う事は、この調理と言う工程自体も変数の加工を行う複数の関数を組み合わせた合成関数と考えることが出来るわけです。そう考えると、

 

 

のような考え方も

 

    ご飯を炊く

    カレーを作る

    ご飯➡カレーの順番にさらに盛り付ける

 

と言う流れと考えると、日常でごく当たり前に行っている作業なので、

 

 

のような工程で考えることもできますが、イメージとしては、

 

 

のように分かれた状態になっているのではないかなと思います。当然、カレ―の場合、この構造も

 

    ペースト

    スープ

 

で分かれているので、これも別の工程で作るものですから全く異なる工程が存在しています。その為、この製造工程も完成までの期間が異なるので、同時進行をするとしても進行度が違ってくるので、ガンチャートでスケジュールを作って運用するように流れを決めて慣性察せて行く事になります。家庭料理でもそう言った工程が必要な物は多く存在しますし、弁当箱に中に調理済みの総菜とご飯を入れるだけでもその調理には個別の食材分ごとに異なる工程が存在していますからこれも複数の関数を用いた作った数式の実行ですぇい率している構造物なので、合成関数と同じ構造になります。こうした異なる工程が存在する事象を記号をも散った数式で管理できるようにした物が数学で使用している数式になりますが、幾何とその変化だとこの辺りがまともに整理や管理が出来ないので、整合性を取った状態で運用し、同じものを同じように作れる(と言っても誤差が変わらない程度の微細な差しかない近似になりますが...。)ための手段として数値や数式が存在している訳です。これを処理を示す関数などで指定して動作させているのがプログラミング言語になります。その為、挙動を法則性を示す式で示した場合、物理方程式が存在しますし、その状態を微分すれば瞬間的な状態変化にも対応できるので、数学を用いて状態変化を示す事が出来るわけですが、人ん感覚器官にはその制度がないので、【 実装されているセンサーの精度 】で結果が違ってきますし、その判断をしているのは知覚や認知なので、これは、経験則でしか実装不可能な物になりますから、データのストックとその状態からの解析でしか取得できない仕様になっています。と言う事は、そうした蓄積もない状態での判断と言うのは乱数の取得と採用と大差がないので、適正な値になる事はありません。と言う事は、正解が存在した時に近似値にすら到達しない状態しか作れなくなりますから、そう言った旧石器時代でも存在しなさそうな間違い(ちなみに、この時代にも0や無の認識はあり、使用方法はよくわかりませんが、3までの数値は存在していました。つまり、3までの素数とそれが存在しないという二値の判断は存在しているので、存在するという条件で考えると3を上限としたロットを組めれば大きな数値も使用でき、円周を半径で細分化した時の数を半分にした3が存在している訳ですから後の60進数のもとになる6に行きつく要素はその時代に存在しています。)にならないようにするための手段として 【 紀元前のから存在する発明品 】 の数学を用いることになります。

 

 

 動と手動               

 

 処理を行う場合には、

 

    自動

    手動

 

の二種類がありますが、この二種類は操作の有無で変わってきます。最も簡単な操作はスイッチになりますが、人が操作する場合には、コントローラーが存在する条件になります。

 

 

 先日の状態だと、

 

 

のようにメインループが初期化のみで、イベントハンドラで動く状態ですから、描画は、スペースキーが押されたというイベントが発生しないと動作しないようになっています。

 

 この場合、 【 操作 】 が入っているので、手動での制御になります。これに対して、自動処理の場合だと、

 

 

のように実行時に操作などの判定を用意せずに動作する物になります。この構造にすると、初期化の後に実装した図家の描画と移動の処理を実装した物が実行されるので、この場合、処理で派生するモジュール部分の形状が生成されます。

 

 

先日は、 【 スペースキー 】 を押していた場合にこれが連続して生成される仕様だったのですが、自動処理だと一度しか実行できないのでこの挙動を連続して実行する為には反復処理を入れることになります。その為、

 

 

のように挙動を実装してループの中に包含すると、

 

 

のように動作するようになります。これが、

 

 

のようにキーの判定がない状態で構成すると自動処理になります。画像ように処理自体を

 

 

のように変えると、移動段階のラインが消えるので、

 

 

のように三角形のみの挙動になります。その為、処理自体が一つの構造物として実装されている場合、その挙動制御で実行結果をコントロールできますが、一つのコードの処理その物を包含するとコードが長くなるので、処理単位で分けておく方が何をするのかを理解しやすいので、どう言った挙動にするのかも考えやすくなります。

 

 この構造にすると、実装する挙動も

 

 

のように独立した部分で管理できるので、処理その物を変更して

 

 

のように異なる結果になる挙動を実装する事もできます。

 

 このように自動処理だと状態に合わせた物を実行するだけなので、何を実装するのか?を考えることになりますが、手動操作の場合だと、 【 操作の有無 】 と言う二値の判定が発生します。その為、処理の記述ではイベントハンドラはIF文などとは異なるので、条件分岐としては登場してこないかもしれませんが、クリックやキー操作などは接点による信号の有無ですから、これもハードウェアレベルで見ると条件分岐になります。

 

 

件分岐                

 

 条件分岐は、 【 選択によって結果が変わる 】 モノなので、条件分岐を使用する場合には結果が2つ以上存在し、それを条件で切り替える時に使用します。

 

 これが条件分岐になりますが、最小単位はスイッチのように二値の判定で結果が変わるような物になります。

 

 電気工作では閉回路のパターンをカットした状態にして、その部分に接点を用意すると、接点の状態変化によって結果が変わります。

 

 こうした変化はコンピューターだとキーボードのキーや売僧のボタンなどもそうなっていますが、この判定によって発生した変化を値として取得する為に、cursesやncurses.hなどを使うとコンソール内でウインドウを実装したり、キーの判定を取得できるようになりますから、C++でコンソールで動くアプリケーションを作ってみる場合、ncurses.hを読み込んで使ってみるとコンソールアプリでは存在しないキーボードのキーの判定によるイベントハンドラを使った処理を実装できます。その為、コンソールで動くテキストベースのゲームを作る際にはそう言った処理を実装しますが、デバイスの入力を検知して動くようなイベントハンドラが使用できるのはフォームアプリのようなGUI環境で動作する物になりますから、基本的にウインドウを作って、その中にウィジェットを配置して動作させるような仕様の物に限定されます。この場合、imput()のような処理がないので、変数の取得と表示が出来る環境とその編集の取得が出来る環境を作る事になりますから、フロントエンドを使った時にどう言った構造にするのかを考えることになります。

 

 キーボードの構造は、 【 接点の接触の有無 】 で制🄬膣しているのですが、一部の構造だと、静電容量を使った物や光学式のように光の状態変化を検知して動作している物もあるので接点の概念がない(のですが、タッチパネルではないので、物理的な押し込みの変化を再現する為のメカ部分は存在します。)物もありますが、そう言った例外を除くと、中学校理科の授業で電気を使う問いに登場するスイッチと同じ構造の物になります。

 

 中学校の物理では、スイッチ回路が出てくるので、並列回路上でスイッチがあって、それがどう言った電流の流れを作る構造なのかを経路から判断するようなカリキュラムがありますが、この時の接点の接触の有無も 【 状態変化 】 ですし、このカリキュラムで学習するのは、 【 接点の変化による結果の差異 】 ですから、条件によって結果が異なるので、条件分岐を簡素な形で再現した構造になります。

 

 中学校の物理のスイッチ回路は

 

 

と同じように通電の状態が存在し、そこに接点の操作で回路の挙動が変わる仕様になっていますが、このスイッチ回路を理解すると複数のボタンがあるような入力装置を作る際の回路の考え方の基礎を理解する事が出来るので、ハードウェアの操作を担う部分の設計をする際の基礎分野になります。

 

 ちなみに、高校の物理で登場するトランジスタは操作がなくても動作するスイッチなので、処理の中での状態変化で判定を入れて、その判定を元に条件分岐を実装すr時に使用するパーツになりますが、こうした判定をコードで記述する際に使用する事もできます。

 

 その為、処理の中において判定を入れる場合に、条件分岐を実装する事になりますが、電気工作の場合だとコンパレーターのように電圧の差異を判定する物もあるので、比較演算子なども実装できますが、プログラミング言語でもそう言った物を実装する事が出来ます。

 

 

■ 判定の方法              

 

 条件分岐は、 【 条件 】 で 【 分岐 】 する物なので、直流回路のように逐次次処理が行われているような構造が条件によって並列回路のように分岐した回路のいずれかが経路として選択されて動作するような仕組みの物になっています。

 

 この状態を見ると、トランジスタの挙動その物ですが、この時の処理も入力の有無と言う二値の判定になっています。このように判定を行う際には条件を用意して動かす事になりますが、この時に自動処理の中で発生する判定と操作による判定のような物は存在しています。Scratchの場合、

 

    デバイスの操作 : イベントハンドラ

    コード内の判定 : 条件分岐

 

で記述する事になります。

 

 

■ 条件の種類              

 

 条件分岐の場合だと、条件を用意する必要がありますが、この場合、接点のように二値の判定も行えます。二値の考え方は一致の判定ですから 【 等式 】 で判定を行っている訳ですが、これと同じように、二値ではなく、範囲を持たせた数値や文字列での判定を入れることができます。

 

 Scratchの場合、条件分岐は、制御の中に含まれており、

 

 

のように

 

    もし <> なら 【 】

    もし <> なら 【 】 でなければ 【 】

 

のようなブロックがあります。これは、BASICインタプリタだと

 

    if ~ then ~

    if ~ then ~ else ~

 

の形の物と同じです。Pythonだと

 

    if ~ 

    if ~  else ~

 

の形になるので、if 条件:で条件の判定を入れて改行してインデントを入れるとifのブロックに処理を配置できるようになっています。実際の記述は、

 

 

の様な感じになりますが、これがScratchのブロックと同じ判定方法になります。実行すると

 

 

の様な感じになりますが、こうした判定を行う事で処理を実行する事が出来ます。Scratchでは、条件がブロックになっているのでそれを使用して

 

 

のように、停止やループに対して条件を入れることが出来るようになっていますが、判定を行うための条件には、

 

    演算子

    センサー

 

を使用する事が出来ます。その為、

 

    内部処理

    操作

 

を判断材料として判定を実装する事が出来るようになっています。

 

 

■ 内部処理               

 

 判定を実装する時には六角形のブロックを使用する事になりますが、このブロックは、

 

 

のように演算の中に用意されています。二値の判定をする場合、数値の一致なので

 

 

と同じような一致の判定をする事になりますが、小学校3年生の算数では等号とは別に 【 範囲指定 】 を行う為の不等号を指定する事が出来ます。

 

 これは、2つの物を比較して判定を行っている訳ですが、基準と比較した時に状態の大小や一致の判定をする際に等号と不等号を使う事になりますが、この判定もScratchで行えるようになっています。この場合、

 

 

のブロックを使う事になりますが、両端が円弧で構成されたブロックが入るようになっていますが、ここに変数を代入して使用する事になります。空白だとここに何でも入りますが、

 

 

のようにその部分の数値は自由に変更できるので基本的にこの空白部分は変数になっているのですが、空白の状態だと数値や文字列を追加する事になります。画像の状態は数値が指定されていますから、 【 決まった値 】 が指定されています。その為、この状態は 【 定数 】 の指定が行われています。

 

 

の状態だとデータの状態

 

    変数 : 空白の部分(この状態だとNull)

    定数 : 50と書かれている部分

 

になりますが、数値の自由度が担保されている部分は変数になるので、変数のブロックを追加して実装できるようになっていますが、このブロックを使う事で用意した変数に対して判定を入れることができます。これが、比較演算子になりますが、これとは別に、数値以外の判定を行う事もできます。Scratchでは、

 

 

のように文字列の中の特定の文字で判定をする事もできるようになっていますが、電気工作で判定を実装すると記事使用する論理回路と同じ処理が行える論理演算子も用意されています。これは、2つの状態の関係性を指定した判定で行う事が出来るようになっていますが、Scratchでは、

 

 

のような形で、

 

    論理積(AND) : < > かつ < >

    論理和(OR)  : < > または < >

    論理否定(NOT) : < > ではない

 

で判定が行えます。この場合、NOTは、対象外の判定なので、

 

 

のif文で判定した時のelseの結果と同じものをif文だけで得る時に使用しますが、【 対象外の抽出 】をしたい時に論理否定を使用します。

 

 ANDとORは、小学校3年生の理科だと直流と交流の電池の状態と豆電球の点灯の条件が論理積と論理和の関係と同じですし、中学校の物理だと直列回路の抵抗部分をスイッチに変更してスイッチの向こう側に豆電球を置くと論理積と同じ判定になり、並列回路にすると、両方かいずれかのスイッチがオンになると豆電球が点灯するので、論理和になります。その為、この判定については、両方揃わなければならないという論理積と片方もしくは両方の選択で条件が成立する論理和については、算数や数学ではなく理科の電気を扱うカリキュラムの中で物理モデルとして登場します。

 

 こうした判定は処理の結果で得られた値を使用していますから、変数を基準として判定をするので、トランジスタを使った処理と同じ考え方になります。

 

 

■ センサー               

 

 条件は内部処理だけでなく、操作による変化を取得する事が出来ますが、Scratchではセンサーに該当する物が使用できます。この時に

 

 

のようにデバイスの状態の検知だけでなく、

 

 

のようにマウスポインタの検知が出来るようになっています。

 

 

■ 判定の対象              

 

 Scratchでは色々な物が最初から指定されているので、従来のプログラミング言語で行うウィジェットの指定なしにウインドウやスプライトの制御が出来る仕様になっていますが、判定を行時の対象を指定するブロックも色々と用意されています。

 

 例えば、

 

 

のように変数同士の計算を判定にして、定数と比較をする事もできますが、こうした物を算術演算子と言います。また、

 

 

のように

 

    剰余

    四捨五入

    絶対値

 

 

なども使用できるようになっています。また、数値だけでなく文字列での判定もできるので

 

 

のように

 

    文字列 と 文字列 の場合

    文字列の番目の取得

    文字列の文字数

 

を取得できるようになっています。また、変数の値だけでなく、デナイスに関連する物も使用できるので、調べるの中にある

 

 

のようなマウスポインタまでの距離やマウスの座標などを変数として使用出来たり、

 

 

のように音量やタイマーも使用できます。また、

 

 

のように

 

    ステージ

    時間に関連する物

    ユーザー名

 

なども変数として使用できるようになっています。Scratchでは、

 

 

のように変数が用意されており、その変数を使った処理もできますし、新規に変数を生成する事もできますが、この辺りは文字数が多くなるので、次の機会に書こうかなと思います。

 

 ここで、ブロック定義のように新規に変数名を付けて変数を作って底に値を入れて管理合できるのですが、その変化をブロックで制御したり、判定に使用する事もできるようになっています。

 

 

件分岐を使う             

 

 今回は条件分岐について触れたので、

 

 

に対して処理を追加してみようかなと思います。これを実行すると、

 

 

のような挙動になまりますが、枠の範囲でとどまってしまうような感じになっているので、範囲を超えると別の場所に移動するような条件を追加する事にしました。

 

 まず、ウインドウサイズを確認する為に端を指定してみると、

 

 

の場所が良さそうだったので、この絶対値で範囲を決めて、範囲を超えると逆に出るような仕様にしてみました。今回は、機能の追加なので、

 

 

のように範囲指定と言う名称でブロック定義をして、このブロックに対して

 

 

のような感じで4つの条件分岐を入れて、

 

 

のように符号が反転するような処理を入れてみました。

 

 そして、今回も自動処理なので、旗のクリックのイベントで動くようにして

 

 

の様な感じにしたのですが、無限ループの中に、図形を描いた後にペンを上げて移動してその後、現在の座標の判定を行って条件に該当している場合には座標の変動を行って描画を始めるようにしてみました。ブロックの構造自体は、

 

 

のようになっていますが、この構造にすると新規機能を実装する際にもブロックの定義を行い、追加するだけで機能を増やす事が出来ます。とりあえず、

 

 

の状態から全画面表示にすると

 

 

になりますが、プログラムを実行すると、最初に初期化をするのでで、画面が消去され、原点にペンが来て描画が始まります。描画が進むと画面の端に来るので、そこに来ると反対側委に移動するので

 

 

の様な感じで、画面端に来ると逆側から形状を描くような処理が実行されるようになります。