Witam. Mam problem, mam zrobić kalkulator który będzie uwzględniał kolejność wykonywania działań i obsługiwał nawiasy.
Kolejność działań zrobiłem. Ale nie mam pojęcia jak zabrać się za nawiasy. Nauczyciel powiedział że mam zrobić to za pomocą wyrażen regularnych, ale nie umiem się w tym połapać.
Oto kod kalkulatora http://pastie.org/1844043
Nie patrze na kod, ale jeżeli chodzi o wyrażenia regularne to dobrze Tobie nauczyciel doradził, z nich skorzystać jest najprościej. Z http://regexpstudio.com pobierasz moduł do wyrażeń regularnych wraz z dokumentacją i przykładami. Później wrzucasz do katalogu z projektem, dodajesz to sekcji uses.
uses
regexpr;
procedure CzaryMaryDawajToCoJestWNawiasachStary(Tekst : string; Wyjscie : TStrings);
var
R : TRegExpr;
begin
Wyjscie.Clear;
R := TRegExpr.Create;
try
R.Expression := '\((.+?)\)';
if R.Exec(Tekst) = True then
begin
repeat
Wyjscie.Add(R.Match[1]);
until not R.ExecNext;
end;
finally
R.Free;
end;
end;
procedure TForm1.Button1Click(Sender : TObject);
begin
CzaryMaryDawajToCoJestWNawiasachStary(Edit1.Text, Memo1.Lines);
end;
Powyższy kod dla tekstu w Editcie:
8 * (3 + 5) - 5 * (3 - 2)
Zwróci w Memo w kolejnych linijkach tekst:
3 + 5
3 - 2
Dalej już kombinuj sobie sam. Przy odrobinie kombinacji można przy użyciu TRegExpr napisać taką funkcję ktora od razu policzy podane wyrażenie. Dalej kominuj już sam. A temat przenoszę do Newbie.
EDIT: a teraz widze, bo to jest tak jak się nie taguje wątków i nie pisze precyzyjnie. Jeżeli kompilujesz pod FPC to tam również jest moduł do obsługi regexpr'a, ale nigdy z niego nie korzystałem, ale podejrzewam z tego co sprawdziłem to ze wspomnianym modulem z dyrektywą kompilatora $MODE DELPHI - kompiluje się bez problemów i działa tylko, że tutaj na TStringList.
program banalne_podstawy;
{$MODE DELPHI}
uses
classes, regexpr;
procedure CzaryMaryDawajToCoJestWNawiasachStary(Tekst : string; Wyjscie : TStrings);
var
R : TRegExpr;
begin
Wyjscie.Clear;
try
R := TRegExpr.Create;
R.Expression := '\((.+?)\)';
if R.Exec(Tekst) = True then
begin
repeat
Wyjscie.Add(R.Match[1]);
until not R.ExecNext;
end;
finally
R.Free;
end;
end;
const
Dzialanie = '8 * (3 + 5) - 5 * (3 - 2)';
var
I : integer;
SL : TStringList;
begin
SL := TStringList.Create;
CzaryMaryDawajToCoJestWNawiasachStary(Dzialanie, SL);
for I := 0 to SL.Count - 1 do
Writeln(SL[I]);
SL.Free;
Readln;
end.