Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.054 Beiträge
 
Delphi 12 Athens
 
#11

Re: qwertz543221 kleine String-Math-Lib

  Alt 12. Jun 2009, 11:38
kleines Beispiel:
Delphi-Quellcode:
function TMathe.summe(a, b: AnsiString): AnsiString;
var
  i, i2, ueberlauf, x: Integer;

begin
  normalisieren(a);
  normalisieren(b);
  if (a[1] = '-') <> (b[1] = '-') then
  begin
    negieren(b);
    Result := differenz(a, b);
    Exit;
  end;
  i2 := Max(Length(a), Length(b)) + 2; // +2 für Überlauf und Vorzeichen
  formatieren(a, False, True, i2);
  formatieren(b, False, True, i2);
  formatieren(Result, False, True, i2);
  ueberlauf := 0;
  for i := i2 downto 2 do
  begin
    x := (Ord(a[i]) - Ord('0')) + (Ord(b[i]) - Ord('0')) + ueberlauf;
    Result[i] := Chr(x mod 10 + Ord('0'));
    ueberlauf := x div 10;
  end;
  Result[1] := a[1]; // Vorzeichen
  normalisieren(Result);
end;
Hab mal das ganze ORD, CHR und sonstiges Umgerechne einfach durch diese Konstanten ersetzt.
Delphi-Quellcode:
const
  ZeichenZuZahl: Array['0'..'9'] of Byte = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  ZahlZuZeichen: Array[0..9] of AnsiChar = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
Und nun sieht man, daß man mit einer etwas durchdachten und aufgeräumten Klassenstruktur sehr schön übersichtliche Codes entstehen lassen kann
Delphi-Quellcode:
function TMathe.summe(a, b: AnsiString): AnsiString;
var
  i, i2, ueberlauf, x: Integer;

begin
  normalisieren(a);
  normalisieren(b);
  if istNegativ(a[1]) <> istNegativ(b[1]) then
  begin
    negieren(b);
    Result := differenz(a, b);
    Exit;
  end;
  i2 := Max(Length(a), Length(b)) + 2; // +2 für Überlauf und Vorzeichen
  formatieren(a, False, True, i2);
  formatieren(b, False, True, i2);
  formatieren(Result, False, True, i2);
  ueberlauf := 0;
  for i := i2 downto 2 do
  begin
    x := ZeichenZuZahl[a[i]] + ZeichenZuZahl[b[i]] + ueberlauf;
    Result[i] := ZahlZuZeichen[x mod 10];
    ueberlauf := x div 10;
  end;
  Result[1] := a[1]; // Vorzeichen
  normalisieren(Result);
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat