Forum: Neuen Beitrag zur Code-Library hinzufügen
by himitsu,
14. Jun 2009
also das sollte jetzt bei dir Laufen ...
function tform1.Quotient(a, b: AnsiString): AnsiString;
var
c: Int64;
begin
if b = '0' then System.Error(reDivByZero);
Result := '0';
c := 0;
while Length(b) < Length(a) do
begin
Forum: Neuen Beitrag zur Code-Library hinzufügen
by himitsu,
14. Jun 2009
OK, das kommt davon, wenn man bei seiner Vergleichsfunktion fernab von jeglichen Standards seine Rückgabewerte definiert ... hatte ganz übersehen, daß diese anders vergleicht.
mach mal aus dem
while vergleich(b, a) <= 0 do
dieses hier
while vergleich(b, a) >= 1 do
ich hoff das stimmt dann
Forum: Neuen Beitrag zur Code-Library hinzufügen
by himitsu,
14. Jun 2009
lad dochj mal ein komplettest Testprojekt hoch, damit man das Schleifchen auch mal sehen kann ... eigentlich sollte da ja keines sein :angel2:
if a=b » brich ab, wenn gleich ... vergleich(a,b)<>0 bzw. a<>b » brich ab, wenn ungleich
also alles danach wird niemal abgearbeitet
if vergleich(a,b)<0
then
Forum: Neuen Beitrag zur Code-Library hinzufügen
by himitsu,
13. Jun 2009
Die das letzte Quotient-Funktion entspricht etwa meiner ... nur etwas gekürzt
summe scheint schonmal richtig zu laufen
Und kann es sein, daß zugfällig diese Meldung angezeigt wird?
Denn dieses sollte immer "wahr" / True melden und auslösen, da hier A immer <> B ist.
//zwei gleiche Zahlen:
if a=b
then result:='0'
else
//a>b?
Forum: Neuen Beitrag zur Code-Library hinzufügen
by himitsu,
12. Jun 2009
keine String-Operation (das +), sondern deiner summe-Funktion ;)
// c = Stellen
function tform1.Quotient(a, b: AnsiString): AnsiString;
var
c: Int64;
begin
if b = '0' then System.Error(reDivByZero);
Result := '0';
Forum: Neuen Beitrag zur Code-Library hinzufügen
by himitsu,
12. Jun 2009
die innere Schleife etwas anders geordnet:
also im Prinzip das
Quotient := summe(Quotient, potenz(10, verschobeneStellen));
Forum: Neuen Beitrag zur Code-Library hinzufügen
by himitsu,
12. Jun 2009
na "fast" genauso, wie du es schriftlich auch machst
z.B.
456789 div 123
Forum: Neuen Beitrag zur Code-Library hinzufügen
by himitsu,
12. Jun 2009
kleines Beispiel:
function TMathe.summe(a, b: AnsiString): AnsiString;
var
i, i2, ueberlauf, x: Integer;
begin
normalisieren(a);
normalisieren(b);
if (a = '-') <> (b = '-') then
begin
Forum: Neuen Beitrag zur Code-Library hinzufügen
by himitsu,
12. Jun 2009
Also nach der einfachen Methode sollte das Ergebnis aber zumindestens richtig sein und dem Ergebnis des DIV-Operators entsprechen.
Und Endlosschleife dürfte auch nicht ganz stimmen ... nur halt langsam, da womöglich viele Schleifendurchläufe nötig sind
z.B. 1000000 div 2 bzw. mathe.differenz('1000000', '2') benötigt so immerhin schon 500000 Durchläufe
Aber es ist einfacher wirklich erstmal...
Forum: Neuen Beitrag zur Code-Library hinzufügen
by himitsu,
11. Jun 2009
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.
function tform1.isOdd(const a: AnsiString): AnsiString; // modul(b, '2') <> '0'
begin
Result := (a <> '') and (a in );
end;