• 検索結果がありません。

while 文の例

ドキュメント内 if if-else if-elif-else (ページ 37-41)

次のwhile文の簡単な例を見てみましょう。

ファイル名:while1.py

1 a = 1

2 w h i l e a < 1 0 : # a1 0未 満 な ら 以 下 を 続 け る

3 p r i n t a * a , # aの 二 乗 を プ リ ン ト す る

4 a = a +1 # aの 値 を 一 つ 増 や す

5

6 p r i n t ’ o w a r i ’ # w h i l e文 を 抜 け て か ら こ の 処 理 を 行 う

実行結果の例 1 4 9 16 25 36 49 64 81 owari

ここで,上の説明での条件Aに相当するものは『a<10』で,処理Xは『print a*a; a = a+1,』です。

while1.pyでは次のような処理を行っています:

1. 変数aを1にセットする。

2. a<10か調べる。a=1だからは条件a<10は真なので 3. a*a=1をプリントする。aの値を1増やす(a=2になる) 4. a<10を調べる。条件a<10は真なので

5. a*a=4をプリントする。aの値を1増やす(a=3になる) 6. ...

7. a*a=9をプリントする。aの値を1増やす(a=10になる)

8. a<10を調べる。条件a<10は偽なのでwhile文の処理は終わる。

9. owariと表示する。

上の処理のように,while文の中にカウンター(一つずつ増える変数)と停止条件を書くことで,for文と同 じ処理を行うことができます。次のfor文は上のプログラムwhile1.pyと同じ出力になります。

1 for a in r a n g e(1 ,10):

2 p r i n t a * a 3

4 p r i n t ’ o w a r i ’

17.2 while 文の例

17.2.1 3n+ 1問題の数列の生成

while文を用いて前の節の問題(nが偶数なら半分にし,奇数なら3n+ 1に変えることを繰り返してでき

る数列を作る問題)を書き直してみましょう:

ファイル名:while2.py

1 a = i n p u t(’ I n p u t an i n t e g e r : ’) # 数 を 入 力 さ せ て , そ の 数 を aに 入 れ る

2 p r i n t a , # aの 値 を プ リ ン ト

3

4 w h i l e a != 1: # a1で あ る 限 り 以 下 の 処 理 を 繰 り 返 し 行 う

5 if a %2 == 0: # aが 偶 数 な ら

6 a = a /2

7 el s e: # aが 偶 数 で な い な ら

8 a = 3* a +1

9 p r i n t a ,

実行結果の例 Input an integer: 19

19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

前回の課題と同じ結果が得られました。もっと大きな数ではどうなるでしょうか?例えばa=6171から始める と261回の繰り返しの末に最終的にa= 1となります。

実行結果の例 Input an integer: 6171

6171 18514 9257 27772 13886 6943 20830 10415 31246 15623 46870 23435 70306 35153 105460 ...

... ...

...

1300 650 325 976 488 244 122 61 184 92 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1

17.2.2 繰り返しが終わらないプログラム

次にwhile文を使って永遠に終わらないプログラムを作ってみましょう:

ファイル名:while3.py

1 # * c o d i n g : utf 8 * -2 j =1

3 w h i l e Tr u e: # 条 件 は 永 遠 に 真 な の で , 以 下 を ず っ と 繰 り 返 す !

4 p r i n t ’ひつじが’+str( j )+’匹’

5 j = j +1

実行結果の例 ひつじが1

ひつじが2 ひつじが3

...

...

このwhile文では条件がいつでも真(True)なので繰り返し処理が永遠に続きます。

プログラムを終了するにはCTRL + Cと入力します。

17.2.3 while文の中でbreak, else, continueを使った例

while文の繰り返しはbreakを書くことによって止めることができます:

ファイル名:while4.py

1 # * c o d i n g : utf 8 * -2 j =1

3 w h i l e Tr u e:

4 p r i n t ’ひつじが’+str( j )+’

5 j = j +1

6 if j > 1 2 3 4 5 6 : # も し 羊 の 数 の 二 乗 が1 2 3 4 5 6を 超 え た らw h i l e文 を 終 え る

7 b r e a k

8

9 p r i n t " Too m u c h s h e e p s ! I ’ m a l r e a d y a s l e e p ... zzz "

実行結果の例 ひつじが1

ひつじが2 ひつじが3 ...

...ひつじが123456

Too much sheeps! I’m already asleep...zzz.

while文でもelseを使うことができます。while文の条件がFalseになったときだけに行う処理を書き

ます。while直後の条件が成立しなければelse以下を処理します:

17.2 while文の例 17 WHILE文による繰り返し

ファイル名:while else.py

1 a =0

2 w h i l e a <5:

3 a = a +1

4 p r i n t a , 5 e l s e:

6 p r i n t ’ h o g e h o g e ’ 7

8 p r i n t ’ END ’

実行結果の例 1 2 3 4 5 hogehoge END

上のプログラムは意味のないプログラムですが,後で紹介するようにbreakをwhile-else文の中で使うと 効果的なプログラムを作ることができます。

次にwhile文の中でcontinueを使った文を作ります。その前に,ある文字列の中に特定の文字(列)が

入っているかどうかを確認する方法を紹介します。次は文字列Shinshuの中にnsをいう文字が入っている かを調べています。

1 > > > ’ ns ’ in ’ Shinshu ’

2 T r u e

3 > > > ’ sn ’ in ’ Shinshu ’

4 F a l s e

さて,羊を数えたいのですが,数字の4は不吉に感じるので,匹数に4を含むものは飛ばしながら最大20匹 まで数えることにしましょう。

ファイル名:while continue.py

1 # * c o d i n g : utf 8 * -2 a =0

3 w h i l e a < 2 0 :

4 a = a +1

5 if ’ 4 ’ in str( a ): # も し aの 中 に 数 字4が 含 ま れ て い た ら

6 c o n t i n u e # 次 のp r i n tを 行 わ ず にw h i l eの 条 件 確 認 に 戻 る

7 el s e: # そ う で な け れ ば

8 p r i n t ’羊が’+str( a )+’# 羊 を 数 え る 9

10 p r i n t ’ zzz ... ’

実行結果の例 羊が1

羊が2 羊が3 羊が5 羊が6 羊が7 羊が8 羊が9 羊が10 羊が11 羊が12 羊が13 羊が15 羊が16 羊が17 羊が18 羊が19 羊が20 zzz...

実は上のような処理はfor文を用いたほうが簡潔に書けます:

1 # * c o d i n g : utf 8 * -2 for i in r a n g e(1 ,21):

3 if not ’ 4 ’ in str( i ): # も し iの 中 に 数 字4が 含 ま れ て い な い の な ら

4 p r i n t ’羊が’+str( i )+’5

6 p r i n t ’ zzz ... ’

17.2.4 フィボナッチ数列の生成

フィボナッチ数列1,1,2,3,5,8,13,21,34,· · ·,つまり漸化式

a1= 1, a2= 1, an+1=an+an1, n= 2,3,4,· · · (1) で定義される数列を表示するプログラムを作ってみましょう。ただし,数列の値が100000000を超えたら停 止するものとします。この場合でも,どのnに対してanが100000000を超えるか分からないのでwhile文 を使うのが便利です。プログラムは次のアルゴリズムに従って書くことにしましょう:

1. maxvalue = 100000000とおく。

2. a=1とおく。b=1とおく。

3. while文でa<maxvalueが成り立っている間は,次の処理4-5を繰り返す。

4. aの値をプリントする。

5. a,bの値をそれぞれb,a+bに置き換える。

6. a<maxvalueが偽になってwhile文を抜けたら,次の数列の値をプリントする。

ファイル名:while5.py

1 m a x v a l u e = 1 0 0 0 0 0 0 0 0 # m a x v a l u eを 右 辺 の 数 字 に セ ッ ト す る

2 a = 1 # a = 1 と お く

3 b = 1 # b = 1 と お く

4 w h i l e a < m a x v a l u e :

5 p r i n t a # こ こ が

6 a , b = b , a + b # 繰 り 返 さ れ る ブ ロ ッ ク

7

8 p r i n t ’ The n e x t v a l u e is ’, a # the ne x t v a l u e i saの 値 を プ リ ン ト す る 実行結果の例 1

1 2 3 5 ...

63245986

The next value is 102334155

17.2.5 素数判定プログラム

次に与えられた自然数(2)が素数かどうか判定するプログラムを作ってみましょう。与えられた数nを2 から順に

n以下のすべての自然数で割ってみて,どれかの数で割り切れたらnは合成数,そうでなければn は素数です。そこで次の手順で判定する事にします:

1. 数nの値を入力させる(ただしn≥2とする)。 2. i= 2とする。

18 練習問題

3. i2≤nである間は,次の手順4-5を繰り返す。

4. もし,niで割り切れたら「nは素数ではありません」とプリントして3の繰り返しを終了する。

5. そうでなければii+ 1にする。

6. もし3の条件全てが偽であったら,「nは素数です」とプリントする。

ファイル名:while primeQ.py

1 # * c o d i n g : utf 8 *

-2 n = i n p u t(’ I n p u t an i n t e g e r ( >1): ’) # 数 を 入 力 さ せ て , そ の 数 を 変 数nに 入 れ る

3 i = 2 # i = 2 と お く

4 w h i l e i * i <= n : # i * inな ら 以 下 を 繰 り 返 す

5 if n % i == 0: # も し niで 割 り 切 れ た ら

6 p r i n t n , ’ is not a p r i m e . ’ # nは 素 数 で は な い と プ リ ン ト

7 b r e a k # w h i l e文 抜 け て1 2行 目 以 下 へ 進 む

8 e l s e:

9 i += 1 # iの 値 を 一 つ 増 や す

10 e l s e: # i * i > n と な っ た ら

11 p r i n t n , ’ is p r i m e . ’ # nは 素 数 で あ る 12

13 p r i n t ’おわり

実行結果の例 Input an integer: 1237

1237 は素数です。

おわり

実は上のプログラムではn= 1が素数と判定されてしまいます。

18 練習問題

18.1 問題:素数判定プログラム

上のプログラム(while primeQ.py)を修正し,n= 1が素数でないと判定されるようなプログラムを作り なさい。

ドキュメント内 if if-else if-elif-else (ページ 37-41)