Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   qwertz543221 kleine String-Math-Lib (https://www.delphipraxis.net/135492-qwertz543221-kleine-string-math-lib.html)

mkinzler 12. Jun 2009 21:56

Re: qwertz543221 kleine String-Math-Lib
 
@qwertz543221: Die Aufforderung Delphi-Tags zu verwenden und den Code richtig einzurücken war ernst gemeint. Bitte mache dies in der Zukunft! :warn:

himitsu 13. Jun 2009 12:57

Re: qwertz543221 kleine String-Math-Lib
 
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.
Delphi-Quellcode:
  //zwei gleiche Zahlen:
  if a=b
  then result:='0'
  else
  //a>b?
if (vergleich(a,b)<>0 )and(a<>b)
  then
  begin
  showmessage('Subtraktion nicht möglich.');
  exit;
  end
//a>b? <> (vergleich(a,b)<>0 )and(a<>b)
Ich vermute mal du wolltes da ein > und nicht <> verwenden.
obwohl es bei dir eigentlich < sein müßte ... a<b, da dann ein negatives Ergebnis rauskommen täte.

Und warum einmal Stringvergleich und zusätzlich per Funktion?

Mein Tipp: einen Breakpoint setzen und dann intensive Nutzung der Taste F7 :angel:

himitsu 14. Jun 2009 06:09

Re: qwertz543221 kleine String-Math-Lib
 
Zitat:

Zitat von qwertz543221
Hallo himitsu,
leider habe ich deinen letzten beitrag nicht ganz nachvollziehen können.
Bei der Verwendung der subtr. fkt zur durchführung einer division befindet sich das programm in einer endlosschleife.

lad dochj mal ein komplettest Testprojekt hoch, damit man das Schleifchen auch mal sehen kann ... eigentlich sollte da ja keines sein :angel2:
Zitat:

Delphi-Quellcode:
//zwei gleiche Zahlen:
  if a=b
  then result:='0'
  else
  //a>b?
if (vergleich(a,b)<>0 )and(a<>b)
  then
  begin
  showmessage('Subtraktion nicht möglich.');
  exit;
  end

if a=b » brich ab, wenn gleich ... vergleich(a,b)<>0 bzw. a<>b » brich ab, wenn ungleich

also alles danach wird niemal abgearbeitet
Delphi-Quellcode:
if vergleich(a,b)<0
  then
Zitat:

Zitat von himitsu
Mein Tipp: einen Breakpoint setzen und dann intensive Nutzung der Taste F7 :angel:

auf die erste Zeile der Quotient-Funktion gehen F5 drücken,
dann mit F7 in Ruhe die Funktion abarbeiten
und dabei schauen was mit den ganzen Variablen passiert
dafür gibt es unter Strg+Alt+W ein Fenster, wo man Variablennamen eintragen kann
oder man höllt die Maus mal ein paar Sekündchen über eine Variable im Code und bekommt so ihren Inhalt angezeigt.

Zitat:

Zitat von qwertz543221
gibt es vlt einen effizienteren algorithmus zur modulo-bestimmung, dann bräuchte ich die division gar nicht?? - das ganze soll ja irgendwann für RSA dienen, bei dem die zahlen über alle normalen delphi-variablentypen hinausgehen.

Und das ist schon ein recht effektiver Algo dafür
gut, da es sich hier ja, aus Sicht des PCs um "alleinstehende" einzelne Dezimalzahlen handelt,
müssen wir diese halt auch komplett behandeln und dann jeweils um eine ganze verschieben.

Bei einer "rein" binären Lib, hätte man hier Bitweise gehen können und dann schön über shl die ganzen Bits verschieben können.

Problem ist halt, daß soeine auf Strings aufbauende Lib nunmal nicht ganz mit dem Wort Effizienz vereinbar ist.

qwertz543221 14. Jun 2009 11:42

Re: qwertz543221 kleine String-Math-Lib
 
Liste der Anhänge anzeigen (Anzahl: 1)
hallo, ich habe das projekt einmal als rar hochgeladen, dann kannst du es testen
vlt liegt es nur an einer kleinigkeit - das ist ja meistens so beim programmieren - oder ich habe deine vorschläge einfach falsch interpretiert.

mfG

himitsu 14. Jun 2009 14:45

Re: qwertz543221 kleine String-Math-Lib
 
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
Delphi-Quellcode:
while vergleich(b, a) <= 0 do
dieses hier
Delphi-Quellcode:
while vergleich(b, a) >= 1 do
ich hoff das stimmt dann



standard:
0 a=b
-1 a<b
1 a>b

und zum Auswerten dann
Delphi-Quellcode:
if vergleich(a, b) < 0 then  a < b  if vergleich(a, b) = -1 then
if vergleich(a, b) <= 0 then  a <= b
if vergleich(a, b) = 0 then  a = b
if vergleich(a, b) >= 0 then  a >= b
if vergleich(a, b) > 0 then  a > b  if vergleich(a, b) = 1 then
if vergleich(a, b) <> 0 then  a <> b
du siehst ... so verhält sich dann a zu b wie "vergleich" zu 0

oder man nutzt bei seiner Vergleichs-Funktion das TValueRelationship aus der Unit Types
(wie vorher schonmal vorgeschlagen), dann fällt zusätzlich noch auf, daß auch sowas geht

Delphi-Quellcode:
if vergleich(a, b) = LessThanValue   then  a < b
if vergleich(a, b) <> GreaterThanValue then  a <= b
if vergleich(a, b) = EqualsValue     then  a = b
if vergleich(a, b) <> LessThanValue   then  a >= b
if vergleich(a, b) = GreaterThanValue then  a > b
if vergleich(a, b) <> EqualsValue     then  a <> b

himitsu 14. Jun 2009 18:23

Re: qwertz543221 kleine String-Math-Lib
 
also das sollte jetzt bei dir Laufen ...
Delphi-Quellcode:
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
    c := c + 1;
    b := b + '0'; // b := produkt(b, '10');
  end;
  while c >= 0 do
  begin
    while vergleich(b, a) <> 0 do
    begin
      Result := summe(Result, inttostr(trunc(power(10, c))));
      a := differenz(a, b);
    end;
    c := c - 1;
    Delete(b, Length(b), 1); // b := quotient(b, '10');
  end;
end;
es gibt nur ein Problem ...
die Funktion summe rechnet falsch ...
und zwar wenn man sie einzeln benutzt, dann 1+1=2
aber in der schleife 0+1=1 ... 1+1=21 ... 21+1=221 .....
da ich aber bei deiner Summenfunktion einfach nicht durchseh, mußt'e den Fehler da wohl selber finden (hat vielleicht was mit den gloablen Variablen zu tun? :gruebel: )

[add]
Problem gefunden ... du hast in Summe das result nicht initialisiert:!:
ein result:=''; vor der Berechnung liefert Abhilfe.

und noch einen Tipp: das result wurde auch in anderen Funktionen nicht initialisert :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:28 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz