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

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    残念ながら今回の結果は悲惨でした.問題のないプログラムは非常に少ない数しかなく,しかも剰余を使用しないものも膨大に提出されていました.

    まずは,形式的な不備ですが,以下のような状況でした.

    前回の課題提出: b2311

    出力時学生番号なし: b2335

    解答用紙の指名番号間違いと出力時番号間違い: b2345

    出力時番号間違い: prog2

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

    X=random.randint(97,122)
    

    変数名は小文字で始めるように何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も...

        print(f'{num3:c}', end=' ')
    

    end の指定で空文字列 '' では無く,空白文字 ' ' を指定しているので,当然以下のようにスペースが挿入されて表示されますね.

    d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z a b c 
    

    for _ in range (26 * 2):
        num = (num - 97) % 26 + 97
        print(f'{num:c}',end = '')
        num = num + 1
    

    今回も出てきました,下線文字を使ったために無駄な変数が必要になった例です.for 文は変数 i を上手に使用することが重要です.

    for i in range(0,52):
        print(f'{num+96:c}', end = '')
        num %= 26
        num += 1
    

    こちらの例ではせっかく変数 i を置いたのに,スイートの中で使用していません.なんで?

    for _ in range(2):
        for num in range(26):
            num=random.randint(97, 122)
            num<num and num>num
            print(f'{num:c}',end='')
    

    なんの意味があるブール値なんでしょうか?処理自体は単純にランダム文字列を生成するだけなので,表示は以下のようになり,題意とは全然違います.

    qtugbjyiivipmkilyscfxdakvjpgcjyijbtcqythaozppbeedkfn
    

    for _ in range(2):
        for i in range(97, 123):
            print(chr(i), end='')
    else:
        print()
    

    今回このような2重の for 文にするケースが多くみられましたが,理由がよくわかりません.単純に52回表示処理を行うだけのことですし.ただ,上のものは乱数が使用されておらず,結果は当然ですが以下のようになって,題意とは違います.

    abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
    

    for i in range(52):
        print(f'{num:c}',end='')
        if num<122:
            num+=1
        else:
            num=97
    

    今回 if 文は必要ありません.

    alphabet = 'abcdefghijklmnopqrstuvwxyz'
    
    random = random.randint(0, 25)
    
    cycle = ''
    for i in range(random, random + 26 * 2):
        cycle += alphabet[i % 26]
    
    print(cycle)
    

    こちらも今回多くみられたもので,アルファベット26文字を文字列として用意してそれをランダムに表示するというものです.間違ってはいませんが,特に必要は無いです.

    for _ in range(2):
        for i in range(letter, 123):
            print(f'{i:c}', end = '')
        for j in range(97, letter):
            print(f'{j:c}', end = '')
    else:
        print()
    

    先ほども例がありましたが,上のように2重の for 文にしている人が実に多くいました.なんで2重にするのでしょうか.そうであれば,2重のループのときの課題としますよ.内側の for 文が2つもあるのは,結局剰余が使えないためで,無駄な処理です.

    for n in range(2):
        for i in range(26):
            print(chr(((num2 + i) % 26) + 97), end = '')
    

    ということで,これも2重の for 文です.どうして52回繰り返すという単純な発想にならなかったのでしょうかね.

    for _ in range(2):
        for i in range(26):
            print(f'{(num+i)%123+((num+i)//123)*97:c}',end='')
    

    もう複雑すぎて何をやっているのか,理解できなくなりそうです.

    a = random.randint(1, 26)
    b = 'abcdefghijklmnopqrstuvwxyz'
    c = 0
    for _ in range(26 - a):
        print(b[a + c], end = '')
        c += 1
    print(b, end = '')
    print(b[1:a])
    

    まあ,できるんならそれでも良いのですが,まだ学習していない文字列を使用し,こちらもまだやっていないスライスを使う.それで全体が短く簡潔になるのならいいですが,どうでしょうかね?

    num=random.randint(97, 122)
    
    for i in range(52):
        print(f'{(num + i) % 26 + num :c}',end='')
    

    文字コードが 122 以降も使われているので,表示可能な文字ではない,変なものを出そうとしておかしくなっています.

    ŒŽ‘’“z{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“z{|}~€‚ƒ„…†‡ˆ‰Š‹
    

    def cycle_alphabet_twice():
        alphabet = 'abcdefghijklmnopqrstuvwxyz'
    
        random_char = random.choice(alphabet)
    
        result = (alphabet * 2).split(random_char, 1)[1][:26]
    
        print(result)
    
    cycle_alphabet_twice()
    

    わざわざ習ってもいない関数を使用してまでやっていますが,結果は下のように全然ダメです.

    fghijklmnopqrstuvwxyzabcde
    

    for _ in range(26):
         r= random.choice('abcdefghijklmnopqrstuvwxyz')
         print(r,end='')
    

    これもランダムにアルファベットを表示しているだけです.

    small = random.randint(97, 122)
    large = random.randint(97, 122)
    
    if small > large:
        samll, large = large, small
        
    for i in range(small, large + 27):
        print(f'{i:c} ', end ='')
    

    上のものも画面に表示可能な文字以外のコードを出す可能性がありますので,以下のように不正な表示を行って,お亡くなりになります.

    z { | } ~  € 
    

    for i in range(num1,123):
        print(f'{i:c}', end='')
    for i in range(97,123):
        print(f'{i:c}', end='')
    for i in range(97,num1):
        print(f'{i:c}', end='')
    else:
        print()
    

    反復処理は楽をするためにあるのに,なんでわざわざややこしいことをするんでしょうか.剰余を使っていないし.

    for i in range(26):
        print(f'{num:c}', end = '')
        num += 1
        x = num // 123
        num -=26 * x
    

    26回の繰り返しなので,当然表示はよくないのですが,これも変数 i はスイートの中に出てきません.結果は以下のようになってますが.

    mnopqrstuvwxyzabcdefghijkl
    

    for c in range(52):
        m=l%26
        print(f'{m+97:c}', end= '')
        c+=1
        l+=1
    

    変数 c は range 関数によって自動的に増えていくので, c+=1 は不要ですし,変数 l はスイートの中に出てこないので,まったく意味がありません.

    small = random.randint(97,122)
    
    for i in range(small, 123):
        print(f'{i:c}', end = '')
    else:
        print(f'', end = '')
    
    for i in range(97,small):
        print(f'{i:c}', end = '')
    else:
        print(f'', end = '')
    
    for i in range(small, 123):
        print(f'{i:c}', end = '')
    else:
        print(f'', end = '')
    
    for i in range(97,small):
        print(f'{i:c}', end = '')
    else:
        print()
    

    なんで変数名が small なのか,ということもありますが,それ以上に反復処理を分けてしまっているので,楽できません.こういう発想をとにかくやめましょう.今回剰余を使用することはわかっていたはずです.

  3. 前回の復習

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

  4. 多重ループ

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

    2重の for 文のポイント

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

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

  5. 演習

    今回の演習問題です.

  6. 本日のまとめ

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

  7. 宿題

    宿題が公開されるのは明日火曜日10:00の予定で,締切りは来週の月曜日12月18日の10:00です.レポート提出システムを使用します.

  8. 次回の予習範囲

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


目次ページに戻る