W jaki sposób przedstawić łańcuch np. 2*2 do postaci algorytmu

Adam Boduch

Poniższy kod źródłowy umożliwia obliczenie prostego rachunku matematycznego (dodwanie, mnożenie) na podstawie działania wpisanego w komponencie TEdit. Przykład zaprezentowany poniżej oblicza podstawowe działania, może zawierać błędy i jest jedynie prezentacją takiego prostego algorytmu.

      
(************************************************************************)
(*                                                                      *)
(*                           IAlgo [6.01.02]                            *)
(*                 Copyright (c) 2002 by Adam Boduch                    *)
(*                      http://4programmers.net                         *)
(*                        boduch@poland.com                             *)
(*                                                                      *)
(************************************************************************)
(*
                NOTKA OD AUTORA

   Coz to jest za program? Niekidy napotykam sie z problemem przedstawiania
   lanucha jako algorytmu. Ten drobny program jest rozwiazaniem tego
   problemu. Przedstawia on lanuch o postacii np. 2+2 na algorytm i wykonuje
   dzialanie matematyczne - w tym wypadku dodaje 2 do 2-och...

   Enjoy! :))
*)

unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TMainForm = class(TForm)
    edtSource: TEdit;
    btnGo: TButton;
    Panel1: TPanel;
    Label1: TLabel;
    procedure btnGoClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

{ wyjatek (pojawiac sie bedzie w przypadku niewlasciwego formatu - np. uzycia liter }
  EBadFormat = class(Exception);

const
{ oto mozliwe dzialania }
  Mnozenie = '*';
  Dodawanie = '+';
  Odejmowanie = '-';
  Dzielenie = '/';

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.btnGoClick(Sender: TObject);
var
  FNumber, SNumber : String;
  Dzialanie : Char;
  iCount, iEnd : Integer;
  Result : Currency;
begin
  iCount := 0;
  Result := 0;

{
   ta petla repeat pobiera kolejne znaki z komponentu edtSearch, az napotka na
   znak dodawania, odejmowania, dzielenia lub mnozenia. Wszystko co jest przed
   znakiem dzialania zostaje zapisane do zmiennej FNumber w postacii lancucha.
}
  repeat
    Inc(iCount);
    FNumber := Copy(edtSource.Text, 0, iCount); // kopiuj tekst przed znakiem dzialania
  until edtSource.Text[iCount+1] in [Mnozenie, Dodawanie, Odejmowanie, Dzielenie]; // kontynnuj dopoki nie napotkasz na znak dzialania

  Dzialanie := edtSource.Text[iCount+1]; // nastepny znak to dzialanie

  iEnd := 0;

{
   ta oto petla wykonuje dzialania, ktore maja na celu pobiranie liczb po znaku
   dzialania. Zasada dzialania tej petli jednak ma takie same zasady jak poprzednia...
}
  repeat
    SNumber := Copy(edtSource.Text, iCount+2, iEnd);
    Inc(iEnd);
  until iEnd = Length(edtSource.Text);

  try
  { teraz w zaleznosci od dzialania wykonaj nastepujece kroki... }
    case (Dzialanie) of
      Dodawanie: Result := StrToCurr(FNumber) + StrToCurr(SNumber);
      Odejmowanie: Result := StrToCurr(FNumber) - StrToCurr(SNumber);
      Mnozenie: Result := StrToCurr(FNumber) * StrToCurr(SNumber);
      Dzielenie: Result := StrToCurr(FNumber) / StrToCurr(SNumber);
    end;
  except
    raise EBadFormat.Create('Nieprawidłowy format danych');
  end;

  { przedstaw wynik na panelu... }
  Panel1.Caption := 'Wynik: ' + CurrToStr(Result);
end;

end.

Przykład: http://4programmers.net/file.php?id=351

2 komentarzy

kod sie nazywa IAlgo...

Wrrrr........ Podaj link, bo nikt nie znajdzie jak będzie potrzebował :>