プログラミング入門I
2025.12.08
多重ループ

Back to index page



  1. 本日の作業内容

  2. 前回の確認テストについて

    今回の内容は一度演習問題として行ったものの修正版です.なのに出来が良くないというのは,結局復習がきちんとできていないということですね.残念です.まだまだ確認テストは行っていきますので,予復習はしっかりやっておきましょう.

    以下は問題のある解答の例です.参考にしてください.

    if num1 > num2:
        num = num1
        num1 = num2
        num2 = num
    

    間違ってはいませんが,Python には便利な多重代入もありますので活用しましょう.演習問題でも何度か使用しています.

    if num1 > num2:
        print(f'Numbers from {num1} to {num2}')
        for num1 in range(num2,num1+1):
            print(f'{num1} ',end='')
        else:
            print()
    else:
        print(f'Numbers from {num2} to {num1}')
        for num2 in range(num1,num2+1):
            print(f'{num2} ',end='')
        else:
            print()
    

    同じことを2度書くというのはなんとも無駄な作業です.こういうのは推奨しません.

    num1 = random.randint(10,98)
    num2 = random.randint(num1+1,99)
    

    2桁の正の整数という指定ですが,十分条件を満足していません.num1 が 99 になることは無いし,num1 が10になることもありません.

  3. 前回の宿題について

    今回もエラーや提出に関する形式的な問題となるようなものはありませんでした.引き続き提出の際はちゃんど動作するソースコードの提出をよろしくお願いします.

    以下は例によって問題のあるプログラムの例です.参考にしてください.

    print(' 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30')
    print('------------------------------------------------------------')
    
    for _ in range(10):
        a = random.randint(10, 30)
        b = random.randint(10, 30)
    
        if a <= b:
            small, big = a, b
        else:
            small, big = b, a
    
        print(f'{small:.2f} -- {big:.2f}:', end=' ')
    
        x = small
        while x <= big:
            print(x, end='  ')
            x += 1
    
        print()
    

    上のものはいろいろと問題があります.まず,目盛代わりの数字ですが,反復処理で自動生成しましょう.授業中にも何度か説明していますが,この授業で行っている演習や課題は画面で簡単に確認できる程度の数値の範囲しか使用しません.大きな数値を使用すると画面を延々スクロールする必要が出てきて面倒だからです.なので,10から30だからと言って自分で打ち込むのは良くありません.1000000から3000000とかだったらどうしますか?

    次に2つの数値を小さい順に並べる操作ですが,教科書の p.70 にソートの例がちゃんと示してありますし,kこれまでも何度か演習で使用しました.

    そして,最後に数値ですが,なぜ整数を小数第2位まで表示させる必要があるのでしょうかね.結果的には以下のように目盛代わりの数値が全然役に立っていませんし.

     10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
    ------------------------------------------------------------
    13.00 -- 16.00: 13  14  15  16  
    15.00 -- 18.00: 15  16  17  18  
    13.00 -- 28.00: 13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  
    22.00 -- 27.00: 22  23  24  25  26  27  
    18.00 -- 29.00: 18  19  20  21  22  23  24  25  26  27  28  29  
    28.00 -- 30.00: 28  29  30  
    18.00 -- 23.00: 18  19  20  21  22  23  
    11.00 -- 15.00: 11  12  13  14  15  
    13.00 -- 23.00: 13  14  15  16  17  18  19  20  21  22  23  
    16.00 -- 20.00: 16  17  18  19  20  
    ------------------------------------------------------------
    

    ranges = [
        (11, 16),
        (11, 22),
        (17, 27),
        (16, 25),
        (17, 18),
        (13, 28),
        (10, 19),
        (11, 25),
        (20, 25),
        (10, 29)
    ]
    
    for start, end in ranges:  
        print(f"{start:2d} -- {end:2d}:", end=" ")
        for n in range(10, 31):    
            if start <= n <= end:
                print(f"{n}", end=" ")
            else:
                print("  ", end="")
        print()
    

    表示させる整数は乱数によって決めると指示しているのに,どうして決め打ちなんでしょうか?

    for i in range(10,31):
        print(f'{i} ',end='')
    
    print('')
    print('-'*73)
    for j in range(10):
        small = random.randint(10,30)
        large = random.randint(10,30)
        small, large = sorted([small, large])
        print(f'{small} -- {large}: ',end='')
        print(f'   '*(small - 10),end='')
        for k in range(small, large + 1):
            print(f'{k} ',end='')
        else:
            print()
    else:
        print()
    

    上のソースですが,for 文のインデックス変数について適切ではありません.for 文は定義されるごとにインデックス変数が初期化されるので,特に変数名に意味があるものを使用するのでなければ i で構いません.出てくるたびにいちいち j k l のように変更していたら変数が足らなくなります.入れ子にした場合には外側と内側のインデックス変数は当然変えなければなりません.

    ちなみに for 文のインデックス変数を i とするのは整数の英語の integer から来ていますが,そもそも世界で最初の高級言語である FORTRAN では変数名がIJKLMNOP...というように I 以降の文字で始まる場合には整数型,A から H までは実数型というように最初の文字で分けていたことによります.
  4. 前回の復習

    2 重の for 文を中心に多重のループについて学習しました.前回も説明しましたが,画面に文字列を2次元的に表現するグラフや表などで重宝されるのが2重のループです.外側のループの変数が行を下に進める処理に対応し,内側の変数は各行を右に進める処理に対応しますので,それを理解した上でいろいろと考えていきましょう.

  5. 多重ループ

    今回も多重の反復処理です.今回は2次元的な表現だけでなく,数値を扱う際に2重のループが必要になるものもいくつか用意しました.引き続き演習問題を通して多重ループを学習していきましょう.

    例題

    約数探索

    100 から 200 の範囲の整数を乱数により2個発生させて,その範囲の数の約数をすべて表示するプログラムを作成しましょう.

    168: 1 2 3 4 6 7 8 12 14 21 24 28 42 56 84 168 
    169: 1 13 169 
    170: 1 2 5 10 17 34 85 170 
    171: 1 3 9 19 57 171 
    172: 1 2 4 43 86 172 
    173: 1 173 
    174: 1 2 3 6 29 58 87 174 
    175: 1 5 7 25 35 175 
    176: 1 2 4 8 11 16 22 44 88 176 
    177: 1 3 59 177 
    178: 1 2 89 178 
    179: 1 179 
    180: 1 2 3 4 5 6 9 10 12 15 18 20 30 36 45 60 90 180 
    181: 1 181 
    182: 1 2 7 13 14 26 91 182 
    183: 1 3 61 183 
    184: 1 2 4 8 23 46 92 184 
    185: 1 5 37 185 
    186: 1 2 3 6 31 62 93 186 
    187: 1 11 17 187 
    188: 1 2 4 47 94 188 
    189: 1 3 7 9 21 27 63 189 
    190: 1 2 5 10 19 38 95 190 
    191: 1 191 
    192: 1 2 3 4 6 8 12 16 24 32 48 64 96 192 
    193: 1 193 
    194: 1 2 97 194 
    195: 1 3 5 13 15 39 65 195 
    196: 1 2 4 7 14 28 49 98 196 
    197: 1 197
    

    解答例

    import random
    
    small = random.randint(100, 200)
    large = random.randint(100, 200)
    
    small, large = list(sorted([small, large]))
    
    for i in range(small, large + 1):
        print(f'{i}: ', end = '')
    
        for j in range(1, i + 1):
            if i % j == 0:
                print(j, end = ' ')
        else:
            print()
    

  6. 演習

    今回の演習問題です.

  7. 本日のまとめ

  8. 宿題

    宿題が公開されるのは明日火曜日10:00の予定で,締切りは来週の月曜日12月15日の13:00です.Moodle を使用します.

  9. 次回の予習範囲

    次回は教科書のp.133-162の範囲を学習しますので,予習をしてきてください.

    次回は多重のループに関する確認テストがありますので,復習もしっかりとしておいてください.


目次ページに戻る