分岐と繰り返し
このノートの問いがそのまま復習カードになり、忘れかけたころに出題されます。
0. どういうまとまりか
3 つの基本構造のうち、分岐と反復を Python で書く方法です。
プログラムを読む問題のほとんどは、どの枝に入るかと何回まわるかを正しく追えるかで決まります。
| 書き方 | 構造 | いつ使うか |
|---|---|---|
if・elif・else |
分岐 | 条件によって処理を選ぶ |
for i in range(…) |
反復(回数が決まっている) | 決めた回数、または配列の要素の数だけ繰り返す |
while 条件: |
反復(条件で続ける) | 条件が成り立つ間、繰り返す。回数が前もって分からないとき |
分かれ目は次の 3 つ。
if・elif・elseは上から調べ、最初に成り立った 1 つだけを実行する。range(n)は 0 から n−1 までの n 個。range(a, b)は a から b−1 まで(b は含まない)。whileは条件が成り立つ間まわる。条件がいつまでも成り立つと、終わらない(無限ループ)。
1. 分岐
根拠: 学習指導要領 情報Ⅰ-(3)-ア-(イ)
Python では、if の条件の後に : を書き、実行する処理を字下げ(インデント)して書きます。
字下げの範囲が、その条件で実行されるまとまりです。
if・elif・else を並べたとき、条件が複数成り立つ場合はどれが実行されるか?
if・elif・else を並べたとき、条件が複数成り立つ場合はどれが実行されるか?上から調べて、最初に成り立った 1 つだけ
残りの elif・else は調べずに飛ばす。どれも成り立たないときだけ else が実行される。
点数 s で「80 以上は A、60 以上は B、それ以外は C」と分けるとき、条件を書く順番で気をつけることは?
範囲の広い条件より、狭い条件(s >= 80)を先に書く
s >= 60 を先に書くと、90 点も最初の条件に当てはまり B になってしまう。
Python で、分岐や繰り返しの中で実行する処理の範囲は、何で表すか?
字下げ(インデント)
if や for の行末に : を書き、次の行から字下げした部分が中身になる。
2. for と range
根拠: 学習指導要領 情報Ⅰ-(3)-ア-(イ)
for は、range(…) や配列から値を 1 つずつ取り出して変数に入れ、そのたびに中身を実行します。
for i in range(5): で、i がとる値は?
for i in range(5): で、i がとる値は?0, 1, 2, 3, 4 の 5 つ
range(n) は 0 から始まり、n は含まない。繰り返しは n 回。
for i in range(2, 7): の中身は何回実行されるか?
for i in range(2, 7): の中身は何回実行されるか?5 回(i は 2, 3, 4, 5, 6)
range(a, b) は a から b−1 まで。回数は b−a 回。
for i in range(1, 10, 3): で、i がとる値は?
for i in range(1, 10, 3): で、i がとる値は?1, 4, 7
3 つ目の引数は増やす幅(増分)。10 は含まないので、10 には届かない。
繰り返しの中に繰り返しを入れる(ネスト)とき、外側が m 回、内側が n 回なら、内側の中身は全部で何回実行されるか?
m × n 回
外側の 1 回ごとに、内側が n 回まわる。表の全マスを調べるときなどに使う。
3. while と無限ループ
根拠: 学習指導要領 情報Ⅰ-(3)-ア-(イ)
while は、まず条件を調べ、成り立てば中身を実行して、また条件に戻ります。
最初から条件が成り立たなければ、中身は 1 回も実行されません。
while の繰り返しが終わらなくなる(無限ループ)のは、どんなときか?
while の繰り返しが終わらなくなる(無限ループ)のは、どんなときか?中身を実行しても、条件がいつまでも成り立ち続けるとき
条件に使う変数を中身で更新し忘れると起こる。例: while i < 10: の中で i を増やしていない。
break は繰り返しの中で何をするか?
break は繰り返しの中で何をするか?その繰り返しを途中で打ち切り、繰り返しの後ろへ進む
探していた値が見つかったときなどに使う。
4. 合計と最大値を求める形
根拠: 学習指導要領 情報Ⅰ-(3)-ア-(イ)
合計・個数・最大値は、繰り返しの前に入れ物を用意し、中で少しずつ更新する、という同じ形で求めます。
配列の合計を繰り返しで求めるとき、合計を入れる変数は繰り返しの前にどうしておくか?
0 を代入しておく(初期化)
繰り返しの中で total = total + a[i] と足していく。初期化を忘れると正しく足せない。
配列の最大値を繰り返しで求めるとき、最大値を入れる変数の最初の値として確実なのは?
配列の最初の要素(a[0])
あとの要素を順に比べ、今の最大値より大きければ入れ替える。0 から始めると、全部が負の数のとき誤る。
練習問題
問 1 次のプログラムを実行すると、何と表示されるか。
total = 0
for i in range(1, 6):
if i % 2 == 1:
total = total + i
print(total)
total = 0
for i in range(1, 6):
if i % 2 == 1:
total = total + i
print(total)
9
i は 1 から 5 まで。2 で割った余りが 1 になる奇数の 1, 3, 5 だけを足すので、1 + 3 + 5 = 9。
問 2 次のプログラムを実行すると、何と表示されるか。
count = 0
for i in range(4):
for j in range(i):
count = count + 1
print(count)
count = 0
for i in range(4):
for j in range(i):
count = count + 1
print(count)
6
内側の回数が i によって変わる。i が 0 のとき 0 回、1 のとき 1 回、2 のとき 2 回、3 のとき 3 回で、0 + 1 + 2 + 3 = 6。
問 3 次のプログラムを実行すると、何と表示されるか。
n = 1
k = 0
while n < 100:
n = n * 3
k = k + 1
print(n, k)
n = 1
k = 0
while n < 100:
n = n * 3
k = k + 1
print(n, k)
243 5
n は 3, 9, 27, 81, 243 と変わり、そのたびに k が 1 増える。
81 のときはまだ 100 未満なのでもう 1 回まわり、243 になったところで条件が成り立たなくなって終わる。
問 4 次のプログラムを実行すると、何と表示されるか。
scores = [62, 85, 47, 85, 90, 71]
best = scores[0]
pos = 0
for i in range(1, len(scores)):
if scores[i] > best:
best = scores[i]
pos = i
print(best, pos)
scores = [62, 85, 47, 85, 90, 71]
best = scores[0]
pos = 0
for i in range(1, len(scores)):
if scores[i] > best:
best = scores[i]
pos = i
print(best, pos)
90 4
best は 62 から始まり、85(添字 1)で更新、次の 85(添字 3)は「より大きい」ではないので更新しない。
90(添字 4)で更新し、71 では更新しない。pos には、最大値の添字 4 が残る。