Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Сокровищница
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  09:32[Войти] | [Зарегистрироваться]

Обсуждение материала
Парсер математических выражений 2
Полный текст материала


Другие публикации автора: Юрий Писарев

Цитата или краткий комментарий:

«... Представляю вашему вниманию обновленный пакет компонентов для расчета математических формул. ...»


Важно:
  • Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
  • Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
  • При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
  • Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.



Добавить свое мнение.

Результаты голосования
Оценка содержания

  Содержит полезные и(или) интересные сведения
[1]2100%
 
  Ничего особенно нового и интересного
[2]00%
 
  Написано неверно (обязательно укажите почему)
[3]00%
 
Всего проголосовали: 2

Оценка стиля изложения

  Все понятно, материал читается легко
[1]3100%
 
  Есть неясности в изложении
[2]00%
 
  Непонятно написано, трудно читается
[3]00%
 
Всего проголосовали: 3




Смотрите также материалы по темам:


Комментарии жителей
Отслеживать это обсуждение

Всего сообщений: 13

13-10-2020 01:56
Юрий,

скажите, сейчас есть возможность скачивания самой свежей версии парсера? А то ныне, в 2020 году, сайт недоступен


20-07-2016 07:44
Юрий, здравствуйте.
А что с лицензией на Ваше произведение? Какие условия?

С уважением, Александр.


19-03-2015 16:36
сообщение от автора материала
И еще если вдруг кто надумает потестить приоритеты:

Каждая функция имеет приоритет:
  TFunctionPriority = (fpLower, fpNormal, fpHigher);
  TPriorityCoverage = (pcLocal, pcTotal);
  TPriority = record
    Priority: TFunctionPriority;
    Coverage: TPriorityCoverage;
  end;
Приоритет может быть пониженный (fpLower), нормальный (fpNormal) или повышенный (fpHigher). Также указывается область действия этого приоритета (TPriorityCoverage).
Если у функции приоритет пониженный, то она вычисляется последней. Если приоритет нормальный – расстановка приоритета не производится вообще. Если приоритет повышенный – функция вычисляется первой.
Область действия приоритета функции может быть двух типов – локальная и полная. Если область действия локальная, то расстановка приоритета затрагивает группу зависимых друг от друга функций. Полная область действия затрагивает все выражение.
Поясню на примере. В качестве тестового выражения возьмем «3 * 4 / 6 – 2 = 0». Представьте что у функции «*» пониженный приоритет (fpLower), а область действия – локальная. Тогда парсер изменит выражение следующим образом: «3 * (4 / 6) – 2 = 0». Таким образом функция «*» в группе функций: «3 * 4 / 6», будет выполнена последней.
Теперь, если область действия полная, то выражения изменится так: «3 * (4 / 6 - 2 = 0)». В данном случае функция «*» будет выполнена последней в масштабах всего выражения.

В парсере на настоящее время все функции имеют нормальный приоритет, за исключением следующих:
1) = пониженный приоритет, область действия полная;
2) <> пониженный приоритет, область действия полная;
3) > пониженный приоритет, область действия полная;
4) < пониженный приоритет, область действия полная;
5) >= пониженный приоритет, область действия полная;
6) <= пониженный приоритет, область действия полная;
7) ^: повышенный приоритет, область действия локальная.


19-03-2015 16:33
сообщение от автора материала
Камрады, ряд замечаний прозвучавших тут учтен и внесены соответствующие изменения. Приоритет у функций теперь настраиваемый, предварительно готов архив который работает в Delphi 7 - http://mathparser.net/download/16.03.2015.zip

По адресу http://mathparser.net/download/ откроется страничка где по названию архива можно найти самые свежие компоненты (актуально до публикации на королевстве).

Несколько позже будет доступно готовое описание а также компоненты для Delphi 7, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Delphi XE6, Delphi XE7, возможно еще для Delphi 6, но точно не будет Delphi 5.


06-10-2014 14:31
сообщение от автора материала
Такого пример там нет. Но вот как это делается:


program Sample;

uses
  Calculator, Classes, Dialogs;

var
  Calc: TCalculator;
  List: TStrings;
begin
  Calc := TCalculator.Create(nil);
  try
    List := TStringList.Create;
    try
      List.Add('A = 1 + 2');
      List.Add('B = 3 + 4');
      List.Add('C = A + B');

      Calc.ParseValueList.Detach;
      try
        Calc.ParseValueList.List.Assign(List);
      finally
        Calc.ParseValueList.Attach;
      end;
    finally
      List.Free;
    end;

    ShowMessage(Calc.AsString('A + B + C'));
  finally
    Calc.Free;
  end;
end.



06-10-2014 03:15
В описании указано "...Возможно подключение пользовательских списков переменных в которых каждый элемент списка представлен в виде NAME=VALUE, где NAME это имя переменной, а VALUE — значение..."
Можно ли пример использования пользовательского списка переменных, а то я не нашел (может быть плохо искал).


09-06-2014 01:49
Приоритет операций нужно изменить:
x^2/10 не работает как принято: (x^2)/10, а x^(2/10)


08-05-2014 00:52
Уважаемые Юрий, Алексей и Geo!

1. Я всего лишь указал на несоответствие между документацией и работой компонента, а вас уже понесло, как Остапа Ибрагимовича )))
То есть достаточно упомянуть в списке изменений, что функция True теперь возвращает -1

2. Меня интересует возможности компонента именно для обработки булевых выражений (давно ищу подобное), чем и было вызвано моё замечание.

Спасибо всем - и особенно автору - за ответы на мои вопросы.


07-05-2014 15:51
сообщение от автора материала
Microsoft, видимо, пошла по пути наименьшего сопротивления. Ведь отсекать лишнее это надо чего-то делать, это затраты времени и т.д. И насчет приоритета операций, в следующей версии будет решение. В примере который привел уважаемый superedward (спасибо, хорошее замечание) это больше уже похоже на какое-то логическое выражение. Но парсер он больше математический парсер, операции сравнения это те же функции, как умножение или сдвиг, поэтому с ними отдельной логики я особо не придумывал.


07-05-2014 08:41
Разница между 1 и -1 всего лишь в том, сколько бит использовать. Борланд рассматривает 1 бит, отсекая все лишние, поэтому у них 0 и 1. Микрософт предпочитает биты не отсекать, поэтому у них 0 и -1. Какой вариант правильнее — бессмысленный вопрос. Какой вариант лучше и удобнее — зависит от задачи и/или от предпочтений программиста. Заниматься приведением булевских типов — задача неблагодарная. Лучше пользоваться предопределенными константами, не огребешь проблем в будущем.
 Geo


07-05-2014 03:31
сообщение от автора материала
Здравствуйте,
Спасибо за комментарии!

True = -1 я установил специально.

Представьте что True = 1 и вот ситуация:

var
  I: Integer;
begin
  I := not Integer(True);

Здесь I = False и, одновременно, I = -2. Такое значение в рамках парсера непригодно для дальнейшего использования. А если True = -1, то последний пример даст результат, равный 0. Который в случае инверсии бит даст False или -1. И наоборот.


07-05-2014 03:15
Неоднократно читал в разных доках, что ориентироваться на True=1 - чревато.
Это исключительно особенность Delphi.

False = 0
True <> 0

Надежнее и совместимо с windows api, и другими языками, библиотеками.


From RAD Studio VCL Reference:
System.Boolean
type Boolean = (False, True);
Represents the generic Boolean type.
Boolean values are denoted by the predefined constants True and False. A Boolean value is considered True when its ordinality is 1, and False when its ordinality is 0(zero).
A Boolean variable occupies 1 byte of memory.

System.LongBool
Delphi
type LongBool = False..Boolean(4294967295);C++
Represents a 32-bit Boolean type.
Boolean values are denoted by the predefined constants True and False. A LongBool value is considered False when its ordinality is 0, and True otherwise.
Note:  The ByteBool, WordBool, and LongBool types exist to provide compatibility with other languages and operating system libraries.


06-05-2014 05:33
Приветствую, Юрий!
Мощный компонент, давно искал нечто подобное.

В первой части сказано, что функция True возвращает значение 1. Возможно, что-то изменилось, но теперь функция True возвращает значение -1.

Выражение 1+1>0 рассчитывается как 1+(1>0), а не как (1+1)>0, т.е. нужно сменить приоритет операций сравнений и операций сложения/вычитания


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жил-был у бабушки серенький КТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.

Оценка содержания
 
Содержит полезные и(или) интересные сведения
 
Ничего особенно нового и интересного
 
Написано неверно (обязательно укажите почему)


Оценка стиля изложения
 
Все понятно, материал читается легко
 
Есть неясности в изложении
 
Непонятно написано, трудно читается

Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования