プログラミング 第7回 制御構文の応用
前回の問題の解答
問題1の解答
「〇から△まで繰り返す」の形を使ってプログラムしました。
進む距離を「10*N」とすることで、Nが1から30まで徐々に大きくなっていくにつれて進む距離も徐々に大きくなっていきます。
問題1の別解
やや面倒ですが、「〇回繰り返す」の形を使ってもプログラムできます。
カメが進む距離Dが毎回10(ピクセル)ずつ増えていくようにプログラムしています。値は10でなくても大丈夫です。
次は問題2の解答です。
「6で割った余りが1になる」というのは「n%6=1」となるときですよね。これを条件として制御構文を使います。
「n%6=1」のときは「和=和+n」の処理行い、それ以外のときは何の処理も行わないようにプログラムします。
問題2の別解1
「6で割った余りが1になる」というのを「6k+1」の形で表しました。こちらの方法はkの値の設定が面倒なので先ほどの方法がより良いかと思います。
問題2の別解2
10から100の間で6で割って1余る最初の数は13です。
13から6ずつ増やして足していけば、6で割って1余る数の和になりますね。
今回学ぶこと
・ 論理演算「かつ」「または」
「かつ」の半角表記は「&&」、「または」の半角表記は「||」
・ 条件分岐のラストに「ここまで」をつける場合
・ 繰り返しの「抜ける」「続ける」について
今回は制御構文の理解をさらに深めていきます。
論理演算「かつ」「または」
まずは、高校数学でおなじみの「かつ」と「または」について見ていきます。
「AかつB」はAとBの両方を満たす部分で、例えば、Aを「英語の点数が80点以上」、Bを「数学の点数が80点以上」とすると、「AかつB」は「英語も数学も80点以上」となります。
他方、「AまたはB」はAとBの両方を合わせた部分で、先ほどの例だと「AまたはB」は「少なくとも英語か数学のいずれかが80点以上(両方80点以上の場合を含む)」となります。
この例を用いて「かつ」のプログラムをしてみます。
「かつ」は半角では「&&」と入力しますが、そのまま「かつ」と入力しても大丈夫です。
「英語=87」「数学=58」なので、条件である「(英語>=80)かつ(数学>=80)」を満たしていません。そのため、「違えば」の後ろの処理がなされました。ちなみに( )はなくても正常に処理されますが、見やすくするためにつけました。
次は「または」のプログラムをしてみます。
「または」は半角では「||」を入力しますが、そのまま「または」と入力しても大丈夫です。
「英語=87」「数学=58」なので、今度は条件である「(英語>=80)または(数学>=80)」を満たしています。そのため、「ならば」の後ろの処理がなされました。
それでは次のような問題をプログラムを使って解いてみましょう。
「1から300までの自然数の中で、3でも7でも割り切れない数の和を求めよ」
「3でも7でも割り切れない」ということは「3で割り切れない かつ 7で割り切れない」ということですね。
前回の課題(問題2)を応用すればあっさり解けますね。
「<>」は「≠」の半角表記です。「≠」の半角表記は「!=」もありましたね。「<>」と「!=」は働きが少し違うのですが、数値を扱う場合は同じです。
繰り返しですが、( )はなくても大丈夫ですが、見やすくするためにつけています。
条件分岐のラストに「ここまで」をつける場合
条件分岐について、さらに掘り下げていきます。
次のプログラムを見て下さい。
A=「偶数」 の部分には「 」が必要です。
代わりに Aに「偶数」を代入 と入力してもいいですが、いずれにせよ「 」が必要です。
それ以外は、今までやった「もし~ならば」「違えば」の形ですね。
上のプログラムで「ならば」の後ろ(処理の部分)を改行してみます。
どうなるでしょうか?
エラーとなり、『ここまで』がありません と表示されました。
実は、条件分岐の「もし~ならば」「違えば」の構文はラストに「ここまで」が必要なのです。
今までは必要ありませんでした。それは処理の部分が改行もなく一行だったからです。
改行などにより一行ではなくなった場合はラストに「ここまで」が必要になります。
「じゃあ、改行しなければいいのでは?」と思われるかもしれませんが、次のような処理の部分が複数になる場合は改行をしないと正常に作動しないため、どうしても改行は必要になってきます。
まとめますと、条件分岐の「もし~ならば」「違えば」の形は原則としてラストに「ここまで」が必要で、処理の部分が改行なく一行で表せる場合は「ここまで」を省略できるということです。
繰り返しの「抜ける」「続ける」について
次は、繰り返しの制御構文で使う「抜ける」「続ける」について見ていきます。
「繰り返す」と「ここまで」の間で「抜ける」を使うと、その時点で繰り返しが終了します。
あくまで終了するのは繰り返しの部分のみであって、「ここまで」の後の処理は行われます。
このように少し順序を入れ替えてやると、結果も少し変わってきます。「抜ける」が来た時点で繰り返しが終了します。
要するに「抜ける」が来た時点で「ここまで」の後ろの処理に飛ぶわけです。
「抜ける」は言葉からイメージがしやすいですが、次の「続ける」は言葉からイメージしにくいです。
「繰り返す」と「ここまで」の間で「続ける」を使うと、「続ける」の後に予定されていた処理を行わず、「繰り返す」の後の処理に戻ります。そして繰り返しを続けます。
「抜ける」とは違い、繰り返しの次の過程を続けていくので「続ける」という言葉なんですね。
当然ですが、「続ける」と「ここまで」の間に何の処理もないと「続ける」はまったく意味のない命令になります。
それでは今回の問題にいきます。
問題1
「かつ」や「または」を使って、次の問題をプログラミングで解いてみましょう。
「1から300までの自然数の中で、3または7で割り切れる数の和を求めよ」
問題2
次のような結果になるように、空欄に適切なプログラムを入力してみましょう。