コンピューターに判断してもらう

tutorial-if.png

想定時間: 10分

今回の内容

  • 偶数か奇数かを判定してみよう
  • 条件式の間違いを見つけてみよう

状況の変化に応じて動作を変えることができる

プログラムは、コンピューターにやって欲しいことが書かれた、いわば指示書です。コンピューターは、次々とプログラムに書かれたことを忠実に行っていきます。これだけでも、とても便利です。

もっと役に立つプログラムを作るためには、コンピューターと人間との対話がより重要になってきます。プログラムを実行している間に、実はコンピューターの中の状況は、刻一刻と変化しています。

例えば、以下のようなことが想定できます。

  • プログラムの実行中に、キーボードのキーが何か押されたり、実行画面がクリックまたはタップされた。
  • プログラムを実行してから、10 秒経過した。
  • 繰り返しによって変数の数値が 100 を超えた。
  • スプライトを移動させていたら、実行画面の端まで来た。
  • random 関数 の結果が 5 になった。

これら以外にももっとたくさんのきっかけがあると思います。

プログラムの中で、今現在どのような状況なのかを確認して、その状況に応じて次に実行すべき命令を変えることができます。これを「条件分岐」と呼びます。

偶数か奇数かを判定してみよう

Jasmine Tea では、条件分岐を行うために if 命令 が提供されています。さっそく if 命令を使って、条件分岐を行うプログラムを作ってみましょう。

最初は、入力された数値が偶数か奇数かを判断して、どちらなのかを表示するプログラムを作ってみましょう。

偶数かどうかを判断するには、入力された数を 2 で割ったときの余りが 0 かどうかを確かめれば良いです。Jasmine Tea では、割り算の余りは「%」を使って計算することができます。例えば、5 を 3 で割ったときの余りは、

print 5%3

というプログラムで計算して画面に表示することができます。

print 命令 は、テキスト画面に文字や数値を表示する命令です。

入力された数値が偶数か奇数かを判断して表示するプログラムは、以下となります。新しくプロジェクトを作った後に、エディターにボタンを使ってコピー&ペーストしてください。

input "数値を入力してください",a
if a%2=0 then
  print a;"は偶数です"
else
  print a;"は奇数です"
end if

input 命令 は、文字や数値を入力するダイアログを表示して、入力されたものを変数に代入してくれる命令です。「input “数値を入力してください”, a」では、入力された値が変数 a に代入されるという意味です。

「実行」ボタンを押して、プログラムを実行してください。

tutorial-17-1

「数値を入力してください」というメッセージが書かれたダイアログが表示されますので、ここでは 50 と入力して、「答える」ボタンを押してください。

tutorial-17-2

「50は偶数です」と実行画面に表示されました。50 を 2 で割ると余りは 0 ですので、偶数です。合っています。

では、もう一度「実行」ボタンを押して、次は 51 を入力してみてください。

tutorial-17-3

「51は奇数です」と実行画面に表示されました。

tutorial-17-4

偶数か奇数かを判定している場所は、プログラムの 2 行目です。

if a%2=0 then

if 命令が先頭に書かれています。その次に、「a%2=0」と書かれています。これは「条件式」と呼びます。この条件式は、「変数 a の数値を 2 で割ったときの余りが 0 かどうか」という意味の式になります。

🗒️覚えよう

if 命令を使うことで、状況を確認して判断することができる

ここで「あれ?等号(=)は、変数に数値や文字列などを代入する時に使うのでは?」と思った方もいるかと思います。条件式で登場する等号(=)は、意味が違っていて、以下となります。

  • 等号の左辺の値と、等号の右辺の値が、同じかどうか

つまり、「a%2 の計算結果と、0 が、同じかどうか」を確認している条件式になります。

🗒️覚えよう

条件式の「=」は、右辺と左辺が同じかどうかを判定するために使う

先ほど 50 と 51 をそれぞれ入力してプログラムの動作を確認しました。この条件式の結果は、それぞれ以下のようになります。

  • 変数 a が 50 のとき - 「50%2=0」→「0=0」→ 成り立つ
  • 変数 a が 51 のとき - 「51%2=0」→「1=0」→ 成り立たない

条件式が成り立つときとそうではないときで実行する命令を変えるには、 else 命令end if 命令 を組み合わせて使います。具体的には、以下となります。

  • if 命令の条件式が成り立つときは、if 命令の次の行から実行されます。
  • if 命令の条件式が成り立たないときは、else 命令の次の行から実行されます。

tutorial-17-5

🗒️覚えよう

条件式が成り立つときは if 命令の次の行から、成り立たないときは else 命令の次の行から、それぞれ実行される

ここで、3 行目と 5 行目がそれぞれインデントされていることに気がついたでしょうか?条件に応じて実行されるかどうかが変化する行は、このようにインデントしておくとわかりやすくなります。

🗒️覚えよう

条件に応じて実行されるかどうかが変わる行は、インデントしておくとわかりやすくなる

条件式の間違いを見つけてみよう

もう一つ条件分岐の例を見ていきましょう。電車の運賃は、大人料金と子供料金で値段が違います。ここではわかりやすく、子供料金は大人料金の半額、ということにしましょう。子供運賃は、12歳未満が適用されることとします。

新しくプロジェクトを作って、以下のプログラムをエディターにボタンを使ってコピー&ペーストしてください。

input "大人の運賃はいくらですか";price
input "何歳ですか";age
if age>12 then
  print "運賃は";price/2;"円です。"
else
  print "運賃は";price;"円です。"
end if

「実行」ボタンを押して、プログラムを実行してください。まず、大人料金を聞いてきますので、ここでは「300」と答えます。

tutorial-17-6

次に年齢を聞いてきますので、子供料金が適用される「10」と答えてみましょう。

tutorial-17-7

子供料金が適用されるはずですので、実行画面には「運賃は150円です。」と表示されるはずです。

tutorial-17-8

しかし、実行画面には「運賃は300円です。」というように、大人料金が表示されてしまいました。間違っています。

コンピューターが誤動作をしてしまったのでしょうか?いいえ、コンピューターはプログラムに書かれた命令を忠実に実行します。きっと、プログラムのどこかに間違いがあるはずです。見つけてみましょう。

🗒️覚えよう

プログラムの間違いを見つけて修正することを「デバッグする」と呼ぶ

実は、プログラムの 3 行目の条件式が間違っています。

現在は「age>12」になっています。この条件式を日本語で表現すると、「変数 age の数値が 12 よりも大きいかどうか」となります。つまり、変数 age の数値が 12 よりも大きければ、この条件式は成り立ちます。

では、その条件式が成り立ったときに実行される「if 命令の次の行」では、どんなことをしているでしょうか?

  print "運賃は";price/2;"円です。"

「price/2」という計算をしています。つまり、子供料金を計算して表示をしています。

まとめてみると、今のプログラムは、以下のような条件分岐になってしまっています。

  • age>12 が成り立つ(12 歳より上) - 子供料金を計算して表示する。
  • age>12 が成り立たない(12 歳以下) - 大人料金を計算して表示する。

気が付きましたか?期待していたことと逆になってしまっています。

3 行目の if 命令にて確認したいことは「子供料金が適用される年齢かどうか」ということです。この条件式は「age>12」ではなく、「age<12」が正解です。

では、3 行目を以下のように修正して、「実行」ボタンを押してください。

if age<12 then

そして、先ほどと同じように「300」、「10」と答えてみましょう。

tutorial-17-9

「運賃は150円です。」と実行画面に表示されました。正しい条件分岐がされるようになりました。

このように、大なり小なりの記号を 1 文字間違えるだけで、プログラムが正しく動作しないことになります。条件分岐では、条件式が正しいかどうかがとても大事です。もしうまくプログラムが動かないときは、条件式が期待通りとなっているかどうかを確認しましょう。

今回のおさらい

  • if 命令と条件式を使うことで、プログラムの中で状況を判断して、やりたいことを切り替えることができる。
  • プログラムが期待通りに動かないときは、条件式が合っているかどうかを確認して、デバッグをする。