2017-04-06 1 views
1

Je convertis des nombres romains en nombres et vice versa en utilisant une instruction case. Mon cas prend un vrai ou faux en vérifiant si je saisis une chaîne ou un entier. Si je saisis 5 je devrais sortir V et si je sais M je devrais sortir 1000. Je suis capable d'obtenir mon "Faux" cas pour fonctionner correctement. Mais je ne peux pas faire fonctionner mon cas "vrai".Conversion de chiffres romains dans une approche différente

J'ai inversé mon Roman_Numerals pour être un hachage inverse appelé Arabic_Numerals. Je ne vois pas pourquoi mon cas true ne fonctionne pas comme il l'a fait le contraire.

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

#Reverses the Roman Numerals and Arabic Numbers around in the Hash 
#to look like 1000 => "M". 
Arabic_Numberals = Hash[Roman_Numerals.to_a.reverse.reverse] 

input = gets.chomp.upcase 

def numeric? 
    Float(self) != nil rescue false 
end 

true_false = input.numeric? 
#Looks for true or false from true_false variable. Then goes through 
#the case to convert a roman numeral or a number. 
case true_false 
when false 
    #Converts a Roman Numeral to a Number 
    Roman_Numerals.each do |roman, value| 
    puts "#{roman}:#{value}" 
    if roman == input 
     puts "Answer: The Roman Numeral '#{input}' => #{value}." 
     break 
    else 
     next 
    end 
    end 
    #Converts a Number to a Roman Numeral 
when true 
    Arabic_Numberals.each do |arabic, letter| 
    puts "#{letter}:#{arabic}" 
    puts "#{input}" 
    if input == arabic 
    puts "Answer: The Number '#{input}' => #{letter}" 
    break 
    else 
    puts "Why isn't this code working?" 
    next 
    end 
end 
end 

conseils sur S'il vous plaît pourquoi mon false cas ne fonctionne pas. Je ne suis pas sûr pourquoi arabic == input ne fonctionne pas.

Répondre

1

Il y a 2 erreurs, premier:

Arabic_Numberals = Hash[Roman_Numerals.to_a.reverse.reverse] 

Ce code ne littéralement rien. Ce que vous voulez faire ici est échange les clés/valeurs, de sorte que vous pouvez utiliser Hash#invert:

Arabic_Numberals = Roman_Numerals.invert 

L'autre est lorsque vous comparez l'entrée:

if input == arabic 

Il comparera '5' == 5, qui est faux. Vous devez convertir l'entrée en nombre entier avant de comparer:

if input.to_i == arabic 

J'espère que ça aide!

+0

J'ai essayé le input.to_i avant que je crois ... mais peut-être la partie .invert fixerez mon problème. J'ai essayé plusieurs scénarios, mais laissez-moi essayer cela plus tard à la maison ce soir et je vais vous donner mes résultats. – balee1991

+0

C'est parce que le '.to_i' ne fonctionnerait pas sans le hachage corrigé (il comparerait' 5 == 'V'') –

+0

Utilisant .invert et convertissant input.to_i à l'argument travaillé. Je vous remercie. – balee1991

1

J'ai supprimé beaucoup de commentaires et de conditions supplémentaires de votre code. S'il vous plaît voir si la version suivante du code est ce que vous cherchez:

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

input = gets.chomp.upcase 

def numeric? 
    !!Float(self) rescue false 
end 

if input.numeric? 
    puts "Answer: The Number '#{input}' => #{ROMAN_NUMBER_MAP.key(input.to_i)}" 
else 
    puts "Answer: The Roman Numeral '#{input}' => #{ROMAN_NUMBER_MAP[input]}." 
end 
+0

L'instruction if fonctionne, mais l'instruction else échoue. Bien que je puisse voir comment cela peut raccourcir le code un peu. En outre, la méthode numérique? Il manque un "public" avant. Ça ne marchera pas jusqu'à ce que j'ajoute ça là. – balee1991