![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
Pilgrim Anton |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 17.12.2004 Репутация: 1 Всего: 1 |
Можно использовать конечные состояния вместе с рекурсией.
В принципе это – не особо сложно. Рекурсия разбивает выражение на атомы, а с атомами работают конечные состояния. |
|||
|
||||
Наставник |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 4.11.2004 Репутация: 2 Всего: 15 |
quote=Pilgrim Anton, 17.12.2004, 17:55]Рекурсия разбивает выражение на атомы, а с атомами работают конечные состояния[/quote]
Это что-то типа "Разделяй и властвуй" - хм, кстати может быть и замечательная идея... хм, хотелось бы узнать, как с помощью рекурсии разбивать выражения на атомы, я понимаю там быстрая сортировка или подсчет факториала, когда данные однородные, но в данном случае данные не одного формата (числа, скобки и sin, cos ...) |
|||
|
||||
Pilgrim Anton |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 17.12.2004 Репутация: 1 Всего: 1 |
Наставник
Для начала нужно сформулировать что есть атом. Когда это станет понятно, то, думаю дальше пойдет легче. Еще идея: можно проставить недостающие скобки - это и будет разбиением на атомы. |
|||
|
||||
Наставник |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 4.11.2004 Репутация: 2 Всего: 15 |
Хм, может оно верно
но, как-то не могу выделить атом из потока данных.
К сожалению не понял, что Вы хотели этим сказать. А вообще чтобы не просто так говорить, лучше на примере всё это объснять, вот допустим очень простое выражение 2+(cos(34*6)+80 - (25^3))*11.5+((34/5-8)+exp(4*2+90)) Какие есть идеи? Это сообщение отредактировал(а) Наставник - 17.12.2004, 18:23 |
||||
|
|||||
Pilgrim Anton |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 17.12.2004 Репутация: 1 Всего: 1 |
Давайте разберем пример попроще: 3+6/8*cos(4+6*2)
Итак, 3+6/8*cos(4+6*2)= (3+((6/8)*(cos((4+(6*2)))))) В результате, каждое выражение находится в скобках, причем скобки строго указывают последовательность действий. |
|||
|
||||
Наставник |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 4.11.2004 Репутация: 2 Всего: 15 |
хорошо, можно и попроще. - но это ведь, по меньшей мере, маразм ![]() итак 3+6/8*cos(4+6*2) - можно вот с этим выражением повозиться, кроме анализатора, не представляю возможности как это можно было бы посчитать. Тут когда я парсер делал, мне попалась интересная статья, что можно разбирать выражения проще, если вначале их перевести в обратную польскую запись, тогда скобки убираются, и последовательность действий легко выполняется, найду сейчас пример... Добавлено @ 18:46 это по поводу тупого анализатора - Я так понимаю... создаем таблицу , в которой будет храниться операция и приоритет её, потом простым сравнением входного выражения с таблицей выполняем куски выражений -- но тут возникаем, как лучше хранить посчитанные куски выражения, в стек их пихать или как, просто встраивать во все выражение Это сообщение отредактировал(а) Наставник - 17.12.2004, 18:47 |
|||
|
||||
Pilgrim Anton |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 17.12.2004 Репутация: 1 Всего: 1 |
Атомом первого рода будем считать:
число. Атомом второго рода будем считать: 1) любой оператор L(a, b), где a, b - атомы первого рода (Например: +(2, 3)=2+3); 2) любой оператор L(a) , где а - атом первого рода (например: Cos(90)) Выражением будем считать: Оператор L(a, b), где 1) a - атом первого рода, b -атом второго рода 2) a - атом второго рода, b -атом первого рода 3) a - атом второго рода, b -атом второго рода 4) a или b - выражение Оператор L(a), где 1) а - атом второго рода 2) а - выражение Это - разбивка на атомы и выражения. Скобки нужны для разбивки на атомы, хотя над этим стоит еще подумать ![]() Это сообщение отредактировал(а) Pilgrim Anton - 17.12.2004, 18:52 |
|||
|
||||
Наставник |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 4.11.2004 Репутация: 2 Всего: 15 |
Хм, в теории более мение понятно... хотя конечно лучше на практическом примере.
Добавлено @ 18:58 Вот пример польской нотации.. (a*(c+d)+(e+f)*g)/(j+i) получим /+*a+cd*+efg+ji а в обратной польской нотации acd+*ef+g*+ji+/ а вот очень простой пример допустие есть выражение a*b+c Переводим в обратную польскую нотацию, получаем ab*c+ ---> ВЫПОЛНЕНИЕ загрузить a в аккумулятор A1 поместить в стек содержимое A1 загрузить b в аккумулятор A1 поместить в стек содержимое A1 извлечь из стека и поместить в аккумулятор A2 извлечь из стека и поместить в аккумулятор A1 выполнить умножение поместить в стек содержимое A1 загрузить c в аккумулятор A1 поместить в стек содержимое A1 извлечь из стека и поместить в аккумулятор A2 извлечь из стека и поместить в аккумулятор A1 выполнить умножение Это сообщение отредактировал(а) Наставник - 17.12.2004, 19:09 |
|||
|
||||
Pilgrim Anton |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 17.12.2004 Репутация: 1 Всего: 1 |
Цитата с сайта http://mathmatrix.narod.ru/AlgorR.html Надо попробовать будет |
|||
|
||||
Наставник |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 4.11.2004 Репутация: 2 Всего: 15 |
Насчет обратной польской записи я привел в ДОПОЛНЕНИЕ пример..
Добавлено @ 19:12 А вообще классная статья. (поставил бы +, да не могу.) Это сообщение отредактировал(а) Наставник - 17.12.2004, 19:13 |
|||
|
||||
Secandr |
|
|||
![]() Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
Да интересная статья, повысил репутацию.
|
|||
|
||||
EXTR |
|
|||
Unregistered |
Исходник на JS, может понадобится.
|
|||
|
||||
Alx |
|
|||
Ajaxy ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: 6 Всего: 78 |
ну тогда и мой пример посмотрите!
![]() ![]() http://portfolio.alx.com.ru/scripts/javascript/sumball2.html |
|||
|
||||
Наставник |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 4.11.2004 Репутация: 2 Всего: 15 |
Не это не дело на ЖаваСкрипт писать, так как встроенная функция eval - сама разбирает и вычисляет выражение, разговор же идет о том как лучше САМОМУ написать программу-скрипт - синтаксический анализатор.
Да и ваш пример, тоже :--((( Смысл, в чем -- как это функция - eval работает, вот тут интересно, а так, тут и думать почти не надо. |
||||
|
|||||
Vinipoo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 15.3.2006 Репутация: нет Всего: нет |
Пришлите программу РНР калькулятор, кто нибудь, сложный калькулятор.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |