Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi immer noch beim kürzen! (https://www.delphipraxis.net/12517-immer-noch-beim-kuerzen.html)

Scryless 29. Nov 2003 09:16


immer noch beim kürzen!
 
Ja,ich hab den Kürzenvorschlag:

{kürzen}
For I := Min(Abs(ez), Abs(en)) downto 2 do
If (ez mod I2 = 0) and (en mod I2 = 0) Then Begin
ez := ez div I2;
en := en div I2;
Break;
End;


von "himinitsu" bei meiner Prozedur eingegeben,damit er mir den Bruch im Ergbebnisfeld kürzt,doch es tritt folgender Fehler auf:


Decleration expected , but “FOR “ found


ich weiß net mehr weiter,und was steht eigentlich für MIN? , Abs? downto? I bzw I2 & Break??

also diese fassung zum Programmieren von Kürzen von Bruchen,hackt:(

HILFE...!

Mirilin 29. Nov 2003 10:28

Re: immer noch beim kürzen!
 
:hi: Scryless

Delphi-Quellcode:
uses
  ... JCLMath, Math;

...

type
  TBruch = record
    Zaehler: Integer;
    Nenner : Integer;
  end;

...

function Kuerzen(const Bruch: TBruch): TBruch;
var
  GGT : Integer;
begin
  GGT := GCD(Bruch.Zaehler, Bruch.Nenner);
  Result.Zaehler := Bruch.Zaehler div GGT;
  Result.Nenner := Bruch.Nenner div GGT;
end;

...

function Kuerzen2(const Bruch: TBruch): TBruch;
var
  Teiler : Integer;
  MaxTeiler   : Integer;
begin
  Result := Bruch;
  MaxTeiler := Min(Abs(Bruch.Zaehler), Abs(Bruch.Nenner));
  for Teiler := MaxTeiler downto 2 do
  begin
    if (Bruch.Zaehler mod Teiler = 0) and (Bruch.Nenner mod Teiler = 0) then
    begin
      Result.Zaehler := Bruch.Zaehler div Teiler;
      Result.Nenner := Bruch.Nenner div Teiler;
      Break;
    end;
  end;
end;

...
Die erste Funktion benötigt die in der Unit JclMath (-->Jedis) zur Verfügung gestellte Funktion GCD (auf Deutsch GGT).

Die beiden Funktionen hier tun eigentlich das gleiche.
Kuerzen greifft auf die Funktion GCD zurück um den GGT zu erhalten und Teilt den Bruch durch diesen, und kuerzen2 errechnet ihn kurz selber.
Und zwar tut sie das so :
- Sie fäng an, beim kleineren der beiden Werte (--> Min(...) ).
- Sie zählt nun diesen schrittweise nach unten bis 2, denn das ist der letzte sinnvolle Teiler.
- Findet sie eine Zahl im Bereich zwischen 2 und der kleineren der Beiden (im Code Maxteiler) dann teilt sie die beiden Zahlen durch diesen, und verlässt die Schleife.


Ps. (Wort markieren --> F1; oder klick)
Min() : gibt die kleinere von 2 Zahlen zurück.
Abs() : gibt den Betrag einer Zahl aus.
Break : verlässt eine Schleife.



Hoffentlich konnte ich Dir damit helfen.


mit freundlichen Grüssen Tobias

himitsu 29. Nov 2003 11:37

Re: immer noch beim kürzen!
 
http://www.FrankNStein.de/Smiley-Wolke.gif Hallöle Scryless,

Die Funktion von Min(), Abs() und Break hat ja Miri schon erklärt.

Ursprünglich sah die Schleife so aus:
Delphi-Quellcode:
{kürzen}
For I := 2 to Abs(ez) {oder Abs(en)} do
  If (ez mod I2 = 0) and (en mod I2 = 0) Then Begin
    ez2 := ez div I2;
    en2 := en div I2;
  End;
ez := ez2;
en := en2;
Dabei wird aber das Ergebnist mehrmals berechnet und die Schleife immer komplett durchlaufen - daher wurde das noch etwas beschleunigt:
Delphi-Quellcode:
    {kürzen}
{1} For I := Min(Abs(ez), Abs(en)) downto 2 do
{2}   If (ez mod I2 = 0) and (en mod I2 = 0) Then Begin
        ez := ez div I2;
        en := en div I2;
{3}     Break;
      End;
  1. Min(Abs(Z1), Abs(Z1)) sucht einfach die kleinste der beiden Zahlen, ohne das Vorzeichen zu beachten
    Und dann wird in der Schleife (I) bis zur 2 runtergezählt
  2. prüft ob Nenner und Zähler durch die aktuelle Zahl (I) ohne Rest teilbar sind
  3. beendet die For-Schleife, sobald ein Ergebnis (GGT - Größter Gemeinsamer Teiler) gefunden wurde



Kannste mal sagen bei welcher Rechenaufgabe es hagt und eventuell nochmal dein Prog zeigen.

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 Uhr.

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