Thema: Delphi Taschenrechner Ausgabe

Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#52

Re: Taschenrechner Ausgabe

  Alt 5. Jun 2009, 17:00
Die Lösung liegt darin, die Operatoren nach Priorität in Gruppen aufzuteilen.
Für jede Gruppe wird der jeweils am weitesten Rechts im Term liegende Operator ermittelt.
Delphi-Quellcode:
{ermittelt aus einer Reihe von Operatoren den,
der am weitesten Rechts im Term auftaucht}

function FindOperator(const ATerm, AOperatoren: string;
  out AOp: Char; out APos: Integer): Boolean;
var
  i, iPos: Integer;
  Op: Char;
begin
  AOp := #0;
  APos := 0;
  Result := False;
  for i := 1 to Length(AOperatoren) do
  begin
    Op := AOperatoren[i];
    iPos := APos;
    repeat
      iPos := PosEx(Op, ATerm, iPos + 1);
      if iPos > APos then
      begin
        AOp := Op;
        APos := iPos;
        Result := True;
      end;
    until (iPos = 0);
  end;
end;

function BerechneTerm(ATerm: string): Double;
const
  OperatorLevel: array[0..1] of string = ('+-', '*/');
var
  Op: Char;
  i, iPos: Integer;
  Value1, Value2: Double;
begin
  for i := Low(OperatorLevel) to High(OperatorLevel) do
  begin
    if FindOperator(ATerm, OperatorLevel[i], Op, iPos) then
    begin
      Value1 := BerechneTerm(Copy(ATerm, 1, iPos - 1));
      Value2 := BerechneTerm(Copy(ATerm, iPos + 1, Length(ATerm)));
      case Op of
        '+': Result := Value1 + Value2;
        '-': Result := Value1 - Value2;
        '*': Result := Value1 * Value2;
        '/': Result := Value1 / Value2;
      else
        raise Exception.Create(Format('undefinierter Operator ''%s''', [Op]));
      end;
      Exit;
    end;
  end;
  Result := StrToFloat(ATerm);
end;