[Парсер] Еще один Эвалютатор мат. выражений

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

[Парсер] Еще один Эвалютатор мат. выражений

Сообщение pronto » 30.10.2006 (Пн) 18:32

Много уже было сказано про вычисления выражений в виде инфиксной записи (1+1 = 2). Поэтому без лишних слов представляю свою версию.
Она мною сознательно немного урезана. Немного разобравшись (комментариев для этого достаточно) в коде можно легко его развить до более функционального :)

Код: Выделить всё
   Программыный калькулятор, использующий Обратную польскую нотацию (или Постфиксную или Полиз или Reverse Polish Notation (RPN)) - это такая запись математических выражений, в которой операнды расположены перед операторами.

   Вычисления в обратной польской нотации основаны на стеке, это означает, что операнды достаются из стека, и результат вычисления кладётся обратно в стек. На первый взгляд это может выглядеть непонятно, однако, обратная польская нотация имеет важное приемущество — она невероятно проста для разбора, поэтому её реализации на компьютере требует мало ресурсов и выполняется быстро.


Особенности

   • Вычисления выполняются слева направо
   • Операнды предшествуют своему оператору.
     После выполении оператора он удаляется и
     результат сам становится операндом (для
     следующих операторов)
    • В ОПН нет скобок и приоритетов операций


Пример

  выражение в инфиксной записи:
  3 * (4 + 7),

  в ОПН примет вид:
  3 4 7 + *


Приоритеты операторов от высшего к низшему

  круглые скобки                         ( )
  возведение в степень                    ^
  унарный минус                           -
  умножение, деление                     *, / | \
  сложение, вычитание                    +, -
  любая функция                         sin, ln, arctg и т.п.

  Более подробный перечень функций и их описание читай в файле
  "описание функций.txt" в данном архиве.


Возможности и особенности данного калькулятора

   • бинарные арифметические операции (+, -, /, *, ^)
   • унарный минус - смена знака операнда на противоположный
   • возможно объединение операций в круглые скобки и их
     (скобок) вложение друг в друга
   • вычисление функций от нескольких аргументов, разделенных
     запятыми. Например, функция root(27,3) вычислит кубический
     корень из двадцати семи
   • разбор и предварительное вычисление происходит один раз,
     что позволяет многократно вычислять выражение с максимальной
     скоростью
   • в выражениях допустимо использование констант чьи имена
     должны начинаться с буквенного символа, но могут содержать
     любые цифры
   • калькулятор допускает в выражении около 30000 символов
     вместе с пробелами. Сам алгоритм нечувствителен к пробелам
     и их положению и - к регистру символов
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось pronto 24.03.2007 (Сб) 14:40, всего редактировалось 7 раз(а).
O, sancta simplicitas!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.10.2006 (Пн) 18:47

Не канает.
1) без доки
2) бажная (для некорректных выражений выдаёт бредовый результат)
3) не понимает унарный минус
4) не понимает экспоненциальную запись
Изображение

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 31.10.2006 (Вт) 9:21

1) Документировать особо нечего
2) примеры бредовых результатов
3) есть функция neg(). Исправить можно, но это повлияет на скорость разбора.
4) 2e+3? или exp(2)? На второе есть константа е, то есть можно записать е^2.
O, sancta simplicitas!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 31.10.2006 (Вт) 10:05

1) какие именно выражения разбираются? почему я это должен определять методом тыка?
2) например, 2**2 => 2
3) и как предложишь писать отрицательные числа? как neg(1)? тогда проще сразу выражение в постфиксном виде писать, раз совместимости с традиционными мат. выражениями нет и не планируется.
4) 2e+3
Изображение

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 31.10.2006 (Вт) 10:41

1) исходный код разве недоступен (postfix.bas)?
2) правильно сформулированный вопрос - половина ответа. Я никогда и нигде не встречал подобной записи.
3)
тогда проще сразу выражение в постфиксном виде писать

нет не проще, а привыкнуть к такой форме можно, если разумно ее использовать - не neg(1)*sin(x+2), a neg(sin(x+2)). И повторюсь
Исправить можно, но это повлияет на скорость разбора


4) чем плохо 2*10^3 ? Пусть не стандартно, но эффективно, так как при избавлении от каких-либо правил записи выражения увеличивается скорость разбора, а это, на мой взгляд, самое главное для простого "калькулятора".
O, sancta simplicitas!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 31.10.2006 (Вт) 11:04

главное для "эвалютатора математических выражений" - это использование стандартной математической записи, т.е. если я пишу 1.2e10, то я должен быть уверен, что на выходе у меня будет 1200, а не что-то другое, да и -2 значительно привычнее чем neg(2)
Весь мир матрица, а мы в нем потоки байтов!

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 31.10.2006 (Вт) 11:09

Отказаться от константы e и заменить ее на привычное exp()!?
Над унарным минусом поработаю...
O, sancta simplicitas!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 31.10.2006 (Вт) 12:04

pronto писал(а):1) исходный код разве недоступен (postfix.bas)?

Если описание кирпича я должен угадать по его исходнику -- то это не кирпич, а ребус. Кирпич -- это то, что можно взять и использовать.

pronto писал(а):2) правильно сформулированный вопрос - половина ответа. Я никогда и нигде не встречал подобной записи.

Вот именно так парсер и должен отвечать.
Изображение

Денис Победря
Мегобойанист
Мегобойанист
 
Сообщения: 1037
Зарегистрирован: 03.01.2005 (Пн) 21:29
Откуда: Из Москвы

Сообщение Денис Победря » 31.10.2006 (Вт) 15:47

1--1=1

А ** в некоторых языках - возведение в степень.
[Место cдаётся]

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 31.10.2006 (Вт) 18:14

Кирпич -- это то, что можно взять и использовать

Абсолютно не разобравшись, как он работает??
И примера оказалось мало...
O, sancta simplicitas!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 31.10.2006 (Вт) 18:36

pronto, вот тебе интересно, как работает рантайм VB6? а ядро Винды? а процессор?
И ты во всём этом разбираешься, прежде чем пользоваться?
А я думаю, ты просто берёшь готовый продукт, берёшь доку, и используешь.
Изображение

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 01.11.2006 (Ср) 17:39

Интересно ВСЕ, но на ВСЕ нет времени :cry:
O, sancta simplicitas!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.11.2006 (Ср) 20:17

Верно.
По-твоему, ещё у кого-то, кроме тебя, есть время ковыряться в твоём коде?
Изображение

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 02.03.2007 (Пт) 11:02

В первом топике лежит последняя исправленная и дополненная версия парсера.
O, sancta simplicitas!


Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList