情報Ⅰ プログラミング演習

第4章 繰り返し ― for文とwhile文

この章で学べること
この章のゴール:くり返しのプログラムを、1周ごとに変数の値がどう変わるかを表で追いかけながら読めるようになること。繰り返し構造は共通テストで毎回必ず出題され、トレース問題の本丸です。
目次

    STEP 1くり返す ― for文とrange()

    「こんにちは、と5回表示する」を、printを5行書かずに済ませるのが繰り返し構造です。for i in range(1, 6): と書くと、変数 i が1、2、3、4、5と変わりながら、字下げした行が5回くり返されます。range(1, 6) の6は「6の手前まで」という意味で、6自身は含まれないことに注意してください。

    for i in range(1, 6):iを1〜5まで変えながら
    print(i, '回目です')forの中:5回くり返す
    print('おわり')forの外:1回だけ
    図1 色のついた範囲(字下げした行)だけが、ぐるぐるくり返される
    たしかめてみよう

    実行して、字下げした行が5回、「おわり」が1回だけ表示されることを確かめましょう。そのあと range(1, 6)range(1, 11) に変えると何回になるかも予想してから試しましょう。

    確認ポイントを見る(実行してから開くこと)
    range(1, 6) で5回、range(1, 11) で10回です。「終わりの数の手前まで」——この感覚は共通テストの空欄補充で何度も問われます。

    例題 1

    1から10までの整数を表示します。今度はfor文の1行を自分で書いて完成させましょう。書けたら、range() の数を変えて1から100にもしてみましょう。

    解答例を見る(まず自分で書いてから開くこと)
    for i in range(1, 11):
      print(i)
    10まで表示したいので、終わりは「10の1つ先」の11です。
    アラン先生
    printを100行書くかわりに、たった2行ですますことができる。「同じパターンをわざわざ書かない」という省エネ精神がプログラミングの基本的な考え方です。
    たしかめてみよう

    くり返す行の中に i出てこなくても、字下げした行は回数分くり返されます。実行して確かめ、回数や文字も変えてみましょう。

    確認ポイントを見る(実行してから開くこと)
    i は1〜5と変わっていますが、使わなくてもかまいません。「for文は回数を数える係、中の行はやることを書く係」と分けて考えると、次の問題が書きやすくなります。
    やってみよう 4-1

    「ドン!」がちょうど3回表示されるように、for文の行を書き加えなさい。

    <実行結果例>ドン! ドン! ドン!
    解答例を見る(まず自分で書いてから開くこと)
    for i in range(1, 4):
      print('ドン!')
    range(1, 4) で1、2、3の3回です。range(0, 3)range(3) でも3回になります(いろいろな書き方でクリアできます)。printの中にiが出なくても繰り返しは実行されています。最初は違和感がありますが慣れていきましょう。

    STEP 2積み上げる ― 合計の定番パターン

    くり返しの最大の使いどころが「合計を積み上げる」ことです。第1章で学んだ goukei = goukei + i(自己代入)をforの中に入れると、1周ごとに goukei に値が足しこまれていきます。値の変化を表で追うと、こうなります。

    igoukei = goukei + i の結果
    1周目10 + 1 → 1
    2周目21 + 2 → 3
    3周目33 + 3 → 6
    4周目46 + 4 → 10
    5周目510 + 5 → 15
    たしかめてみよう

    上の表とまったく同じ変化が起きることを、実行して確かめましょう。

    例題 2

    1から100までの整数を全部足すプログラムです。printがforのにある(最後に1回だけ表示する)ことに注目してください。

    ノイマン先生
    いいかね、共通テストは「この行が実行された回数」や「◯周目のgoukeiの値」を聞いてくる。さっきの表のようなトレース表を自分の手で書けることが大切だ。
    やってみよう 4-2

    1から10までの合計(55)が表示されるように、積み上げの行を書き加えなさい。字下げは半角スペースを2ついれます。字下げを忘れないように気をつけてください。

    <実行結果例>1から10までの合計は 55
    解答例を見る(まず自分で書いてから開くこと)
    goukei = 0
    for i in range(1, 11):
      goukei = goukei + i
    print('1から10までの合計は', goukei)
    積み上げの1行が書ければ、共通テストの集計問題は安心してください。
    ⏱ ここまでで1時間くらいが目安です。つづきは次の時間でもOK(クリアの記録は残っています)。

    STEP 3ループの中のループ ― 二重ループ

    forの中にもう1つforを入れることもできます。内側のループが一周りしてから、外側が1歩進む——時計の長針と短針のような動きです。

    for i in range(1, 3):外側:iが1、2
    for j in range(1, 4):内側:jが1、2、3
    print(i, 'と', j)内側の中:2×3=6回実行
    図2 青の範囲(外側)が1歩進むごとに、赤の範囲(内側)がまるごと一周りする
    たしかめてみよう

    実行する前に、表示される6行の順番を予想してみましょう。「1と1、1と2、1と3、2と1…」でしょうか?それとも「1と1、2と1…」でしょうか?

    確認ポイントを見る(実行してから開くこと)
    内側の j が先に1→2→3と回りきってから、外側の i が2に進みます。この「内側が先に回りきる」順番を理解して、共通テストの二重ループ問題を攻略しましょう!

    例題 3

    九九の1〜3の段を表示するプログラムです。end=' ' は「改行のかわりに空白をはさむ」という指定で、1つの段を1行にまとめています。end=' ' は必ずprintのカッコの中に書きます(外に出すと、ただの変数になってしまいます)。最後の行の何も入っていない print() は、段の終わりで改行だけをする係です。

    アラン先生

    end='  '  はキーワード引数といいます。今回は end='  '  を改行を起こさないために使っています。共通テストにはでてこないので、安心してください。

    ノイマン先生
    いいかね、二重ループは2025年・2026年の本試験に連続で出ている。かなり難しい考え方だが、プログラミング問題で安定して点数をとるためにがんばって乗り越えるんだ!
    やってみよう 4-3

    1組から2組まで、それぞれ1番から3番までの出席番号が表示されるように、内側のfor文の行を書き加えなさい。

    <実行結果例>1 組 1 番 1 組 2 番 1 組 3 番 2 組 1 番 2 組 2 番 2 組 3 番
    解答例を見る(まず自分で書いてから開くこと)
    for i in range(1, 3):
      for j in range(1, 4):
        print(i, '組', j, '番')
    内側のfor文は、外側より一段深く字下げします。上にある図2と見比べてみてください。

    STEP 4条件が成り立つ間くり返す ― while文

    「10回」のように回数が決まっているならforが便利ですが、「〜である間ずっと」のように回数がわからないくり返しには while 条件: を使います。whileには3点大切なポイントがあります——①始める前の準備(初期化)、②続ける条件、③1周ごとの更新。とくに③を忘れると、条件がずっと成り立ったままの無限ループになってしまいます。

    num = 1① 初期化(準備)
    while num <= 5:② 続ける条件
    print(num)くり返す中身
    num = num + 1③ 更新(忘れると無限ループ!)
    print('おしまい')条件が成り立たなくなったら、ここへ
    図3 whileの3点セット:初期化・条件・更新
    たしかめてみよう

    図3のプログラムそのものです。num が6になった瞬間に条件が成り立たなくなり、ループを抜けることを確かめましょう。

    アラン先生
    4行目の num = num + 1 を消すと、numの値が更新されずに無限ループします。実際に試してみるとおもしろいですよ。

    例題 4

    例題2(1〜10の合計)とまったく同じ仕事を、whileで書いたものです。forでは自動だった「iを増やす」を、自分の手で書いている点を見比べてください。

    ノイマン先生
    いいかね、2026年の本試験では「forで書いたプログラムをwhileに書き直す」形式が出た。問われたのは、①初期化と③更新の行をどこに置くか。例題2と例題4を並べて見比べられれば、あの問題は解けたんだ。
    やってみよう 4-4

    10からのカウントダウンが表示されるように、③更新の行を書き加えなさい。忘れると無限ループになりますが、このサイトでは自動で止まるので、恐れず失敗してみてください。

    <実行結果例>10 9 8 7 6 5 4 3 2 1 発射!
    解答例を見る(まず自分で書いてから開くこと)
    num = 10
    while num >= 1:
      print(num)
      num = num - 1
    print('発射!')
    num = num - 1 が③更新です。試しにこの行を消して実行すると、無限ループを実行環境が検出して止めてくれます。エラー例1でくわしく見ます。

    エラー例 ― よくあるエラーを知ろう!

    くり返しの章では、エラーメッセージが出るまちがいに加えて、エラーは出ないのに結果がおかしい「バグ」にも出会います。どちらも体験しておきましょう。

    エラー例 1 無限ループ(更新のし忘れ)

    whileの3点セットのうち、③更新の行がありません。実行するとどうなるか、安心して試してください(このサイトの実行環境では自動で止まります)。

    エラーの読み方を見る(実行してから開くこと)
    大量の「ぐるぐる」のあと、RuntimeError: 実行が止まらないため中断しました と表示されます。num がずっと1のままなので、条件 num <= 5 が永遠に成り立ち続けるのが原因です。ループの中に num = num + 1 を足せば直ります。本物のパソコンでは自動では止まらないので、whileを書くときは必ず③更新を確かめる癖をつけましょう。

    エラー例 2 エラーが出ないまちがい ― rangeの端

    「1から10まで表示するつもり」で書いたプログラムです。実行してみると……?

    まちがいの正体を見る(実行してから開くこと)
    9までしか表示されません。エラーメッセージは何も出ないのに、結果がおかしい——これが「バグ」です。range(1, 10) は「10の手前まで」なので、10まで表示したければ range(1, 11) です。この「1つずれ」は、プロでもやらかす世界一有名なバグです。

    演習問題

    問 4-1

    1〜100の整数をすべて表示するプログラムを完成させなさい。

    ※ if文やfor文では改行するだけで、普通は適切に字下げが起こるようになっています。そのことも確かめてみてください。

    <実行結果例>1 2 (中略) 100
    解答例を見る(まず自分で書いてから開くこと)
    for i in range(1, 101):
      print(i)
    終わりの数が101(100の1つ先)になっていれば正解です。余裕があれば、while文でも挑戦してみてください。
    問 4-2

    3の倍数を 3 + 6 + 9 + … + 30 と足し合わせた値を、while文を用いて求めなさい。ヒント:3ずつ増える変数を用意して、30以下の間くり返します。

    <実行結果例>合計は 165
    解答例を見る(まず自分で書いてから開くこと)
    goukei = 0
    num = 3
    while num <= 30:
      goukei = goukei + num
      num = num + 3
    print('合計は', goukei)
    更新が + 3 になるのがポイントです。「3ずつ進む」ようなくり返しは、forよりwhileの方が素直に書けることがあります。
    問 4-3

    九九の表(1の段から9の段まで)を表示するプログラムを自分で考えて作りなさい。例題3が大きなヒントです。

    <実行結果例>1 × 1 = 1 1 × 2 = 2 … (9の段まで続く)
    解答例を見る(まず自分で書いてから開くこと)
    for i in range(1, 10):
      for j in range(1, 10):
        print(i, '×', j, '=', i * j, end='  ')
      print()
    例題3の range(1, 4)range(1, 10) に広げるだけで、81マスの表が完成します。くり返しの威力を実感できる問題です。
    問 4-4(発展)

    10万円を年利5%で預けると、毎年残高が1.05倍になります。残高がはじめて20万円を超えるのは何年後かを、while文で求めなさい。(これは共通テストのサンプル問題に出た「複利計算」と同じ考え方の問題です)

    <実行結果例>15 年後にはじめて20万円を超える
    解答例を見る(まず自分で書いてから開くこと)
    zandaka = 100000
    nensu = 0
    while zandaka <= 200000:
      zandaka = zandaka * 1.05
      nensu = nensu + 1
    print(nensu, '年後にはじめて20万円を超える')
    「何回で条件を満たすかわからない」というのが、まさにwhileの出番です。2021年のサンプル問題は、これと同じ構造の貯金プログラムでした。

    自由実行スペース

    思いついたことを自由に試すための場所です。大きな数の合計や、模様の表示(print('★' * i) も面白いですよ)に挑戦してみましょう。

    ノイマン先生
    ちなみに共通テストの表記では、for文は「iを1から10まで1ずつ増やしながら繰り返す:」と書かれる。ここで注意——この表記は10を含む。Pythonの range(1, 11) と一緒になるんだ。whileは「(条件)の間繰り返す:」。この「端のちがい」だけは、注意が必要だ!
    実行環境を準備中…