Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Вычисление простых арифметических выражений

Delphi , Синтаксис , Математика

Вычисление простых арифметических выражений

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

function Calculate(SMyExpression: string; digits: Byte): string;
   // Calculate a simple expression 
  // Supported are:  Real Numbers, parenthesis 
var
   z: Char;
   ipos: Integer;

   function StrToReal(chaine: string): Real;
   var
     r: Real;
     Pos: Integer;
   begin
     Val(chaine, r, Pos);
     if Pos > 0 then Val(Copy(chaine, 1, Pos - 1), r, Pos);
     Result := r;
   end;

   function RealToStr(inreal: Extended; digits: Byte): string;
   var
     S: string;
   begin
     Str(inreal: 0: digits, S);
     realToStr := S;
   end;

   procedure NextChar;
   var
     s: string;
   begin
     if ipos > Length(SMyExpression) then
     begin
       z := #9;
       Exit;
     end
     else
     begin
       s := Copy(SMyExpression, ipos, 1);
       z := s[1];
       Inc(ipos);
     end;
     if z = ' ' then nextchar;
   end;

   function Expression: Real;
   var
     w: Real;

     function Factor: Real;
     var
       ws: string;
     begin
       Nextchar;
       if z in ['0'..'9'] then
       begin
         ws := '';
         repeat
           ws := ws + z;
           nextchar
         until not (z in ['0'..'9', '.']);
         Factor := StrToReal(ws);
       end
       else if z = '(' then
       begin
         Factor := Expression;
         nextchar
       end
       else if z = '+' then Factor := +Factor
       else if Z = '-' then Factor := -Factor;
     end;

     function Term: Real;
     var
       W: Real;
     begin
       W := Factor;
       while Z in ['*', '/'] do
         if z = '*' then w := w * Factor
       else
         w := w / Factor;
       Term := w;
     end;
   begin
     w := term;
     while z in ['+', '-'] do
       if z = '+' then w := w + term
     else
       w := w - term;
     Expression := w;
   end;
 begin
   ipos   := 1;
   Result := RealToStr(Expression, digits);
 end;


 procedure TForm1.Button1Click(Sender: TObject);
 var
   sMyExpression: string;
 begin
   sMyExpression := '12.5*6+18/3.2+2*(5-6.23)';
   ShowMessage(sMyExpression + ' = ' + Calculate(sMyExpression, 3));
 end;

Привет! Я переведу контент на русский язык.

Функция Delphi, написанная на Паскале, вычисляет простые арифметические выражения. Функция принимает два параметра: SMyExpression, который является строковым представлением выражения для оценки, и digits, которое specifies количество знаков после запятой для отображения результата.

Разбивка на шаги:

  1. Функция Calculate вызывает несколько вспомогательных функций:
    • StrToReal: конвертирует строку в вещественное число.
    • RealToStr: конвертирует вещественное число в строку с указанным количеством знаков после запятой.
    • NextChar: читает следующий символ из входной строки.
  2. Функция Expression отвечает за оценку арифметического выражения:
    • Она вызывает функцию Factor рекурсивно, пока не достигнет конца выражения или не встретит оператор (+, -, *, /).
    • Каждый фактор оценивается вызовом либо StrToReal (если текущий символ является цифрой), либо рекурсивным вызовом Expression, если текущий символ является открывающей скобкой.
    • Факторы затем комбинируются с помощью операторов для получения финального результата.
  3. Событийный обработчик кнопки Button1Click демонстрирует, как использовать функцию Calculate:
    • Он определяет строку примера и передает ее в функцию Calculate вместе с желаемым количеством знаков после запятой (3 в этом случае).
    • Результатный сообщатель показывает оцененное выражение и его результат.

Обратите внимание:

  • Функция не обрабатывает ошибки, поэтому она будет выдавать ошибку при невалидном вводе.
  • Она использует функцию Val для конвертации строк в вещественные числа, что может быть медленным для больших входных данных. Более эффективный подход бы был использованием специализированного парсера или библиотеки регулярных выражений.
  • Функция RealToStr использует функцию Str для форматирования результата как строки, что может не всегда давать желаемый результат (например, она не будет сохранять trailing zeros).
  • Код написан в синтаксисе Delphi и использует конструкты, похожие на Pascal, но может быть адаптирован к другим языкам с минимальными изменениями.

Альтернативные решения:

  1. Использовать специализированную библиотеку парсера, например FPParser или SynEdit.
  2. Реализовать простой рекурсивный спуск парсера используя набор производных правил.
  3. Использовать регулярные выражения для парсинга выражения и оценки его вручную.
  4. Рассмотреть использование болееadvanced библиотеки для вычисления математических выражений, например MathExpr или Calculation.

В статье описывается функция для вычисления простых арифметических выражений, которая может обрабатывать реальные числа, скобки и операции сложения, вычитания, умножения и деления.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Математика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-26 16:54:02/0.0033979415893555/0