Je viens de commencer à apprendre le rubis et j'ai un petit projet sur lequel je travaille. Je crée une simple calculatrice de deux nombres. Ce que je veux faire, c'est demander à l'utilisateur de saisir deux nombres, puis de lui demander s'il souhaite les ajouter / soustraire / multiplier. Mon problème est que je veux qu'un message se déclenche si l'utilisateur ne saisit pas ajouter / soustraire / multiplier. Dites que l'utilisateur tape Annonce au lieu de Ajouter , je veux que l'ordinateur dise "Je ne comprends pas!" Je ne sais pas comment exécuter cela.

Voici mon code jusqu'à présent.

puts "Welcome to math.rb!"
puts "Enter a number!"
     user = gets.to_i
puts "Enter another number!"
    user2 = gets.to_i
puts "What would you like to do with your number? You can add, subtract, or multiply!"

math = gets.chomp.downcase 
if math == "add"
    puts user + user2
end 
if math == "subtract"
    puts user - user2
end
if math == "multiply"
    puts user * user2
end
if math != ["add", "subtract", "multiply"]
    puts "I don't understand"
end
1
Dym 29 août 2020 à 01:37

2 réponses

Meilleure réponse

Utilisez l'instruction if avec elsif et else.

math = gets.chomp.downcase 
if math == "add"
    puts user + user2
elsif math == "subtract"
    puts user - user2
elsif math == "multiply"
    puts user * user2
else
    puts "I don't understand"
end

case est également bien pour ce cas d'utilisation.

math = gets.chomp.downcase 
case math
when "add"
    puts user + user2
when "subtract"
    puts user - user2
when "multiply"
    puts user * user2
else
    puts "I don't understand"
end
2
shirakia 28 août 2020 à 22:45

Vous pouvez raccourcir davantage le code et utiliser un hachage pour stocker les opérations autorisées, et eval pour évaluer la chaîne résultante en tant qu'expression arithmétique. Même si eval n'est pas sûr dans de nombreux cas, nous contrôlons ici strictement son entrée, ce qui le rend beaucoup plus sûr.

Notez que pour contrôler l'entrée, je garde la conversion to_i (sans elle, l'utilisateur peut entrer des chaînes arbitraires, ce qui ne serait pas sûr d'être directement eval - ed). Le hachage contrôle en outre l'entrée en convertissant les opérateurs de chaîne en valeurs de hachage, que nous contrôlons complètement.

puts 'Welcome to math.rb!'
puts 'Enter a number!'
x = gets.to_i
puts 'Enter another number!'
y = gets.to_i
puts 'What would you like to do with your number? You can add, subtract, or multiply!'

op_str = gets.chomp.downcase

op_str_to_math = { 'add' => '+', 'subtract' => '-', 'multiply' => '*' }

if op_str_to_math.key? op_str
  puts eval "#{x} #{op_str_to_math[op_str]} #{y}"
else
  puts "I don't understand"
end

op_str_to_math = { ... } définit un hachage avec des paires de valeurs clés =>. Les éléments du hachage sont accessibles comme suit:

puts op_str_to_math['add'] # prints: +
puts op_str_to_math['subtract'] # prints: -

Nous vérifions si l'opérateur est autorisé en recherchant l'entrée utilisateur (op_str) parmi les clés de hachage: if op_str_to_math.key? op_str.

eval "..." évalue la chaîne. Étant donné que la chaîne est entre guillemets, les valeurs entre # {...} sont interpolées. Donc, si l'utilisateur a entré, par exemple, 2, 3, add, la chaîne est interpolée en 2 + 3, qui est 5.

Enfin, j'ai remplacé le cas échéant toutes les guillemets doubles par des guillemets simples, conformément aux conventions de codage Ruby.

1
Timur Shtatland 29 août 2020 à 02:02