2016-03-24 13 views
0

Roma sayılarını tam sayılara dönüştüren bir yöntem oluşturuyorum. Ben bu yazdım:Roman sayıları arapçaya dönüştürme yöntemi, yanıt yazmıyor

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)) 

o sonucu yazdırmalısınız son çizgi, söz konusu, sadece komut satırında boş giriş hattını olsun. Neden işe yaramadığını ve kodun nerede olduğunu bulmakta biraz yardıma ihtiyacım olduğunu anlamıyorum.

Ben son satır olarak

puts number.roman_to_integer 

kullanmak Ayrıca, ben Herhangi bir yardım mutluluk duyacağız

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

olsun.

cevap

2

while roman satırında sıkışmış olduğundan yönteminiz geri dönmez - roman değişkenini değiştirmediğinizden, her zaman doğru olur ve blok tekrar tekrar çalışmaya devam eder, asla bir değer döndürmez :

while roman 
    #... runs forever 
end 

olursa olsun bunun, senin yöntem bunu mu sizce görünmüyor çıkarmadan

+0

Şerefe! 'while' kaldırarak çalıştı! Gerçekten, şu anda "IX" için çalışmayacak. Çok fazla ayrıntıya girmeden - görev, onu, VIIII. Gibi şeyleri kabul eden * eski * Roma Sistemi ile çalışmaktı. Her neyse - "IX" ile çalışmasını sağlamak için daha sonra geliştirmeye çalışacağım ve "XL", vb. –

0

while döngüsünüzü kaldırın. Kodlara hiçbir şey eklemediğini sanmıyorum. Ayrıca biçimlendirmeyi geliştirdim ve gereksiz olan to_s yöntemlerini kaldırdım.

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) 

Ayrıca bu arada yapmaması gereken String sınıfının, sizin yöntemi eklemek gerekir puts number.roman_to_integer çalışması için.

+0

Yep 'while' Çözmedim ('IX' 1 dönecektir?)! Teşekkür ederim! String sınıfına ekleme yöntemleri ile - bu mantıklıdır, böylece özel metodum string dizisinde çalışır. Bunu nasıl yapacağımı bilmiyorum ve nasıl yapacağımı öğrendiğimde bile tavsiyenizi yerine getireceğim :) –

+0

Doğru olmama rağmen nedenini açıklayamadım, bu yüzden @UriAgassi daha iyi bir cevaba sahip. Ayrıca programınızın düzgün çalışmayabileceğini işaret ediyor. –

+1

Yol tarifi için teşekkürler! StackOverflow'ta yeniyim ve kafamdaki şeylerin toplumda nasıl işlediğine bakıyorum. Şimdi en iyi cevap olarak @UriAgassi cevabını işaretledim. –