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

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    今回は問題のあるものがいくつか見られました.こちらの意図としては単純な場合分けのはずでしたが,変に条件をややこしくして間違ってしまうというものが典型的なものでした.

    課題では無いものを提出: 24_51

    実行時エラー: 23_42 (中身については後述)

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

    Start time -- 04:52
    Elapsed time -- 12:55
    Finished time -- 17:47
    

    上のように文字が揃っていないものがいくつか見られました.実行例を載せていましたが,その実行例のように時刻は揃えて下さい.

    import random
    
    print('Student number: s******')  # 自分の学生番号に変更
    print()
    
    # この部分にソースを入力
    import random
    

    自分で一度プログラムを別のファイルに作ってそれを解答用紙にそのままペーストするとありがちなものですが,同じ import 文を2回書いています.動作としてはおかしくなったりはしないですが,本来このような記述はすべきではありません.気をつけてください.

    print('Student number: s******')  # 自分の学生番号に変更
    print()
    
    # この部分にソースを入力
    
    
    print('\n------------------------\n')
    num1 = random.randint(0,23)
    num2 = random.randint(0,59)
    time1 = random.randint(0,23)
    time2 = random.randint(0,59)
    
    print(f'Start time   -- {num1:>3}:{num2:>3}')
    print(f'Elapsed time -- {time1:>3}:{time2:>3}')
    num3 = num1 + time1
    num4 = num2 + time2
    if num3 >24:
        num3 = num1 + time1 -24
    elif num4 > 60:
        num4 = num2 + time2 -60
    print(f'Finished time - {num3:>3}:{num4:>3}')
    

    前も指摘したはずですが,自分のソースを記述するべき一はコメントで示している部分です.実行したときに最後にハイフンラインを出力して終わるようにしてください.

    total_minute = hour * 60 + minute + elapsed_hour * 60 + elapsed_minute
    final_hour = (total_minute // 60) % 24
    final_minute = total_minute % 60
    

    上のやり方は間違ってはいないようですが,そんなややこしいことをしなくてもいいように,今回の課題は単純なものにしたつもりでした.

    if msum >= 60:
        if hsum + 1 >= 24:
            print(f'{hsum + 1 - 24:02}:{msum - 60:02}')
        else:
            print(f'{hsum + 1:02}:{msum - 60:02}')
    else:
        if hsum  >= 24:
            print(f'{hsum - 24:02}:{msum:02}')
        else:
            print(f'{hsum:02}:{msum:02}')
    

    一つの if - else 節に全部を入れ込むようなことをすると間違える可能性が高くなります.上のものは間違ってはいなかったので良かったのですが,下のものは間違っていました.

    if 60<=totalmin:
        finishmin=totalmin-60 and totalhour+1 
    else:
        finishmin=totalmin
    if 24<=totalhour:
        finishhour=totalhour-24
    else:
        finishhour=totalhour
    if 24<=totalhour and 60<=totalmin:
        finishhour=totalhour-23
        finishmin=totalmin-60
    else:
        finishhour=totalhour
    if 60<=totalmin and 23

    2つの条件を and でつないでいるために,左側の条件を満足している状態でおかしいことになります.例えば,下のような結果が出たりします.

    Start time   -- 23:09
    Elapsed time -- 07:43
    Finished time - 30:52
    

    if time >= 60:
        hour1 = hour + 1
        f_time = time - 60
        if hour1 >= 24:
            f_hour = hour1 - 24
            print(f'Finished time - {f_hour:02}:{f_time:02}')
        else:
            print(f'Finished time - {hour1:02}:{f_time:02}')
    elif hour >= 24:
        f_hour = hour1 - 24
        print(f'Finished time - {f_hour:02}:{time:02}')
    

    上の例ですが,変数の hour1 は最初の if 節が真のときに定義されるのですが,定義されていない elif 節で使用しています.そのため,エラーになります.また,エラーでなくても,ケースによっては下のように最後の結果を表示しません.

    Start time   -- 16:07
    Elapsed time -- 02:17
    

  3. 前回の復習

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

  4. while 文

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

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

    1. while 文の基本
    2. 教科書の p.90にある以下の構成が 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月17日の13:00です.

  8. 次回の予習範囲

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


目次ページに戻る