Основные арифметические операции с пользовательским вводом - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу сделать четырехфункциональный калькулятор.Я пытался создать методы для хранения операций.

def mul
  puts num1*num2
end

def div
  puts num1/num2
end

def sub
  puts num1-num2
end

def add
  puts num1+num2
end

num1=gets.chomp.to_f
op=gets.chomp
num2=gets.chomp.to_f

puts "Multiplication=mul\n Addition=add\n Subtract=sub\n Division=div"
puts ("This is your answer"+num1+op+num2)

Но я не смог создать калькулятор.

Я попытался запустить код, но он не сработает.Может кто-нибудь помочь?

Ответы [ 4 ]

0 голосов
/ 27 февраля 2019

Наилучший способ для этого -

def perform_operation(op, a, b)
  op = { 'add' => '+', 'sub' => '-', 'mul' => '*', 'div' => '/' }[op]
  a.send(op, b)
end

num1=gets.chomp.to_f
op=gets.chomp
num2=gets.chomp.to_f

puts "This is your answer", perform_operation(op, num1, num2)

Если ваш op равен +, -, * или / передан путем ввода, вы можете напрямую сделать это без метода, как показано ниже,

puts "This is your answer", num1.send(op, num2)
0 голосов
/ 27 февраля 2019

После того, как вы определили методы с параметрами, например:

def sub(x, y)
  x - y
end

def add(x, y)
  x + y
end

После того, как вы соберете переменные, установленные пользовательским вводом (я назначаю с помощью жесткого кодирования, чтобы показать):

op = "add".to_sym # or user input
num1 = 10 # or user input
num2 = 20 # or user input

Вы можете использовать case case , чтобы выбрать результат для показа.Например:

res = case op
  when :add
    add(num1, num2)
  when :sub
    sub(num1, num2)
end

Таким образом, вы можете отобразить результат как:

puts res

Как уже упоминалось, вы также можете вызвать метод для ввода пользователя, используя send:

0 голосов
/ 27 февраля 2019

Использование heredoc и proc

def mul(num1, num2)
  num1 * num2
end

def div(num1, num2)
  num1 / num2
end

def sub(num1, num2)
  num1 - num2
end

def add(num1, num2)
  num1 + num2
end

puts 'First number'
num1 = gets.to_f

puts 'Second number'
num2 = gets.to_f

puts <<-OPERATORS
Multiplication = mul
Addition = add
Subtract = sub
Division = div
OPERATORS

op = method(gets.chomp).to_proc

puts "This is your answer: #{op.call(num1, num2)}"

Как это работает на примере String#downcase:

downator = :downcase.to_proc
downator.call('WORD') #=> "word"

# It is equal to
'WORD'.downcase #=> "word"

Этопотому что downator хранит блок proc { |arg| arg.downcase }

На практике это свойство часто используется для операций с массивами, например:

['WORD', 'STRING'].map(&:downcase) #=> ["word", "string"]

# It is equal to
['WORD', 'STRING'].map { |arg| arg.downcase } #=> ["word", "string"]
0 голосов
/ 27 февраля 2019

Вы не можете использовать локальные переменные, определенные вне метода в этом методе.Вместо этого вам нужно передать в качестве аргумента:

def mul(num1, num2)
  puts num1 * num2
end

Вам также не нужно использовать одинаковые имена переменных, используйте то, что имеет смысл в контексте метода:

def mul(a, b)
  puts a * b
end

mul(2, 3)
# prints 6

Методы обычно становятся более универсальными, если они делают одну вещь.Вышеуказанная реализация умножает a и b, а затем печатает результат через puts.Давайте переместим печать за пределы метода:

def mul(a, b)
  a * b
end

puts mul(2, 3)
# prints 6

Теперь мы можем выполнять фактические вычисления:

x = mul(2, 3) #=> 6
y = mul(2, 5) #=> 10
puts mul(x, y)
# prints 60

Это было бы невозможно с вариантом, включающим puts.


С пользовательским вводом и выводом: (используя целые числа для демонстрационных целей)

print "first factor: "
num1 = gets.to_i

print "second factor: "
num2 = gets.to_i

puts "#{num1} * #{num2} = #{mul(num1, num2)}"

Обратите внимание, что #{...} необходим для интерполяции других значений.

Примерсеанс:

first factor: 2
second factor: 3
2 * 3 = 6

Чтобы иметь различный вывод в зависимости от заданного оператора, вам нужно условное выражение, например: case:

op = gets.chomp

case op
when 'mul'
  puts mul(num1, num2)
when 'add'
  puts add(num1, num2)
# ...
end

Надеюсь, этоначну.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...