最初は何もしない(読んだ行を無駄に捨てるだけの)プログラム
while gets do
end
空白で分割してトークンに分割
while gets do
a=$_.split
end
内側のループの外枠のみ (これは配列aに変化がなく無限ループになり動作しない)
while gets do
a=$_.split
while a.length > 1 do
end
end
トークンを3つ取り出し、演算し、答えを戻し入れる
while gets do
a=$_.split
while a.length > 1 do
l=a.shift
ope=a.shift
r=a.shift
result=calc(ope,l,r)
a.unshift result
end
end
関数 calc のダミー版
def calc(op, v1, v2)
puts "calc(#{op},#{v1},#{v2})"
end
関数 calc の実効版
def calc(o,r,l)
case o
when '+' then r+l
when '*' then r*l
when '-' then r-l
when '/' then r/l
end
end
shift(3) (要素3つをまとめて取り出す)を使ってループにする
この段階では値を書き戻していないため動作しない。
while gets do
a=$_.split
while l, ope, r = a.shift(3) do
result=calc1(ope,l,r)
end
end
結果の値を書き戻す。
このとき、配列aは空にならないので、上記の条件では内側ループが終了しない。
ope に入る値が a から取り出せずに ope に nil が代入されると終了する、
という論理でならうまくいく筈。
内側ループが終了した時点で、変数 l に計算結果(普通電卓として)が残っている ので、それを印字することにする。
while gets do
a=$_.split
while l, ope, r = a.shift(3) and ope do
result=calc1(ope,l,r)
a.unshift result
end
puts l
end
(最後の変更は大したことではないが)変数 resultは使わなくてもいい。 (これでプログラムが読みやすくなるかどうかは意見が別れるところだが)
while gets do
a=$_.split
while l, ope, r = a.shift(3) and ope do
a.unshift calc(ope,l,r)
end
puts l
end
この過程に沿って作成実演したソースファイル も参考に利用下さい。