Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверить правильность выражения 
:(
    Опции темы
AlexP11223
Дата 1.4.2012, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 11.10.2011

Репутация: нет
Всего: нет



Подскажите, как надо решать эту задачу? Что почитать?
Цитата

Проверить правильность выражения, заданного в виде строки S
 <выражение> ::= <цифра> | <выражение> + <цифра> | <выражение> – <цифра> 
 Если выражение составлено правильно, то вывести 0, в противном случае вывести номер первого ошибочного (или лишнего) символа в строке S.

PM WWW Skype   Вверх
DarkProg
Дата 1.4.2012, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: нет
Всего: 19



Парсинг строк и рекурсию.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
AlexP11223
Дата 1.4.2012, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 11.10.2011

Репутация: нет
Всего: нет



Парсить строки я умею, а рекурсию как использовать? Можно ссылку на что-нибудь по этой теме, а то что-то не особо гуглится?
PM WWW Skype   Вверх
ksnk
Дата 1.4.2012, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 7
Всего: 386



на каком языке решать-то? 
imho, метод рекурсивного спуска наиболее практичен для самодельных парсеров.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AlexP11223
Дата 1.4.2012, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 11.10.2011

Репутация: нет
Всего: нет



Pascal/Delphi

PM WWW Skype   Вверх
_Y_
Дата 1.4.2012, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(Omfgnoob123 @  1.4.2012,  20:49 Найти цитируемый пост)
рекурсию как использовать

Рекурсию используется для простоты алгоритма парсинга. При парсинге выделяется кусок (например, заключенный в скобки), этот кусок рекурсивно задается для парсинга той же функции, она парсит его и находит вложенные скобки... и так далее.

Понятно, что не только со скобками так. Приоритет операций, например, разбивать можно аналогичным образом.

ЗЫ: Во многих языках вроде бы есть встроенные или подключаемые библиотеки для парсинга мат или булевых выражений, записаннных текстом.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
AlexP11223
Дата 2.4.2012, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 11.10.2011

Репутация: нет
Всего: нет



А правильно ли я понимаю, что <выражение> ::= <цифра> | <выражение> + <цифра> | <выражение> – <цифра> означает, что строка  S может быть 
либо 8
либо 8 + 3
либо 8 - 3 (где 8 число, где 3 любая цифра)
или как? какие еще есть варианты? Что означает <выражение>?


Это сообщение отредактировал(а) Omfgnoob123 - 2.4.2012, 00:15
PM WWW Skype   Вверх
ksnk
Дата 2.4.2012, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 7
Всего: 386



Omfgnoob123, 

правильнее будет переписать эту конструкцию так

Код

<операция> ::= "+"|"-"
<выражение> ::= <цифра> [ <операция> <выражение >]


Вот и рекурсия почти в чистом виде.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
DarkProg
Дата 2.4.2012, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: нет
Всего: 19



Цитата(Omfgnoob123 @  2.4.2012,  01:07 Найти цитируемый пост)
Что означает <выражение>?

Это означает, что этот кусочек может иметь тот же формат, что и всё исходной выражение, и что к нему надо подходить с той же точки зрения парсинга, как и к общему выражению.
Рекурсия, в общем и наиболее простом понимании - это вызов функции себя же самой, так для примера абсолютно непрактичный кусочек кода
Код

procedure MyInc(Var p, s:integer);
begin
  p:=p+1;
  if p<s then MyInc(p, s);
end;

Я думаю понятно, хотя сама по себе функция бессмысленна.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
AlexP11223
Дата 25.5.2012, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 11.10.2011

Репутация: нет
Всего: нет



Сделал с помощью этого самого рекурсивного спуска, однако препод сказал, что надо через дерево. 

Погуглил дерево разбора, но как-то все примеры сложные (когда выражения более сложные, где  важен приоритет операций и т.п.), а в деревьях и графах я плохо разбираюсь. Никто не подскажет с чего начать и как бы это реализовать?


PM WWW Skype   Вверх
Pavia
Дата 26.5.2012, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Omfgnoob123, 
В данной постановки профессор дурак либо вы что-то не поняли. Так как при помощи дерева проверяются не грамматические правила, а семантические. 

Дерево является результатом грамматического анализа. Вам всего навсего надо построить дерево в процессе вашего рекурсивного спуска.
Делается это при выходи из рекурсии добавляя результирующее дерево, то в левое, то в правое поддерево.

Это сообщение отредактировал(а) Pavia - 26.5.2012, 08:58
PM MAIL   Вверх
user07
  Дата 19.12.2012, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.10.2012

Репутация: нет
Всего: нет



НУ, КАКИЕ ПРЕДЛОЖЕНИЯ ИМЕЮТСЯ ПО ЗАДАННОЙ ЗАДАЧЕ??? smile
Проверить правильность выражения, заданного в виде строки S. Если выражение составлено правильно, то вывести 0, в противном случае вывести номер первого ошибочного (или лишнего) символа в строке S.  
НА СИ++ ИЛИ PASCAL

Это сообщение отредактировал(а) user07 - 19.12.2012, 14:51
PM MAIL   Вверх
maxim1000
Дата 19.12.2012, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



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

если нужна конкретная реализация - лучше в Центр Помощи


--------------------
qqq
PM WWW   Вверх
Akina
Дата 19.12.2012, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(Omfgnoob123 @  1.4.2012,  21:21 Найти цитируемый пост)
 <выражение> ::= <цифра> | <выражение> + <цифра> | <выражение> – <цифра> 


Цитата(ksnk @  2.4.2012,  08:44 Найти цитируемый пост)
<операция> ::= "+"|"-"
<выражение> ::= <цифра> [ <операция> <выражение >]

Неэквивалентно. 
1+2 соответствует второму, но не соответствует первому.

Добавлено через 6 минут и 9 секунд
Цитата(Omfgnoob123 @  2.4.2012,  01:07 Найти цитируемый пост)
А правильно ли я понимаю, что <выражение> ::= <цифра> | <выражение> + <цифра> | <выражение> – <цифра> означает, что строка  S может быть 
либо 8
либо 8 + 3
либо 8 - 3 (где 8 число, где 3 любая цифра)
или как? какие еще есть варианты? Что означает <выражение>?

Неправильно понимаешь.
Вот пример простого выражения:
1+2-9
При этом на месте цифр 1 и/или 2 может стоять легитимное выражение. Например, если такое легитимное выражение будет 3+4-5, и оно стоИт только вместо первой цифра, то ты имеешь легитимное выражение:
3+4-5+2-9
Если вместо второй, то:
1+3+4-5-9
Если вместо обеих, то:
3+4-5+3+4-5-9
В любом из этих трёх выражений любая цифра любого подвыражения точно так же может быть заменена на любое легитимное выражение. Неограниченное количество раз.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 19.12.2012, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



На самом деле в данной конкретной задаче всё проще.
В легитимном выражении:
1) Перваый и последний символы - цифры;
2) После цифры - знак плюс или минус;
3) После знака - цифра;
4) Количество плюсов в любом фрагменте от начала не меньше количества минусов;
5) Общее количество плюсов равно количеству минусов.
Так что просто сканируем строку до первого несоответствия. Не встретилось - последовательность легитимна. Встретилось - это и есть начало косяка.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0748 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.