Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#19

Re: taschenrechner (erweiterung)

  Alt 3. Jun 2009, 14:57
Du solltest dir erst einmal um das Prinzip gedanken machen, wie man eine solche Aufgabe löst.
Danach kommt die Umsetzung in eine Programmiersprache.

Du hast ja bereits als ersten Schritt den Term in zwei Teile zerlegt.
Allerdings muss dabei mit dem Operator der geringsten Priorität begonnen werden.
1 + 2 * 3 => (1) + (2 * 3)

Wie berechnet man nun aber jeden dieser Teilterme?
Solange ein Term einen Operator enthält, kann man diesen erneut in Teilterme zerlegen.
2 * 3 => (2) * (3)
Enthält ein Term aber nur noch eine Zahlenfolge, kann dieser direkt in eine Zahl umgewandelt werden.

Das lässt sich sehr schön mit einer rekursiven Funktion darstellen:
Delphi-Quellcode:
function BerechneTerm(ATerm: string): Double;
var
  Op: string;
  iPos: Integer;
  Value1, Value2: Double;
begin
  for i := 0 to 3 do
  begin
    case i of
      0: Op := '+';
      1: Op := '-';
      2: Op := '*';
      3: Op := '/';
    end;
    iPos := Pos(Op, ATerm);
    if iPos > 0 then
    begin
      Value1 := BerechneTerm(Copy(ATerm, 1, iPos - 1));
      Value2 := BerechneTerm(Copy(ATerm, iPos + 1, Length(ATerm)));
      case i of
        0: Result := Value1 + Value2;
        1: Result := Value1 - Value2;
        2: Result := Value1 * Value2;
        3: Result := Value1 / Value2;
      end;
      Exit;
    end;
  end;
  Result := StrToFloat(ATerm);
end;
Diese Funktion berücksichtigt noch nicht, dass Operatoren gleicher Priorität von links nach rechts ausgewertet werden.