::: µ¨ÆÄÀÌ Tip&Trick :::

µ¨ÆÄÀÌ Tip&Trick ¼º°Ý¿¡ ¸ÂÁö ¾Ê´Â ±¤°í,ºñ¹æ,Áú¹®ÀÇ ±ÛÀº Áï½Ã »èÁ¦Çϸç
³»¿ëÀ» º¹»çÇÏ¿© »ç¿ëÇÒ °æ¿ì ¹Ýµå½Ã À̰÷(http://www.howto.pe.kr)À» Ãâó·Î ¸í½ÃÇÏ¿© ÁÖ¼¼¿ä


Category

  ±è¿µ´ë(2003-03-06 21:53:34, Hit : 3421, Vote : 891
 ¹®ÀÚ¿­ ¼ö½Ä¹®Àå(expression)ÀÇ °á°ú ±¸Çϱâ

// È­¸éÀÇ Edit1ÀÇ Text¿¡ sqrt(43.23*12+3.1/1.64) ¸¦ ÀÔ·ÂÇϰí
// ¹öưÀ» Ŭ¸¯ÇÏ½Ã¸é ±× °á°ú¸¦ °è»êÇØ¼­ º¸¿©ÁÝ´Ï´Ù
// ¸¸¾à À߸øµÈ ¼ö½ÄÀÌ¸é ¿¡·¯³­ ¹®ÀÚ·Î ÄÉ·µÀ» À̵¿½Ãŵ´Ï´Ù
//
// ¼Ò½º Ãâó: http://www.geocities.com/SiliconValley/Hills/9167/index.htm

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, forms, Dialogs,
  StdCtrls;

type
  Tform1 = class(Tform)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  form1: Tform1;

implementation
{$R *.DFM}

procedure Eval(formula: String;      {Expression to be evaluated}
               var Value: double;    {Return value}
               var ErrPos: Integer); {error position}
const
  Digit: Set of Char = ['0'..'9'];
var
  Posn: Integer;  {Current position in formula}
  CurrChar: Char; {character at Posn in formula}

  procedure ParseNext;
  begin
    repeat
      Posn := Posn+1;
      if Posn <= Length(formula) then
        CurrChar := formula[Posn]
      else
        CurrChar := ^M;
   until CurrChar<>' ';
  end {ParseNext};

  function add_subt: Real;
  var
    E: Real;
    Opr: Char;

    function mult_DIV: Real;
    var
      S   : Real;
      Opr : Char;

      function Power: Real;
      var
        T : Real;

        function Signedop: Real;

          function Unsignedop: Real;
          type
            StdFunc = (fabs,    fsqrt, fsqr, fsin, fcos,
                       farctan, fln,   flog, fexp, ffact);
            StdFuncList = array[StdFunc] of String[6];

          const
            StdFuncName: StdFuncList =
            ('ABS','SQRT','SQR','SIN','COS',
            'ARCTAN','LN','LOG','EXP','FACT');
          var
            E, L, Start    : Integer;
            Funnet         : Boolean;
            F              : Real;
            Sf             : StdFunc;

            function Fact(I: Integer): Real;
            begin
              if I > 0 then
              begin
                Fact := I*Fact(I-1);
              end
              else
                Fact := 1;
            end {Fact};

          begin {function Unsignedop}
            if CurrChar in Digit then
            begin
              Start := Posn;
              repeat
                ParseNext
              until not (CurrChar in Digit);
              if CurrChar = '.' then
                repeat
                  ParseNext
                until not (CurrChar in Digit);
              if CurrChar = 'E' then
              begin
                ParseNext;
                repeat
                  ParseNext
                until not (CurrChar in Digit);
              end;
              Val(Copy(formula,Start,Posn-Start),F,ErrPos);
            end
            else if CurrChar = '(' then
            begin
              ParseNext;
              F := add_subt;
              if CurrChar=')' then
                ParseNext
              else
                ErrPos := Posn;
            end
            else
            begin
              Funnet := False;
              for sf := fabs tO ffact do
                if not Funnet then
                begin
                  l := Length(StdFuncName[sf]);
                  if Copy(formula,Posn,l)=StdFuncName[sf] then
                  begin
                    Posn := Posn+l-1;
                    ParseNext;
                    f := Unsignedop;
                    case sf of
                      fabs:     f := abs(f);
                      fsqrt:    f := SqrT(f);
                      fsqr:     f := Sqr(f);
                      fsin:     f := Sin(f);
                      fcos:     f := Cos(f);
                      farctan:  f := ArcTan(f);
                      fln :     f := LN(f);
                      flog:     f := LN(f)/LN(10);
                      fexp:     f := EXP(f);
                      ffact:    f := fact(Trunc(f));
                    end;
                    Funnet := True;
                  end;
                end;
              if not Funnet then
              begin
                ErrPos := Posn;
                f := 0;
              end;
            end;
            Unsignedop := F;
          end {Unsignedop};

        begin {Signedop}
          if CurrChar='-' then
          begin
            ParseNext;
            Signedop := -Unsignedop;
          end
          else
            Signedop := Unsignedop;
        end {Signedop};

      begin {Power}
        T := Signedop;
        while CurrChar='^' do
        begin
          ParseNext;
          if t <> 0 then
            t := EXP(LN(abs(t))*Signedop)
          else
            t := 0;
        end;
        Power := t;
      end {Power};

    begin {mult_DIV}
      s := Power;
      while CurrChar in ['*','/'] do
      begin
        Opr := CurrChar;
        ParseNext;
        case Opr of
          '*': s := s * Power;
          '/': s := s / Power;
        end;
      end;
      mult_DIV := s;
    end {mult_DIV};

  begin {add_subt}
    E := mult_DIV;
    while CurrChar in ['+','-'] do
    begin
      Opr := CurrChar;
      ParseNext;
      case Opr of
        '+': e := e + mult_DIV;
        '-': e := e - mult_DIV;
      end;
    end;
    add_subt := E;
  end {add_subt};

begin {PROC Eval}
  if formula[1] = '.' then
    formula := '0' + formula;
  if formula[1]='+' then
    Delete(formula,1,1);
  for Posn:=1 to Length(formula) do
    formula[Posn] := Upcase(formula[Posn]);
  Posn := 0;
  ParseNext;
  Value := add_subt;
  if CurrChar=^M then
    ErrPos := 0
  else
    ErrPos := Posn;
end {PROC Eval};

procedure Tform1.Button1Click(Sender: TObject);
var
  Value: double;
  ErrPos: Integer;
begin
  Eval(Edit1.Text, Value, ErrPos);
  Label1.Caption := FloatToStr(Value); // °á°ú°ª

  if ErrPos > 0 then // ¿¡·¯°¡ ÀÖ´Ù¸é ÇØ´ç ¹®ÀڷΠij·µÀ» À§Ä¡ ½ÃŲ´Ù
  begin
    Edit1.SetFocus;
    {µÎ¹øÂ° ¹®ÀÚ À§Ä¡·Î Ä¿¼­¸¦ º¸³½´ë}
    Edit1.SelStart := ErrPos - 1;
    {¹®ÀÚ¸¦ ¼±ÅÃÇÏÁö ¾ÊÀº »óÅ·Π¸¸µç´Ù}
    Edit1.SelLength := 0;
  end;
end;

end.





411   [À©µµ¿ìÁî API] ¸ð¼­¸®°¡ µÕ±Ù(rounded ends) TEdit ¸¸µé±â  ±è¿µ´ë 2003/03/07 4958 1288
410   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] TOpenDialog ÀÇ '¼±ÅÃ','Ãë¼Ò' ¹öư À̸§ ¹Ù²Ù±â  ±è¿µ´ë 2003/03/07 4376 1334
409   [À©µµ¿ìÁî API] ·¹Áö½ºÆ®¸® Àüü °Ë»öÇÏ±â  ±è¿µ´ë 2003/03/07 4220 1141
408   [À©µµ¿ìÁî API] ALT_F4 hot key °¡·Îä±â  ±è¿µ´ë 2003/03/07 5655 1618
407   [µ¥ÀÌÅͺ£À̽º] µ¿ÀûÀ¸·Î SELECTÀÇ GROUP BY ¹® ¸¸µé±â  ±è¿µ´ë 2003/03/07 4201 946
406   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] ListView ÀÇ item À» °­Á¦·Î ÆíÁý»óÅ·Π¸¸µé±â  ±è¿µ´ë 2003/03/07 4666 1217
405   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] MessageDlg()ÀÇ ÆùÆ®¸¦ ¹Ù²Ù¾î¼­ ¶ç¿ì±â  ±è¿µ´ë 2003/03/07 3890 1070
404   [À©µµ¿ìÁî API] À©µµ¿ìÁî Ž»ö±âÀÇ ÆÄÀÏ, ÄÄÇ»ÅÍ Ã£±â È­¸é ¶ç¿ì±â  ±è¿µ´ë 2003/03/07 6187 1630
403   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] WideString À» String À¸·Î ¹Ù²Ù±â  ±è¿µ´ë 2003/03/07 4519 1129
402   [À©µµ¿ìÁî API] ´Ù¸¥ ApplicationÀÇ È­¸é¿¡ ±ÛÀÚ,±×¸²À» Ãâ·ÂÇÏ±â  ±è¿µ´ë 2003/03/07 3400 868
401   [À©µµ¿ìÁî API] À©µµ¿ìÁî '½ÃÀÛ' ¸Þ´º Refresh ½ÃŰ±â  ±è¿µ´ë 2003/03/07 4625 1419
400   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] StringGrid ¿¡¼­ ÇÁ·Î±×·¥À¸·Î MultiSelect ½ÃŰ±â  ±è¿µ´ë 2003/03/06 5473 1192
399   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] StringGrid ÀÇ ¼±Åÿµ¿ª¸¸ Ŭ¸³º¸µå·Î º¹»çÇÏ±â  ±è¿µ´ë 2003/03/06 4903 1088
398   [À©µµ¿ìÁî API] RichEdit¿¡ ÀÔ·ÂÇÑ ¹®ÀåÀÇ ½ÇÁ¦ ³ôÀÌ ±¸ÇÏ±â  ±è¿µ´ë 2003/03/06 5074 1430
397   [À©µµ¿ìÁî API] DDE ¾²Áö ¾Ê°í IEÀÇ ÇöÀç URL °¡Á®¿À±â  ±è¿µ´ë 2003/03/06 6002 1680
396   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] MemoÀÇ ÇàÀÇ ¹®ÀÚ¼ö¸¦ Á¦ÇÑÇϰí WordWrap½ÃŰ±â  ±è¿µ´ë 2003/03/06 5264 1315
395   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] OEM conversion  ±è¿µ´ë 2003/03/06 4340 1265
394   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] ASCII printing  ±è¿µ´ë 2003/03/06 5330 1220
393   [COM/OLE] DelphiÀÇ OCX¸¦ InstallShield·Î ¹èÆ÷ÇÏ´Â ¹æ¹ý  ±è¿µ´ë 2003/03/06 8387 5644
392   [µ¥ÀÌÅͺ£À̽º] Save DBGrid To Excel  ±è¿µ´ë 2003/03/06 7087 1939
391   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] StringGrid ÀÇ ³»¿ëÀ» Ŭ¸³º¸µå·Î º¹»çÇÏ±â  ±è¿µ´ë 2003/03/06 4489 1061
390   [À©µµ¿ìÁî API] ·¹Áö½ºÆ®¸®ÀÇ º¯°æ¿©ºÎ ¾Ë¸®´Â 2°¡Áö ¹æ¹ý  ±è¿µ´ë 2003/03/06 4786 1286
389   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] desktop ¹è°æÈ­¸éÀ» ÆûÀÇ ¹è°æÈ­¸éÀ¸·Î ±×¸®±â  ±è¿µ´ë 2003/03/06 3713 1037
388   [¸ÖƼ¹Ìµð¾î] JPEG, WAVE ¸¦ resource ÆÄÀÏ¿¡ ³Ö°í Àоî¿À±â  ±è¿µ´ë 2003/03/06 5352 1226
387   [½Ã½ºÅÛ] ¸¶ÀÌÅ© º¼·ý Á¶ÀýÇÏ±â  ±è¿µ´ë 2003/03/06 4679 1289
386   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] À©µµ¿ìÁî "³¯Â¥/½Ã°£" ¼³Á¤È­¸é ¶ç¿ì±â  ±è¿µ´ë 2003/03/06 6226 1825
385   [½Ã½ºÅÛ] ¿Àµð¿À CDÀÇ º¼·ý Á¶ÀýÇÏ±â  ±è¿µ´ë 2003/03/06 3650 1026
  [ÀϹÝ/ÄÄÆ÷³ÍÆ®] ¹®ÀÚ¿­ ¼ö½Ä¹®Àå(expression)ÀÇ °á°ú ±¸ÇÏ±â  ±è¿µ´ë 2003/03/06 3421 891
383   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] ƯÁ¤ ColorÀÇ Invert Color ±¸ÇÏ±â  ±è¿µ´ë 2003/03/06 4329 1319
382   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] µÎ°³ÀÇ RichEdit »çÀÌ¿¡ ³»¿ë º¹»çÇÏ±â  ±è¿µ´ë 2003/03/06 5897 1369
381   [½Ã½ºÅÛ] Redirecting DOS Application Output  ±è¿µ´ë 2003/03/06 4723 1220
380   [½Ã½ºÅÛ] How do I use SetWindowsHookEx ?  ±è¿µ´ë 2003/03/06 6917 960
379   [À©µµ¿ìÁî API] KeyDownÀÇ BeepÀ½À» ¾ø¾ÖÀÚ...  ±è¿µ´ë 2003/03/06 4671 1214
378   [µ¥ÀÌÅͺ£À̽º] ƯÁ¤ ÆûÀÇ ÇöÀç ÆíÁýÁßÀÎ DB Field ±¸ÇÏ±â  ±è¿µ´ë 2003/03/06 4105 1115
377   [À©µµ¿ìÁî API] ÇÁ·Î±×·¥À¸·Î Screensaver µî·ÏÇÏ´Â µÎ°¡Áö ¹æ¹ý  ±è¿µ´ë 2003/03/06 4521 1270
376   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] TObjectÀÇ ÇÁ·ÎÆÛƼ¸¦ ¹®ÀÚ¿­·Î ÂüÁ¶ÇÏ±â  ±è¿µ´ë 2003/03/06 5238 1596
375   [À©µµ¿ìÁî API] ¿ÜºÎ ÇÁ·Î±×·¥À» ÃÖ»óÀ§·Î ¼³Á¤ÇÏ±â  ±è¿µ´ë 2003/03/06 5257 1236
374   [ÀϹÝ/ÄÄÆ÷³ÍÆ®] À̹ÌÁö¸¦ ¸¶¿ì½º·Î drag ÇØ¼­ zoom ÇÏ±â  ±è¿µ´ë 2003/03/06 3628 1027
373   [À©µµ¿ìÁî API] Æú´õ³ª ÆÄÀÏÀÇ À©µµ¿ìÁî µî·ÏÁ¤º¸ dialog ¶ç¿ì±â  ±è¿µ´ë 2003/03/06 5116 1478
372   [³×Æ®¿÷/ÀÎÅͳÝ] How to bring a network down - "Win Nuke"  ±è¿µ´ë 2003/03/06 7343 1998

[ÀÌÀü 10°³] [1]..[11][12][13][14] 15 [16][17][18][19][20]..[25] [´ÙÀ½ 10°³]
 

Copyright 1999-2023 Zeroboard / skin by zero