Rambler's Top100
Королевство Дельфи "Knowledge itself is power"
F.Bacon
Модуль для расчета формул II
Вернуться к разделу Подземелье Магов Автор Юрий Писарев,
дата публикации 04 апреля 2002г.

В этой статье представлена новая версия модуля для расчета формул. Я сделал очень много нововведений, в том числе полностью изменил структуру сценариев. В предыдущем варианте сценарий состоял примерно из равных частей по 4 байта - не рационально, но намного проще. Полное описание структуры новых сценариев приведено в исходном файле модуля. Изменился синтаксис формулы, больше не нужно заключать функции в скобки. Ниже приведены все элементы синтаксиса, многие из них также претерпели изменения:

Несколько слов о тех изменениях, которые я сделал.
Прежде всего, улучшен контроль ошибок. Теперь идет строгая проверка последовательности функций с учетом их особенностей. Также доработаны сообщения исключительных ситуаций о найденных ошибках. Изменено зарезервированное слово "bool" на "if", которое служит для обозначения логических выражений. На мой взгляд "if" намного лучше, короче и, как Вы заметили, я стараюсь сделать элементы синтаксиса формулы максимально похожими на те же элементы в Delphi. Изменено свойство "Formula", теперь это свойство "Text". Изменены названия методов для работы с математическим сценарием, например RegisterIntFunction теперь называется RegisterNumFunction. Раньше при регистрации функций важно было следить за их порядком. Поясню на примере. Представьте себе, что Вы регистрируете новую функцию "X". А затем Вы регистрируете еще одну функцию "EXP". В памяти программы они будут находиться именно в порядке регистрации, т.е. сначала "X", затем "EXP". При распознавании формулы в таком же порядке будет происходить поиск функций. Поэтому функция "EXP" никогда не будет распознана, т.к. она включает себя функцию "X", которая будет найдена первой. Сейчас порядок регистрации не имеет значения. Но после регистрации нужно вызвать метод SortNumFunctionsData или SortBoolFunctionsData для соответственно математических и логических функций. Эти методы сортируют зарегистрированные функции таким образом, что первыми оказываются самые "длинные" функции. После регистрации новых типов нужно вызвать метод SortTypesData. Важно помнить, что после сортировки функций, изменятся идентификаторы этих функции в соответствии с их новым положением в памяти. Опять же я приведу пример. Представьте, что Вы регистрируете две новые функции, пусть это будут функции "sin" и "sinh" (такие функции регистрируются автоматически при создании объекта класса TDataEditor, но пример чисто гипотетический):
...
type
  TForm1 = class(TForm)
  ...
  private
    FSinID: Integer;
    FSinhID: Integer;
  ...
  end;

  ...

  procedure TForm1.FormCreate(Sender: TObject);
  begin
    with DataEditor do begin
      RegisterNumFunction(FSinID, 'sin', False, True);
      RegisterNumFunction(FSinhID, 'sinh', False, True);
      // Допустим, что FSinID = 0, FSinhID = 1;
      SortNumFunctionsData;
      // После выполнения этой процедуры, FSinID = 1, FSinhID = 0,
      // т.е. первой функцией стала наиболее длинная - 'sinh'.
    end;
  ...
  end;
  
  ...

Пример

В качестве примера использования класса TDataEditor я написал компонент (TGraph), который строит графики функций. А также я сделал ActiveX объект, который демонстрирует возможности компонента TGraph. ActiveX Вы можете увидеть чуть ниже, но сначала несколько слов о методах и свойствах TGraph: На рисунке приведен скриншот ActiveX-компонента, который Вы можете установить у себя, скачав предлагаемый проект, или проведя on-line тестирование на страницах Королевства.
Прежде чем переходить по ссылке, обратите внимание, придется скачать ActiveX размером 304К.

On-line тест иллюстрирующий работу ActiveX

Замечания

При составлении этого примера я оставил доступными все математические функции, которые были перечислены выше. Вообще функции типа "random", "frac" или "int" с точки зрения математики не желательны. Но при использовании некоторых из них получаются очень любопытные графики (например, int abs x ^ frac abs x или random * x * sin x). Обратите также внимание, что при изменении максимальных значений осей X или Y перерасчет графика происходит практически мгновенно.

Заключение

Хочу выразить отдельную благодарность Григорьеву Антону за его статью "Неочевидные особенности вещественных чисел". В этих компонентах сплошь и рядом используются вещественные числа, без дополнительной информации сделать их было бы сложнее.

Исходники:

Юрий Писарев

Обсуждение статьи

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации.
Все используемые на сайте торговые марки являются собственностью их производителей.
Основная страница |  Королевские Хроники |  Карта сайта |  Глас Народа! |  Дальние Земли |  Круглый стол |  Книга Песка |  Свитки |  Фолианты |  Сокровищница |  Подземелье Магов |  Hello, World! |  Арсенальная башня |  Рыцарский зал |  Базарная площадь |  Городская площадь |  Почта
Тематический каталог сайта  |  Все манускрипты
Rambler's Top100 Рейтинг@Mail.ru rax.ru: показано число посетителей за сегодня