2low4...
12.06.2007 23:19
Доброго времени суток!
Вот такая вот есть задача, надо её решить...
Во входном файле задан текст, за которым следует точка. Проверить, является ли этот текст правильной записью «формулы», где «формулы»:
<формула>:: = <цифра> | <формула> <знак><формула>)
<знак>:: =+| - |*
<цифра>:: = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Решить задачу, используя рекурсию.
Входные данные находятся в файле input.txt. Файл студент формирует самостоятельно. Выходные данные на консоль и в файл output.txt.
Если там надо за как тут написано "денюжку" - не вопрос, просто хочется посмотреть как она решается, не 1 час над ней просидел...
Если что my ICQ := 262363792
Цитата
Если там надо за как тут написано "денюжку"
В конкретно этом разделе да. А вообще задача и похожие решались, поиск в помощь ...
Попробую навскидку объяснить, как это делается. Если ошибки будут, не пинайте, давно ничего подобного не писал, уж забыл много чего.
<формула>:: = <цифра> | <формула> <знак><формула>)
<знак>:: =+| - |*
<цифра>:: = 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, то формула удовлетворяет грамматике.