現在は、中学校の技術でもフローチャートが登場するので処理の流れを学習することになりますが、この中でセキュリティーに関する内容やフローチャートなどについても学習します。
フローチャートも全てを使うわけではないので、
■ スタートと終了
■ 処理
■ 分岐
■ 反復
を使うことになります。この中で、ループについては、
■ 反復の記号の中に含まれているもの
■ 条件分岐で回帰するもの
がありますが、この2つはコードで使用する時のメソッドが異なります。
Scratchのようにループがブロックになっているものだと少し異なるのですが、Pythonの場合だと、この2つは
■ for
■ while
になります。
for
forはブロックの中に処理を実装する仕組みになっていますが、この時に使用する引数は
■ 最初の値
■ 最終の値
■ 推移の幅
となっていますから、実質的に等差数列と同じ構造になっています。等差数列は
■ 初項
■ 末項
■ 交差
を使用しますが、この構造は中学校の数列のカリキュラムでも扱うと思います。名称は登場しませんが、小学校でも等差数列は登場するので、
■ 最初の数
■ 最終の数
■ 増えている数
のように考えると、等差数列と同じものだと分かります。この指定で
■ 始まりの数
■ 終了時の数
■ 増え方
を指定しますが、引数は省略できるので、最初の数値だけを指定することでインデックスだけ指定することも出来ますし、2つの値を指定することで、推移が1のループを作ることも出来ます。全ての引数を指定すると等差数列のような指定が出来ます。Pythonのforは
for 変数名 in range(a,b,c):
処理の内容
のようになっているので、JavaScriptやC言語などのように処理のブロック内を{}で囲む必要がありません。
ちなみに、数学では、
■ [ : 大括弧
■ { : 中括弧
■ ( : 小括弧
になっているので、 a{ 2(x+1)-(x-5) } のような記述になりますが、上記の言語では、処理を包含するブロックの部分は{}で囲まれています。この形はC言語の基本構造を見れば確認できますが、C言語ではmain関数を使用するので
# include<stdio.h>
int main(void){
printf("Hello,World!");
return 0;
}
のようになります。基本的に、処理の改行部分には 【 ; 】 を使用することでつながっていないことを明記し、ブロックの中にはインデントを追加します。そして、処理を格納するブロックの部分は、【 {} 】 が使用されているので、その範囲がブロック内での処理である事を支持できるようになっています。その為、処理については、順次以外はブロック担っているのでわかりやすいのですが、Pythonだとこの記述が簡素化された状態になっています。
これが、forループになりますが、引数の対象をリストのような配列のような複数のデータを格納した変数も使用できるので、数値の変化以外の処理も出来るようになっています。
while
2つ目のものはwhileの特性になりますが、これは、標準ライブラリを使用しない状態だと無限ループで使用できます。ちなみに、速度的にはforのほうが高速ですが、組み込み関数のみで作ると言う条件がない場合だと、標準ライブラリや別の速度の出る方法を使用します。
アプリケーションを作る場合、 【 処理が継続してもらったほうが良い 】 ばあいがありますが、こうした条件では 【 無限ループ 】 を実装します。これがメインループになりますが、このメインループ内に処理を実装することで、 【 終了処理を行うまでループする 】 ような状態を作ることが出来ます。
Pythonは、Linuxだと標準実装されているので、現在のバージョンだとターミナル上で 【 python3 】 のコマンドを打ち込むとpythonが立ち上がります。最新のバージョンだと、3.12辺りが入っているのではないかな?と思いますが、Pythonのバージョンは各ディストリビューションのバージョンで異なりますが、3.1x系になっています。
ここで、工程表のように処理を並べた 【 順次 】 の形で処理を実装すると処理が順番に実行されるのですが、ターミナル上で処理を実行したい場合だと、defを使用して関数として定義して、その関数を実行するようなコードを書くことで、単一のコードが実行される仕組みから、処理の塊を実行できるようになります。
この時に
def a():
print('Hello,Python!')
print('Hello,Linux!')
のように記述を行い関数aの宣言をします。こうすることでメモリー内に関数aの情報が記録されるので、これを打ち込んでプロンプトが出るまでEnterキーを押して、プロンプト上で
a()
を実行すると関数aが実行されるので、順番に指定した文字列を実行できるようになります。これが順次の処理になりますが、
■ 初期化
■ 入力
■ 変数の再代入
■ 処理
■ 表示
のような工程を実装して実行した場合、順次だけだと 【 一度だけコードが実行されて終了する 】 ことになります。
この処理を繰り返したい場合には、 【 上記の処理をループ内に包含する 】 ことになりますから、
【 ループの条件とループの開始 】
■ 初期化
■ 入力
■ 変数の再代入
■ 処理
■ 表示
【 ループ終了 】
のような形になります。この構造物の条件を無限ループにするとこの処理が継続されるわけですが、Pythonでこういった処理を 【 組み込み関数で指定する 】 場合には、whileを使用します。この場合、ブール値のTrueで判定をすればいいので、
while True:
無限ループを行う処理
のような構造にすることも出来ます。この条件は、Trueの場合にループするというものになっていますから、ブール値で判定をしているわけですが、
a = 0
while a<10:
print(a)
a=a+1
のようなコードにすると、【 変数aが10未満だとループする 】 というものですから、変数aの数を増加させていくと不等式の条件が不成立になりますから、条件的にはFalse(偽)になります。基本的に
■ ループの実行 : True(真)
■ ループの終了 : False(偽)
のようになっていますから、whileの場合だと 【 条件を満たすと回帰する 】 と言う仕組みになります。その為、上記のコードを
a = 0
while a<10:
print(a)
のようにしても無限ループになりますが、
while True:
print(a)
のようにすると、変数の指定も不要なので簡素な記述で無限ループを行うことが出来ます。
このように、whileの場合だと 【 条件を満たしている間はループする 】 ので、実質的に条件分岐で回帰させるような仕組みですから、中学校のフローチャートで記述する分岐を使ったループはこれを用いたものと同じ構造になります。
デスクトップアプリのように継続して動作するものの場合には前述のようなループを指定することになりますが、この場合、
【 メインループ(開始) 】
処理
【 メインループ(終了) 】
のような構造ですから、何かしらの条件で終了させる必要があります。コンソールアプリの場合だと、組み込み関数には 【 1文字入力 】 が存在しないので、input()関数をで 【 入力待ち 】 を入れて判定を行うような作りになります。これを行うことで
【 メインループ(開始) 】
処理
入力待ち
終了処理 : 変数での判定
【 メインループ(終了) 】
のようなが慣れにすることが出来ますが、ループの場合、forもwhileもBreakで止めることが可能なので、判定でbreakで停止するようにしておけばアプリケーションのループを止めることが出来ます。
if
無限ループを実装すると判定を入れて停止する必要がありますが、この時の使用するのが if になりますが、これもブロックで処理を格納するので、
if 判定の内容:
処理
と言う形で実装することになります。inputを使用すると文字列型で変数の値(リテラル)が指定されるので、この値でキーの判定を行うと条件を満たすので、そこで
while True:
input(’終了しますか?(y)’)
if n=='y':
break
のようにすると、入力待でyキーを押してEnterキーを押すとループが終了しますが、無限ループの場合だと、このような
■ 反復
■ 分岐
をセットで使用することになります。この時のキーの判定ですが、ゲームパッドのようなタクトスイッチの場合だと、接点の情報だけで判定が出来ますが、キーボードの場合、文字で判定をしているので、LinuxのXサーバーのような位置情報で判定をしているわけではないので文字での判定を刷る場合だと、キーを押された時に入力される可能性のある文字の全てに対応させておく状態に関係なく動作するようになります。
こうした処理は、キャラクターコードのような数値でキーの判定を行うような処理で簡素な判定を入れてしまった状態だと対応できなくなるのですが、入力される文字の可能性を全て対象にしてしまえば組み込み関数でもご入力はなくなります。また、上記の内容だと、y以外だと順次に流れるので、ループになりますから、n二限定したい場合には、yと同じように文字の指定を行うことになります。ちなみに、分岐は、
■ True(真)の時 : 処理の実行
■ False(偽)の時 : 次の処理が行われる
と言う仕様になっているので、ここでもTrueで判定が実行される仕様になっています。
処理の流れの基本は
【 処理1 】
↓
【 処理2 】
↓
【 処理3 】
↓
【 処理4 】
↓
:
:
のような流れになっているのですが、これは、日常で使用している 【 工程表 】 と同じです。
プログラミング言語では、工程表のように順番に行う処理を 【 順次 】 と言いますが、この処理も
【 処理1 】
↓
【 処理2 】
↓
【 処理1 】
↓
【 処理2 】
↓
:
:
のように同じ工程が円属する場合には、順次ではなく反復を使用して
【 ループ開始 】
↓
【 処理1 】
↓
【 処理2 】
↓
【 ループ終了 】
のような形にします。この時にループの条件をforのように回数指定を行うか、whileのように条件で判定を刷るのかを指定することになりますが、これが、反復を使う事例になります。この内容を見てみると
■ 順次 : 処理の追加
■ 反復 : セット物のロット数の指定
と同じですから、
■ 順次 : 加算
■ 反復 : 乗算
と考えることが出来ます。ちなみに、中学校で学習する累乗は、乗算を1つのロットとしてそれを幾つ集めたものなのか?を扱うものなので、同じ値の積を乗算処理を行うものになります。
小学校だと定数項を扱うので数字で処理を行いますが、中学校一年生では、 【 項 】 を学習するので、数字の加算ではなく、 【 式の形の構造物を項にまとめる 】 事が出来ることを学習します。その為、数式を変数項の状態でまとめると、 【 式という処理を一つのまとまりとして加算していく処理 】 を数式にして示すことが出来ます。この構造は、プログラミング言語の処理や作業工程に似ているので、抽象化して現実とは少し違うような簡素な状態のものを、現実の処理に近いように 【 数式の形で示した処理 】 を一つの項にまとめて扱うことで、 【 作業工程を式にしたもの 】 に近い構造にすることができるようになっています。
その為、項を使用すると符号や係数が実装できるので、
■ 反転
■ ループ
のような処理を一つの変数項の要素として実装して、工程表の中に実装できるようになります。
その為、中学校のカリキュラムは 【 プログラミングで使用する物が多く登場する 】 訳ですが、項の中で登場する変数項と定数項もプログラミング言語の中で使用する変数と定数と同じ考え方になります。
プログラミング言語では、
■ 変更しても大丈夫な値
■ 固定しておく値
があり、これとは別に定数の指定が出来るものもありますが、これらは
■ 変数
■ 定数
で示すことが出来ます。JavaScripだと
■ 変数 : let
■ 定数 : const
を使用しますが、Pythonにはそうした機能がないので、ライブラリを自作してconstを実装する必要があります。
座標
義務教育では、コンピューターで使用する物も多く登場していますが、代数学のカリキュラムは代数学の視点でしか見ていないので、これを幾何学の視点で見ていないこともあります。
ベクターグラフィックを扱う際には浮動小数点数を用いた座標を使用しますが、この時に
■ グローバル座標
■ ローカル座標
を使用します。この辺りは幾何ベクトルで考えるとわかりやすいのですが、
■ 数学 : 法則性
■ 物理 : 状態
を示すので、数学のベクトルは大きさと向きを求める物なので、この場合、定数が必要になるので、 【 原点からの距離 】 を扱うことになります。その為、 【 0からどれ位の距離にあるのか? 】 を求めるので、原点は常に(0,0)になります。
この座標は3DCGでも使用しますが、この原典座標を基準とした座標のことを 【 グローバル座標 】 と言います。
これに対して、 【 任意の座標を基準とした距離 】 を扱う場合、基準となるのは原点座標ではありませんから異なる基準点を用いることになります。この 【 任意の座標を基準とした座標 】 のことを 【 ローカル座標 】 と言います。
マインクラフトでは、クリエイティブモードを使用するとコマンドブロックを使用して処理を連結してワールド内に存在しない処理を実装することが出来ますが、この時の座標の考え方も
■ 原点からの位置関係
■ プレイヤーからの位置関係
などが指定できます。これが、
■ グローバル座標
■ ローカル座標
になりますが、このように 【 特定のオブジェクトから見た位置関係 】 を示す際にローカル座標を使用しますが、この考え方は小学校の算数でも登場しています。
これは、
【 問題 】
Aさんの家は、学校から 500m 先にあります。
Bさんの家は、学校から 1.2km 先にあります。
Aさんの家からBさんの家までの距離は
どれくらいあるでしょうか?
のような問題上がったとします。この場合、大きい値から小さい値を引けばいいので、
1200-500=700
なので、Aさんの家からBさんの家までは700mの距離があることが分かります。
この問題では、距離の基準点が学校なので、ここが減算座標である(0,0)ということになります。
ここから距離を計測すると定規と同じですから、原点0からの距離を取得できます。
これを単純な直線距離と考えると定規上の目盛りの違いになりますから、数直線上の値の違いになりますが、これを幾何ベクトルに置き換えると、長さの違いになります。この時のBさんの家は、原点座標から見た場合には x = 1200 の座標に位置しているわけですが、これがグローバル座標での座標の値になります。
しかし、原点ではなく別の座標にあるAさんの家から見た場合には距離が全く異なるので、計測地点を変更する必要があります。その為、二点の座標間の距離を計測する場合には、基準となる座標を原点として、そこかrの距離を計測する必要があります。
この場合、 x = 500 と言う座標の指定が出来る Aさんの家の位置が原点座標になるので、 X = 500 という位置を基準として対象までの距離を計測することになります。Aさんの家からBさんの家までは700mの差がありますから、AさんがBさんの家に行くには +700 をするだけで到達できるわけです。
この場合、
■ 基準 : Aさんの家
■ 対象 : Bさんの家
となっていますから、完全にグローバル座標の原点とは異なる場所に原点が存在していますから、この処理の考え方は、 【 ローカル座標での移動郷里の算出方法 】 ということになります。この問題では、
■ 基準となるグローバル座標
■ ローカル座標を用いた距離
を使用しているわけですが、グラフィックも座標の制御を行っていますから、【 対象物からの距離 】と言う概念が発生します。
算数のカリキュラムでは上記のような計算方法も登場しますが、これを具象化して数直線上の座標に置き換えると、グラフィックで使用するグローバル座標とローカル座標の関係性と同じものになります。
これを矢印で示すと一次元の幾何ベクトルの合成と同じ構造になりますが、グラフィックではこの座標を多次元化して使用しているので、平面や立体で同じ方法を用いて移動や距離の関係性の判定などを行っています。
プログアミング言語は
■ バックエンド
■ フロントエンド
で構成されているのですが、この座標の数値の変化はバックエンドになります。この時の結果をフロントエンドで表示しているわけですが、ウィジェット環境で表示するオブジェクトなどがフロントエンドで人に見える形状として表示されたものになります。バックエンドのコンソールでの制御だと、cursesなどを使うと1文字入力や配列を使用して整数座標で文字の位置を指定できるようになる(位置文字入力は無理ですが、多次元配列を使用すれは、組み込み関数だけでも座標の指定は出来ます。)ので、表示おコントロールは出来るようになりますが、ウィジェット環境だと画像ファイルの表示が出来るので、この時の表示を行う初期の座標を指定しておくと先程のAさんの家の位置のようなローカル座標の指定が出来ます。
これがキャララクターオブジェクトの場合だと、ここからの座標の変化を与えることになりますから、
■ X軸 : cosθ
■ y軸 : sinθ
を用意して、ここに移動距離を加算したもので制御することになりますが、三角関数を用いると、この移動距離に対して 【 回転 】 を追加できるので、移動距離を1とした時に
【 45度の方向に1の距離移動する 】
のような処理を実装できるようになります。正方形を対角線で二等分した時に出来る直角二等辺三角形の斜辺の長さは、√2なので、 【 X+1 and y+1 】 とすると 【 斜め方向に1.4倍強ほど移動してしまう 】 ことになります。
そうならないようにする為には1の距離を角度分だけ回転させる必要があるわけですが、これを使用するのに高校の数学で登場する三角関数を用いることになります。
デスクトップアプリの場合、
■ レイアウト
■ 移 動
が生じますが、
■ レイアウト : 定数
■ 移 動 : 変数
での制御になるので、視点が違ってきます。その為、
■ レイアウト : グローバル座標
■ 移 動 : ローカル座標
で処理を刷ることになります。画面内のスプライトなどのオブジェクトは初期座標を持っていますから、位置情報については最初に初期化を行うことで、初期に発生する位置の座標を指定しておくことになります。この場合、Pythonだと
変数名 = 値
のような形で指定しますが、このように変数雨の宣言と値も代入する処理を一度に行うことを 【 初期化 】 と言います。
処理と構造
プログラミング言語を学習すると 【 一度きりで処理が終わるコード 】 を書くことになりますが、これをループさせる場合には、メインループとして無限ループを用意して、ループを終了させる処理を実装しておけばいいので、この 【 雛形 】 を用意しておけば、実装した処理を延々と実行することができるようになります。
当然、ループだけだと意味がありませんから
【 ループ内に実装する処理 】
を考えることになります。この時に使用するのが
■ 変数
■ 演算
■ 記録と呼び出し
■ 入出力
になりますが、プログラミング言語の学習を行う場合、
■ キーボードとマウスでの入力
■ モニターの表示
■ PCでの処理
が行われていると思うのですが、これが、
■ 入力
■ 出力
■ 制御・演算処理
になります。これらは
■ 入力
■ 制御
■ 出力
と考えることが出来ますから、
■ センサー
■ コントローラー
■ アクチュエーター
に置き換えて考えることが出来るので、センサー入力がコードの入力時に使用しているデバイスで、アクチュエーターに該当するものは表示機材になります。そして、マイコンのように入力の値を参照して処理を実行して
出力に反映させるのがPCということになります。
プログラミング言語の学習の最初の段階だとコンソールアプリからになる(JavaScriptやScratchなどは違います。)はずですが、これは 【 バックエンドの制御 】 という処理の根幹から学習するためのものになります。
デスクトップアプリも 【 処理自体はバックエンド 】 なので、フロントエンドは、操作する人が解るようにするための手段でしかありません。その為、
■ 操作
■ 操作後の挙動
をフロントエンド側で実装することになりますが、この時の状態の制御もバックエンド側で行っているので、検知と反応というセンサーとアクチュエーターに該当するものはフロントエンド側に配置してありますが、コントローラー側で制御する内部処理の部分はフロントエンドの記述では制御できません。その為、
■ イベントと処理の関連付け
■ ウィジェットと変数の関連付け
のような物を行って内部処理とは関係ないオブジェクトの挙動を内部処理で制御できるようにする必要があります。JavaScriptだと、
■ EventListener()
■ getElementById()
でマウスやキーボードのイベントの取得やエレメント(タグで指定した対象)の制御が出来るようになっていますが、PythonのTkinterでもウィジェットと変数の紐付けやイベントと処理の連携を行うようなコードの書き方をします。
と言っても、アルゴリズムの構築自体はコンソールと同じなので、基本となるコードの記述方法を学習するためにコンソールで動作する方法を学習することになります。
プログラミング言語を扱う際には、現実と同じく 【 必要なものを揃える 】 ことになりますから、
■ ライブラリの読み込み
■ 変数の初期化
■ クラスの宣言
■ 関数の宣言
のような処理を行います。これが、Pythonでは読み込む対象になります。関数などについては、main関数を使用して記述をするとmain関数のあとに記述を行った関数を呼び出すことが出来るようになりますが、そうした記述を行わない場合には、 【 処理で使用するものは事前に用意しておく 】 ことになります。
この考え方は 【 存在しないものは使用できない 】 とい動く当たり前な概念を理解する意味合いもありますが、この基本形を学習した後に、別の記述の方法を学ぶと、 【 記述の構造と意味合い 】 をしっかりと理解できるようになります。
このように変数などの使用する値や独立した処理の塊などを使えるようにした後に、先程の
■ 順次
■ 反復
■ 分岐
を使用して処理を実装することになりますが、この際に、 【 値の変化 】 を実装することで、様々な処理を実行することが出来るようになっています。
プログラミング言語では、
■ 文字
■ 数値
を扱うことが出来るので、数値と文章を使うことが出来ます。コンソールの処理では、バックエンドの処理として考えるので、人が見る部分はフロントエンドで作ると言う考え方なので、コンソールでは数値の制御による座標制御を扱わないこともあります。
コンソールでは文字しか表示できないので、この構造は、文字数で画面内の表示の制御を行っていますが、文字数は 【 文字の個数 】 なので、整数の座標として考えることが出来ます。ただし、通常の使い方だと 【 変数の表示 】 しか出来ないので、これを 【 二次元配列 】 を用いることで、二次元の整数座標を用いて位置情報で表示をコントロールできるようになります。
これを行うと 【 座標単位で文字を配置できる 】 ようになるので、文字のレイアイトヤ文字の位置の移動を制御できるようになります。この場合、
■ バッファ
■ 配列の変更
を行うようにすると配列上の表示の切り替えも行えるようになります。この考え方ですが、
■ ドットマトリックスLED
■ ラスターグラフィック
■ スプライト制御
と同じものになりますが、この配列内のデータを数値で管理するとスプライトを使ったアプリケーションのタイルを使った表示の制御と同じことが出来るようになるので、数値で管理しているデータを図記号に変更すると画面内を記号で埋めることが出来るようになります。
こうした処理ですが、全てが1つの二次元配列で構成されているわけではありませんから、
■ 配列A
■ 配列B
がある場合に、このデータを組み合わせて計算したり入れ替えることも出来ます。Pythonの配列は組み込み関数で用意されていますから、変数の宣言時にリストの形で変数を指定すれば良いのですが、Pythonで配列を使う場合には、Numpyが使用されることが多いです。これは、
■ 配列A + 配列B
■ 配列A * 配列B
のような個別の配列に存在する同じ位置のデータを参照して計算を行う場合に、Numpyだとそのまま計算が出来るので、組み込み関数のようにループで値を参照して計算しなくてもいいので高速に処理を行うことが出来るようになっています。こうした配列の合成の考え方は 【 レイヤーと同じ 】 なので、RGBAの状態を同時に変更したり、画素(ピクセル)単位で処理をする場合でも高速に処理が出来るようになっています。
画像の解析や処理をする場合には外部ライブラリのOpen-CVを使用することになりますが、これも簡素な記述で処理が行える上に利便性が高いのでそういった処理を行うようになっています。
こうしたライブラリがない状態だと配列で考えていくことになりますが、プログラミング言語の配列は整数座標として扱うことが出来るので、コンソール上でも座標を構築して、文字に対して位置情報を与えてレイアウトをしたり移動させることが出来ます。
プログラミング言語を使う場合
コードを書く場合には処理を考えることになりますが、処理を実装する際には
■ コード内で使うものを事前に用意する
必要があります。これはどのプログラミング言語でも同じですが、処理を実装する際には
■ 順次
■ 反復
■ 分岐
がどのように実装されるのかを考えることになります。
コンソールアプリの場合だと、
■ 入力 : inputなど
■ 出力 : printなど
を使用して、入力待ちと表示を行うことになりますから、変数の初期化を行って値を指定しておき、その値の変化を演算処理などで実装することになります。
数値の変化は、関数と同じなので、
■ 状態を示す数値
■ 単位がついた時の変化
のように値は使い方で変わってきますが、表示の場合だと、座標として扱えるので、
■ 大きさ
■ 位置
■ 距離
などで使用できます。GUIを使用した場合にはオブジェクトの状態を制御できるのですが、この時にローカル座標でみた時の距離感も使用することになります。
こうした処理はScratchを使った場合も同じなので、コードの部分がブロックに変わっただけになりますが、手続き型のコードの書き方をした場合には、どのプログラミング言語でも同じように処理の実装をおkなうことが出来ます。
その為、アルゴリズムを作ることが出来レイ手羽、プログラミンっ言語の記述方法と挙動を理解できればコードに出来るようになりますが、中学校の技術だとアルゴリズム部分の基礎知識のような部分を学習できるようになっています。
アプリケーションを考える場合、 【 何をするものなのか? 】 を考えることになりますが、その上で
■ 人と機械の関わり合い
■ フロントエンドでの挙動
■ バックエンドでの挙動
を考えることになりますが、人の操作を考えても工程が生じるので、どのような工程がその中に発生するのかを考えることになります。
操作が発生する場合だと、操作とその結果が必要になるので、目的の挙動に至るまでの操作や工程を考える事になります。
この工程も 【 項 】 のカリキュラムのように処理単位で分けることが出来るので、どういった処理が存在していてどのような手順で動作しているのかを考えることになります。
手続き型の記述だと、これを関数で分けて考えることが出来ますが、処理を分けて考えてみるとその部分の変更などが行いやすくなります。