- 本日の作業内容
- 出席確認
電子メールで出席確認をします.宛先など以下の情報を用いてメールを作成し,
出席申告してください.なお,キーワードは授業中に紹介します.
提出形式
宛先 |
justice@mag.shimane-u.ac.jp |
件名 |
AttendA11-21_ruby_s0540**
AttendB11-21_ruby_s0540** |
(Aクラス) (Bクラス) |
本文 |
学生番号
氏名
キーワード
|
(改行) (改行)
キーワードは授業中に紹介 |
注意 |
「件名」および「添付書類名」の**をそのままにしないで,必ず自分の学生番号
に修正して下さい.また,ABクラス別は指示にしたがって下さい.
|
- インデント
「制御構造」を扱い始めたので,インデント(字下げ)に注意するよう何度か説
明していますが,どのように字下げをするのか,例題を見てもわかりにくいかも
しれませんので,今一度,見本を示しておきます.現在までのところ,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
|
- 復習
前回学習した複雑な条件分岐において,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 が便利なことが分かります.
- 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
に相当するものはありません.注意してください.
- 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
|
- 演習
- 小テスト
授業の終わりに小テストを実施します.アナウンスに注意していて下さい.
- 宿題
宿題に関する案内が授業の終わりに紹介されます.注意にしたがって提出してく
ださい.
- 本日の用語