在Ruby中用罗马数字程序写一个简单的整数

时间:2014-03-24 01:25:29

标签: ruby

我正在努力通过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

我不确定最后一次投注也是正确的。

3 个答案:

答案 0 :(得分:2)

Ruby中没有++运算符。你需要写mthousand += 1

MD ...是常量,如果您还没有定义它们,则会产生错误。你的意思可能是"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,但为了以防万一,我将其包括在内。