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

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    今回はエラーや関係ないプログラムの提出などのものが無かったのでうれしいです.今後もこの調子で行きましょう.

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

    num = random.randint(11,19)
    print(f'{num} random numbers:',end=' ')
    

    これでは11から19までの整数のどれかになってしまいます.

    num = random.choice([11, 13, 15, 17, 19])
    

    間違ってはいないのですが,もし,2桁の奇数としたら同じ方法を使いますか?自分で数を見つけるのはやめましょう.

    k = random.randint(11, 19)
    while k % 2 == 0:
        k = random.randint(11, 19)
    

    奇数が出るまでやり続けるというのは無駄な作業です.

    print('The maximum number: ', maximum)
    print('The minimum number: ', minimum)
    print('The mean:           ', f'{mean:.2f}')
    

    上のようなものも何件か見られたのですが,桁揃えをしていないので以下のように表示がずれます.

    929 176 The maximum number:  929
    The minimum number:  13
    The mean:            548.55
    

    print(f'The maximum number: {mx}')
    print(f'The minimum number: {mn:>3}')
    print(f'The mean: {ave:>16}')
    

    最小値の方だけ3桁を指定していますが,最大値には1000が出る可能性がありますので,これではずれて表示されてしまいます.少数の方もです.

    maxnum=0
    minnum=0
    total=0
    
    for i in range(oddnum):
        num1=random.randint(1,1000)
        print(num1,end=' ')
        if num1>maxnum:
            maxnum=num1
        if num1<minnum:
            minnum=num1
        total+=num1
    

    最小値の初期値が間違っているので,表示される最小値は毎回0になります.

    for i in range(num1):
        num2=random.randint(1,1000)
        print(num2,end=' ')
    
        if mx < num2:
            mx = num2
            
        elif mn > num2:
            mn = num2
    

    前回の授業中に説明していたのですが,分かってもらっていなかったようです.最小値と最大値は別に連動するわけでは無いので,elif ではダメです.例えば,以下のように最小値を間違えることになります.

    13 random numbers: 32 670 375 466 924 257 430 300 367 664 394 336 530
    
    The maximum number:  924
    The minimum number:  257
    The mean          :  441.92
    

    numbers = []
    for i in range(num):
        num1 = random.randint(1, 1000)
        numbers.append(num1)
        print(num1, end = ' ')
    else:
        print()
    MAX = max(numbers)
    MIN = min(numbers)
    AVE = sum(numbers) / num
    
    print(f"The mximum number:  {MAX:4d}")
    print(f"The minimum number: {MIN:4d}")
    print(f"The AVE :           {AVE:6.2f}")
    

    他にもリストを使った人がいました.別に間違いでは無いですし,この方が簡単になりますが,一応授業内容と合わせた課題なので,そのように既習の処理を使ってプログラムを組むようにしてください.

    def main():
        rdnum = [11, 13, 15, 17, 19]
        key = random.choice(rdnum)
    
        nums = [random.randint(1, 1000) for _ in range(key)]
        print(f'{key} random numbers: {nums}')
        print()
    
        mx = max(nums)
        mn = min(nums)
        ave = sum(nums) / key
    
        print(f'The maximum number:  {mx}')
        print(f'The minimum number:  {mn}')
        print(f'The mean:            {ave:.2f}')
    
    if __name__ == "__main__":
        main()
    

    さて,今回もいよいよ出てきました.授業の最初に説明しましたが,def を使用したものは採点しません.合っている合っていないではなく,def を使うだけの理解があるのなら,def を使わないプログラムも簡単に書けるはずだからです.

  3. 前回の復習

    授業の最初に for 文に関する確認テストを行います.実際の作業については授業の中で指示します.

  4. 多重ループ

    繰り返しの処理の中に繰り返しを入れることが可能です.それにより2次元的な表現などが可能となります.教科書では九九の表の例が出ていますが,そのような縦と横に文字を並べる作業では以下の点がポイントとなります.

    2重の for 文のポイント

    for i in range(hoge):
        for j in range(huga):
            print(foo, end = '')
    

    外側のループの変数 i は行に対応し縦に進む処理で,内側の変数 j は各行内の表示で右に進める作業に対応します.例題を通して学習していきましょう.

    例題

    1. 2重ループの基本
    2. 以下のように表示するプログラムを作成しましょう.

      ( 1, 1) ( 1, 2) ( 1, 3) ( 1, 4) ( 1, 5) ( 1, 6) ( 1, 7) ( 1, 8) ( 1, 9) ( 1,10) 
      ( 2, 1) ( 2, 2) ( 2, 3) ( 2, 4) ( 2, 5) ( 2, 6) ( 2, 7) ( 2, 8) ( 2, 9) ( 2,10) 
      ( 3, 1) ( 3, 2) ( 3, 3) ( 3, 4) ( 3, 5) ( 3, 6) ( 3, 7) ( 3, 8) ( 3, 9) ( 3,10) 
      ( 4, 1) ( 4, 2) ( 4, 3) ( 4, 4) ( 4, 5) ( 4, 6) ( 4, 7) ( 4, 8) ( 4, 9) ( 4,10) 
      ( 5, 1) ( 5, 2) ( 5, 3) ( 5, 4) ( 5, 5) ( 5, 6) ( 5, 7) ( 5, 8) ( 5, 9) ( 5,10) 
      ( 6, 1) ( 6, 2) ( 6, 3) ( 6, 4) ( 6, 5) ( 6, 6) ( 6, 7) ( 6, 8) ( 6, 9) ( 6,10) 
      ( 7, 1) ( 7, 2) ( 7, 3) ( 7, 4) ( 7, 5) ( 7, 6) ( 7, 7) ( 7, 8) ( 7, 9) ( 7,10) 
      ( 8, 1) ( 8, 2) ( 8, 3) ( 8, 4) ( 8, 5) ( 8, 6) ( 8, 7) ( 8, 8) ( 8, 9) ( 8,10) 
      ( 9, 1) ( 9, 2) ( 9, 3) ( 9, 4) ( 9, 5) ( 9, 6) ( 9, 7) ( 9, 8) ( 9, 9) ( 9,10) 
      (10, 1) (10, 2) (10, 3) (10, 4) (10, 5) (10, 6) (10, 7) (10, 8) (10, 9) (10,10) 
      

      解答例

      for i in range(1, 11):
          for j in range(1, 11):
              print(f'({i:2},{j:2}) ', end = '')
          else:
              print()
      

    3. 2重ループの基本2
    4. 設問 i. を変更して以下のように表示させてみましょう.

      ( 1, 1) 
      ( 2, 1) ( 2, 2) 
      ( 3, 1) ( 3, 2) ( 3, 3) 
      ( 4, 1) ( 4, 2) ( 4, 3) ( 4, 4) 
      ( 5, 1) ( 5, 2) ( 5, 3) ( 5, 4) ( 5, 5) 
      ( 6, 1) ( 6, 2) ( 6, 3) ( 6, 4) ( 6, 5) ( 6, 6) 
      ( 7, 1) ( 7, 2) ( 7, 3) ( 7, 4) ( 7, 5) ( 7, 6) ( 7, 7) 
      ( 8, 1) ( 8, 2) ( 8, 3) ( 8, 4) ( 8, 5) ( 8, 6) ( 8, 7) ( 8, 8) 
      ( 9, 1) ( 9, 2) ( 9, 3) ( 9, 4) ( 9, 5) ( 9, 6) ( 9, 7) ( 9, 8) ( 9, 9) 
      (10, 1) (10, 2) (10, 3) (10, 4) (10, 5) (10, 6) (10, 7) (10, 8) (10, 9) (10,10) 
      

      解答例

      for i in range(1, 11):
          for j in range(1, i + 1):
              print(f'({i:2},{j:2}) ', end = '')
          else:
              print()
      

  5. 演習

    今回の演習問題です.

  6. 本日のまとめ

    2重のループを使用して2次元表示的な作業を行いました.二つの変数(通常は i と j)が変化するとどのような処理になるのか,じっくりと考えながら作業を進めるようにしてください.その際にはフローチャート的な処理の組み立てを考えるステップと,思ったように結果が出ないときの処理を一つ一つ丁寧にたどっていって問題を見つけるステップが重要です.

  7. 宿題

    宿題が公開されるのは明日火曜日10:00の予定で,締切りは来週の月曜日12月8日の13:00です.

  8. 次回の予習範囲

    次回も引き続き教科書のp.102-114の範囲を学習しますので,予習をしてきてください.多重のループについて特に扱います.


目次ページに戻る