Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: Langzahlen

  Alt 11. Jun 2009, 21:43
Das einfachste ist erstmal alles das, was geht und schon einem einheitlichem Stil entspricht auszulagen und als eigene Klasse zusammennzufassen.

Dann die Grundfuntionen zum Laufen zu bekommen
und sich danach um Optimierungen und Erweiterunen zu kümmern.


Delphi-Quellcode:
function tform1.isOdd(const a: AnsiString): AnsiString; // modul(b, '2') <> '0'
begin
  Result := (a <> '') and (a[Length(a)] in ['1', '3', '5', '7', '9']);
end;

function tform1.isEven(const a: AnsiString): AnsiString; // modul(b, '2') = '0'
begin
  Result := (a = '') or (a[Length(a)] in ['0', '2', '4', '6', '8']);
end;



Delphi-Quellcode:
type TMathe = class
  function summe ( a, b: AnsiString): AnsiString;
  function differenz( a, b: AnsiString): AnsiString;
  procedure inc (var a: AnsiString);
  procedure dec (var a: AnsiString);

  function produkt ( a, b: AnsiString): AnsiString;
  function quotient (const a, b: AnsiString): AnsiString;
  function modul ( a, b: AnsiString): AnsiString;

  function vergleich( a, b: AnsiString): TValueRelationship;
  function ungerade (const a: AnsiString): Boolean;
  function gerade (const a: AnsiString): Boolean;
end;
da wo intern der String nicht verändert wird, macht sich const besser
(hab es jetzt nicht bei allem gesetzt, da ich nicht weiß, ob es möglich ist)
siehe VAR CONST OUT und Co. ... warum?

Delphi-Quellcode:
var mathe: TMathe;
  a, b, c: AnsiString;

mathe := TMathe.Create;

a := '123';
b := '456';
c := mathe.summe(a, b);
if mathe.vergleich(c, '56088') = 0 then ...;

mathe.Free;

Ja, das mit der Division ist wirklich nicht leicht,
wenn ich bedenke, wie ich mich bei meiner Lib da abgequält hab

Im Prinzip kannst kannst du dich auch von hinten rum annähern
und dich von der anderen Seite aus, über Additionen oder Multiplikationen schrittweise annähern.

der Einachste und leider auch lagsamste Weg wäre
Delphi-Quellcode:
function TMathe.quotient(a, b: AnsiString): AnsiString;
begin
  result := '0';
  while vergleich(a, b) >= 0 do
  begin
    result := summe(result, '1');
    a := differenz(a, b);
  end;
end;

function TMathe.modul(const a, b: AnsiString): AnsiString;
begin
  result := a;
  while vergleich(result, b) >= 0 do
    result := differenz(result, b);
end;
also das sollte erstmal funktionieren
und über eine Multiplication sollte sich da noch was optimieren lassen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat