プログラミング入門I
2023.12.04
for 文

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    今回は軽微なミスが1件だけ見られました.減点されますので,こういうミスはなくしましょう・

    出力時番号間違い: b2328

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

    A = 10
    B = 99
    

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

        print(f'{rand_num:>6}\n', end='')
    

    出力文字列の末尾に改行を入れているのに,なぜかその後に空文字を入れる...

    for i in range(1,6):
        print(f'{random.randint(10**i,10**(i+1)-1):6}')
        i+=1
    

    Python だと正しい動作になるのですが,他の言語では間違った処理になります.for 文は変数の増分を自動で +1 にしてくれるので,最後の i+=1 は不要です.

    i = 1
    for _ in range(5):
        print(f'{random.randint(10 * i,99 * i + 1 * i - 1):6}')
        i *= 10
    

    このような処理が何件か見られました.先々週の while 文は変数の初期化や増分指定を自分で明記する必要がありますが,for 文は自動で行ってくれます.ですので,for 文で使用する変数に i を指定しておいて,それで処理を考えるのが通常のプログラムです.下線文字を使用するのではなく,そこに変数をおいて活用しましょう.単純な繰り返しのときのみ下線文字で十分ということになります.

    for i in range(5):
        for _ in range(6 - i -2):
            print(' ' , end = '')
        print(f'{random.randint(10 ** (i + 1), (10 ** (i + 2)) -1)}')
    

    print 関数で表示する文字幅を指定すれば不要な for 文が入っています.このような文字幅の指定と左右揃えなどは format メソッドや f 構文では必須なので,必ず覚えておいてください.10月23日の演習問題の vi. などですでに扱っていますし,教科書の p.158 (旧版では p.156) に詳しく載っています.

    for i in range(2,7):
        print(f'{random.randint(10 ** (i-1), (10 ** i) - 1):^6}')
    

    ^ の記号は中央揃えです.

    y = 1
    z = 1
    a = 4
    b = ' '
    
    for _ in range(5):
        x = random.randint(10 * y, 99 * z)
        print(f'{b * a}{x}')
        y *= 10
        z *= 10
        a -= 1
    

    for 文の変数を置かないで下線文字にしているために,もっと簡単にできるところたくさんの変数を置いて無駄なことをしています.また,変数の y と z は値が同じなので,2つ用意する必要も無いです.

    i=1
    a=1
    b=6
    for i in range(a,b,1):
        c=10**i
        d=10**(i+1)-1
        n1=random. randint(c,d)
        print(f'{n1:{b}}')
    

    変数 i の値が1ずつ増えるのなら range 関数にわざわざステップを指定する必要はありません.また,for 文の前で変数 i の値を初期化する必要もありません.

    for num_digits in range(2, 7):
        # 10^(桁数-1)から10^桁数-1までの範囲からランダムに整数を生成
        random_number = random.randint(10**(num_digits-1), 10**num_digits-1)
        
        # 右寄せで表示
        formatted_number = f"{random_number : > {num_digits}}"
        
        print(formatted_number)
    

    いろいろとコメントなども入れてくれていますが,結局動作としては以下のように左揃えになってしまっています.

    28
    210
    6582
    60297
    281756
    

    num=random.randint(10,99)
    for _ in range(5):
        print(f'{num}')
        num*=10
        num+=random.randint(0,9)
    

    作成する乱数をごまかしています.最初に2桁の乱数を出して,それ以後はその乱数を10倍して1桁の乱数を足しているだけなので,以下のように途中まで同じ数になってしまっています.

    75
    759
    7596
    75965
    759658
    

    i = 6
    for i in range(2, i + 1):
        a = random.randint(10 ** (i - 1), (10 ** i) - 1 )
        print(f'{a:6}')
    

    先ほどもありましたが,for 文の変数 i はその値を range 関数で指定しますので,それ以前に変数の値を代入していても意味はありません.

    for i in range(1,6):
        print(f'{random.randint(1 * 10 ** i,9.9 * 10 ** i):>6}')
    

    作成する乱数の値の範囲が適切ではありません.例えば3桁の正の整数は100から999までのどれかですが,上の例では100から990までとなります.

    for i in range(5):
        for _ in range(5 - i - 1):
            print(' ', end='')
        for _ in range(i + 2):
              print(f'{random.randint(1,9)}', end='')
        print()
    

    上のプログラムも処理をごまかしています.各桁数の乱数を発生するのではなく,1桁の数を桁数回出しているだけで,0も出ませんので,90や105のような0を含む数は決して出てきません.また,右揃えもスペースで埋めることで行おうとしているので,ダメです.

    さて,以下はまたもや出てきた絶対にやっちゃダメ!なプログラムです.理由はこれまでと同じで,与えられた課題に対して見かけだけなんとか繕おうとしているもので,課題の値の範囲が変更された場合に対応できないものだからです.例えば,2桁から始まって1000桁までの乱数を発生させるという場合だと,どうしますか?いいかげん,このような発想から抜け出して,プログラミング的な思考をしてください.

    for i in range(1):
        print(f'    {random.randint(10,99)}')
        print(f'   {random.randint(100,999)}')
        print(f'  {random.randint(1000,9999)}')
        print(f' {random.randint(10000,99999)}')
        print(f'{random.randint(100000,999999)}')
    

    num2 = random.randint(10, 99)
    num3 = random.randint(100, 999)
    num4 = random.randint(1000, 9999)
    num5 = random.randint(10000, 99999)
    num6 = random.randint(100000, 999999)
    
    for i in range(1):
        print(f'    {num2}', end = '')
    print()
    for i in range(1):
        print(f'   {num3}', end = '')
    print()
    for i in range(1):
        print(f'  {num4}', end = '')
    print()
    for i in range(1):
        print(f' {num5}', end = '')
    print()
    for i in range(1):
        print(f'{num6}', end = '')
    print()
    

    for _ in range(5):
        print(f'{num:>6}')
        if num < 99:
            num = random.randint(100, 999)
        elif num < 999:
            num = random.randint(1000, 9999)
        elif num < 9999:
            num = random.randint(10000, 99999)
        else:
            num = random.randint(100000, 999999)
    

    num1 = random.randint(10,99)
    num2 = random.randint(100,999)
    num3 = random.randint(1000,9999)
    num4 = random.randint(10000,99999)
    num5 = random.randint(100000,999999)
    
    num = [num1,num2,num3,num4,num5]
    
    for i in range(5):
       print(num[i])
    

  3. 前回の復習

    反復処理の2回目として for 文を扱いました.その前に学習した while 文と異なり,in メソッドと range 関数により変数の値を指定して繰り返しを行います.その際には,その変数をスイートの中で有効に使用することで,さまざまな処理を行うことができますので,今後もしっかりと学習していきましょう.

  4. for 文 その2

    今回も引き続き for 文について学習します.宿題のまとめのところでも簡単に説明しましたが,for 文は変数 i をどう使うかがポイントです.今回も例題を通してしっかり理解を深めて行きましょう.

  5. 演習

    今回の演習問題です.

  6. 本日のまとめ

  7. 宿題

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

  8. 次回の予習範囲

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

    また,次回は2回目の確認テストを行いますので,しっかり準備してきてください.範囲は while 文と for 文の多重ではないものです.


目次ページに戻る