| | | | |
Парсер математических выражений 2 | Полный текст материала
Другие публикации автора: Юрий Писарев
Цитата или краткий комментарий: «... Представляю вашему вниманию обновленный пакет компонентов для расчета математических формул. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 2 | 100% | | | | Ничего особенно нового и интересного | [2] | 0 | 0% | | | | Написано неверно (обязательно укажите почему) | [3] | 0 | 0% | | Всего проголосовали: 2 | | | Все понятно, материал читается легко | [1] | 3 | 100% | | | | Есть неясности в изложении | [2] | 0 | 0% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 3 |
Отслеживать это обсуждение
Всего сообщений: 1313-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. Какой вариант правильнее — бессмысленный вопрос. Какой вариант лучше и удобнее — зависит от задачи и/или от предпочтений программиста. Заниматься приведением булевских типов — задача неблагодарная. Лучше пользоваться предопределенными константами, не огребешь проблем в будущем. |
|
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, т.е. нужно сменить приоритет операций сравнений и операций сложения/вычитания |
|
|
|