AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi immer noch beim kürzen!
Thema durchsuchen
Ansicht
Themen-Optionen

immer noch beim kürzen!

Ein Thema von Scryless · begonnen am 29. Nov 2003 · letzter Beitrag vom 29. Nov 2003
Antwort Antwort
Scryless

Registriert seit: 21. Nov 2003
Ort: Germnay - 53773 Hennef
10 Beiträge
 
#1

immer noch beim kürzen!

  Alt 29. Nov 2003, 10:16
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...!
Bitte Rücksicht auf mein Delphinevau , bin n Ansteiger seit 4 Monaten..THANKS...
  Mit Zitat antworten Zitat
Benutzerbild von Mirilin
Mirilin

Registriert seit: 21. Dez 2002
Ort: Lenzburg
861 Beiträge
 
Delphi 6 Professional
 
#2

Re: immer noch beim kürzen!

  Alt 29. Nov 2003, 11:28
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
Tobias
Die Physik ist für die Physiker eigentlich viel zu schwer.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: immer noch beim kürzen!

  Alt 29. Nov 2003, 12:37
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.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 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