【第7回】 【micro:bit講座 第7回】IF文のネスト(入れ子):条件の中に条件を入れ、より緻密な判断をしよう!

MakeCode × micro:bit編

第6回では、IF文という「門番」を使って、バグを未然に防ぐ「絶対にマイナスにならない家族りんご管理システム」を完成させましたね。これでプログラムは、誤作動のない非常に堅牢(けんろう)なものになりました。

しかし、世の中のルールはもっと複雑です。 「もしりんごがあるなら配る。ただし、妹の持っている袋がいっぱいの時は配らない……」

このように、私たちは日常の中で「複数の条件を重ねて判断」をしています。もし、今のプログラムのまま「在庫があるから」といって無理やり配り続ければ、袋からりんごが溢(あふ)れてしまうでしょう。

今回は、そんな複雑な状況を攻略するための高度なテクニック、「IF文のネスト(入れ子)」を学びましょう。条件の中に条件を入れ込むことで、あなたのプログラムは「単なる判断」から、状況を深く分析する「緻密な思考」へと進化します。さあ、プログラムの判断能力を次のレベルへ引き上げましょう!

前回の宿題:答え合わせ

前回は「マイナスを発生させない最強の門番(IF文)」を導入しましたね。 宿題では、さらにプログラムに「心」と「声」を授けるべく、エラー時の警告アラートを実装してもらいました。まずは、皆さんのプログラムが正しく改造できているかチェックしましょう!

家族りんご管理システムのプログラム例。Aボタンを押したとき、「ぼくのりんご>0」ならばりんごを配る計算を行い、そうでなければ悲しい顔のアイコンが表示され、エラー音が鳴るよう構成されている。
図1:宿題の解答例「警告アラート付き家族りんご管理システム」

見ての通り、「もし(在庫があるなら)」のルートには正常な計算処理が、「でなければ(在庫がないなら)」のルートにはエラーを知らせる「悲しい顔アイコン」と「悲しい音」が収まっています。

このように、「エラー時に音と光で伝える」という機能が加わったことで、プログラムはただ計算をこなす無機質なものから、使う人に「今は無理だよ!」と状況を寄り添って伝える「親切なパートナー」へと進化しました。

この「エラーを隠さず、使う人に親切に知らせる」という工夫こそ、本物のエンジニアが最も大切にしている「ユーザーへの気配り」なのです。

今日のミッション:複雑な状況を判断せよ!

前回までのミッションをクリアし、皆さんのプログラムは「在庫があるか・ないか」を判断し、エラー時には光で知らせる「親切なパートナー」へと進化しましたね。

しかし、実際の管理システムはそんなに単純ではありません。例えば、こんな場面を想像してみてください。

りんごの在庫はある。……でも、妹が持っている『りんご袋』の容量が、あと1個でいっぱいになってしまったら?

もし、今のプログラムのまま「在庫があるから」といって無理やり配り続ければ、妹の袋からりんごが溢(あふ)れて床に落ちてしまいますよね。現実のシステムでは、「在庫がある」という条件に加えて、「受け取る側に、あとどれくらい入る余裕があるか?」という、もう一つの条件を同時にチェックしなければいけません。

「もし(在庫があるなら)……その中で、もし(袋に空きがあるなら)……配る!」

……このように、条件の中にさらに条件を重ねて「より緻密(ちみつ)な判断」をさせるにはどうすればいいのでしょうか? そこで登場するのが、今回の最強テクニック「IF文のネスト(入れ子)」です。

ミッション1:ネストを使って「二重の門番」を設置しよう!

今回は、MakeCodeを使って新しいプロジェクト「プログラム7」を新規作成しましょう。 「在庫チェック」と「袋の容量チェック」、二つの門をくぐらないと計算が始まらない、最強の二重管理システムを作ります。

手順1:変数の準備

まず、必要な道具(変数)を準備しましょう。

もし変数の作り方を忘れてしまった方は、[【第3回】 【micro:bit講座 第3回】変数の仕組み:変数という「魔法のバッグ」を使いこなそう!] を見返してみてくださいね!

  • 「ぼくのりんご」:初期値は「10」に設定します。
  • 「いもうとのりんご」:初期値は「0」に設定します。

手順2:二重の門番(ネスト)の組み立て方

ツールボックスから「もし〜なら」ブロックを取り出し、もう一つの「もし〜なら」ブロックを、最初の「なら」のエリアの中にカチッとはめ込みます。

手順3:二つの門にルールを設定する

プログラムの本体(Aボタンを押したとき)を、以下のように組み立てましょう。

  • 【第1の門番(外側)】在庫チェック
    • 条件:「ぼくのりんご > 0」
    • もしそうなら:第2の門番へ進む!
    • でなければ:LEDに「0」を表示し、「あげるりんごがない!」と警告。
  • 【第2の門番(内側)】容量チェック
    • 条件:「いもうとのりんご < 5」
    • もしそうなら:「いもうとのりんご」を1増やし、「ぼくのりんご」を1減らして計算実行!
    • でなければ:LEDに「×」を表示し、「袋がいっぱい!」と警告。

プログラムの完成!

IF文のネスト(入れ子)構造を示すブロック図。外側に「ぼくのりんご>0」を判定する大きなIF文があり、その中の「なら」ブロックの中に「いもうとのりんご<5」を判定する小さなIFがすっぽりと収まっている。
図2:二重の門番構造。大きな門(在庫チェック)の「なら」の中に、小さな門(容量チェック)がすっぽりと収まっています。

これで、条件を重ねることで判断基準がぐっと緻密になりました。ボタンをいくら押しても、「在庫はあるか?」そして「袋に空きはあるか?」という二つのハードルをクリアした時だけ、りんごが手渡されます。

もし在庫が尽きれば「0」が表示され、袋がいっぱいなら「×」が表示される……。このように、状況に応じて自分の判断を切り替えるプログラムは、まさに「生きているような」賢いシステムと言えるでしょう!さあ、シミュレーターでボタンを連打して、どちらの警告もしっかり機能するか試してみてください。んと警告してくれる。まさに、状況に合わせて自分で判断して動く「生きているような」賢いプログラムの誕生です!、状況に合わせて自分で考えて動く「生きているような」賢いプログラムの誕生です!

【解説】IF文のネスト(入れ子)とは?

【解説】IF文のネスト(入れ子)とは?

プログラミングの世界では、IF文の中にさらに別のIF文を入れる構造のことを、まるでマトリョーシカ人形のように中に物が収まっている様子から「ネスト(入れ子)」と呼びます。

二段階の門番で、リスクを徹底排除! これまでは「在庫はあるかな?」という一つの門番で判断していましたが、ネストを使うことで「二重の門番」を設置できるようになります。

  • 第1の門番(外側のIF文): 「りんごの在庫はあるかな?」
    • イエスなら: 第2の門番へ進む!
    • ノーなら: LED表示で「在庫なし!」と警告。
  • 第2の門番(内側のIF文): 「妹の袋には、まだ空きがあるかな?」
    • イエスなら: りんごを配る計算を実行!
    • ノーなら: LED表示で「袋がいっぱい!」と警告。

このように条件を階層化することで、コンピューターは「一見すると複雑な状況」を、一つずつ順番に整理して判断できるようになるのです。

なぜ「ネスト」が必要なの?

「条件を一つずつ別々に書けばいいのでは?」と思うかもしれません。

しかし、ネストを使わないと、条件の組み合わせが増えるたびにプログラムがどんどん複雑で読みにくくなってしまいます。ネストを使えば、「まず大前提をチェックし、クリアしたら詳細をチェックする」というエンジニア的な思考を、そのままプログラムの形に落とし込めます。

これが、今回皆さんに習得してほしい「緻密な判断力」の正体です。

ミッション2:プログラムを改造して、より緻密な管理へ

では、実際にプログラムを組んでみましょう。今回は「ぼく」だけでなく「あに」のりんごも加わり、より本格的な管理システムへとパワーアップさせます。

手順1:変数の準備

まず、新しい道具を準備しましょう。

  • 「ぼくのりんご」:初期値は「10」に設定します。
  • 「いもうとのりんご」:初期値は「0」に設定します。
  • 「あにのりんご」:初期値は「3」に設定します。

手順2:三段階の門番(ネストの深掘り)を組み立てる

Aボタンを押したとき、プログラムは以下の順番で3つの門番を通過します。

  • 【第1の門番】在庫チェック(外側)条件:「ぼくのりんご > 0」
    • もしそうなら:第2の門番へ!
    • でなければ:LEDに「◇0」を表示し、「在庫がない!」と伝えます。
  • 【第2の門番】あにの協力チェック(中側)条件:「あにのりんご > 0」
    • もしそうなら:第3の門番へ!
    • でなければ:LEDに「□0」を表示し、「あにの在庫がない!」と伝えます。
  • 【第3の門番】容量チェック(一番内側)条件:「いもうとのりんご < 5」
    • もしそうなら:妹に配る!「いもうとのりんご」を2増やし、「ぼくのりんご」と「あにのりんご」を1減らします。
    • でなければ:LEDに「×」を表示し、「妹の袋がいっぱい!」と伝えます。

プログラムの完成!

図3:三重の門番構造。大きな門(ぼくの在庫チェック)の「なら」の中に、中の門(あにの在庫チェック)の「なら」の中に、小さな門(容量チェック)がすっぽりと収まっています。

これで、「在庫はあるか?」「あには協力してくれるか?」「妹の袋に空きはあるか?」という3つのチェックをクリアした時だけ、りんごが手渡されます。 もしどれか一つでも条件を満たさなければ、ちゃんとエラー表示(「0」や「×」)が出るようになっています。このように条件を深く重ねていくことで、システムは現実の複雑なルールを完璧に守れるようになるのです。まさに、エンジニアが作る「鉄壁の管理システム」ですね!

さあ、シミュレーターで「条件によって配る人が変わる様子」や「袋がいっぱいになった時の挙動」をぜひ確認してみてください。完璧に動けば、君のプログラミングスキルはまた一つ大きくレベルアップです!の挙動」をぜひ確認してみてください。完璧に動けば、君のプログラミングスキルはまた一つ大きくレベルアップです!

今日のまとめ:プログラムに「思考の深さ」を与えよう!

  • IF文のネスト(入れ子)の仕組み: IF文の中にさらにIF文を入れることで、複雑な条件を「大前提」と「詳細」に分けて処理できるようになりました。プログラムに「二重の門番」を設けることで、論理の迷路を迷わず正しく進むことができます。
  • 判断の階層化による「賢さ」: ただ条件を並べるのではなく、「まず在庫を確認し、クリアできたら次は袋の空き(または貯金状態)を確認する」という優先順位を持たせました。この「段階的なチェック」こそが、複雑な事象を正確に扱うエンジニアの思考プロセスそのものです。
  • 緻密な制御で「現場のルール」を再現: 「ただ配る」のではなく、「袋には4個まで」や「あにのりんごの在庫チェック」という制約を取り入れました。条件を重ねることで、ミスを防ぐだけでなく、現実の制約を忠実に再現する、柔軟で堅牢なシステムを作ることができるようになったのです。

【宿題】門番のルールを解読せよ!

今回のプログラムで使った「>」や「<」以外にも、プログラミングにはルールを厳密に決めるための「比較演算子(ひかくえんざんし)」があります。
以下のミッションに挑戦して、門番の「正体」を突き止めてください!

宿題ミッション:

1:第1の門番「在庫チェック」の書き換え

今の条件は「ぼくのりんご > 0」ですが、これを以下の記号を使って書き換えてみましょう。

  1. 「≧」を使って書き換え: 「ぼくのりんご ≧ 0」と書くと、プログラムはどう動くかな?もし在庫が「0」のとき、この門番は通れるかな?
  2. 「=」を使って書き換え: 「ぼくのりんご = 0」をヒントに、門番が「エラー(◇0)」を出す条件を考えてみよう。
  3. 「≠」を使って書き換え: 「ぼくのりんご ≠ 0」と書くと、門番はどんな反応をするかな?「= 0」と比べてどう違うか探ってみよう。

2:第3の門番「容量チェック」の書き換え

今の条件は「いもうとのりんご < 5」ですが、境界線をいじると袋の限界が変わります。

 1.「≦」を使って書き換え: 「≦ 5」としたとき、妹の袋には最終的に何個のりんごが
  入るか予想してシミュレーターで試してみよう。「5個になった瞬間に止めたい」ときは、
  どの数字と組み合わせるのが正解かな?

境界線の設定は、エンジニアにとっても一番ミスが起きやすい場所です。もしシミュレーターで「思った通りに動かない!」と思ったら、それは大成功!「なぜその記号だと、門番が門を閉じてしまうのか?」という謎解きをすると、プログラミングの理解がぐっと深まります。

次回の予告

次回は「【第8回】 【micro:bit講座 第8回】論理演算(AND / OR / NOT):複数の条件をスマートにまとめよう!(7/22 10時公開予定!)」です。

今回作った「ネスト(入れ子)」を、さらに短くスッキリと書くための「魔法の演算子」を紹介します。これを知れば、複雑な条件も一気に整理できるようになりますよ!お楽しみに!

コメント