Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Algorithmen (https://www.delphipraxis.net/28-library-algorithmen/)
-   -   Delphi Kürzen eines Bruches (https://www.delphipraxis.net/88142-kuerzen-eines-bruches.html)

felxi 10. Mär 2007 21:34


Kürzen eines Bruches
 
Mit der folgenden Funktion ist es möglich, einen Bruch mit Hilfe des ggT vollkommen zu kürzen:

Delphi-Quellcode:
type TBruch = record
  zaehler,nenner :Integer;
  end;

...

Function Kuerzen(zaehler,nenner:integer):Tbruch;
var
  a,b,rest:Integer;
begin

  If (zaehler = 0) or (nenner = 0) then exit;
////größere Zahl bestimmen///////////
  If abs(Zaehler) < abs(Nenner) then
  begin
   a := Zaehler;
   b := Nenner;
  end else
  begin
   b := Zaehler;
   a := Nenner;
  end;
///////////ggT//////////////
  rest:= a mod b;
  while rest<>0 do
  begin
    rest:=a mod b;
    a:=b;
    b:=rest;
  end;
//////Ergebnis ausgeben//////
  Result.zaehler := Round(Zaehler / a);
  Result.nenner := Round(Nenner / a);
end;

TonyR 10. Mär 2007 22:32

Re: Kürzen eines Bruches
 
Wir hatten das Thema ja vor kurzem erst hier in der DP.
Es fehlt bei dir das zerlegen des Bruches in Ganzzahl, Zähler und Nenner!
Meine Lösung:

Delphi-Quellcode:
TBruch = record
  Zaehler: integer;
  Nenner: Integer;
  Ganzzahl: integer;
end;

function ggT(a, b: integer): integer;
var
  x: integer;
begin
  if b <> 0 then
  repeat
    x:=a mod b;
    a:=b;
    b:=x;
  until x = 0;
  result := abs(a); //falls a, oder b negativ
end;

function Kuerzen(Bruch: Tbruch;): TBruch;
var
  Teiler: Integer;
  TempZaehler, TempGanzzahl: Word;
begin
  Teiler := ggt(bruch.Zaehler, bruch.Nenner);
  if Teiler <> 0 then
  begin
    Result.Zaehler := Round(bruch.Zaehler / Teiler);
    Result.Nenner := Round(bruch.Nenner / Teiler);
    TempZaehler := result.Zaehler; // musste ich mit temporären Brüchen rechnen, weil die folgende Funktionen werte des Typs Word verlangt
    TempGanzzahl := 0;
    DivMod(result.zaehler, Result.Nenner, TempGanzzahl, TempZaehler); // hier erhält man die Ganzzahl mithilfe der Restberchnung
    Result.Zaehler := TempZaehler;
    Result.Ganzzahl := TempGanzzahl;
  end;
end;
Edit: Link zum angesprochenen Thema hinzugefügt.

[edit=CalganX]Code-Style angepasst. Mfg, CalganX[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 13: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