1010

if 文と for 文の複合文

if 文と for 文の複合文
この節では，if 文と for 文を用いた代表的な応用例を紹介していきます。今後様々なプログラミングの技法を学ぶ上でも核になるような重要な活用例ばかりです。まずは例題をしっかりと理解して，演習問題もできるかぎり解くようにしましょう。

条件を満たすものを数える・最大値と最小値を求める
例題 10.1（if 文と for 文の組み合わせ）《重要》
5 人のテストの点数 a = [20, 40, 60, 80, 100] を用意し，60 点以上の人数 count を出力するプログラムを作成しなさい（解答は次ページ）。

例題 10.1 の穴埋め式ヒント

count の初期値を count = 0 と定めておきます。まず a[0] を取り出して 60 と比較し，60 以上であれば count の値を 1 増やすようにします（とりあえず a[0] のみについて調べる文を作ってみましょう）。

a = [20,40,60,80,100]
count = 0

if あああ :count = あああprint(count)

同じようにして次は a[1]，a[2] と順に 60 と比較します。a[] のかっこ内の数値だけが変わっていくことに注目して，for 文に直します。
a = [20,40,60,80,100]
count = 0

for i in range(0, あああ ):if あああ :count = あああ

print('60点以上の人数は'+str(count)+'人です。')

10

if 文と for 文の複合文

37

例題 10.1 の解答例

まず，a[0] の値のみ 60 と比較した場合のコードは以下のようになります。次は a[1]>=60，a[2]>=60，……となるので，「if a[i] >= 60 :」と一般化することができます。
a = [20,40,60,80,100]
count = 0

if a[0] >= 60:

count = count + 1

print(count)0

したがって，for 文を用いてまとめると以下のようになります。range は「0 以上 5 未満」であることに注意します。
a = [20,40,60,80,100]
count = 0

for i in range(0,5):
if a[i] >= 60:

count = count + 1

print('60点以上の人数は'+str(count)+'人です。')
60点以上の人数は3人です。

38第2章

制御構文（ if 文，for 文，while 文 ）（重要）print 文の 3 通りの位置と出力結果の違いについて
下のように print 文の位置を if の真下の位置からはじまるようにすると，for 文の中にprint 文が入るものの，if 文の外には出てしまいます。これは if 文の実行内容である「countの値が更新」されたか否かによらず，print 文が実行されるという結果をもたらします。
a = [20,40,60,80,100]
count = 0

for i in range(0,5):
if a[i] >= 60:

count = count + 1

print(str(i+1)+'番目までの60点以上の人数は'+str(count)+'人です。')
1番目までの60点以上の人数は0人です。
2番目までの60点以上の人数は0人です。
3番目までの60点以上の人数は1人です。
4番目までの60点以上の人数は2人です。
5番目までの60点以上の人数は3人です。

では，print 文の位置をその一行上の「count =」の開始位置にあわせるとどうなるでしょうか。
今度は print 文が if 文の中に入るので，「count の値の更新」とともに print 文が実行されるという内容に変わります。したがって，count の更新が行われない場合は，print 文の実行はされないことになります。
a = [20,40,60,80,100]
count = 0for i in range(0,5):
if a[i] >= 60:

count = count + 1

print(str(i+1)+'番目までの60点以上の人数は'+str(count)+'人です。')
3番目までの60点以上の人数は1人です。
4番目までの60点以上の人数は2人です。
5番目までの60点以上の人数は3人です。

10

if 文と for 文の複合文

39

（念のための注意）コードの処理の順番についての確認
当たり前ですが，コードは原則上の行から順に処理されます。ただし，for 文で囲まれた部分は，数値の値を変えながら，字下げされた部分だけ繰り返し処理が行われます。前ページで扱った下のコードを例にとり，確認しておきます。
(00) a = [20,40,60,80,100](01) count = 0(02) for i in range(0,5):(03)

if a[i] >= 60:(05)

print(str(i+1)+'番目までの60点以上の人数は'+str(count)+'人です。')(04)

count = count + 1

まず (00) 行目と (01) 行目はともに変数の準備と初期値の代入です。

次に (02) から for 文がはじまりますが，(03) ～ (05) 行目がその繰り返しの対象となります。

最初 i が 0 のとき，(03) 行目の a[0] >= 60 の条件判定が行われます。しかしこの場合満たさないので (04) 行目は無視されます。(05) 行目は if 文の外に出るものの for 文の中にあるので実行されます。このとき count は 0 が入ったままなので，「1 番目の 60 点以上の人数は 0 人です。」と出力されます。

次に i が 1 のとき，(03) 行目の a[1] >= 60 の条件判定が行われます。しかしこの場合も満たさないので (04) 行目は無視されますが (05) 行目は実行されます。このときも count は 0 が入ったままなので，「2 番目の 60 点以上の人数は 0 人です。」と出力されます。

次に i が 2 のとき，(03) 行目の a[1] >= 60 の条件判定が行われます。この場合は満たされるので (04) 行目は実行され，count が 1 に更新されます。次に (05) 行目が実行されます。このとき count は 1 になったので，「3 番目の 60 点以上の人数は 1 人です。」と出力されます。

以下同様に i が 3 のとき，4 のときまで繰り返され，すべての処理が終了となります。

演習問題 10.1

6 人のテストの点数を用意し最大値 saidai と最小値 saisyo を出力するプログラムを作成しなさい。
《最重要》

演習問題 10.2（1）1 から 100 までの自然数で，3 で割ると 1 余る数の個数を求めよ。
（2）21 未満の自然数で 3 でも 7 でも割り切れないものを全て求めよ。《重要》［Hint］答えを配列で表現するため，空の配列 a を「a=[]」で用意。あとは 1 から 21 までの数が条件を満たすか判定し，満たせば a.append( 追加したい値 ) で追加する。print 文で順に出力させてもよい。

40

第2章

制御構文（ if 文，for 文，while 文 ）