情報科学概論(1年生)
2005.11.21

Back to index page



  1. 本日の作業内容

  2. 出席確認

    電子メールで出席確認をします.宛先など以下の情報を用いてメールを作成し, 出席申告してください.なお,キーワードは授業中に紹介します.

    提出形式

    宛先 justice@mag.shimane-u.ac.jp
    件名 AttendA11-21_ruby_s0540**
    AttendB11-21_ruby_s0540**
    (Aクラス)
    (Bクラス)
    本文 学生番号
    氏名
    キーワード
     
    (改行)
    (改行)
    キーワードは授業中に紹介
    注意 「件名」および「添付書類名」の**をそのままにしないで,必ず自分の学生番号 に修正して下さい.また,ABクラス別は指示にしたがって下さい.

  3. インデント

    「制御構造」を扱い始めたので,インデント(字下げ)に注意するよう何度か説 明していますが,どのように字下げをするのか,例題を見てもわかりにくいかも しれませんので,今一度,見本を示しておきます.現在までのところ,if 文を習って来たので,それについて多重になった場合の例とします.構造が発生するたびに2文字ずつ右 にずれて行きますが,対応するものがどれなのか分かりやすくなっています.

    hit = 7
    
    num = rand(10) + 1
    printf "You\'ve got the number %d\n", num
    
    if num < 3                                            #<= 階層1
    
      printf "Your number is too small to win a prize!\n"
      
      if num == 1                                         #<= 階層2
    
        printf "Yours are the smallest today.\n"
    
      end                                                 #<= 階層2
    
    
    elsif num < 6                                         #<= 階層1
    
    
      printf "Just a little bit smaller\n"
    
    
    elsif num == 10                                       #<= 階層1
    
    
      printf "The largest number we\'ve ever seen!\n"
    
    
    else                                                  #<= 階層1
    
    
      if num > 7                                          #<= 階層2
    
        printf "Just a little bit larger\n"
    
    
      elsif num < 7                                       #<= 階層2
    
        printf "Very near to the Jack Pot!\n"
    
    
      else                                                #<= 階層2
    
        printf "You\'ve got a prize now! "
        printf "Congraturations!\n"
    
      end                                                 #<= 階層2
    
    
    end                                                   #<= 階層1
    

  4. 復習

    前回学習した複雑な条件分岐において,if の「入れ子」と elsif の違いが分かりにくいと思った人がいたかもしれません.ここでは,もう 一度,その流れを復習してみましょう.

    閏年判定を判定を再び例に取ります.elsif を用いない場合には判断 がYESのものの方にどんどん進んで判定する方が分かりやすいスクリプトになり ます.一方,elsif を使う場合には,NOの方に進んで新たに判定を進 めることになります.しかし,現実はそう単純ではないので,次の二つのような違いになるでしょう.

    if 文だけのもの

    #year = rand(1000) + 1753
    year = 2400
    
    if year % 400 == 0
      str = "です"
    else
      if year % 100 == 0
        str = "ではありません"
      else
        if year % 4 == 0
          str = "です"
        else
          str = "ではありません"
        end
      end
    end
    
    printf "西暦%d年はうるう年%s.\n", year, str
    

    elsif を用いるもの

    #year = rand(1000) + 1753
    year = 2000
    
    if year % 400 == 0
      str = "です"
    elsif year % 100 ==0
      str = "ではありません" 
    elsif year % 4 == 0
      str = "です"
    else
      str = "ではありません"
    end
    
    printf "西暦%d年はうるう年%s.\n", year, str
    

    上の二つを比較すると,elsif が便利なことが分かります.

  5. unless

    if と意味が逆になるのが unless 文です.これも英語の意 味そのままですので,「もし〜でなければ」となります.すなわち,if 文では条件が「真」のときに処理が実行されましたが,unless では,条件が「偽」のときに処理が行われます.

    a = 10
    b = rand(2)
    
    if b != 0
      div = a / b
    else
      div = "不可能"
    end
    
    printf "a = %d, b = %d\n", a, b
    print "a / b = ", div, "\n"
    

    上の例では if 文を使用しています.これを変 換してみると,次の例のようになります.

    a = 10
    b = rand(2)
    
    unless b == 0
      div = a / b
    else
      div = "不可能"
    end
    
    printf "a = %d, b = %d\n", a, b
    print "a / b = ", div, "\n"
    

    unless 文においても else は使えますが,elsif に相当するものはありません.注意してください.

  6. case

    いくつかの選択肢について場合分けする場合に,elsif を用いること が可能であることは先週紹介しました.条件式によってはここで紹介する case 文を使用する方が簡単になる場合もあります.次の例は,m として与えた月が何日あるかを返すスクリプトです.

    m = 11
    
    case m
    when 2
      d = "28 or 29"
    when 4,6,9,11
      d = "30"
    else
      d = "31"
    end
    
    printf "%d月は%s日.\n", m, d
    

    when による条件指定はいくつでも置くことが可能です.また,上記の 例のように,一つの when のところに複数の条件を置くことも可能で す.

    when による場合分けはより柔軟な指定方法が可能です. 次の例は範囲指定するものです.

    a = (rand(30) - 10) / 10.0
    
    case a
    when 0..1
      d = "in"
    else
      d = "out of"
    end
    
    printf "The number is %s the range 0 ≦ x ≦ 1.\n", d
    

    この例では引数として与えた数値が0と1の範囲内にあるかを判定しています.す なわち,0 ≦ x ≦ 1 を判定しています.注意するのは,範囲指定でも 両側が決まっていないもの,例えば,正か負かを判定するような場合にはちょっ とした工夫が必要なことです.数値が正であるか,負であるか,それとも0であ るかを判定するには,次のようにします.

    a = (rand(30) - 10) / 10.0
    
    case a
    when 0
      d = "zero"
    when 0..(1.0/0)
      d = "positive"
    else
      d = "negative"
    end
    
    printf "The number is %s.\n", d
    

    また,「以上」や「以下」の判定は実現できますが,「大なり」「小なり」は工 夫が必要です.上の例では先に0であるかを判定させておいて,その後で正の判 定に移るようにしています.

    case 文において,when で指定できるのは変数や式の値だけ で,比較演算の結果などは使えないことに注意してください.すなわち,>= のような比較演算子を用いてその真偽で場合分けするようなことは case 文では出来ません.そのときには,if 文を使用してくださ い.次のは間違った例文ですので,希望するような動 作はしません.

    num = rand(10)
    
    case num
    when num >= 7
      printf "%d is large.\n", num
    when num <= 3
      printf "%d is small.\n", num
    else
      printf "%d is middle.\n", num
    end
    

    正しく行うためには次の if 文を用いたものか, 正しく範囲指定したもののようにしなければなりませ ん.

    num = rand(10)
    
    if num >= 7
      printf "%d is large.\n", num
    elsif num <= 3
      printf "%d is small.\n", num
    else
      printf "%d is middle.\n", num
    end
    

    num = rand(10)
    
    case num
    when 7,8,9
      printf "%d is large.\n", num
    when 0..3
      printf "%d is small.\n", num
    else
      printf "%d is middle.\n", num
    end
    

  7. 演習

  8. 小テスト

    授業の終わりに小テストを実施します.アナウンスに注意していて下さい.

    Aクラス小テスト
    Bクラス小テスト

  9. 宿題

    宿題に関する案内が授業の終わりに紹介されます.注意にしたがって提出してく ださい.

    Aクラス宿題
    Bクラス宿題

  10. 本日の用語

    • unless

      条件式が偽のときに与えられた処理をする if と逆の構文

    • case

      複数の場合分けに対応できる条件判断法

    • ..

      範囲の指定を表す記号.1..5 のように書くと1以上5以下の数が該当 する.


目次ページに戻る