`` Natural To Roman
`` http://www.scriptol.net
`` Public Domain Program
`` Converts a natural number into roman notation

// Requires a Scriptol compiler and a C++ compiler or Php5.


class RomanToDecimal

    int  PostValue
    text PostLetter
    int  PreValue
    text PreLetter

    void RomanToDecimal(int a, text b, int c, text d)
        PostValue = a
        PostLetter = b
        PreValue = c
        PreLetter = d
    return

/class



array RomanConvert


``
``  nat2roman() - Convert a long integer into roman numerals
``  Input: natural value to convert
``  Ouput: roman conversion
``

text nat2roman(natural val)

    int place = 0
    text result
    RomanToDecimal rtd
    dyn d

    if val > 3999
        print val, "too big..."
        return null
    /if

    do
        d = RomanConvert[place]
        rtd = d.toObject()
        int pv = rtd.PostValue

        while val >= pv
            result + rtd.PostLetter
            val - pv
        /while

        if val >= rtd.PreValue
            result + rtd.PreLetter
            val - rtd.PreValue
        /if

        place + 1

    /do while val > 0

return result


int main(int argc, array argv)

    int value
    text roman
    dyn d

    if argc < 2
        print "Natural To Roman - www.scriptol.net"
        print "Syntax: roman2 number [number] ..."
        exit(0)
    /if

    RomanConvert.push( RomanToDecimal(1000, "M", 900, "CM"))
    RomanConvert.push( RomanToDecimal(500, "D", 400, "CD"))
    RomanConvert.push( RomanToDecimal(100, "C", 90, "XC"))
    RomanConvert.push( RomanToDecimal(50, "L", 40, "XL"))
    RomanConvert.push( RomanToDecimal(10, "X", 9, "IX"))
    RomanConvert.push( RomanToDecimal(5, "V", 4, "IV"))
    RomanConvert.push( RomanToDecimal(1, "I", 1, "I"))


    for int i in 1 -- argc
        value = argv[i].toInt()
        roman = nat2roman(value)
        if roman = null
            print "aborted..."
        else
            print value, "=", roman
        /if
    /for

return 0

main($argc, $argv)