Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > Ruby
Регистрация

Восстановить пароль
Повторная активизация e-mail



Ответ
 
Опции темы
Старый 06.12.2013, 23:10   #1
Dyaside
Новичок
 
Регистрация: 06.12.2013
Сообщений: 2
Репутация: 10
По умолчанию Стековый компилятор(Ruby)

Изменить что-то в коде, чтобы задача была решина:
Формулы, содержащие только записанные в десятичной системе счисления натуральные числа, абсолютная величина которых не превосходит 3999, компилируются в программы для стекового калькулятора, содержащие римские числа (в записи которых используются цифры I, V, X, L, C, D и M).
Код:

#!/usr/bin/env ruby
require_relative 'stack'
#
# Стековый компилятор формул преобразует правильные
# арифметические формулы (цепочки языка, задаваемого 
# грамматикой G0) в программы для стекового калькулятора
# (цепочки языка, определяемого грамматикой Gs):
#
# G0:
#     F  ->  T  |  F+T  |  F-T
#     T  ->  M  |  T*M  |  T/M
#     M  -> (F) |   V
#     V  ->  a  |   b   |   c   |  ...  |    z
#
# Gs:
#     e  ->  e e + | e e - | e e * | e e / | 
#            | a | b | ... | z 
#
# В качестве операндов в формулах допустимы только 
# однобуквенные имена переменных /^[a-z]$/
# 
class Compf < Stack
  # Константы, задающие тип символа
  SYM_LEFT  = 0 # '('
  SYM_RIGHT = 1 # ')'
  SYM_OPER  = 2 # '+', '-', '*', '/'
  SYM_OTHER = 3 # иные символы

  def initialize
    # Вызов метода initialize класса Stack
    super
    #Создание массива с результатом компиляции
    @data = Array.new
  end

  def compile(str)
    @data.clear
    # Последовательный вызов для всех символов 
    # взятой в скобки формулы метода process_symbol
    "(#{str})".each_char{|c| process_symbol(c)}
    @data.join(' ')
  end

  private

  # Определение типа символа
  def sym_type(c)
    case c
    when '('
      SYM_LEFT
    when ')'
      SYM_RIGHT
    when '+', '-', '*', '/'
      SYM_OPER
    else
      check_symbol(c)
      SYM_OTHER
    end
  end

  # Проверка допустимости символа
  def check_symbol(c)
    raise "Недопустимый символ '#{c}'" if c !~ /[a-z]/
  end

  # Обработка символа
  def process_symbol(c)
    case sym_type(c)
    when SYM_LEFT
      push(c)
    when SYM_RIGHT
      process_suspended_operators(c)
      pop
    when SYM_OPER
      process_suspended_operators(c)
      push(c)
    when SYM_OTHER
      process_value(c)
    end
  end

  # Заключительная обработка имени переменной 
  def process_value(c)
    @data << c 
  end

  # Заключительная обработка символа операции
  def process_oper(c)
    @data <<  c
  end

  # Обработка отложенных операций
  def process_suspended_operators(c)
    while precedes?(top, c) 
      process_oper(pop)
    end
  end

  # Определение приоритета операции
  def priority(c)
    (c == '+' or c == '-') ? 1 : 2
  end

  # Определение отношения предшествования
  def precedes?(a, b)
    return false if sym_type(a) == SYM_LEFT 
    return true  if sym_type(b) == SYM_RIGHT
    priority(a) >= priority(b)
  end
end

if $0 == __FILE__
  c = Compf.new
  loop do
    print "Арифметическая  формула: "
    str = gets.chomp
    print "Результат её компиляции: "
    puts c.compile(str)
    puts 
  end
end

Я нашел небольшой кусочек кода, который поможет в решении задачи, но не знаю как его пристроить
https://groups.google.com/forum/#!ms...A/45EEpZYcp2UJ
Как мне объяснили, то программа на вход должна получать:
Пример: 10+5
На выход: XV+

Последний раз редактировалось Dyaside; 06.12.2013 в 23:14.
Dyaside вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стековый калькулятор, чистый Си, реализовать его со связным списком anna27 Помощь студентам 4 09.05.2013 23:31
Компилятор с подмножества языка ruby xz2raza Фриланс 0 08.05.2011 13:54
стековый калькулятор Leva_89 C# (си шарп) 0 25.03.2011 23:23
Постфиксный (стековый) калькулятор (РЕКУРСИЯ) killer007 Фриланс 4 03.06.2010 09:25
Ruby, Ruby on Rails разработчик, Спб Ludmila.K Работа на постоянной основе 0 14.07.2009 12:29




04:53.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru