Beans Blog

ミカンかリンゴか、それが問題だ – あなたの知らないプログラミングの世界#2

前回のお話ではコンピュータプログラミングの成り立ちについてご紹介しましたが、いよいよ今回からプログラムの基本的な考え方についてを説明します。複雑なプログラムの世界も一番シンプルなカタチに分解してあげることで判りやすくなります。

○か☓かを調べよう

初めてプログラミングを学ぶにあたって、難しい英語や数学が山ほど積み重なっていて、見た瞬間からもう判らない…となる気持はよくわかります。でも心配しなくても大丈夫。プログラムの一番基本の骨組みは「○か☓」「YesかNo」という2択クイズなのです。次の問題をちょっと考えてみましょう。

質問1:
テーブルに一つ果物があります。それはミカンですか?

ここまでシンプルな問題なら大丈夫ですね?ミカンかそれ以外かを答えればOKです。コンピュータは複雑な計算をものすごいスピードで正確に判断してくれますが、正しい答えを導くにはとにかくシンプルな質問をしてあげることが大切です。「○か☓」「YesかNo」のような判断に困る必要のない質問であればコンピュータは瞬時に正確な答えを教えてくれます。それでは次のような質問ではどうでしょう?

質問2:
テーブルに一つミカンかリンゴがあります。それはミカンですか?リンゴですか?

一問目によく似ていますが少し複雑になりました。「○か☓」ではなく「AかB」という選択になっています。答えは「ミカンかそうではないか」ではなく「ミカンかリンゴか」を答えなければいけません。それでも質問はとてもシンプルですね。これをあなたの大好きなゲームに当てはめてみましょう。

質問3:
あなたはいまコントローラのAを押していますか?Bを押していますか?
(Aならキャラクターが走る、Bならキャラクターがジャンプする)

さぁ急に身近になってきたような気がしませんか?あなたがキャラクターを動かし、走らせたりジャンプさせたりコインを取ったりしているとき、ゲーム機の中ではこんな質問が何度も繰り返されているのです。あなたの操作する通りにキャラクターが自由に動くということは、質問が繰り返される度にコンピュータが入力されたキーを判別しキャラクターを動かす計算が行われているのです。キャラクターを自由に動かすだけで膨大な数の計算が行われていることが想像できるでしょうか?

参考までに、よく使われるJavascript風に質問1を書いてみましょう。

function 果物の確認 {
 var a;
 if (a == ミカン) {
  return “これはミカンです”;
 } else {
  return “これはミカンではありません”;
 }
}

  1. 最初に「果物の確認」という質問(入れもの)を用意します。[function]
  2. 次に果物(a)を一つ用意します。[var a]
  3. それがミカンかどうかを確認します。[if (a == ミカン)]
  4. ミカンであれば「これはミカンです」と回答させます。[return]
  5. a == ミカンではなかった場合は…[else]
  6. 「これはミカンではありません」と回答させます。[return]

簡単な質問の積み重ね

今回ご紹介したように、コンピュータ・プログラムは間違いようのない(悩む必要のない)単純な質問を何度も繰り返し、その度に答えを導き出すサイクルの繰り返しだということが判りました。あなたのゲーム機のコントローラには一体いくつのボタンがありますか?そのボタンそれぞれに「押したとき」「離したとき」、また複数のボタンを同時に「押したとき」「離したとき」というように、コンピュータに簡単な質問を投げかけてみること、これがコンピュータプログラムの一番シンプルな構造です。

コンピュータはものすごい速さで計算を行うことが出来ますが、いまはまだ自分自身で考えることが出来ません。「ミカンですか?リンゴですか?」と単純な質問をしてあげることで悩むことなく計算を手伝ってくれるようになるのです。例題からも解るように、プログラミングに必要なのは英語や数学よりも、複雑な問題を簡単な質問に分解する力が必要です。これは学問の世界では「論理的思考(論理学)」と呼ばれます。難しい言葉ですが簡単に言うと、「順番通りに物事が進むように道筋を整理する」ということです。この思考を使ってコンピュータとコミュニケートすること、これがプログラミングの本質なのです。

さぁこれでコンピュータに仕事をお願いする準備が整いました。まずはいろんな質問を自由に想像してみましょう。次にそれらをどう分解すると判りやすいか考えてみてください。