Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.054 Beiträge
Delphi 12 Athens
|
Re: qwertz543221 kleine String-Math-Lib
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.
|