2016-03-24 6 views
0

Ich erstelle eine Methode, die römische Zahlen in Ganzzahlen konvertiert. Ich habe dies geschrieben:Methode zum Konvertieren von römischen Zahlen in Arabisch druckt nicht die Antwort

def roman_to_integer(roman) 
    roman = roman.upcase 

    num_I = roman.count("I").to_i 
    num_V = roman.count("V").to_i 
    num_X = roman.count("X").to_i 
    num_L = roman.count("L").to_i 
    num_C = roman.count("C").to_i 
    num_D = roman.count("D").to_i 
    num_M = roman.count("M").to_i 

    rom_num = { "I" => 1, 
       "V" => 5, 
       "X" => 10, 
       "L" => 50, 
       "C" => 100, 
       "D" => 500, 
       "M" => 1000 } 

    while roman 
     if roman[0] == "M" 
     integer = num_M * rom_num["M"] + num_D * rom_num["D"] + num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"] 
     elsif roman[0] == "D" 
     integer = num_D * rom_num["D"] + num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"] 
     elsif roman[0] == "C" 
     integer = num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"] 
     elsif roman[0] == "L" 
     integer = num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"] 
     elsif roman[0] == "X" 
     integer = num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"] 
     elsif roman[0] == "V" 
     integer = num_V * rom_num["V"] + num_I * rom_num["I"] 
     elsif roman[0] == "I" 
     integer = num_I * rom_num["I"] 
     end 
    end 
    return integer 
end 

puts "Tell me any number in Roman System and I will convert it to the Arabic Number!" 
number = gets.chomp 
puts "Here is your number:" 
puts(roman_to_integer(number)) 

Wenn es um die letzte Zeile kommt, wo es aus dem Ergebnis gedruckt werden soll, bekomme ich nur die leere Eingabezeile in der Befehlszeile. Ich verstehe nicht, warum es nicht funktioniert und brauche Hilfe, um herauszufinden, wo der Code falsch ist.

Auch wenn ich

puts number.roman_to_integer 

als letzte Zeile verwenden, erhalte ich

private method "roman_to_integer" called on "":String (NoMethodError) 

Jede Hilfe würde geschätzt.

Antwort

2

Ihre Methode nicht zurück, da es in der while roman Block steckt - da Sie nicht über die roman Variable ändern, wird es immer truthy sein, und der Block wird auch weiterhin immer und immer wieder laufen, nie einen Wert zurückgibt :

while roman 
    #... runs forever 
end 

Unabhängig davon Ihre Methode scheint nicht zu tun, was Sie denken, es ist

+0

Prost! Entfernen "während" hat funktioniert! In der Tat wird es für "IX" im Moment nicht funktionieren. Ohne zu sehr ins Detail zu gehen - die Aufgabe war, es mit dem * alten * römischen System arbeiten zu lassen, das Dinge wie VIIII = 9 akzeptierte. Wie auch immer - ich werde versuchen, es später zu verbessern, damit es mit dem "IX" und "XL" usw. –

0

Entfernen Sie Ihre while Schleife. Ich denke nicht, dass es dem Code etwas hinzufügt. Ich habe auch die Formatierung verbessert und die to_s Methoden entfernt, die überflüssig waren.

def roman_to_integer(roman) 

    roman = roman.upcase 

    # Counts the occurrences of each letter from the input 

    num_I = roman.count("I") 
    num_V = roman.count("V") 
    num_X = roman.count("X") 
    num_L = roman.count("L") 
    num_C = roman.count("C") 
    num_D = roman.count("D") 
    num_M = roman.count("M") 

    # Assigns values to every Roman letter 

    rom_num = { "I" => 1, 
       "V" => 5, 
       "X" => 10, 
       "L" => 50, 
       "C" => 100, 
       "D" => 500, 
       "M" => 1000 } 

    # Multiplies the value of the letter by number of occurrences   


    if roman[0] == "M" 
    integer = num_M * rom_num["M"] + num_D * rom_num["D"] + num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"] 
    elsif roman[0] == "D" 
    integer = num_D * rom_num["D"] + num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"] 

    elsif roman[0] == "C" 
    integer = num_C * rom_num["C"] + num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"] 

    elsif roman[0] == "L" 
    integer = num_L * rom_num["L"] + num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"] 

    elsif roman[0] == "X" 
    integer = num_X * rom_num["X"] + num_V * rom_num["V"] + num_I * rom_num["I"] 

    elsif roman[0] == "V" 
    integer = num_V * rom_num["V"] + num_I * rom_num["I"] 

    elsif roman[0] == "I" 
    integer = num_I * rom_num["I"] 
    end 

    return integer 
end 

puts "Tell me any number in Roman System and I will convert it to the Arabic Number!" 

number = gets.chomp 
puts "Here is your number:" 
puts roman_to_integer(number) 

Auch puts number.roman_to_integer Arbeit machen Sie würden Ihre Methode der String-Klasse hinzuzufügen, die Sie übrigens nicht tun sollten.

+0

Yep Entfernen der 'while' es gelöst ('IX' gibt 1 zurück?)! Vielen Dank! Mit den Adding-Methoden zur String-Klasse - ok, das macht Sinn, so dass meine bestimmte Methode auf die Klasse der Zeichenfolge funktioniert. Ich weiß nicht, wie ich das machen soll und werde deinem Rat folgen, auch wenn ich herausfinde, wie es geht :) –

+0

Obwohl ich richtig war, habe ich nicht erklärt, warum, also hat @UriAgassi die bessere Antwort. Außerdem weist er darauf hin, dass Ihr Programm möglicherweise nicht korrekt ausgeführt wird. –

+1

Danke für die Wegbeschreibung! Ich bin neu hier bei StackOverflow und habe mir nur überlegt, wie die Dinge in der Community funktionieren. Ich habe @UriAgassi Antwort als die beste Antwort jetzt markiert. –

Verwandte Themen