![]() |
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...! |
Re: immer noch beim kürzen!
:hi: Scryless
Delphi-Quellcode:
Die erste Funktion benötigt die in der Unit JclMath (-->
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 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 ![]() 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 |
Re: immer noch beim kürzen!
![]() Die Funktion von Min(), Abs() und Break hat ja Miri schon erklärt. Ursprünglich sah die Schleife so aus:
Delphi-Quellcode:
Dabei wird aber das Ergebnist mehrmals berechnet und die Schleife immer komplett durchlaufen - daher wurde das noch etwas beschleunigt:
{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;
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;
Kannste mal sagen bei welcher Rechenaufgabe es hagt und eventuell nochmal dein Prog zeigen. http://www.delphipraxis.net/images/common/divider.jpg ![]() ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz