はじめに
やあ、こんにちは。今回は『while文』についてやっていこう。
はい、よろしくお願いします。
while文はfor文と同様に処理を繰り返して実行できる。for文は繰り返す回数が決まっているとき使われることが多いが、while文はある条件が成り立つ場合に処理が繰り返されるのだ。
条件が成り立つ限りずっと繰り返されるということですか?
そう、ずっと繰り返される。while文の型は次のようになる。
if文と大体同じですね!
うむ、何はともあれ実際に書いてみよう。次の画面を見てほしい。
例題1
このプログラムを実行するとどうなるか考えてほしい。
はい、変数 a に100が代入されていて、2行目のwhile文の条件式が a%2==0 となっています。つまり、a を2で割った余りが0に等しい場合、3行目の a=a//2 という処理が実行されるということですね!この処理は a を2で割った商を a に代入するというものです。ここまでいいですか?
大丈夫だぞ!
そして、while文の条件が満たされる限り処理は実行されるから・・・
そうか!a を2で割った数がまだ偶数ならば、条件を満たすので、また2で割られることになります。そして、それが続いていって、いつか偶数でなくなったとき処理は終了するのですね!ということは答えは25です!
うむ、答え合わせは自分で実際に書いて実行して確認してごらん。
はい、今回はfile28を用意してそれに書いていきます。
できました!やっぱり正しかったです!
今回のプログラムは、『与えられた整数が偶数であれば、奇数になるまで2で割り続ける』というプログラムだったのですね!
そういうことだ。今度の問題は自分で考えて書いてみてほしい。下を見てくれ。
例題2
なるほど、input関数とwhile文を組み合わせて書けば良さそうですね!
input関数を使うときは文字列を整数に直すためint関数を使うのでした。これは、file29を作成してそれに書いていきます。
できました!
偶数の場合と奇数の場合で処理が異なるので、if-else文を処理の中で使いました!また、各処理ごとに結果を表示するために8行目にprint関数も入れました。5を入力して確認しましたが、たぶん大丈夫だと思います。
完璧だ!
途中過程を見るためにprint関数を用いたのがとても良いぞ!
先生、一つ質問です。この問題のプログラムは計算結果が1になったら終了ということですが、何度処理をしても1にならない場合はないのでしょうか?そのような数は存在しないのですか?
ふふ、非常にいい質問だ!
答えは、『分からない』だ。
分からない・・・ですか?
コラッツ予想
ああ。指定された処理の計算を何度しても1にならないような数は現在のところ発見されていないのだ。ただ、発見されてないだけで存在しないと断言もできない、というのが正確な答えだ。
今、100や1000などの結構大きな数について試してみましたが、計算の回数は多くなりますが、すべて1になって終了しました。でも、正の整数は無限にあって、もっと途方もなく大きい数については確かに確信が持てませんね。
うむ、つまり『どのような正の整数に対しても、いつかは必ず1になる』という数学的な証明が存在しないのだ。しかし、多くの実験でおそらく正しいだろうという予想は立っている。これを、『コラッツ予想』といい、数学の有名な未解決問題の一つなのだ。
このような単純な問題が未解決問題なのですか?
確かに難しそうだけど、難関大学の整数問題に出てきそうな感じもします。
ちなみに、2021年に日本のある会社の代表がコラッツ予想に1億2千万円の懸賞金をかけたぞ。詳しくはネットを見てほしい。
と、とんでもない問題のようですね!
ふふ、まあ伝えたかったことはコラッツ予想のような有名な未解決問題もプログラムを用いることにより容易に実験できるということだ。
はい、一度プログラムを書いてしまえば計算機を用いるよりずっと楽ですね!
例題3
では、while文とif文を組み合わせる問題をもう1問見てみよう。つぎのプログラムを見てほしい。
このプログラムを実行するとどうなるのかを考えてみてほしい。ここで、print関数の中の『end=’ ‘』は改行せずに右側に続けて表示するという機能を持つぞ。例えば、
と表示されるのに対して、『end=’ ‘』を用いると
のように表示されるのだ。違いが分かったかな?
なるほど、横方向に伸びて表示されるのですね!
では、問題に戻って考えてくれ。もう一度下に表示しておこう。
ええと、1行目で a に0が代入され、while文の条件式は a<=3 で、処理における3行目のif文は a<=1 ならば『あ』と『い』を表示することになっています。しかし、6行目のprint関数はif文のインデントがそろっていないので、この文はif文に含まれません。つまり、この分はwhile文の処理として実行されます。最後に、7行目で a に1を足した数が a に上書きされている。
うむ、読み取りは完璧だぞ!ということは実行結果はどうなるかな?
はい、a の値が0と1のときは『あ』と『い』、そして『う』が表示され、a の値が2と3のときは『あ』と『い』は表示されず『う』だけが表示されるので、実行結果は『あいうあいううう』となると思います。
いつも通り実際に実行して確認してごらん。
できました!予想通りの結果になりました!
素晴らしい!
では最後に練習問題を2問やって終わりにしよう。
練習問題
問題1
上に書いたfile31のプログラムにおいて、インデントだけを変更して文字列『あいうあいういういう』が表示されるようにしよう。
問題2
パスワード『math』を事前に設定し、キーボードから入力した文字列が正しければ『ログインOK!』、違う時は合うまで入力を促すプログラムをwhile文を用いて書いてみよう。
解答
問題1の解答
file31のプログラムを変更するだけなので楽ですね。問題1はすぐにできました。5行目のインデントを6行目にそろえるだけで完成ですね。
問題2の解答
問題2の方は、変数 pw にパスワード『math』を代入しwhile文の条件式を、『pw != a』としました!
うむ、文句なしに完璧だ!
最後に
今日の内容は多かったが、また一つプログラムの世界が広がったと思う。今日学んだwhile文を使って色々遊んで身につけてほしい。では今日はここまでにしよう。お疲れさん。
はい、ありがとうございました!
コメント