このページでは、プログラミングの最も基本的な「処理の流れ」について説明します。
全てのプログラムは、たった3種類の処理の流れ方で作れることを学びます。
プログラムの制御構造
プログラムは多くの命令を組み合わせて作ります。コンピューターに賢く複雑な処理を任せようとすれば、それだけ長いプログラムになります。そうなると、とても読むのは難しいです。
しかしどんなに長くて複雑なプログラムでも、処理の流れ方はたったの3つです。
- 順次(書いてある順番どおりに実行)
- 分岐(選択)(条件で処理を切り替えて実行)
- 反復(同じ処理を繰り返して実行)
これをプログラムの「基本構造」と呼びます。
全てのプログラムは、この3つを組み合わせて処理の流れを作ります。
順次
プログラムを書いてある順番通りに実行することです。
スクラッチは上から下へプログラムを組み立てます。そのため特に何も指定されない限り、プログラムは上から下の順番に実行されます。
上のプログラムは、スクラッチの画面で緑の旗がクリックされると、上から順に
- 猫が「ニャー」と声を出す
- 1秒間何もしない
- 猫が「こんにちは!」とセリフを吹き出しで表示する
という流れで処理を実行します。
これは当たり前のように思う人がいるかもしれませんが、そう思わない人も意外と多いです。
実際、子供たちにプログラミングを教えていると、
- 全ての命令は、同時に行われる
- 全ての命令は、瞬時に実現される
- 命令と命令の間の整合性は、勝手に調整してもらえる
- 実行結果がおかしい時に「それがプログラムの何行目か」という発想と結びつかない
などなど、プログラムを自分の都合のいいように解釈したり、プログラムの何行目かについて全く意識しなかったりすることが多いです。
人間が相手なら、空気を読んで細かいことは言わなくても伝わりますが、コンピューターは細かいことまで指定しないと期待通りに動きません。
順番通りやって欲しいなら、順番通りにプログラムを書かなければ、そのように動きません。
5番目にやって欲しいなら、5番目に書かなければ、そうなりません。
だから、当たり前のことのようにお漏れうことでも、いちいち確認して知っておくことが重要なんです。
分岐(選択)
条件によって処理を切り替えることです。「分岐」とも「選択」とも呼ばれます。
「もし■ならば、○○をせよ。そうでなければ△△をせよ。」
というような文法になります。細かい文法はプログラミング言語によります。
スクラッチでは次の2種類が用意されています。
- 「もし■なら、○○をする。」
- 「もし■なら、○○をする。でなければ△△をする。」
1番目は、条件が合う時だけ、特定の処理をさせたい場合に使います。
2番目は、条件が合う時と合わない時に、処理を分けたい時に使います。
例えば、次のプログラムを考えてみてください。左は正解した時だけメッセージを表示しますが、右は正解と不正解で違ったメッセージを表示します。
複雑な分岐をさせるには
この2種類だけあれば、どんな選択処理でも実現できます。
例えば、条件が5種類あって、それぞれに処理を割り振る場合は、次のように応用します。
C言語やパイソン、Javaなどといったプログラミング言語には、複数の条件を切り替える「スイッチ」という文法があって便利です。
残念ながらスクラッチにはそれがあります。でも大丈夫です。上のように、同じ選択処理を何個も入れ子にすれば、スイッチと同等の処理の流れをつくり出すことができます。
このように基本構造さえ押さえておけば、すべてはその組み合わせだけで実現できることが分かります。
反復
同じ処理を繰り返して実行させます。「繰り返し」や「ループ」などとも呼ばれます。
数クラッチでは次の3種類があります。
- 「〇回繰り返す」(指定の回数だけ繰り返す)
- 「■まで繰り返す」(条件が揃うまで繰り返す)
- 「ずっと」(無限に繰り返す)
「〇回繰り返す」の使い方
指定した回数だけ繰り返す処理です。
例えば、次のようにすると「ニャー」と1秒おきに3回鳴きます。
「■まで繰り返す」の使い方
指定した条件が成立するまで、繰り返します。
例えば、次のようにすると、正解の「2」を入力するまで、ずっと質問を繰り返します。
「ずっと」の使い方
無限に繰り返す処理です。「無限ループ」と呼ぶ人もいます。
他のプログラムと平行して何かをずっとやらせておくのに便利です。何かの状態をずっと監視させたり、BGMをずっと繰り返し再生させたりするなどです。
例えば、マイクラミングではプレーヤーの位置を座標で知りたい時がよくあります。プレーヤーが動いたら、それに応じて今の座標を表示してくれる機能があったら便利です。
それを実現させるプログラムは次のようにします。0.2秒おきに自分の位置を調べて表示させます。覚えておくと便利ですよ。
なお「ずっと」の下(次)に処理が移ることはありません。
そのためスクラッチでは「ずっと」の下には処理を追加する事ができません(追加できたとしても無意味だからです)。
複数の処理を並列に動かす
ところで「ずっと」の下に「処理が追加できない」となると、中には不安に思う人がいるかもしれません。
「ずっと」を使うと、もうその下にプログラムが書けなくなる?
そんな不安です。でも、これは半分正解で、半分間違いです。
例えば、次のようにすればBGMの再生と「1+1=?」の出題は、両方とも平行して動きます。
このように「ずっと」の処理は、あくまでも他のプログラムと並行して動作するようにつくります。
ですから「ずっと」を使っても、プログラムがそこで止まるわけではありません。
安心してください。
(コラム)現代のプログラミング言語は高機能
以上で、プログラムの流れを制御する3つの基本構造について学びました。
これで処理の流れがどんなに複雑になろうとも、すべて上で挙げた3種類を組み合わせれば実現できるはずです!
とは言え、本当にこれだけで全てを実現すると、とても苦労します。
例えば「スペースキーを押したときに○○をする」を実現させようとしたらどうでしょう。
「ずっと」の中で次のプログラムを組み込む必要があります。
- キーの状態を取得する
- スペースキーが押されているか判断する
- もしも押された状態なら○○をする
さらに、もしも、
「キーボードのAキーからZキーのどれかを押したら何かの処理をする」
ような処理にしたい時はどうでしょう。上と似たようなプログラムをあと25個も作ることになり、とてもめんどうです。
そこでスクラッチでは「イベント」という仕組みが用意されています。「イベント」とは、何かが起こったことをスクラッチがプログラムに教えてくれる機能のことです。
イベントを使えば、プログラムの方でキーボードを監視しなくても、「スペースキーが押されたとき」や「Aキーが押されたとき」というプログラムを1行追加するだけでよくなります。
イベントについては、別のページでちゃんと説明します。
スクラッチは他のプログラミング環境に比べて、とても新しく登場しました。そのため、今までプログラマーが「こんな機能があったら便利なのになー」と思う機能が組み込まれています。
プログラミング言語には流行り廃りがありますが、一般に新しくて人気の高いプログラミング言語は、高機能で目的を直ぐに達成しやすくなっています。