Download as pdf or txt
Download as pdf or txt
You are on page 1of 10

プログラミングの基礎

1. 実習: 自動操縦

ここでは、教育用プログラミング言語の Scratch を使用し、アルゴリズムの基本的な構造を組み合わせ、簡単な


自動操縦プログラムを作成します。実習で作成するプログラムの完成図を、下に示します。
Scratch は MIT が開発した教育用のビジュアルプログラミング環境です。通常はテキストを打ち込む命令の記述
をブロックの配置で行い、スプライト(sprite)と呼ばれるキャラクターを動かすことで、初心者でもプログラミング
の概念を学べるのが大きな特徴です。小学生でもすぐ慣れることができますが、プログラムやアルゴリズムで重要
な様々な概念を学ぶことができるため、世界中で広く使われています。

※ Scratch は、インターネット環境があれば下記の URL でプログラムを作成したり、公開したりできます。


Scratch is developed by the Lifelong Kindergarten Group at the MIT Media Lab. See https://scratch.mit.edu.
※ ネコのスプライトが道路から外れた際に上手く曲がるようにするには、若干の修正が必要です。
(ネコの右斜め上と右斜め下に小さな点を打つと、道路から外れた際の動作を改善できます)
※ スプライトの進む幅や回る角度を調整し、より早く動くようにしたり、ステージを編集して道を書き換えた
り、スプライトを複製して増やしたりするなど、できたプログラムを書き換えてみましょう。

1.1 逐次
Scratch では、プログラムを開始するには画面右上の 🚩 をクリックします。 🚩 がクリックさ
れた際の処理を設定するには、イベント→ 🚩が押されたとき のブロックを右側のスクリプトエ
リアにドラッグします。このブロックの下に他のブロックを繋げることで、逐次処理を作成
できます。例えば動き→ (10) 歩動かす のブロックを繋げて右のようなスクリプトを作ると、 🚩

がクリックされたときにネコが 10 歩動きます。更に、動き→ ↷(15) 度回す のブロックを繋げると、 🚩 がクリックさ

れたときにネコが 10 歩動き、次に時計回りに 15 度回転します。あくまで (10) 歩動かす と ↷(15) 度回す が順に実行


されており、同時に実行されているわけではないことに注意する必要があります。

1.2 反復
(10) 歩動かす の 10 の部分を書き換えれば、一度に進む歩数を変えることはできますが、

これでは 🚩 を何度も押さないとネコを進めることができません。次は、人手でボタンを押
さずとも、ネコが進む動作を繰り返し、自動的に進むようにします。
まず、 ↷(15) 度回す のブロックをドラッグして (10) 歩動かす のブロックから外し、横に置
いておきます。使わないブロックはブロック一覧のところに戻すと削除できますが、スク
リプトエリアに放置しても、スクリプトの動作には影響しません。
制御→ ずっと のブロックをドラッグし、 🚩が押されたとき のブロックの下側に置きます。このブロックは挟んだ

ブロックをずっと繰り返すので、右のように、 ずっと のブロックで (10) 歩動かす のブロックを挟みます。 🚩 をクリ

ックすると、ネコは端に当たるまで (10) 歩動かす の処理を永遠に繰り返すようになります。動作中のスクリプトを

停止するには、 ● をクリックします。

1.3 選択
ここまでのスクリプトでネコはずっと動き続けるようになりましたが、端に当たるとそ
れ以上先へ進めなくなってしまいます。次は、ネコが端に当たっても、向きを変えて進み
続けるようにします。
制御→ もし < > なら のブロックをドラッグし、右のように (10) 歩動かす のブロックの下に

繋げます。このブロックは「もし」と「なら」の間に条件を設定することができ、条件が
真のときにのみ、挟んだブロックを実行します。ここでは、
「ネコが端に当たったとき」と
いう条件を入れるため、調べる→ [マウスのポインター▼]に触れた の「▼」をクリ

ックし、「マウスのポインター」を「端」に変えます。こうしてできた [端▼]に

触れた のブロックを「もし」と「なら」の間に置きます。マウスカーソルを

「もし」と「なら」の間に置くのではなく、六角形の左端を「もし」のすぐ右側
に置くのがポイントです。 もし < > なら のブロックの間に、先程横へ避けた ↷

(15) 度回す のブロックを置き、右のようなスクリプトを作成します。

ここで 🚩 をクリックすると、ネコが進んで端に当たっても回転して向きを変
え、再び歩き続けるようになります。このままでは ↷(15) 度回す を何度も繰り返
して左右に歩くだけなので、いろいろな方向に歩かせたい場合は、動く歩数

( (10) 歩動かす の 10)や回転する角度( ↷(15) 度回す の 15)を変え、回転を繰り返さないようにします。

2. プログラミングの基礎

プログラム(program)とは、実行すべき命令を書き並べたもので、プログラムを作成することをプログラミング
(programming)といいます。現代のコンピュータの大きな特徴は、特定の用途にしか使えない専用機ではなく、プロ
はんよう

グラムを入れ替えることで様々な動作を実行できる汎用機であることです。こうした設計のコンピュータをプログ
フォン ノ イ マ ン

ラム内蔵式もしくはvon Neumann式といいます。
2.1 プログラミング言語
言語の名称 ソースの拡張子 主な使用場面 パラダイム
プログラムを記述するための
C, C++ .c, .cpp, .h OS, ソフトウェア 手続き型
表記法をプログラミング言語
JavaScript .js Web オブジェクト指向
(programming language)または単
Python .py 数値計算, 統計 オブジェクト指向
に言語といいます。プログラミ
R .r 統計 マルチパラダイム
ング言語には使用場面や目的、
Scratch .sb2 教育 イベント駆動型
思想により多数のものがあり、
VBA .xlsm 処理の自動化 手続き型
主なものを上の表に示します。
「1 つの言語を習得すればすべての場面で使える」のが理想ですが、実際には、目的に応じてプログラムを簡潔に
記述できる言語が異なるため、複数の言語を使い分けることになります。
プログラミングでは、プログラムを記述したテキストファイルをソース(source)といいます。プログラミング言
語には、ソースのままで動作するスクリプト言語(script language)と、コンパイル(compile)という作業を行ってソー
スをバイナリの実行ファイルに変換してから動作させる言語があります。前者は小規模なプログラムの作成に、後
者は動作速度が求められるプログラムに向いていますが、スクリプト言語のうちにはバイナリの実行ファイルを作
成できるものもあります。なお、スクリプト言語のプログラムはスクリプト(script)とも呼ばれます。

2.2 プログラミングパラダイム
パラダイム(paradiam)は枠組みや流儀を表す用語で、プログラミングにもいくつかの枠組みがあります。伝統的
な言語では、関数による手続きを処理の順番に並べて記す手続き型のものもありますが、現在ではオブジェクト指
向や関数型の言語が多いです。オブジェクト指向プログラミング(OOP, object-oriented programming)は、プログラム
をオブジェクト(object)の集まりと捉え、オブジェクト同士のメッセージ交換として処理を記述する考え方です。一
方、関数型の言語では、関数の呼び出しを中心に処理を記述し、簡潔な構造によるプログラミングを実現します。

2.3 プログラミング環境
プログラミングはメモ帳などのテキストエディタでも行えますが、より円滑にプログラムを作成するため、プロ
グラミングを支援するプログラミング環境(programming environment)と呼ばれるソフトウェアを用いることが多い
です。プログラミング環境の利用により、プログラムで用いる命令の候補を表示したり、プログラムの動作検証や
不具合の修正などのデバッグ(debug)作業を効率化できたりします。

3. アルゴリズム

データを並べる、単語を探す、数式を計算するなど、何らかの問題を解く手順のことをアルゴリズム(algorithm)
といいます。コンピュータ上でのプログラムの実装だけでなく、人間が仕事を行う手順もアルゴリズムに含まれま
す。1 人の人間や 1 台のコンピュータなど、1 つのワーカ(worker)で実行できるアルゴリズムは、次の 3 つの処理の
組み合わせからなることが知られています。

3.1 逐次(順次)
「ある 1 つの命令s1の実行が終われば、次の 1 つの命令s2を実行する」というように、命令を 1 つずつ順に実行
ち くじ

する処理を逐次または順次といいます。この処理は、ワーカが分裂して増加できないことや、1 つのワーカが同時
に複数の命令を実行できないことを示しています。多くの言語では、命令を並べることで逐次処理を記述します。
3.2 選択(条件分岐)
「ある条件Pの真偽に応じて、Pが真なら命令s1を、Pが偽なら命令s2を実行する」というように、条件の結果に
よって次に実行する命令を選ぶ処理を選択または条件分岐といいます。この処理は、数学でいう場合分けにあた
り、複数の処理を使い分けることで、状況に応じて別の処理を行えることを示しています。多くの言語では、if 文
などの命令により選択処理を記述します。

3.3 反復(繰り返し)
「ある条件Pの真偽に応じて、Pが真である間は命令sを実行し続ける」というように、条件の結果が変わるまで
命令を実行し続ける処理を反復または繰り返しといいます。この処理は、数学でいう∑計算にあたり、ある特定の
状況が訪れるまで、同じ処理を何度でも実行できることを示しています。多くの言語では、while 文などの命令に
より反復処理を記述します。
(1) p = 1 なら p は素数でないので終了する
3.4 アルゴリズムの例 (2) 変数 n に 2 を代入する
基本的なアルゴリズムの例には、筆算や素数判定、Euclid の (代入文は n = 2 のように表す)
互除法などの数学的なものや、データの探索(search)や整列 (3) n が p より小さければ次の命令を実行
(sort)などの工学的なものなどがあります。 ① もし p が n で割り切れたら、
例えば、自然数pが素数か判定するアルゴリズムの一例は、 p は合成数なので終了する
右のようになります。このアルゴリズムは最も単純なもので、 ② (そうでなければ、) n に 1 を加える
より早く判定できるよう最適化(optimize)できます。 ③ (3) へ戻る

4. フローチャート (4) (n = p より) p は素数だと分かったので終了


する
ここまで、1 つのスプライトを動かすプログラムを
作成しました。このような、1 つのワーカが動くアル
ゴリズムを記す方法のうち、最も基本的なものがフロ
ーチャート(flowchart)です。フローチャートは、楕円
の始点・終点記号の間を右の図記号で繋ぐものです。
右の図は、左から順に逐次、選択、反復の記号です。
アルゴリズムの他の表記法としては、プログラミング言語の表記法に近い擬似コード(pseudo code)や UML
(Unified Modeling Language)がよく使われます。どの方法を用いる場合も、プログラムの内容をそのまま記述するの
ではなく、人間がアルゴリズムを理解できる程度の複雑さ(抽象度)で記述することが重要です。

4.1 フローチャートの例
例えば 1 章で作成した、ネコが動き続け
るスクリプトのフローチャートは、右のよう
になります。台形の中に条件を記さなけれ
ば、永遠に繰り返す反復構造(いわゆる「無
限ループ」)を表しますが、この場合も形式
的に「終了」を書き記すことが多いです。
また、料理のレシピや楽曲の構成も、フロ
ーチャートで簡潔に表せます。
4.2 実習: 自動操縦のフローチャート
1 章で作成した下の自動操縦プログ
ラムのフローチャートを、右に書い
てみましょう。

5. 並列処理

フローチャートで表記できないアルゴリズムの例として、複数のワーカを用いる並列処理があります。大人数で
取り組むプロジェクトや、多数のコンピュータを用いた大規模計算などは、同時に処理できる部分を各ワーカに割
り振って適切な並列化を行えば、処理速度を大幅に高速化できます。1 台の PC しかない場合も、最近の PC では 4
つ程度のコアがあることが一般的なため、コア数と同数程度のワーカを同時に動かすことで高速化できます。
ここでは、Scratch で行える並列処理の例として、ネコ以外の動物を増やし、複数の動物を同時に動かします。

5.1 複数スプライトの動作
画面中央の「新しいスプライト」の右側の をクリックし、追加したいスプライトを選択します。どれでも構
いませんが、説明では動物のペンギンを選択します。ペンギンの側のスクリプトエリアに、先程と同じ、1.3 節右
下のスクリプトを作成します。ここで 🚩 をクリックすると、ネコとペンギンが同時に画面上を動き回ります。

5.2 メッセージ交換
次に、同時に動いているネコとペンギンが、もし鉢合わせしたときに、互いに挨拶するなどの処理を足します。
「もし」鉢合わせしたらの部分で条件分岐を行うことは明らかですが、ネコとペンギンの両方で もし < > なら のブ
ロックを使うと上手く動かないことがあります。これは、どちらかの条件分岐が先に動いてしまい、条件分岐の中
の処理を行う間に条件を満たさなくなることがあり、もう片方の条件分岐が起きなくなるためです。そこで、ここ
では片方のスプライトのスクリプトのみに条件分岐を置き、メッセージの機能を用いて挨拶させます。
まず、ネコ側のスクリプト(左図)で、制御→ もし < > なら のブロックを ずっと の内側に追加します。条件の部分

には、調べる→ [マウスのポインター▼]に触れた の「▼」をクリックし、水平線より下に表示されている、追加した

スプライトの名前(ここでは「Penguin 2」)に変えたものを入れます。条件分岐の内部には、イベント→ [メッセージ

1▼]を送る の「▼」をクリックし、 新しいメッセージ… をクリックします。「メッセージ名」に「鉢合わせ」など、


どのようなイベントが起こったか分かる名前を入力して OK をクリックします。こうしてできた [鉢合わせ▼]を送る

を、条件分岐の内部に置き、その下に、鉢合わせ中はネコを動かさないよう、制御→ (2) 秒待つ を繋ぎ、右のような


スクリプトを作成します。ペンギン側のスクリプト(右図)も同様に、条件分岐と 2 秒待つ命令を作成します。
次に、ネコ側とペンギン側のスクリプトに、メッセージ「鉢合わせ」を受けたときの処理を作ります(中央図)。
イベント→ [鉢合わせ▼]を受け取ったとき をスクリプトエリアにドラッグし、見た目→ (こんにちは!)と(2) 秒言う を繋

ぎます。更に、連続して鉢合わせするのを避けるため、動き→ ↷(180) 度回す と動き→ (10) 歩動かす を繋げます。

5.3 クローン
Scratch では、増殖する敵キャラクターなど、予め定まっていない任意の数のスプライトを作成するため、クロー
ン機能を使うことができます。あるスプライトのスクリプト中で制御→ (自分自身▼)のクローンを作る のブロックを
用いると、そのスプライトと同じクローン(clone)というスプライトが作成されます。クローンが作成されたときに
は、制御→ クローンされたとき というイベントが発生するので、初期設定などはここで行います。また、制御→ こ

のクローンを削除する で、作成されたクローンを削除できます。このように、プログラムの実行中に必要な数のス

プライトを作成する方法を動的(dynamic)な複製といいます。
原理上は無数のクローンを作成できますが、実際には OS のメモリ容量や CPU 速
度の制約を受けます。多数のクローンを作成すると Scratch や OS の動作が重くな
り、フリーズすることもあるので注意が必要です。
作成するスプライトの数が予め決まっている場合は、複製(copy)の機能も使えま
す。スプライト一覧にあるスプライトを右クリックして 複製 をクリックすると、
同じスプライトをもう 1 つ作成できます。このように、プログラムの動作前に必要
な数のスプライトを作成する方法を静的(static)な複製といいます。
6. 変数

変数(variable)は、プログラムの動作に必要な値をメモリ上の特定の場所に格納しておくものです。プログラムへ
の値の直接埋め込み(ハードコード(hard code))を多用すると、同じ値がプログラム中の複数箇所に現れ、プログラ
ムの保守が難しくなり、不具合が生じる原因にもなります。必要な値を変数に格納(store)しておき、変数に格納さ
れた値を参照(refer)することで、こうした問題の発生を防げます。
また、変数を用いることで、ハードコードでは作成できない、自由度の高いプログラムを作成できるようになり
ます。ユーザや HDD の状況に応じた値を変数に格納することで、動作中にプログラムの挙動を変更できます。

6.1 代入
変数に値を格納することを代入といいます。特に、空の変数に最初に代入を
行うことを、その変数の初期化(initialization)といいます。殆どのプログラミン
グ言語は変数を作成できますが、関数型のプログラミング言語では、代入は初
期化のみ可能で、初期化した後は変数への代入を行えません。

Scratch で変数を作成するには、変数→ 変数を作る をクリックし、「変数名」に


適切な名前を入力します。ここでは「word」と入力し、 OK をクリックすると、
右のようなブロックが新たに現れます。変数→ [word▼]を[0]にする のブロックを
使うと、変数 word に値 0 を代入できます。なお、現在の変数の値は Scratch の
画面左上に、 のように表示されています。

6.2 参照
変数の値を読み取ることを、その変数を参照するといいます。Scratch では、
変数を作成すると変数→ word という変数名のブロックができるので、このブロ
ックを他のブロックの枠内に置くと、変数を参照できます。右の例では、見た
目→ (こんにちは!)と言う のブロックの(こんにちは!)の枠に変数 word を入れ、値

を吹き出しに表示します。
プログラミング言語では、数や文字列、真偽値などのデータをそれぞれ種類として扱っており、これをその値の
型(type)といいます。型の名前は言語により異なりますが、整数型(integer)や小数型、文字列型(string)、真偽値型
(boolean)などがあることが多いです。Scratch では、数値・文字列型(○枠)と真偽値型(⎔枠)があります。

6.3 入力
Scratch でユーザに入力(input)を要求するには、調べる→ (あなたの名前は何ですか?)と聞いて待つ のブロックを使い
ます。 🚩 をクリックすると、下のような入力欄が表示されます。ユーザが何かを入力して○
✓ か Enter キーを押す

と、入力した内容が調べる→ 答え に格納されます。下の例では、回答の前に「こんにちは、」という文字を付加し
て吹き出しに表示します。例えば、ユーザが「Bob」と入力すれば、ネコは「こんにちは、Bob」と話します。
6.4 タイマー
プログラム中で時間を測ろうとするときは、反復で変数の値を増やしていく方法もあ
りますが、用意されているタイマーを用いる方法もあります。タイマーは、調べる→ タ

イマーをリセット で 0 にすることができ、計時を開始します。計時開始からの経過時刻

は調べる→ タイマー で参照できます。右の例では、スプライトの吹き出しで 🚩 をクリッ


クしてからの経過時刻を表示します。

6.5 乱数
くじなどのプログラムでは、試行の度にどのくじが出るかが確率的に変化します。このような確率的な動作を実
現するには、乱数(random number)を用います。演算→ (1)から(10)までの乱数 を用いると、Scratch が生成した乱数の
値を参照できるので、このような動作を実現できます。

6.6 リスト(配列)
数列のように、順番を指定すればそれに対応する値を参照できる変数
を、配列(array)やリスト(list)と呼びます。配列があると、複数の変数を 1
つにまとめて扱うことができ、変数の数を自由に増減できて非常に便利で
す。

Scratch では、通常の変数と同じように変数→ リストを作る で変数名を


入力すれば、リストを作成できます。例えば、「くじ」というリストを作
成すると、変数に右のブロックが追加されます。これらのブロックを使い
「くじ」に代入することも、画面左上に表示される一覧に直接データを入
力することもできます。
下の例では、乱数の値に応じて配列のどの部分を表示するかを変えて、
簡単なくじ引きスクリプトを作成しています。
7. 関数
ひきすう

関数(function)とは、入力として引数(argument)という値をいくつか与えたとき、引数を基に何らかの処理や計算
を行い、戻り値(return value)という値を出力するものです。数学での𝑓(𝑥) = 2𝑥や𝑔(𝑥, 𝑦) = 𝑥 2 + 𝑦 2はそれぞれ、𝑥と
𝑥, 𝑦を引数とする関数です。n個の引数𝑥1 , 𝑥2 , … , 𝑥𝑛 をとり、値𝑦を返す関数 function の一般的な形は、次のように表
されます。
𝑦 = function(𝑥1 , 𝑥2 , … , 𝑥𝑛 )
Scratch のブロックは戻り値を持ちませんが、0 個以上の引数を受け取って処理する、関数と類似のものです。独
自のブロックを作成するには、ブロック定義→ ブロックを作る をクリックします。上の画面が表示され、ブロック
の名前とどのような引数を取るかを宣言できます。

ここで OK をクリックすると、下のようなブロックが作られる一方、ブロックの動作を定義するためのブロック
が作られます。
付録. Scratch の画面構成

「ファイル」メニュー: 実行/停止ボタン:
ファイルを開く/保存する プログラムを実行

(🚩)/停止(●)する

スクリプト: y軸
ブロックを組み合わ

ブロック: せて作るプログラム

実行できる命令。
ダブルクリックで

1 回実行
スクリプトエリア: 原点 O x軸
選択中のスプライトに関 スプライトの座標:
ステージ:
する複数のスクリプトを 選択中のスプライト
Scratch のプログラムが
配置できる の座標
動作する背景画面

スプライト:
Scratch のプログラムで動
かせるオブジェクト
スプライト一覧:
拡張:
現在のプログラムにある
音楽・ペン(軌跡)・
スプライト作成:
スプライトの一覧
カ メラ・外 部機 器
下から「素材集から作成」「新たに描
などとの連携機能
く」「ランダム」
「ファイルを開く」

全画面表示:
ステージをフルスクリーン
で表示

コスチューム一覧:
現在のスプライトがもつ
コスチュームの一覧

ベクタ/ビットマップ:
ベクタ形式とビットマップ(ラスタ)
形式の違いは教科書 p.86-87 参照

⚫ スプライト: Scratch のプログラムで動かせるオブジェクト。


⚫ コスチューム: スプライトに対応する画像。複数のコスチュームを登録すると、プログラム中でコスチュームを切り替えられる。
⚫ ブロック: Scratch のそれぞれの部品のことで、関数に当たる。
「ブロックの定義」で、自作のブロック(関数)を作成可能。
⚫ ペン: スプライトが動く軌跡を画面上に記録できる。左下のボタンを押すと拡張機能として利用できるようになる。
⚫ ステージ: Scratch のプログラムが動作する背景画面。ステージにもスクリプトを設定したり、複数の背景を切り替えたりできる。
⚫ 座標: Scratch では、ステージ中央に原点があり、右方向に x 軸が、上方向に y 軸が伸びている。

You might also like