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
kod sie nazywa IAlgo...
Wrrrr........ Podaj link, bo nikt nie znajdzie jak będzie potrzebował :>