プロが教える店舗&オフィスのセキュリティ対策術

大学のレポートで下のような課題が出て、実際プログラムを自分で作って実行してみたのですが、全く無反応でいくら考えても原因がわかりません(T_T)批判されそうな質問かもしれないですが、留年かかっているので親切な方、助言お願いします。。

●下の動作をするプログラム(a.rb)を作れ
 %a.rb "+[1,20]
=>21
%a.rb "*[-1,25,4]
=>-100
●作ってみたプログラム↓
class Array
def list_ope
d=0 #最終的に返す値
s=0 #状態番号
x="" #一時的に数値を入れる
op="" #[+,-,*,/]
sgn=1 #マイナスの符号のあるなし
err=999999

self.each{|i|
case s #とりあえず、[+,-,*,/]をopに代入
when 0
op=i
s=1

when 1
if /\[/ =~ i 
s=2
else
s=err; bleak
end

when 2
sgn=1; x=0;
if /[1-9]/ =~ i #1~9の時
x+=i; s=3
elsif /-/ =~ i #マイナスの時
sgn=-1; s=3
else
s=err; bleak
end

when 3
if /[0-9]/ =~ i #0~9の時
x+=i;
elsif /,/ =~ i #コンマの時
x=sgn*x.to_i; s=4
elsif /\]/ =~ i #]の時
x=sgn*x.to_i; s=5
else
s=err; bleak
end

when 4 #コンマの時の処理
if /\+/ =~op
d=d+x
elsif /-/ =~ op
d=d-x
elsif /\*/ =~ op
d=d*x
elsif / =~ op
d=d/x
end
s=2

when 5 #]のときの処理
if /\+/ =~op
d=d+x
elsif /-/ =~ op
d=d-x
elsif /\*/ =~ op
d=d*x
elsif / =~ op
d=d/x
end
s=6 #終了状態
end
}
if s==6
return d #dを返す
else
print "error!"
end
end
end

A 回答 (3件)

>私のプログラムのダメなとこ


どこから手を付けていいのかよくわからない(添削したら、ほとんど変わってしまうので)ですが、
気の付いた所を書いておきます。
まず、
・このスクリプトがエラー無しには通りません。
/ =~ op
とか
s=6 #終了状態
とか
すくなくとも、エラーがでないものをアップしましょう。(実行できているということなので、多分違うものなのでしょう)
・コマンドの引数になっているから"op[n1,n2,n3]"はStringなのに、Array Classでメソッド定義をしている。
"*[-1,25,4]".list_ope
などとしたら、当然エラーになるはず(無反応のはずがないと思う、ここでも多分、何かが違う)
・-0とか0始まりの数字が通ってしまう(まあ、いいけど)、-,みたいなのが通ってしまう(状態変移する)
・クラスがStringだとしたら、String#eachは、一文字を取り出さない。
    • good
    • 0
この回答へのお礼

・・・何から何までありがとうございました。BLUEPIXYさんに教えていただいたことをちょっと工夫したらすぐ実行できました!感謝感謝です。。単位取れそうです

お礼日時:2005/03/02 17:10

>"2+5"と返ってきました。

計算まではどうやればいいのでしょうか
変ですね
でも、そこまで来たらevalするだけなのですが…
ひょっとしてevalが使えないのでしょうか?

ついでにまた別のやり方
exp=ARGV[0]
op=exp[0,1]
list=exp[1 .. exp.length]
a=eval(list)
case op
when "+"
result=0
a.each{|x| result+=x }
when "-"
result=a[0]
a[1 .. a.length].each{|x|result-=x }
when "*"
result=1
a.each{|x| result*=x }
when "/"
result=a[0]
a[1 .. a.length].each{|x|result/=x }
end
print result, "\n"

この回答への補足

そして、、引き続き私のプログラムのダメなとこ教えていただける方、、お願いしますm(_ _)m

補足日時:2005/02/27 02:11
    • good
    • 0
この回答へのお礼

ありがとうございました。確かにできました!
感謝です・・・!!(>v<)

お礼日時:2005/02/27 02:10

exp=ARGV[0]


op=exp[0,1]
len=exp.length
list=exp[1 .. len].delete!("[]").gsub!(",",op)
print eval(list), "\n"
とかは、ダメなんでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございました(*^^*)実行してみたのですが、例えば"+[2,5]"に対して"2+5"と返ってきました。計算まではどうやればいいのでしょうか。あと、私のプログラムは先生いわく「動きそうにもないプログラム」らしいので(笑)どこがダメなのかどなたか教えて下さい(なさけない・・)お願いします・・

お礼日時:2005/02/25 21:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!