@Katyusha_melnich

Как добавить операции plusCommand и minusCommand?

@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
  • Вопрос задан
  • 53 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы