現在はプログラミング教育がスタートしているので、小学校の理科や算数でもプログラミング言語(Scratchなど)をしよ吹田カリキュラムが用意されていますが、中学校の技術ではScratchを使用したサーバにアクセスするネットワークを使ったアプリケーションの作成なども用意されています。
義務教育でのカリキュラムは、 【 体験が主体 】 になっているので、いきなりLAMP環境でサーバを立ててネットワークを作りましょうというような無茶なものではありませんが、コンピューターを使う場合にはどういった使い方が出来るのか?と言うことを触れながら知識を広げるような仕様になっています。コンピューターを使う場合、PC単体だと
■ PC上で動くアプリケーション
■ デバイス制御
が行えますが、前者が、OS上のアプリケーション層で動作する物になりますが、後者が、マイコン制御のようなデバイスを制御するものになります。この2つは
■ 算数 : 図形を描く
■ 理科 : 電気を扱う
で他県すると思いますが、前者がLOGOのようなもので、後者はマイコン制御の電気の伝達方法になります。
この使い方は、 【 PC単体での動作 】 なので、コードをコンピューター内で実行するだけの仕組みになりますが、現在はネットワークを使用したもの存在しているので、そういった物についても扱うようになっています。流石に、サーバソリューションは膨大な量の知識が必要になりますから 【 何を行うのか? 】 でも構成が変わってくるので、学校の技術の中の少ない枠だけで理解できるようなものではありませんから、体験という状態に近いのですが、ネットワークを使った物を使用することで端末だけではできない通信を扱うことが出来るということを体験することになります。
現在は中学校のカリキュラムでも 【 流れ図 】 辺りは扱うようになっていますが、これは、コードを書くと言うよりも 【 工程を思考するためのツール 】 なので、
■ 構造物の設計
■ 動作が生じるもの
■ 物事を行う場合の判断
で使用します。実際には、ある程度方向性が決まった状態でそれを工程として組み立てる時に使用するのがこうしたツールになりますが、この中で、工程表のような順番の処理だけでなく、他のデータの利用や反復や判定などを含めて構造を考える際に使用できるのがフローチャートになります。
UMLだとこの辺りはノードのような形になったものを使用しますが、UMLは色々な視点で見たものを個別に考えることが出来るツールになりますが、少し複雑なので中学校では使用しませんが、フローチャートは使用します。
こうしたツールは、 【 思考を図示して判断しやすくする 】 為の物になりますが、物を作る場合には文章や数式の塊よりも図示したほうがわかりやすい場合もあります。この辺りは、論理回路や電気工作で用意する回路図なども該当しますが、図示したほうがイメージしやすくなる場合もあります。
フローチャートもそういった特性がありますが、この構造を扱う前に、手続き型ではなく構造型プログラミングの基礎を知っておくとフローチャートを扱いやすくなります。
処理の構造
プログラミング言語は 【 処理 】 を並べていくことで目的に事を行う仕組みになっていますが、この仕組みは、0と1で処理をしている機械レベルになると、工程通りの処理担っているので、
■ メモリーへのデータの記録
■ 命令の呼び出し
■ 実行部への命令とデータの移動
■ 命令の実行
のような流れを1つのサイクルとして行い、それをタスク通りに行うような仕組みになっています。
その為、量産工場の機械のように処理の流れが決まっていて、それをタスク通りに行う仕組みになっています。
この状態だと、 【 順番通りに処理をする 】 ので、 【 工程表 】 と同じく最初から用意冴えた順番で処理を行うことになります。この構造を数式にすると、処理は単項式で流れは多項式になるので、
■ 2x^2
■ -4x
のように変数項に
■ 係数
■ 指数
■ 符号
などがついた構造が処理と考えることができます。この構造は、項が一つしか無いので単項式になりますが、最初のものは指数が2つあるので、二次式で、あとのものは指数がないので一次式になります。
多項式は、複数の項で構成された式なので、
■ x^2+2x+1 =(x+1)(x+1) =(x+1)^2
のようなものになります。最初の式は、
■ 変数項 × 2
■ 定数項 × 1
のように複数の後でできていますから多項式になります。
中学校一年生の数学では項を学習しますが、この時に 【 全てを加算の構造にする 】 ように四季を作り変えることになるので、加算以外の記号は変数項の付加要素として扱うようになっています。その為、変数項には
■ 符号 : 減算要素
■ 係数 : 乗算要素
■ 分母 : 除算要素
■ 指数 : 累乗要素(高校では、べき乗)
の・ようなものが付与できるようになっています。つまり、単項式もxのように何も付与されていないものだと数値ですが、上記のものが付与されると、 【 演算処理を実装した構造物 】 になるので、これは 【 処理 】 と考えることが出来るわけです。
プログラミング言語では、 【 処理を順番に行う 】 と言う仕組みになっていますが、この考え方が、手続き型のプログラミングの手法になります。
これに対して、構造型の場合だと、項の中に存在する処理の要素を別に分けて 【 パーツ 】 として使用するような構造になっています。
小学校の算数では、
■ 現在の状態に何かを追加する : 足し算
■ 同じ数を繰り返して足す : 掛け算
と言う形のものが登場しますが、この2つの計算については小学校2年制までに学習します。足し算は追加すると言う処理ですから、
■ 元の数字
■ 用意した数字
があり、元の数字に対して用意した数字分だけ増やした場合に、どのようになるのか?を計算によって導き出す方法を学習します。この時に、幾何学ではなく代数学を使用することになりますが、感覚器官だけでは対応できない 【 集合の状態の正確な判断 】 をする為の方法として、小学校一年生で
■ 数字
を学び、その変化を扱う為に 【 足し算 】 を学ぶことになります。この構造も中学校で項を学習すると
【 方程式や関数が加算の状態で登場する 】
ので、数式の根幹部分の物であることを体験することになりますが、これが人の思考や演算処理ではなく、機械を使った二値論理で動作するものになってくると、加算の仕組みがなければ何もできないことが分かります。
レッドストーンと論理ゲート
加算器がなければ機械はかなり不便なツールになってしまいます。高校の情報Iでは、ニ進数の加減算を扱うようなので、 【 補数 】 も登場するようですが、マイクラでレッドストーン回路を組む時に使用する 【 減算器 】 も二値論理なので 【 補数 】 を使用した計算を行います。当然、これは、論理ゲートを使用しなければ行えませんから、マイクラのレッドストーン回路も論理記号を使うわけではありませんが、パーツの特性から回路が組めるので論理ゲートを作ることができます。
この時に使用するのが、レッドストーントーチと言う透過ブロックになりますが、このブロックは
■ 単独で使用すると信号を発生させる
■ ブロックに接続すると信号で切ることが出来る
と言う特性があります。つまり、ブロックに接続すると
■ 入力がオフの時にオンになる
■ 入力がオンの時にオフになる
というしようになっていますから、インバーター(NOT回路)と同じ挙動になります。これは
■ 入力:0 → 出力:1
■ 入力:1 → 出力:0
なので ━▶❍ と同じ構造になっています。これでNOTができますが、回路の場合、
【 直列回路 】
【 入力 】 ━▶ 【 処理 】 ━▶ 【 処理 】 ━▶...
【 並列回路 】
【 入力 】 ━┳━▶ 【 処理 】 ━▶ 【 処理 】 ━▶...
┃
┗━▶ 【 処理 】 ━▶ 【 処理 】 ━▶...
のようになっています。スケジュール通りに動作する仕組みだと直列回路と同じですが、同時進行を刷る場合には並列処理を行うことになります。
これが入力をした後の処理を刷る時お選択肢になりますが、
【 入力1 】 ━┓
┣━▶ 【 処理 】 ━▶ 【 処理 】 ━▶...
【 入力2 】 ━┛
のようにすると、この構造は、【 論理和(OR) 】 になります。この構造で考えた場合
【 入力1 】 ━▶❍━┓
┣━▶ 【 処理 】 ━▶...
【 入力2 】 ━▶❍━┛
のように
■ 入力 : 論理否定(NOT)
■ 判定 : 論理和(OR)
の形にすると、否定論理積(NAND)を作ることができます。つまり、この状態だと、
【 入力1 】 ━▶❍━┓
┣━▶❍
【 入力2 】 ━▶❍━┛
のように出力をバッファからインバーターに変更するだけで、論理積(AND)を作ることができます。
その為、ド・モルガンの法則で全ての判定を作る際に必要となる基本の3つの回路があるので、レッドストーントーチがあれば、全ての判定を作ることが出来るようになっています。ちなみに、
【 否定論理積 : NAND 】
【 入力1 】 ━▶❍━┓
┣━▶
【 入力2 】 ━▶❍━┛
と言う構造になっていますが、この回路を変形させると、違う回路を作れます。例えば、入力を統合すると
【 論理否定 : NOT 】
┏━▶❍━┓
【 入力1 】━▶┫ ┣━▶
┗━▶❍━┛
のように論理否定になりますし、入力を論理否定で否定すると
【 論理和 : OR 】
【 入力1 】 ━▶❍━▶❍━┓
┣━▶
【 入力2 】 ━▶❍━▶❍━┛
のようになりますが、これは二重否定なので、入力はインバーターと同じ状態になります。その為、この構造は論理和になります。そして、既出ですが、否定論理積の判定を論理否定で反転させると、
【 論理積 : AND 】
【 入力1 】 ━▶❍━┓
┣━▶❍
【 入力2 】 ━▶❍━┛
になります。この図のインバーター部分が不当化ブロックの側面にレッドストーントーチを配置した構造になりますが、基本的にあ電気で使用する論理回路の仕組みをそのまま使用した構造になっています。
その為、この部分に関しては伝達の特性というマインクラフトの仕様部分以外だと通常の二値論理の範疇で考えることが出来るようになっています。
その為、回路を組み立てて排他論理和(XOR)を作ることが出来るので、論理積(AND)と組み合わせることで半加算器(HA)を作ることが出来るようになっています。
これが 【 判定 】 を行う際のものになりますが、インバーターには面白い特性があるので、二重否定ではなく、三重で否定を行うと、
1 0 1
【 入力0 】━▶❍━▶❍━▶❍━
0 1 0
【 入力1 】━▶❍━▶❍━▶❍━
のようになります。この仕組みを見ると、 【 回帰した時の信号と出力が同じ 】 なので、
【 入 力 】━▶❍━▶❍━▶❍━┓
▲ ┃
┃ ┃
┗━━━━━━━━━━━━┛
のように回帰させると、オンとオフを繰り返すようになります。つまり、タイマー回路のような挙動になるわけですが、この仕様もマイクラのレッドストーントーチを使うことで実装できるようになっています。
この場合、
■ 処理の実行
■ リフレッシュ
を行うので、ラッチ回路のように一度処理が実行されると通電状態が固定されるわけではなく、処理の実行後にはリセットがかかり新規に処理を行われている状態になるので、タクトスイッチで処理が実行できる装置を用意して、ボタンを特定おタイミングで押す処理を継続するのと同じ状態になります。
この回路は、クロック驟雨端数を持っており、そのクロックでパルス信号を送る仕組みになっているので、クロック回路とも呼ばれていますが、マイコン制御をする場合のパーツだとタイマー回路になります。
処理の種類
電気工作やマイクラのレッドストーン回路でも 【 実装した処理を繰り返す 】 ことができるようになっていますが、プログラミング言語でもこうした処理を実装することが出来るようになっています。この状態で考えると、
【 直列回路 】
【 入力 】 ━▶ 【 処理 】 ━▶ 【 処理 】 ━▶...
【 タイマー回路 】
【 入 力 】━▶❍━▶❍━▶❍━┓
▲ ┃
┃ ┃
┗━━━━━━━━━━━━┛
では明らかに構造が違うので、この2つを分けて考えることになります。プログラミング言語では、この2つのことをそれぞれ
【 順次 】
【 入力 】 ━▶ 【 処理 】 ━▶ 【 処理 】 ━▶...
【 反復 】
【 入 力 】━▶❍━▶❍━▶❍━┓
▲ ┃
┃ ┃
┗━━━━━━━━━━━━┛
と呼んでいます。この回路があれば、
■ 順番通りに一度だけ処理を刷る
■ 指定した処理を連続して実行する
というものが実装できますが、
■ 無限ループ内に順次の配置
■ 順次内に反復の配置
を行うことができます。
こうした順次と反復は
■ 順次 : 加算
■ 反復 : 乗算
で考えることが出来るので、反復を係数ではなく、括弧で囲んでループと判断できるようにすると式で処理の内容の表記を刷ることができます。例えば、【 6(1+2) 】 とすると、1+2という順次の処理を6回ループすると考えることができます。ということは、
【 ∞(f(x)+g(x)) 】
のような仕組みにすると
■ 関数:f(x)
■ 関数:g(x)
という処理を格納したものを用意してこレを順番に行う処理を無限ループで行っているよな状態になります。当然、これらは、内部で反復を追加できるので、
【 ∞(a(f(x))+b(g(x))) 】
のように異なるループに包含することもできます。これが、順次の中に反復が含まれている事例になりますが、変数校に置き換えると、 【 2a+3b+4c... 】 のような状態になります。これは、個別の変数項がループ回数分反復が入っている状態になりますが、
■ 2xのような係数の形
■ 2(a+b)のように順次をループで包含した形
があるので、
■ 2(a+b) : 対象が順次
■ 2a+b : 処理の要素
のように実装の仕方で係数は意味が変わってきますが、プログラミング言語を使用する場合のループについては、コレと同じ考え方になります。Pythonの場合だと、
【 メインループの場合 】
while True:
処理
【 順次の中にループがある場合 】
a=0
while a>5:
print(a)
a+a+1
priny('Loop End')
のような違いになります。前者は、無限ループが用意されていて、その中に処理を実装する形になりますが、後者は、
のようになります。このようにループを使用する場合には、アプリケーションのように終了処理が実行されるまで永続的に動いたり、処理を包含して回数を指定して動かすものと、処理の中で発生するループが存在しています。
分岐について
順次と反復は加算と乗算なので義務教育の算数や数学で登場するものなので、関連付けて理解すれば仕組みの理解はしやすいと思いますが、分岐については、 【 決定木 】 なので、高校のカリキュラムですら登場しないので、数学とは違うもので考える必要があります。この仕組みは、先程のwhileで登場しているのですが、
┃ ┃
┣━━━━━━━━━━━━┛
┃ a<5▶
┃
a>5 ┃
▼ ┃
┃
の部分が判定になります。これは条件を用意して分岐した回路の流れを切り替えているのと同じですから、条件分岐になりますが、プログラミング言語では、この処理を 【 分岐 】 と呼びます。
構造型プログラミングでは、
■ 順次
■ 反復
■ 分岐
の3つの要素を使って処理を考えていくことになります。Whileの場合だと、
【 a>5 】
┃ ┃
┣━━━━━━━━━━━━┛
┃ NO▶
┃
YES ┃
▼ ┃
┃
のようになっていますが、通常の分岐は、【 条件を満たした場合に処理を実行する 】 という仕組みなので、
■ 0 : 実行しない
■ 1 : 実行する
と言う仕組みになっています。Pythonでは、 【 if 】 を使用しますが、この場合、
if(1):
print('True')
if(0):
print('Flase')
のようなコードを書いて実行すると、Trueとしか表示されないと思います。これは、引数が1でTrueの条件でしかifが動作しないので、Flaseになる0では動かない仕様になっているためです。
これは、Pythonだけでなく 【 どのプログラミング言語も同じ 】 なので、基本的には
【 Trueになる条件の指定をして使用する 】
ようになっています。分岐の構造は、
のようになります。この分岐が、
のようになったものが、 【 if 〜 elif 〜 】 になります。
【 ifの場合 】
■ 一致の場合のみ処理を行う
【 if 〜 else 〜 の場合 】
■ 一致の場合のみ処理を行う
■ 判定後に条件以外を対象にして処理を行う
【 if 〜 elif 〜 の場合 】
■ 一致の場合のみ処理を行う
■ 判定後に別の条件で判定を行う
と言う仕組みになっています。その為、
■ if : 指定した条件のみで判定を行う
■ elif : 判定から外れた物を対象として別の条件で判定
■ else : 判定から外れた物を対象として処理を実行する
と言う違いがあります。その為、
【 if 】
【 if 〜 else 〜 】
【 if 〜 elif 〜 】
のような作りの違いがあります。
処理の考え方
処理を考える場合、工程表からスタートしたほうがわかりやすいのですが、
のような手順で処理をする場合、選択の前までは工程表と同じで順次で行うことができます。その為、
のようになりますが、分岐が入ると
のようにメニューの項目が合って、そこから分岐が始まり、
の世に終了してからメニューに戻る事になります。この時の処理は、
のような感じになりますが、メニュー表示に階層を作ると、最初に分岐が発生して、その後、カテゴリーの中に包含差Rている物の選択を行うようになります。その為、メニュー部分は、
のような感じになりますが、この処理をメインループとして考えた場合、最終的にメニューに戻るようにする必要があるので、
のように回帰させる必要があります。この場合、メニューを構成している画面内で分岐の判定を行う必要がありますが、
のように分岐後に実行するプログラムに潰えは、メニューの処理の中に包含するのではなく、関数やクラスで外に出すことが出来るので、別のプログラムを用意してン連携するような管理を行うことができます。
オブジェクト指向のコードの書き方の場合、クラスで管理するので 【 処理の塊 】 を作って実行すR為のデータを作成しますが、この時の仕様書部分の動作の管理やデータの管理をクラス同士の連携によって扱えるようになっているので、フローチャートだと表現しに行くい場合もあります。
このような構造だと、個別の処理を参照するような書き方もあるのでフローチャートで書くこともできますが、構造によってはUMLのクラス図を使ったほうが作業がしやすくあんる場合もあります。結構雑な作りになっていますが、処理の流れだと
のような感じになっていますが、この中には、
■ 順次
■ 分岐
■ 反復
の3つが全て含まれています。
処理を考える場合、
■ 一度だけ実行するもの
■ 回数指定をして実行するもの
の2つがありますが、ループを使わないコードの場合だと一度しか実行されません。この構造は順次で処理をした場合も同様です。
この状態で、メインループを用意して無限ループを実装すると、常に実装した処理は繰り返すことが出来るので、
【 ∞(処理) 】
の構造にするとアプリケーションのように終了処理をするまで処理が事項されるようになります。この状態だと問題があるので、終了処理を実装するKと尾になりますが、ホとどのプログラミング雨言語でループの終了をする際にはbreakを使用します。PythonやC++などでもそうですが、基本的に
■ 無限ループ
■ ifによるbreak用の判定
をセットで実装することになりますから、この段階で
■ 反復
■ 分岐
を使うことになります。例えば、
while True:
処理
a=input('終了しますか?(y/n)_')
if a=="n":
break
のような構造です。入力待が発生するまでは順次なので、処理が終了するまでの状態を作っておいて、終了処理の確認を入力待で指定すると、リアルタイムのキー判定が行えない環境でも入力による判定を実装することができます。(ただし、yキーは大文字、小文字とカナの入力ができるので、修飾キー対策をしていないとキーを押して判定が反応しないのでループが止まらなくなります。)
声rでループは実装できるので、この中になにか必要なものを実装することになりますが、アプリケーションを考える場合には、【 作るものがどういったものになるのか? 】 を明確にして実装することになります。
その時に、一つのアプリケーションではなく、アプリケーションを構成している要素単位で分けて、
■ 要素の仕組み
■ 要素の関係性
を考えて処理の方法を考えると仕組みを考えやすくなります。
この際に漠然と行うとわけがわからなくなりますし、規模が大きくなると記録しておかないと記憶から消える恐れもあります。その為、仕組みを記述しておく必要がありますが、この時に用意するのがアイデアを記録したものや設計図になります。
仕組みを考える場合、【 変化 】を扱うことになりますが、この段階で
■ データや素材
■ 処理
■ 表示
を分けて考えることになります。これらは連携して動いているので、 【 それぞれの連携方法 】を学習する必要がありますが、表示したウィジェットからのデータの取得やイベントハンドラから処理に連携させる方法を考える場合も
■ イベントハンドラ → 座標制御
■ イベントハンドラ → 変数の制御
などが可能なので、処理を行う場合も表示やデータの変化をどのように実装するのかを考えることになります。コンソールアプリの場合、多くの環境で1文字入力ができない場合が多いので、そういった環境だとinput関数のようなものを使用することになります。
Pythonだと、
■ 表示 : print
■ 入力 : input
になり、C言語だと
■ 表示 : printf
■ 入力 : scanf
になりますが、この表示と入力待を使った状態でどのようなものが作れるのかを考えることになります。Pythonの場合、無いものは外部ライブラリで揃える事もできますが、ライブラリのインストールだけでは足りないので、OSとライブラリのバージョンで検索してみてどのような傾向があるのかを調べる必要があります。複雑なものw作る場合医は副すのライブライをインストールする必要がありますが、そうした場合に、環境で動いていくれる組み合わせが存在することもあります。損貯め、目的の処理をする為のライブラリの組み合わせと現在使用しているプログラミング言語のバージョンだと何が使えるのかを調べる必要がでてきます。
Pythonでコンソールアプリを作る場合、標準ライブラリだけでも色々出来るので、
■ 表 示 : print
■ 入力待ち : input
でッ人が情報を見たりデータの入力が出来るようになっているので
■ 分岐 : if
■ 反復
・ 条件で判定 : while
・ 等差数列的 : for
で分岐と反復を実装できます。この時に
■ 変数
・ 単体(型の違いを使う)
・ 複数(リスト、タプル、辞書、集合)
などが利用できるのでデータの集まりを座標として使用することもできます。
文字の扱い方については、
■ 文字列
■ 文字
で異なりますが、二次元配列の場合、文字数を使った整数座標を使用できるので、文章とは異なるデータ管理が出来るようになっています。
Scrtchの場合だとグラフィックが動かせるのと接触の判で色の判定などもできるので、かなり自由度の高い状態になっていますが、Scratchの場合だと、製作者が役割分担を刷る前から、
■ スプライト
■ ステージ
が分類されているので、
■ 対象のスプライトの挙動
■ ステージの挙動
で分けて処理を実装できる要因合っています。この考え方はゲームエンジンっぽい作りになりますが、コードを書く際にもScratcのような役割分担をして処理を分けて考えることになります。