Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  4 817

•  TDictionary Custom Sort  6 815

•  Fast Watermark Sources  6 598

•  3D Designer  9 560

•  Sik Screen Capture  6 936

•  Patch Maker  7 385

•  Айболит (remote control)  7 329

•  ListBox Drag & Drop  6 188

•  Доска для игры Реверси  98 163

•  Графические эффекты  7 503

•  Рисование по маске  6 789

•  Перетаскивание изображений  5 645

•  Canvas Drawing  6 024

•  Рисование Луны  5 813

•  Поворот изображения  5 266

•  Рисование стержней  3 858

•  Paint on Shape  3 016

•  Генератор кроссвордов  3 969

•  Головоломка Paletto  3 146

•  Теорема Монжа об окружностях  3 983

•  Пазл Numbrix  2 631

•  Заборы и коммивояжеры  3 443

•  Игра HIP  2 359

•  Игра Go (Го)  2 273

•  Симулятор лифта  2 675

•  Программа укладки плитки  2 236

•  Генератор лабиринта  2 788

•  Проверка числового ввода  2 395

•  HEX View  2 729

•  Физический маятник  2 421

 
скрыть

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



Оформил: DeeCo

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;




Похожие по теме исходники

Вычисление даты Пасхи