Einzelnen Beitrag anzeigen

Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#41

Re: Term (Zeichenfolge 1+2*3) in Fließkommazahl

  Alt 23. Okt 2009, 14:39
Delphi-Quellcode:
Function TForm1.ParseAndCalc(Const S: String): String;
  Var SL: TStringList;
    i: Integer;

  Begin
    SL := TStringList.Create;
    Try
      Try
        SL.Add('');
        For i := 1 to Length(S) do
          Case S[i] of
            '0'..'9', ',', '.': Begin
              SL[SL.Count - 1] := SL[SL.Count - 1] + S[i];
            End;
            '*', '/', '+', '-': Begin
              If SL[SL.Count - 1] = 'Then Begin
                // eine leere Zeile kommt vor, wenn mehrere Operatoren
                // hintereinander liegen, z.B. bei '1*+2' bzw. '1 * +2'
                SL.Delete(SL.Count - 1);
              End;
              SL.Add(S[i]);
              SL.Add('');
            End;
            ' ': ; // ignoriere Leerzeichen
            Else Raise Exception.CreateFmt('Ungültiges Zeichen "%s" gefunden.', [S[i]]);
          End;
          begin
               begin
               i:=0;
               while i < SL.Count do
                  begin
                      if SL[i]='*then
                         begin
                               SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])*StrToFloat(SL[i+1])));
                               {Zahl vor und nach dem * werden multipliziert und in die Zeile der ersten Zahl geschrieben???} 
                               SL.Delete(i);
                               {Jetzt soll die Zeile des Operators gelöscht werden} 
                               SL.Delete(i+1);{und die der zweiten Zahl} 
                               {etwas wurde gefunden - fange von vorn an} 
                               i := -1;
                         end
                      else
                      if SL[i]='/then
                         begin
                               SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])/StrToFloat(SL[i+1])));
                               SL.Delete(i);
                               SL.Delete(i+1);
                               i := -1;
                         end
                      else
                         i := i + 1;
                  end;
               i:=0;
               while i < SL.Count do
                  begin
                      if SL[i]='+then
                         begin
                               SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])+StrToFloat(SL[i+1])));
                               {Zahl vor und nach dem * werden multipliziert und in die Zeile der ersten Zahl geschrieben???} 
                               SL.Delete(i);
                               {Jetzt soll die Zeile des Operators gelöscht werden} 
                               SL.Delete(i+1);{und die der zweiten Zahl} 
                               {etwas wurde gefunden - fange von vorn an} 
                               i := -1;
                         end
                      else
                      if SL[i]='-then
                         begin
                               SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])-StrToFloat(SL[i+1])));
                               SL.Delete(i);
                               SL.Delete(i+1);
                               i := -1;
                         end
                      else
                         i := i + 1;
                  end;

                   
          end;
          end;
      Finally
            
        Result := '';
        For i := 0 to SL.Count - 1 do Result := Result + SL[i];
        
      End;
    Finally
      SL.Free;
    End;
  End;
Hab das jetzt da stehen. Die erste Schleife kommt später noch, wird ja bei 1+2*3 nicht benötigt.
Ich klick auf = und krieg die Meldung: Der Index der Liste überschreitet das Maximum (2).
Vorher hatte ich immer die Meldung: Der Index der Liste überschreitet das Maximum(Anzahl der Zeilen der Stringlist)...
  Mit Zitat antworten Zitat