現在はプログラミング教育もスタートしているので、学校教育でもごく当たり前にコンピューターに触れルキ会も増えており、コードを書くことがごく当たり前に行われるようになっています。高校の必修科目の情報Iでは、知識の拡張だけでなく、実際にコードを書きながら仕組みを理解するものも用意されています。このカリキュラムでは、ITパスポート検定(旧シスアド)の学習を行う上である程度の部分をカバーしてくれるので、何も知らない状態からスタートするよりも覚えやすくなっていますが、現在は、アプリケーション内でごく当たり前に実装されているデータの管理などについても学習します。
コードを書く上では、オブジェクト指向でない場合だと
■ 使用するライブラリを用意する
■ 変数を用意する
■ 配列を用意する
■ 関数の定義をする
■ 処理を実装する
のような形になるので、
■ 材料の準備
■ 道具の準備
■ 組み立て
のような流れになりますが、処理の基本構造はCPUの内部処理で行っているような逐次処理とタスクを順番に処理をするような構造で考えることになります。これは、【 工程表 】と同じ構造になりますが、プログラミング言語を使用してコードを書く場合だと、この順番に処理をすることを 【 順次 】 と言います。
この状態だと、【 一度だけ処理が行われる 】 ので、アプリケーションのように終了処理をする前動くような構造や継続して自動処理を行うことができないので、連続して同じ処理を実行するためには 【 ループ処理 】 を実装することになります。この処理のことを 【 反復 】 と言いますが、処理を考える上では、
■ 一度だけ
■ 無限ループ
の2つのものを用意して処理を実装することになります。
この構造は、
でも同様のイベントのブロックが用意されており、この中に処理を実装する構造になっていますが、この仕様は、ArduinoのスケッチをC言語で記述する際にも同様の仕組みになっています。
マイコンのスケッチは、
■ setup(){}
■ loop(){}
で構成されています。これらは、
■ setup() : 一度だけ
■ loop() : ずっと
と同じなので、
■ setup() : 初期化や設定
■ loop() : 処理
を実装することになります。プログラミング言語でコードを書く場合もこの形を踏襲して、
■ 初期化
■ 処理
に分けて考えると処理を考えやすくなりますが、コードを書く場合には使用するものを最初に用意する必要があるので、
■ 変数の初期化
■ 処理の実装
と言う形で構造を考えることになります。
変数
変数については、先日
で扱いましたが、処理を行う際には変数を使用します。
表示を行う場合、Pythonではprint関数を使用しますが、関数は高校のす学の関数で使用する
■ f(x)=x
■ f(1)
のように値を代入して使用する構造になっているので、print関数も構造的には関数ですから、
■ print(引数)
と言う構造になっているので、
print('Hello,Python!')
のような形で引数二値を代入して使用することになります。このように対象を指定して表示を行うことができますが、表示する内容を変更する場合、その都度、引数を書き換えるのは大変ですし、異なる表示をする場合だと、この記述そのものを複数用意することになりますから、関数と同様に引数を変数にすることで表示する内容を選択できるようにすることができます。この表示だと
a='Hello,Python!'
print(a)
のようになりますが、この構造にすると、
a1='Hello,'
a2='Python!'
print(a1+a2)
のようなこともできます。これは、
■ 文字列型(str)同士
■ 数値型(intやfloat)同士
のような状態で成立しますが、C++のstd::coutのように<<で接続すれば、型に関係なく連結して表示できるようなものではありません。
その為、変数を使用する際には、使用する変数がどのようなものなのか?を最初に決めておき、その上で用途に合わせて方を変更して使用することになります。
前述のコードの場合、記述を分けてあるので、Pythonの部分をLinuxに変更して連結することもできますが、この場合、
a1='Hello,'
a2='Python!'
a3='Linux!'
print(a1+a2)
print(a1+a3)
のようにすると
Hello,Python!
Hello,Linux!
のように対象物を変更して文章を構築することができます。
この辺りの構造は、差し込み印刷などのように
■ 変数
■ 定数
の形で運用する構造物と同じですが、
┏━━━━━━━━━━━━━━━┓
┃ ┃
┃ 〇〇様 ┃
┃ ┃
┃ 本文 ┃
┃ ┃
┃ 担当:▲▲ ┃
┃ ┃
┗━━━━━━━━━━━━━━━┛
のような構造にした場合、
■ 〇〇
■ ▲▲
の部分は入れ替わる可能性があるので、この部分は変数になります。これに対し、定形フォーマットの文面を使用する際には単なる定数ですから、ここは確定した文字列を用意しておくだけで対処できます。
これが、データベースソフトを使用した時のレポート出力をする際の書面の構成と差し込み印刷をする際の仕組みになりますが、スプレッドシートでも同様のことが行えます。
その為、【 部分的に状態が異なる文面 】 の場合だと、その部分が変数化しているだけなので、
■ 変数と定数の用意
■ 文字列の結合
だけで行える処理になります。この処理をSHIFT-JISの2バイト文字やUTF-8の3バイト文字で行うとしても、低負荷な処理ですから、1000文字程度だと装飾が入っても高負荷になるようなものではありません。
こうした表示を行った際に、コンソールでの表示のように決まったフォントサイズで均一に表示をするような仕様の場合だと、文字列の結合だけで完結しますが、文字のサイズや装飾を入れる場合だと、テキストの処理ではなくレンダリングを行っているので、こうした表示を行う際にはウィジェットを扱える環境が必要になります。
通常のプログラミング言語では、コンソールで処理を実装するようのコードを書いて、ウィジェットを追加して、オブジェクトと連携して
■ 入出力
■ 演算
を行うことになりますが、変数の変化を与える演算部分はバックエンドですが、表示をウィジェットで行った場合には、ウィジェットの表示やイベントで変数が変化するようにする必要がありますから、ウィジェットの配置と処理の実装方法を別途学習する必要が出てきます。この処理を行うと、表示の変更を変数で制御できるので、プレーンテキストの集まりに装飾を追加して表示を行えるようになります。
先程の構造は、Hello,に対して、対象物を追加している構造でエスから、
■ 挨拶
■ 対象物
のようにカテゴライズすることができます。しかし、先程の構造では、こうした分類ができていません。この時に使用するのが配列になります。
配列
配列は、複数のデータを格納できる仕組みになりますが、Pythonではリストと言う名称になっています。これ以外にも変更が不可能なタプルや、辞書のようにインデックスとデータの形で記録するものもあります。リストの場合、
リスト名=[データ,データ,データ,...]
のような形でデータを格納することができるので、一つの変数名で複数のデータを格納して管理することが出来きます。この際に
リスト名[インデックス]
で呼び出すことができます。インデックスは1からではなく、0からなので、一番最初のデータを参照する際には0を指定することになります。
これを踏まえて先程の変数の構造をリストに置き換えると
a=[\
'Hello,'\
]
b=[\
'Python!,'\
'Linux!,'\
]
のようになるので、表示を行うデータをカテゴリー別に分けることができます。これを表示する際には、
a=[\
'Hello,'\
]
b=[\
'Python!',\
'Linux!'\
]
print(a[0]+b[0])
print(a[0]+b[1])
のようにするだけで表示を行うことができます。実際に
のようにコードを書いて
のようにターミナルを開き
のようにしてファイルを実行すると
のように文字列が連結された状態で表示されます。
このように配列を使用するとカテゴライズをして単語を管理できるので、文章の構造を配列に格納したデータとインデックスだけで管理できるようになります。例えば、英語の最初に登場するbe動詞で考えると、
のようになっていますから、これらは、
s=[]
v=[]
o=[]
と言うリストを作れば、管理できることになります。この場合だと、
s=[\
'I',\
'He',\
'She',\
'You',\
]
v=[\
'am',\
'is',\
'are',\
]
o=[\
'human.',\
'student.',\
'crafter.',\
'....???',\
]
のようにできるので、この組み合わせで考えると、
【 I amの形 】
■ s[0]+v[0]
【 He isの形 】
■ s[1]+v[1]
【 She isの形 】
■ s[2]+v[1]
【 You areの形 】
■ s[3]+v[2]
で構築できます。ここに配列oに追加したデータを追加すれば、この構造の文面を作ることができます。
この形では、
■ S+V+O.
になっていますが、疑問文では、
■ V+S+O?
のようになります。ということは、疑問文だとインデックスは固定でリストの順番だけを入れ替えることになります。この場合、Am I 〜?は見かけないので、それ以外の文面で適応すると
【 Is heの形 】
■ v[1]+s[1]
【 Is sheの形 】
■ v[1]+s[2]
【 Are youの形 】
■ v[2]+s[3]
のようになります。
日本語の場合も同様に管理できますが、トークンの分け方が異なるので、
a1=[\
'私',\
'彼',\
'彼女',\
'あなた',\
]
a2=[\
'は、',\
]
a3=[\
'友達',\
'家族',\
'学生',\
'クラフター',\
]
a4=[\
'です。',\
]
のような形になります。この場合、
a4=[\
'です。',\
'ですか?',\
]
のように述語を追加するとインデックスで文面を変更できるようになりますが、
a2=[\
'は、',\
'が、',\
]
のようにデータを追加するだけで構築できる文面も変わります。リストa3は、対象物になりますから、ここが英語のO(オブジェクト)に該当する部分になりますから、文面の構築時に対象を変えて学習ス売る際に使用するのはこの部分になります。be動詞の最初の辺りの学習だと定形だけで完結する構文が存在しており、対象と生るオブジェクトの変更で文面を構築して考えていくことになります。
文章には文法が存在しますが、基本構造は加算担っているので、最初に学習するのは、
【 何が加算された構造物なのか? 】
と言う法則性になります。そして、どの言語も共通して、特定の条件で単語が変化する(英語の過去形で単語の変形が生じたり、単語そのものが変わってしまうなど)ことについて学習することになります。日本語も同様に国語の中で
【 人とのつきあい 】
人付き合い(ひとづきあい)
のように、ひらがな(というよりも音読)にすると元の単語とは変化しているものもあります。
また、
【 する+ます = します 】
のようなのも変化の一つですが、言語の場合、特定の条件で単語そのものが変化する仕組みになっているんどエソのアルゴリズムも追加しておく必要があります。
この構造を見ると、言語は単語という辞書で構成されており、コンピューターで文面を作る場合だと、変数の制御で構築できることが確認できると思いますが、この最小単位をトークンと言います。
AIの場合、文章の変化による予測を立てて構文を行うような仕組みいなっているので、この事例とは少し異なりますが、文面の構築を行う際には定数と変数の組み合わせで宛名の差し替えなどを行えるほか、文面自体もトークン単位で分けたものを法則性に基づいて並べると文章構築を行うことができます。
変数の取り扱い
変数は、【 データの管理 】 で使用できますが、
■ 変数の宣言
■ 値の代入
によって処理が成立しています。その為、計算結果の代入なども変数に対して行うことができるので、変数を使用すると
■ 状態の維持
■ 状態の変化
の管理を行うことができます。ただし、定数を用意して演算結果を定数として作成することでも同じ処理を実装できますから、改変不能な定数を用意して変化を関数で制御することもできます。この制御を行っているのが関す歌のプログラミング言語になります。
変数の基本的な考え方ですが、
【 定数の場所は変数に置き換えることができる 】
ようになっているので、関数の引数なども変数に置き換えることができます。
処理を行う場合、
■ 変数の参照
■ 変数の書き換え
を行いますが、プログラミング言語の変数を数値型で指定して使用した場合、実装する処理は 【 演算 】 になりますから、コンピューターの内部では代数学の処理が行われていることになります。
これを二値論理で処理を行い、十進数に変換した解を出力しているわけですが、代数学のように数字を使う分野では、この時の値は、抽象化した構造物になりますから、 【 数値と言う結果 】 しか持っていません。つまり、これを具象化して使用する場合には、何かしらの単位などを付与する必要があります。
プログラミング言語を使用してアプリケーションを作る場合も同様に、 【 数値の変化には意味をもたせて使用する 】 ことになりますが、小学校高学年で登場する 【 単位による数値の変化 】 のカリキュラムも
■ 対象物
■ 単位
と言う組み合わせになっています。この時に数値で対象物のデータの総数を示しているわけですが、この時のデータの総数は
■ 位置
■ 長さ
■ 面積
■ 体積
などになりますから、視覚情報で確認できるものについては、多次元の空間の中で存在するデータの総数ということになります。
位置は、原点0から見た時の距離に目印をつけたものなりますが、長さは、その範囲を示したものになります。これは距離と同じですが、長さそのものを示す場合には、座標ではなく線分を使用するので、数直線に対して一次元の変域を設けた構造担っています。
面積の場合はこれが二次元化したものになっており、体積は、これに高さ方向に層を追加した構造になります。
これらのデータの総数は数値で示すことができますが、100と言う数値があったとしても単位の変化で意味合いが変わってきます。
その為、数値は状態を抽象的に表現し、基準を音に考えた時の大きさを示したものでしかないので、これがどのように使用されているものなのかを明確にしないと、数字自体は全く意味を持ちません。
コードを書く場合も同様に、
【 変数の使途を明確にする 】
必要があるわけですが、アプリケーションだと
■ データの数字の変化
■ オブジェクトの位置情報
で意味合いが変わってきます。というのも、前者は数字自体が表示されますが、後者は座標制御なので数字が見えることはありません。
小学校六年生の比例のカリキュラムでは、
■ 帳票
■ グラフ
を使ってデータの相互変換を行い、予測を行ったり、
■ 帳 票 ▶ グラフ
■ グラフ ▶ 帳 票
の相互変換を行いますが、この2つは、
■ 帳 票 : 数値
■ グラフ : 座標
の表示を行ったものになります。ゲームの場合だと、
■ ス コ ア : 数値
■ オブジェクト : 座標
のようになっていますから、上記のものと同様に数値を値の表示として使用するものと座標の制御に使用しているものを扱っているわけですが、中学校一年生の数学では関数が登城するので、法則性をを数式で示すことを学びます。
ちなみに、特定の法則性を関数で示したものを使用するのはシーケンス制御になりますが、AIを使った推論で使用する学習済みモデルも関数なので、関数を使って数値のコントロールを行っています。
その為、ゲームで動いているものは解析学の分野で使用するものを使用してることになりますが、義務教育で登場する関数などに見られる
■ 帳票
■ グラフ
という始点の変更は、代数学と幾何学という違う始点での状態の表現になりますが、前者が抽象表現で、後者が具象表現になります。
アプリケーションでも数字と座標という異なるものを扱うので、対象物によって数値の意味合いが変わってきます。
デスクトップアプリのようにウィジェットを使用した環境だと
■ 数字(データの表示)
■ ウィジェットの座標
は全く意味合いが違うので、変数を宣言する際に使途を明確にしておく必要があります。
そして、動かす際に動作を指定することになりますが、この挙動の制御をイベントハンドラや任意の方法で制御を行うことになりますが、基本的には
■ センサー検知
■ 完全自動処理
の2つに分けることができます。前者の場合、センサー検知なので、イベントハンドラも含めた処理になりますが、後者の場合だと関数の実装による座標の制御を行うコードを実装して、時間単位の座標の推移を実行するようなものになります。こうした変化を分岐で実装したり、時間単位の発生で制御することができますが、動作の場合だと、
ループに包含して条件で終了させることになるので、処理その物を1つの構造でまとめたほうが管理しやすくなります。
これが、
■ 数字の表示
■ 座標の制御
という全く異なる変数の取り扱いになりますが、変数はデータの集まりの配列でも使用できるので 【 表示の制御 】 でも使用することができます。これは、ラスターグラフィックのタイルマップの制御でも使用できますが、この構造物は、
■ タイルサイズ
■ タイルの数
という仕組みで、1枚の画像のパターンを制御する仕組みになっています。タイルが1つの画像のパターンになりますから、この単位で移動することで違う画像に切り替わる仕組みになっていますから、この管理方法は 【 等差数列 】 と考えることができます。
この時に二次元配列のインデックスを使用して画素(ピクセル)の範囲指定を行うことになりますが、この処理は、中学区おの数学で登場する二次元空間に対する変域の指定と全く同じ考え方になります。
ただし、ラスターグラフィックは、左上から右下に向かって数値が増加する仕組みなので、数学のグラフとは異なる構造になっているので、数値の管理方法もグラフとは異なります。
ラスターグラフィックについては、
で触れていますが、マイクラのブロックから高さの情報を除去した構造になっています。
また、
でも触れていますが、配列を使うと、レイヤーの構造を作ってマスク処理も行えるので、画像の合成を行うこともできます。
二次元配列はコンソール上で整数の座標を構築することができるので、
のような処理も行えます。