我正在努力通过Chris Pine的书“学习编程”进行基本练习。但是,我遇到了语法错误,编译器不会让我使用'end'来关闭我的许多while循环。如何使此程序正确?感谢。
class StdClass def roman __romannumber __finalnumber = [mthousand,dfive,chundred,lfifty,xten,vfive,ione] while __romannumber != 0 while __romannumber >= 1000 __romannumber - 1000 mthousand++ end while __romannumber >= 500 __romannumber - 500 dfive++ end while __romannumber >= 100 __romannumber - 100 chundred++ end while __romannumber >= 50 __romannumber - 50 lfifty++ end while __romannumber >= 10 __romannumber - 10 xten++ end while __romannumber >= 5 __romannumber - 5 vfive++ end while __romannumber >= 1 __romannumber - 1 ione++ end end return __finalnumber[] end def initialize puts = 'Enter you number' aby = gets.chomp.to_i roman aby puts M*__finalnumber[0] + D*__finalnumber[1] + C*__finalnumber[2] + L*__finalnumber[3] + X*__finalnumber[4] + V*__finalnumber[5] + I*__finalnumber[6] end end x = StdClass.new
我不确定最后一次投注也是正确的。
答案 0 :(得分:2)
Ruby中没有++
运算符。你需要写mthousand += 1
。
M
,D
...是常量,如果您还没有定义它们,则会产生错误。你的意思可能是"M"
,"D"
......而是。
这些是您正在努力解决的语法错误;正如Justin Wood在评论中指出的那样,还有一些风格问题,即使它是正确的,也会使这种情况变得非常不完美。
编辑:还有逻辑错误。 __romannumber - 1000
的评估值低于__romannumber
,但不会更改__romannumber
。 Ruby中的数字是不可变的,因此执行mthousand += 1
不会更改__finalnumber
的内容,它只会更改mthousand
变量的内容(用旧数字替换旧数字)。 __finalnumber = [mthousand, ....]
会生成错误,因为此时未定义mthousand
。执行此操作的正确方法是首先将变量初始化为0:
mthousand = dfive = ... = ione = 0
然后做你的电池(顺便说一句,可以通过明智地使用除法/
和模运算符%
来取代),然后才最终构造一个数组返回。
答案 1 :(得分:0)
通过阅读Ruby手册可以使其正确。 mthousand++
不是允许的令牌。提示将来参考:为了进行正确的编程,有一种叫做#34的基本方法;阅读手册"。
答案 2 :(得分:0)
你正在努力实现这一目标。
不要为每个值使用while循环,例如V和I,请尝试:
所以,
if __romannumber > 1000
mthousand = (__romannumber / 1000).to_i
__romannumber = __romannumber - mthousand * 1000
end
我还没有对此进行测试,因此可能无法编译,但基本的想法是找到该值的数量,然后将其删除。
如上所述,可能不需要to_i
,但为了以防万一,我将其包括在内。