プログラミング入門I
2023.11.20
while 文

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    今回の提出では形式的な問題やエラーなどが無かったので,まずは一安心でした.今後も提出前の確認をよろしくお願いします.

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

    if n % 2 ==0:
        if n % 4 == 0:
            print('An even number and a multiple of 4')
        else:
            print('An even number')
    elif n % 2 == 1:
        if n %  3 == 0:
            print('An odd number and a multiple of 3')
        else:
            print('An odd number')
    

    最初の if で偶数かどうかを見ているので,そこが偽であればもう残りは奇数しかありません.なので,もう if は要らないことになるので,else でいいですよね.

    if x % 2 == 0:
        if x % 4 == 0:
            print(f'An even number and a multiple of 4')
        else:
            print(f'An even number')
    if not x % 2 ==0:
        if x % 3 ==0:
            print(f'An odd number and a multiple of 3')
        else:
            print(f'An odd number ')
    

    こちらも2つ目のブロックで if を使っていますが,そこは if では無いです.

    if x % 2 == 0:
        if x % 4 == 0:
            print('Random number: {}'.format( x ))
            print('An even number and a multiple of 4')
        else:
            print('Random number: {}'.format( x ))
            print('An even number')
    else:
        if x % 3 == 0:
            print('Random number: {}'.format( x ))
            print('An odd number and a multiple of 3')
        else:
            print('Random number: {}'.format( x ))
            print('An odd number')
    

    乱数を表示する部分は条件分岐によって変わるわけではないので,中に入れると無駄な行が増えるだけです.

    if num % 2 == 0:
        if num % 4 == 0:
            print('Student number: s******')
            print()
            print(f'Random number:{num}')
            print('An even number and a multiple of 4')
        else:
            print('Student number: s******')
            print()
            print(f'Random number:{num}')
            print('An even number')
        
    else:
        if num % 3 == 0:
            print('Student number: s******')
            print()
            print(f'Random number:{num}')
            print('An odd number and a multiple of 3')
        
        else:
            print('Student number: s******')
            print()
            print(f'Random number:{num}')
            print('An odd number')
    

    さらに学生番号の表示まで分岐に入れるのはもう無駄でしか無いですねえ.

    if num1 % 2 == 0:
        if num1 % 4 == 0:
         print(f'Random number: {num1}')
         print('An even number and a multiple of 4')
        else:
         print(f'Random number: {num1}')
         print('An even number')
    else:
        if num1 % 3 == 0:
         print(f'Random number: {num1}')
         print('An odd number and a multiple of 3')
        else:
         print(f'Random number: {num1}')
         print('An odd number ')
    

    同じように乱数の表示を無駄に分岐の中に入れているのですが,それよりも入れ子になった内側の if 文のインデントがわかりにくいので,2文字分以上のスペースは取ってください.

    if a % 4 == 0 and a % 2 == 0:
        print('An even number and a multiple of 4')
    elif a % 2 == 0:
        print('An even number')
    elif a % 2 != 0 and a % 3 == 0:
            print('An odd number and a multiple of 3')
    else:
        print('An odd number')
    

    こちらも間違ってはいないのですが,論理演算子を使用することは,時には直感的にわかりづらくなることもあるので,注意してください.

    if num1 %2 == 0 and not num1 %4 == 0 :
        print(f'An even number')
        if  num1 %2 == 0 and num1 %4 == 0:
            print(f'An even number and a multiple of 4')
    else :
        if num1 %2 == 1 and not num1 %3 == 0 :
            print(f'An odd number')
        if  num1 %2 == 1 and num1 %3 == 0:
            print(f'An odd number and a multiple of 3')
    

    外側の if の条件式を内側の if でもう一度使用するというのは混乱します.そうならないような条件式を考えてください.

    if n%2==0:
        print('n is an even number.')
    else:
        print('n is an odd number.')
    if n>=4 and n%4==0:
        print('n is an even number and multiple of 4')
    if n%3==0 and n%2!=0:
        print('n is an odd number and a multiple of 3')
    

    上の例でも else で処理するのではなく,何度も if が出てきます.どれか一つの結果に収束する場合には適切ではないですし,下のように画面表示が間違ってしまうことを誘発します.

    Random number n:36
    n is an even number.
    n is an even number and multiple of 4
    

    x=random.randint(100,999)
    print(f'Random number: {x}')
    if x % 2 == 0:
        if x % 4 == 0:
            print('An even number and a multiple of 4')
        else:
            print('An even number')
    elif ((x // 100) + (x // 10) % 10 +  x - (x // 100 * 100 + (x // 10 % 10 * 10))) % 3 == 0:
        print('An odd number and a multiple of 3')
    else:
        print('An odd number')
    

    いろいろ問題がありすぎて,どこから見ていくか,です.発生させる乱数も間違っていますし,約数かどうかの判定も不必要に複雑になっていますし.

    if n1 % 2 == 0:
        print(f'An even number',end='')
        if n1%4 == 0:
            print(f' and a multiple of 4')
    
    
        
    else:
        print(f'An odd number',end='')
        if n1%3 == 0:
            print(f' and a multiple of 3')
    

    上の例も間違ってはいないのですが,前回も指摘したように if のブロックと else のブロックの間に空行がたくさん入っていて,一体的な処理ということが見えづらくなっています.人に見てもらう際に混乱を生じる可能性があります.

    import random
    
    print('Student number: s******')
    print('')
            
            
            
            
            
    print('\n------------------------\n')
            
            
            
    a=random.randint(10,99)
            
    print(f'Random number: {a}')
            
    if a % 2 == 0:
        if a % 4 == 0:
            print(f'An even number and a multiple of 4')
        else:
            print(f'An even number')
    else:
        if a % 3 == 0:
            print(f'An odd number and a multiple of 3')
        else:
            print(f'An odd number')
    

    解答用紙の使用法を説明した際に,どの部分にプログラムを記述するか,指定したはずです.どうして,ハイフンラインの後に書いてしまうのでしょうか?

    n=random.randint(10,99)
    m=n%2
    t=n%4
    u=n%3
            
    print('Student number: s236060')
    print('')
    print(f'Random number: {n}')
            
    if m==0:
        print('An even number ', end = '')
        if t==0:
            print('and a multiple of 4')
    else:
        print(f'An odd number ', end = '')
        if u==0:
            print('and a multiple of 3')
    

    変数の無駄遣いです.以前にわかりやすくするために,変数を置いた例を紹介してしまったので,それを引きずっているのかもしれませんが,基本的には,この程度の処理では変数 m, t, u は不要ですね.変数の名前の意味もよくわかりませんが.

  3. 前回の復習

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

  4. while 文

    今回からいよいよ反復処理を扱います.この反復処理こそがプログラムを作る最大の理由の一つです.反復処理というのは,同じ作業を変数の値を変えながら必要回数実行する処理で,いろいろな作業をどのように反復処理に落とし込むか,いわゆるアルゴリズムを考えることが,プログラミングの醍醐味です.

    初回の今回はまずは while 文ということで,変数の初期値,増分(場合によっては減分),実行条件を規定して,処理を繰り返すことが基本です.演習問題を通して学習していきましょう.

    1. while 文の基本
    2. 教科書の p.90(旧版では p.88)にある以下の構成が while 文の基本ですが,実際には以下のように変数の値の規定が必要になることが大半です.

      式で使用する変数初期値の指定
      while 式:
          スイート(処理や増分指定)
      

      初期値や増分が間違っていると,無限ループや1度も実行しないプログラムになってしまいます.

    3. 累算代入演算子
    4. 一般的に代入演算子と呼ばれるもので,反復処理において非常に重要です.まず理解しておかなければいけないこととして,プログラミングは数学と異なる部分があり,例えば以下のような表現があります.

      a = a + 1
      

      数学的には認められない表現ですが,プログラミングでは等号の記号は等しいことではなく,代入ですので,上の式は変数 a に 1 を加えたものを新たに変数 a に代入するということで,結局は変数 a の値を 1 増やすという操作になります.このような処理があまりに多く使用されるので,その操作にはインクリメントという名前がついています.そのため,以下のように簡略化して表現することが行われます.

      a += 1
      

      このような代入演算子はすべての演算子に対して用意されていますので,下記を参考に今後も使いこなしてください.

      記号 意味 動作例 a = 5 の場合
      +=左辺の変数の値を右辺の値だけ増やすa += 5 → a の値は 10
      -=左辺の変数の値を右辺の値だけ減らすa -= 2 → a の値は 3
      *=左辺の変数の値を右辺の値倍するa *= 3 → a の値は 15
      /=左辺の変数の値を右辺の値分の 1 にする(実数)a /= 4 → a の値は 1.25
      //=左辺の変数の値を右辺の値分の 1 にする(整数)a //= 4 → a の値は 1
      %=左辺の変数の値を右辺の値で割った余りにするa %= 2 → a の値は 1

    5. 無限ループになってしまったら
    6. 反復処理のプログラムを作成している途中で間違って無限ループを作ってしまうことはよくあります.通常はキー操作の Ctrl + C 終了させることができますが,IDLEを使用して run module により実行したときにはそのキー操作ではちゃんと止まってはくれないときがあります.その場合にはIDLEの画面をクリックしていったん処理を止めて,ウィンドウ右上の赤い×ボタンをクリックして強制的に終了させるか,しばらく待って Python のプロセス自身がお亡くなりになった状態で,やはり×ボタンで終了させるしかないようです.


      図1 無限ループを走らせておいた場合にIDLE画面をクリックした状態


      図2 ×ボタンを押したら出てくるダイアローグ

      教科書の p.7 には Ctrl + Z Enter で止まるとありますが,それではどうやら止まらないようです.
  5. 演習

    今回の演習問題です.

  6. 本日のまとめ

  7. 宿題

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

  8. 次回の予習範囲

    次回は教科書のp.102-114(旧版は p.100-111)の範囲を学習しますので,予習をしてきてください.


目次ページに戻る