@zmin=0
@num1 = 0
@num2 = 0
@oper = 0
@memory = 0
$stack=[]
@mas = ['+', '-', '*', '/', '**', '%', '--', '++', 'cos', 'sin', 'tg', 'ctan', 'ln', 'sqrt', '!', 'primes','pop','push','stack']
# проверяем есть ли строка числом
class String
def numeric?
Float(self) != nil rescue false
end
def is_integer?
self.to_i.to_s == self
end
end
# проверяем есть ли флот после запятой
class Float
def numeric?
true
end
def is_integer?
self.to_i.to_s == self
end
end
# возвращаем 3 если введенная строка не операция и не число, 1 если это число, 2 если операция
def char_or_namber(number_or_char)
if number_or_char.numeric?
return 1
else
r = false
@mas.each do |op|
if op == number_or_char
return 2
break
end
end
return 3
end
end
# факториал заданного числа
def factorial(ans)
if ans <= 2
return ans
else
return ans * factorial(ans - 1)
end
end
puts "Calculator has started"
a = 3
puts "Ведите первое число"
# первый ввод обрабатываем отдельно
while a == 3
@num1 = gets.chomp
if @num1 == "mr"
@num1 = @memory
puts @num1
break
end
a = char_or_namber(@num1)
if a == 3
puts "Error"
end
end
# ввод второго числа и есть возможность выгрузить с ячейки памяти данные
def cin_number_two()
a = 3
while a == 3
@num2 = gets.chomp
if @num2 == "mr"
@num2 = @memory
puts @num2
break
end
a = char_or_namber(@num2)
if a == 2
@oper = @num2
start_execution
return
end
if a == 3
puts "Error"
end
end
end
#чи число є простим
def isPrime(a)
for i in 2...a do
if a % i == 0
return false
end
end
return true
end
# проверяем есть ли такая операция, унарная ли она, если нет вводим 2 аргумент
def start_execution()
case @oper
when "+"
cin_number_two
@num1 = @num1.to_f + @num2.to_f
when "-"
cin_number_two
@num1 = @num1.to_f - @num2.to_f
when "/"
cin_number_two
@num1 = @num1.to_f / @num2.to_f
when "**"
cin_number_two
@num1 = @num1.to_f ** @num2.to_f
when "*"
cin_number_two
@num1 = @num1.to_f * @num2.to_f
when "%"
cin_number_two
@num1 = @num1.to_f % @num2.to_f
when "primes"
cin_number_two
@zmin = $stack.pop()
$stack.push(@zmin)
while @zmin.to_f < @num2.to_f do
@zmin += 1
num = @zmin.to_f
if isPrime(num)
$stack.push(num)
end
end
when "--"
@num1 = @num1.to_f - 1
when "cos"
@num1 = Math.cos(@num1.to_f)
when "sin"
@num1 = Math.sin(@num1.to_f)
when "++"
@num1 = @num1.to_f + 1
when "tg"
@num1 = Math.tan(@num1.to_f)
when "ctan"
@num1 = Math.sin(@num1.to_f) / Math.sin(@num1)
when "ln"
@num1 = Math.ln(@num1.to_f)
when "sqrt"
@num1 = Math.sqrt(@num1.to_f)
when "!"
@num1 = factorial(@num1.to_f)
when "pop"
puts $stack.pop()
when "push"
$stack.push(@num1.to_f)
when "stack"
puts $stack
end
end
# вводим операцию
def operation()
a = 3
while a == 3
puts "Введите операцию"
@oper = gets.chomp
if @oper == "mr"
@num1 = @memory
puts @num1
operation
return
end
if @oper == "mw"
@memory = @num1
puts "Число сохранено!"
operation
return
end
a = char_or_namber(@oper)
if a == 1
@num1 = @oper
operation
end
if a == 3
puts "Error"
end
end
end
# Здесь просто зациклим чтобы калькулятор работал постоянно
while true
operation # вызывает ввод операции
start_execution # вызываем начало проверки операции
puts "Ответ"
puts @num1
end