プログラミング 第6回 制御構文(繰り返し)
前回の問題の解答
前回の解答からです。まずは問1
これは前回やった「偶数・奇数を判断するプログラム」をそのまま応用すればいいので簡単でしたね。
次は、問2
注意点ですが、条件2は「16≦値<17」と入力する必要はありません。自動的に条件1(値<16)を満たさないときの処理となるので「値<17」と入力するだけで「16≦値<17」と入力したのと同じ意味になります。別に「16≦値<17」と入力してもいいのですが、手間なのでなるべく省略したところです。
また、一番最後の行は「値≧40」という条件を入力する必要はありません。自動的にすべての条件を満たさないとき(値≧40のとき)の処理になるからです。
今回学ぶこと
・「繰り返し」の制御構文①(〇回繰り返す)
・ 正n角形を描くプログラム
・ カメの移動速度設定
・ 「繰り返し」の制御構文②(〇から△まで繰り返す)
・ 「繰り返し」の制御構文③(〇の間繰り返す)
・ 奇数を列挙する
・ 奇数の和を求める
今回も引き続き「制御構文」を学習していきます。
「制御構文」とは、プログラムの途中で条件によって分岐させたり、繰り返させたりするものでしたね。
今回は条件分岐だけでなく、繰り返しも合わせてプログラムしていきます。
「繰り返し」の制御構文①(〇回繰り返す)
まず、繰り返しの命令の復習をしておきましょう。
タートルグラフィックスを使って、正六角形を描いてみます。
ここで、数学的な発想を使ってみます。
多角形の外角の和は360°なので、正六角形の1つの外角は(360÷6)°です。これを用いてプログラムを作ると
「6回繰り返す」は「繰り返す」を省略して「6回」と入力しても大丈夫です。
正n角形を描くプログラム
多角形の外角の和が360°という性質を使えば、正n角形を描くプログラムができそうですね。
せっかくなので「尋ねる」関数も使って作ってみます。
「実行」ボタンを押し、ダイアログ(別枠)に「8」と入力してみると見事な正八角形が描けました。「(n)回」の( )を忘れないように。
ただ、これだと…
ダイアログ(別枠)に「12」と入力したら、枠を超えてしまいました。辺の長さも調整する必要がありますね。そこで、
辺の長さも多角形ごとに調整するようにプログラムを変更してやると、見事な正十二角形が描けました。
ちなみにカメを非表示ではなく表示にして、正五百角形などを描くと、カメが少しずつ角度を変えながらせっせとがんばって図形を描く様子が見れます。
ここから前回の復習です。小数や3より小さい整数を入力したときに警告文が出るようにしましょう。
前回やったように「整数変換」や「不等号」を使って条件を設定していきます。
最後に、繰り返しの制御構文を使って図形を描くようにプログラムします。
これで正n角形を描くプログラムは完成です。
カメの移動速度設定
実はカメの移動速度は変えれます。例えば、標準の速度で正五百角形(ほぼ円)を描くとかなり時間がかかるので速度をアップさせる命令を書きます。
カメの移動速度を変えるには「(数字)にカメ速度設定」と入力します。
数字が小さいほど速くなります。初期設定の速さは100です。ちなみに、0にすると速すぎて見えません…。
せっかちな人はあえて200とかにして忍耐力を養うのもいいかもしれません(笑)
「繰り返し」の制御構文②(〇から△まで繰り返す)
繰り返しの制御構文は「〇回」と回数を指定する方法の他に
「(変数)を(開始値)から(終了値)まで繰り返す」という形もあります。
このように(開始値)から(終了値)までのすべての整数について結果が表示されます。
この場合「繰り返す」という言葉は省略できません。
ちなみに、これは「〇回繰り返す」を使っても同じ結果を導き出せます。
「N=N+1」という数式と繰り返しの制御構文を用いることにより、上のプログラムと同じ結果を導けました。
入力する順番を入れ替えたらどうなるかも見ておきます。
プログラムは上から順に処理されていくので、入力する順番が大切になります。
次のケースを見てみましょう。
適切な順序でプログラムをつくっていくことは大切です。
そのためには、自分が入力したプログラムがどのような結果になるかを理解しておかなくてはなりませんね。
「繰り返し」の制御構文③(〇の間繰り返す)
繰り返しの制御構文には他に「(変数)が(条件)の間繰り返す」という形もあります。
「N<=10」は「N≦10」と同じでしたね。
「Nが10以下の間繰り返す」と言葉で入力しても大丈夫です。
この場合は「繰り返す」という言葉は省略できます。
奇数を列挙する
それでは、繰り返しの制御構文を使って、1から20までの自然数の中で奇数であるものを列挙してみましょう。
奇数は2k-1と表すことができましたね。ここで、2k+1としてしまうと、k=1のとき、3になってしまいます。
ただ、2k+1を使う場合は次のように調整してやれば大丈夫です。
このように調整してやれば同じ結果を導けます。
この発想は、中学数学では「規則性」、高校数学では「数列」という単元でかなり大切になります。
ただ奇数を列挙するだけならば、次のようにするのが一番早いです。
数字を繰り返す際に、1ずつ増やすだけではなく、任意の数ずつ増やすことも減らすこともできます。
つまり、1から2ずつ数を増やしていけば奇数を列挙できるわけです。
減らす例も載せておきます。
奇数の和を求める
次に、1から20までの自然数の中にある奇数の和を求めてみましょう。
「和=和+n」とプログラムすることにより、和の値にnの値を加えることを繰り返し、和の値が徐々に大きくなっていきます。
途中経過を示さずに最終的な和だけを求めるなら次のようにプログラムします。
和の表示は繰り返しの部分に入れず、最終的な和だけを表示しました。
先ほど奇数を列挙したときに使った「2ずつ増やして」を使えばもっと簡単に奇数の和を求めることができます。
「1から20までの自然数の中にある奇数の和」を求めるときに次のような考え方も大切です。
奇数は2で割り切れません。つまり、2で割った余りが0以外です。これを使います。
この方法ならば、先ほどの方法で使った変数kを使わなくてよいですね。
条件分岐の制御構文は基本的には「もし、…ならば」「違えば…」のセットで使いますが、「違えば…」の部分は省略できます。その場合は、条件を満たさなければ何も処理はされません。
だんだん複雑なプログラムになってきましたが、しっかり見直して身につけていきましょう。
それでは今回の課題です。
問題1
次のような図を描くにはどのようにプログラムを書けばよいでしょうか?
細かいところが違ってもだいたい同じ形になればOKです。
問題2
次の問題を繰り返しの制御構文を使って解いてみましょう。ちなみにこれは高校の数学Bの問題です。
「10から100までの自然数のうち、6で割って1余る数の和を求めよ。」