第十二回 『while文』について

プログラミング編

はじめに

マサト先生
マサト先生

やあ、こんにちは。今回は『while文』についてやっていこう。

ヒロト
ヒロト

はい、よろしくお願いします。

マサト先生
マサト先生

while文はfor文と同様に処理を繰り返して実行できる。for文は繰り返す回数が決まっているとき使われることが多いが、while文はある条件が成り立つ場合に処理が繰り返されるのだ。

ヒロト
ヒロト

条件が成り立つ限りずっと繰り返されるということですか?

マサト先生
マサト先生

そう、ずっと繰り返される。while文の型は次のようになる。

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

問題

キーボードから入力した正の整数に対して、偶数の場合は2で割り、奇数の場合は3倍して1を足す、という操作を繰り返していき1になったら終了というプログラムを書いてみよう。

ヒロト
ヒロト

なるほど、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文を使って色々遊んで身につけてほしい。では今日はここまでにしよう。お疲れさん。

ヒロト
ヒロト

はい、ありがとうございました!

コメント

タイトルとURLをコピーしました