![]() |
Начальные контакты ТОЛЬКО через личку!!
![]() ![]() |
![]() |
2low4... |
![]()
Сообщение
#1
|
Гость ![]() |
Доброго времени суток!
Вот такая вот есть задача, надо её решить... Во входном файле задан текст, за которым следует точка. Проверить, является ли этот текст правильной записью «формулы», где «формулы»: <формула>:: = <цифра> | <формула> <знак><формула>) <знак>:: =+| - |* <цифра>:: = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Решить задачу, используя рекурсию. Входные данные находятся в файле input.txt. Файл студент формирует самостоятельно. Выходные данные на консоль и в файл output.txt. Если там надо за как тут написано "денюжку" - не вопрос, просто хочется посмотреть как она решается, не 1 час над ней просидел... Если что my ICQ := 262363792 |
klem4 |
![]()
Сообщение
#2
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Цитата Если там надо за как тут написано "денюжку" В конкретно этом разделе да. А вообще задача и похожие решались, поиск в помощь ... -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Гость |
![]()
Сообщение
#3
|
Гость ![]() |
Попробую навскидку объяснить, как это делается. Если ошибки будут, не пинайте, давно ничего подобного не писал, уж забыл много чего.
<формула>:: = <цифра> | <формула> <знак><формула>) <знак>:: =+| - |* <цифра>:: = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Это приводится к грамматике: F = D F = F S F S = + S = - S = * D = 0 ... D = 9 Теперь программируем грамматику, используя функции (по одной на один нетерминальный символ): (юзаем заранее определённые процедуры "взять токен" и "определить принадлежность нетерминальному символу", т.е. T(oken) = D, S, F и т.д.). T - текущий токен. Конструкция T = ... означает совпадение первого токена с первым токеном соответствующего нетерминального символа. "Ошибка" подразумевает выход из алгоритма с возвращение отрицательного результата ("не соответствует грамматике"). вот псевдокод. F(): { взять токен, если T=D, то D(), иначе если T=F, то F(), иначе Ошибка; взять токен, если T=S, то S(), иначе Ошибка; взять токен, если T=F, то F(), иначе Ошибка; взять токен, если T не является пустой строкой, то Ошибка, иначе - корректно. } D(): { взять токен, если T<> '1' и T<>'2' ... и T<>'9', то Ошибка; } S(): { взять токен, если T<>'-' и T<>'+' и T<>'*', то Ошибка. } Теперь просто где-нибудь в коде вызываем F() - и синтаксический анализ пошёл. Если вызов F() самого верхнего уровня вернёт true, то формула удовлетворяет грамматике. |
![]() ![]() |
![]() |
Текстовая версия | 30.07.2025 23:40 |