(5)05/18の授業内容

  1. 制御構造とは
  2. プログラムは通常上から順番に実行されます.この流れを変えるものが制御構造です.先週の例題では,返済額が2倍になるまで同一の処理を繰り返し実行するというwhile〜endを利用しましたが,これも制御構造の1つです

    制御構造は下記のように分類することができます

    逐次処理:プログラムを書かれたとおりに,上から順に実行する(特に指定を行わない場合の通常の処理)

    条件判断:ある条件が成り立つ場合は○○を,そうでない場合は××を実行する

    繰り返し:ある条件が成り立つ間,△△を繰り返し実行する

    例外処理:何か例外が発生した場合には□□を実行する

    ここでは条件判断と繰り返しについて説明します

  3. 条件判断
    1. if〜then〜elsif〜else〜end
    2. まずは下記のプログラムをemacsで入力し,if.rbという名前をつけて保存し,実行してみよう

      #!/usr/koeki/bin/ruby
      
      print "好きな数字を入力してください\n"
      a = gets.chomp!.to_i
      
      if a >= 10 then          #条件1(thenは省略可)
         print "big\n"           #条件1が成り立ったときに実施する処理
      elseif a >=5              #条件2 条件1が成り立たない場合
         print "medium\n"    #条件2が成り立ったときに実施する処理
      else
         print "small\n"        #条件12が成り立たなかったときに実施する処理
      end

      get:文字列を読み込むメソッド.数値ではなく文字列なので1や2と入力しても,そのままでは足し算や引き算はできない

      chomp!:キーボードから入力を行う際に必ず[Enter]を入力しますが,これも改行文字として取り扱われてしまいます.chomp!は末尾に改行がある場合に取り除くメソッドです

      to_i:文字列を整数に変換するメソッドです.小数点以下は切捨てとなります

    3. unless〜else〜end
    4. ifの場合はif以下の条件を満たす場合に処理を実行しますが,unlessでは条件を満たさない場合に処理を実行します.unlessを使用せずにifでも表現が可能です

      #!/usr/koeki/bin/ruby
      
      a = 20
      b = 30
      
      unless a > b
         print "aはbより大きくないです\n"
      else
         print "aはbより大きいです\n"
      end

    5. case〜when〜when〜else〜end
    6. 比較したいオブジェクトが1つ(aとbの大小関係の比較ではなく,aが特定の整数より大きいかどうかというような場合)で,その値によって場合わけを行う場合に使用する.whenはいくつでも続けることができ,whenの中に複数の値を指定することもできる

      #!/usr/koeki/bin/ruby
      
      print "1から10の好きな数字を入力してください\n"
      a = gets.chomp!.to_i
      
      case a
      when 1, 2, 3
         print "small\n"
      when 4, 5, 6
         print "medium\n"
      when 7, 8, 9, 10
         print "big\n"
      else
         print "範囲を超えました\n"
      end

  4. 繰り返し
    1. times
    2. 単純に一定回数繰り返す場合に用いる.以下のどちらの方法でもよい

      #!/usr/koeki/bin/ruby
      
      4.times {
        print "Hello\n"
      }
      #!/usr/koeki/bin/ruby
      
      6.times do
        print "Hello\n"
      end

    3. for〜end
    4. for 変数 in 開始時の数値..終了時の数値 do
         繰り返したい処理
      end

      これを用いて足し算を行うプログラムを作成すると下記のようになります

      #!/usr/koeki/bin/ruby
      
      sum = 0
      for i in 1..5
         sum = sum + i
      end
      print sum, "\n"

    5. while〜end
    6. for〜endでは1..5のように範囲指定を行うだけですが,while〜endでは比較演算子を用いて処理を実施する条件を示します.先週の課題でwhile〜endは実施済みですね.以下の例はすぐにわかりますか

      #!/usr/koeki/bin/ruby
      
      sum = 0
      i = 1
      while sum < 50
         sum += i
         i += 1
      end
      print sum, "\n"

    7. until〜end
    8. if〜then〜elsif〜else〜endに対して,unless〜else〜endがあるように,while〜endに対してもuntil〜endがあります.構造はwhileの場合と同じですが,条件を満たしていない場合に処理を実行します

      #!/usr/koeki/bin/ruby
      
      sum = 0
      i = 1
      until sum >= 0
         sum += i
         i += 1
      end
      print sum, "\n"

  5. これらを組み合わせたプログラムを作ろう
  6. まずは下記のプログラムをemacsで入力し,register.rbという名前をつけて保存し,実行してみよう

    #!/usr/koeki/bin/ruby
    
    sum=0
    while true
        STDERR.print "金額を入力してください(終了するときはqを押す): "
        item = gets.chomp!
            if item == "q" 
                then break
            end
         sum += item.to_i
     printf "          現時点の合計は %d 円です\n", sum
    end
    printf "お会計は %d 円になります\n", sum

    while true:while〜endの条件としてtrueを用いることができます.これは永遠に繰り返すという意味です.通常while〜endの内部に新たに条件文をつけ,その条件を満たした場合に処理が終了するようにします

    break:繰り返しの途中で,処理を中断する命令です.このプログラムではキーボードからqが入力されたときにbreakが実行されます.breakが実行されるとwhileの繰り返しを抜けて一番最後の行まで進んでしまいます

    STDERR.print:ユーザーに数値を入力させるときの表示に使用

    課題

    register.rbを改良しdebit.rbを作成する.register.rbはレジを想定し,商品の代金を繰り返し入力することで合計の金額を算出するプログラムであった.debit.rbが想定しているのはデビットカードでの支払いである.デビットカードは購入と同時に銀行口座から代金が引き落とされるシステムである

    このプログラムでは初期の銀行口座の残高を50万円とする.次々に商品を購入することにより,購入した累積金額と口座の残高が変化するものとする.

    register.rbからの変更点は以下のとおり

    • 現時点での合計金額を表示するだけでなく,現時点の口座の残高も表示すること.
    • この際printfを使い,printf"  現時点の合計は%d円,残高は%d円です\n" と1行で表示すること.
    • キーボードからqを入力した時点で処理を終了するのではなく,口座の残高がマイナスになった時点で処理を終了すること
    • このためにはif文の位置や条件を変更する必要があるので注意すること
    • (while sum <= 500000を用いればよいように感じるが,これでは結果出力で不都合が生じる.余裕のある人はこの理由について考えてみる)

    作成したプログラムや実行結果をメールでnaoya@e.koeki-u.ac.jp宛に送る.

    課題の提出期限は5月21日(土)17:00までです


    メール送信時の注意

    • Subjectは「学籍番号-kadai3」とすること
    • 本文の1行目ではまず名乗ること
    • 2行目以降は下記の構成で記載すること
      1. 作成したプログラム(メール本文に貼り付ける)
      2. プログラムの各部の説明
      3. プログラムの実行結果
      4. 感想

      今回のプログラムは誰が書いても同様のものになるので,プログラムの各部の説明を自分が理解した上で,自分の言葉でしっかりと書けているかどうかが評価のポイントとなる

      レポートのサンプルは下記を参照すること(広瀬先生のページ)

      良かったレポート

    Tips

    emacsについて

    • emacsで新しいファイルを作成する場合は,C-x C-fを押し,ミニバッファにkensaku/kadai2.rbのようにファイル名を入力する
    • ファイルの保存はC-x C-s
    • 日本語入力のオンオフの切り替えはC-o

    Mewについて

    • emacsを起動する
    • Escとxを押し,mewと入力しReturnEscとxを押すことを,一般にM-xと表記します)%<--これでMewが起動します
    • Mewを起動するとパスワードがたずねられるので入力しReturn
    • 新着メールの確認およびパスワードを間違えた場合はiと入力しReturn
    • メールを読む場合は,カーソルキー(矢印キー)で読みたいメールを選びReturn
    • メールの新規作成はwと入力
    • e-mailの本文にテキストファイルを読み込むには,新規送信メール画面の本文を記入するエリアにカーソルを移動し,Ctrl+x,iとすると,ミニバッファにInsert file: ~/と表示されるので,読み込みたいファイル名を入力する。
    • プログラムの実行結果の貼り付けは,kterm上の出力結果部分をマウスで選択し,Mewの本文の貼り付け位置にカーソルを移動し,マウスの真ん中ボタンをクリックする
    • メールの送信はC-c C-cと入力するか,もしくはメニューのsendアイコンをクリックする
    • Mewを終了するにはqと入力
    • emacsを終了する