AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Algorithmen Delphi Kürzen eines Bruches

Kürzen eines Bruches

Ein Thema von felxi · begonnen am 10. Mär 2007 · letzter Beitrag vom 10. Mär 2007
Antwort Antwort
felxi

Registriert seit: 12. Mär 2005
29 Beiträge
 
Delphi 5 Professional
 
#1

Kürzen eines Bruches

  Alt 10. Mär 2007, 21:34
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;
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Kürzen eines Bruches

  Alt 10. Mär 2007, 22:32
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]
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf