Autor Beitrag
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 26.02.06 18:27 
user profile iconwp_xxyyzz hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:

Sollte die 2. Routine nicht, wenn kein Bruchstrich vorkommt, FloatToBruch aufrufen? Fänd ich logischer...


Wenn kein Bruchstrich vorkommt, muss es sich um eine ganze Zahl handeln, da TBruch nur aus ganzen Zahlen zusammengesetzt ist.

Nein, grad nicht, weil ich kann doch StrToBruch auch sowas hier übergeben:

ausblenden Delphi-Quelltext
1:
Bruch := StrToBruch('0.5');					


UC? ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
wp_xxyyzz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: So 26.02.06 18:34 
Natürlich - hast recht!
Dezipaitor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: Di 14.03.06 23:12 
coole unit

nur so zum Spaß:
könnte man eigentlich auch mit komplexen Zahlen rechnen.

also
z = a + ib (wobei a,b e R)
i^2 = -1

i = sqrt(-1)

und
1/i = i/(i^2) = -i

sowie
1/(a+ib) = (a-ib)/(a^2 + b^2) b <> 0 && a <> 0
(Bruch mit (a-ib) erweitert und 3.binomF. im Nenner )

Vielleicht hat jemand Lust?
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: So 16.04.06 12:16 
von komplexen zahlen habe ich leider keine ahnung, sonst hätte ichs bestimmt umgesetzt ^^ alle anderen änderungen sollten jetzt drin sein
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Fr 21.04.06 16:27 
Ich habe die Unit nochmal ein wenig verbessert, falls noch irgendwo zb ein const zuviel oder zu wenig ist, das wäre nett, die parameterübergaben sollen ja möglichst optimal gewählt sein.

Neu ist TBruchG, im moment kann nur von TBruch in TBruchG umgewandelt werden, aber Stringumwandlungen, sowie einige andere Dinge werden folgen, ebenso die Behandlung von Mehrfachbrüchen (autsch :lol: )

TBruchG repräsentiert einen Bruch mit Ganzzahlanteil, das ist nützlich wenn man sowas darstellen will:

ausblenden Delphi-Quelltext
1:
2:
3:
45 67/23
-- -- --
1. 2. 3.


1. ganzzahl
2. zähler
3. nenner

die umwandlung von und in einen string kommt noch, eventuell werde ich die unit noch ein wenig umstrukturieren

im moment geht das mit dem anzeigen so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  aBruch: TBruch;
  aBruchG: TBruchG;
begin
  aBruch := StrToBruch(edit1.text);
  aBruchG := BruchToBruchG(aBruch);
  edit2.text := inttostr(aBruchG.Zahl) + ' ' + BruchToStr(ToBruch(aBruchG.Zaehler, aBruchG.Nenner));
end;


EDIT: TBruchG besteht jetzt aus Zahl und Bruch und die umwandlung sollte jetzt auch fehlerfrei funktionieren
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Sa 22.04.06 11:47 
ich arbeite momentan an einer sehr umfangreichen Demo Applikation, in der sämtliche Features mit Beispielen veranschaulicht werden, außerdem werden noch Funktionen wie FloatBruchAdd und IntBruchAdd sowie Sub multi und div dazukommen, dann kann ich auch ein wenig bei der umwandlung von bruchg zu bruch kürzen usw.

weils so viel spass macht, der ggT in C#
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
    public int ggT(int a, int b)
    {
      if ((a == 0) || (b == 0))
        return 0;
      int r;
      do
      {
        r = b;
        b = a % b;
        a = r;
      }
      while (b != 0);
      return a;
    }
wp_xxyyzz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: So 23.04.06 13:41 
TBruchG findet ich zunächst eine nützliche Erweiterung, da nun praktisch die ganze Bruchrechnung abgedeckt ist. Allerdings stört mich, dass man dafür einen weiteren Int64 benötigt, die Information dafür aber schon in der bisherigen Deklaration vorhanden ist. Ich würde folgende Änderungen vorschlagen, um einen ganzzahligen Bruchanteil zu implementieren, ohne TBruchG einführen zu müssen:

- Die bereits vorhandene Funktion ToBruch würde ich mit einer Variante mit Ganzzahl überladen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function ToBruch(Ganze,Zaehler,Nenner:int64) : TBruch; // natürlich mit "overload"
begin
  if Nenner=0 then raise Exception.Create('Der Nenner darf nicht null sein.');
  result.Zaehler := Ganze*Nenner + Zaehler;
  result.Nenner := Nenner;
end;


- Die Stringumwandlungsroutine müsste die vorgeschaltete Ganzzahl erkennen; die folgende Routine geht noch weiter und erkennt auch Float-Zahlen in Ganzzahl, Zähler und Nenner; außerdem werden einige offensichtliche Syntax-Fehler erkannt (aber sicher nicht alle):

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
function StrToBruch(const s:string; eps:extended=0.0) : TBruch;
var
  p : integer;
  b1,b2,b3 : TBruch;

  function Get(var z : TBruch) : boolean;
  var
    tmp : string;
  begin
    tmp := '';
    while (p <= Length(s)) and (s[p] = ' 'do inc(p);
    while (p<=Length(s)) and (not (s[p] in [' ''/'])) do begin
      tmp := tmp + s[p];
      inc(p);
    end;
    while (p <= Length(s)) and (s[p] = ' 'do inc(p);
    if tmp=''
      then result := false
    else begin
      if eps=0.0
        then z := FloatToBruch(StrToFloat(tmp))
        else z := FloatToBruch(StrToFloat(tmp), eps);
      result := true;
    end;
  end;

begin
  p := 1;
  if Get(b1) then begin
    if (p>Length(s)) then
      result := b1
    else
    if s[p]='/' then begin
      inc(p);
      if Get(b2) then
        result := p_Div(b1, b2)
      else
        raise Exception.Create('Syntax-Fehler');  // keine weitere Zahl hinter dem "/"
    end else begin
      if Get(b2) then begin
        if s[p]='/' then begin
          inc(p);
          if Get(b3) then
            result := p_Add(b1, p_Div(b2,b3))
          else
            raise Exception.Create('Syntax-Fehler'); // s.o.
        end else
          raise Exception.Create('Syntax-Fehler');
      end else
        result := b1;
    end;
  end else
    raise Exception.Create('Syntax-Fehler');   // Hier fehlt der Nenner.
end;


- Folgende Funktionen extrahieren Ganzzahl etc. aus einem Bruch, damit muss man der Anwender die interne Darstellung eines Bruchs nicht mehr kennen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function Ganze(bruch:TBruch) : int64;
begin
  result := Bruch.Zaehler div Bruch.Nenner;
end;

function Zaehler(bruch:TBruch) : int64;
begin
  result := Bruch.Zaehler mod Bruch.Nenner;
end;

function Nenner(Bruch:TBruch) : int64;
begin
  result := Bruch.Nenner;
end;


- Schließlich erscheint mir noch eine weitere Stringumwandlungsroutine sinnvoll:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function BruchToNiceStr(Bruch:TBruch) : string;
// Spaltet den Ganzteil ab, aber nur wenn vorhanden. Das Ergebnis ist ein "schöner" Bruch.
var
  g,z,n : int64;
begin
  Bruch := p_Kuerzen(Bruch);
  g := Ganze(Bruch);
  z := Zaehler(Bruch);
  n := Nenner(Bruch);
  if (g<>0then begin
    if (n<>1then result := Format('%d %d/%d', [g,z,n])
    else result := Format('%d', [g])
  end else
  if (n<>1)
    then result := Format('%d/%d', [z, n])
    else result := Format('%d', [z]);
end;
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 24.04.06 14:34 
da hast du dir ja schon gedanken gemacht ^^ einige dinge sind auch schon fertig, aber sachen wie sowas x x/x von string in einen bruch umzuwandeln hat noch nicht ganz so geklappt, ich überlege auch immer noch, funktionen einzubauen um zahlen als int oder float mit brüchen zu addieren multiplizieren usw und mehrfachbrüche einzubauen, mehrfachbrüche vielleicht mit nem array aus nennern oder einfach einem extended als nenner, da bin ich mir noch uneinig ;)
Beiri22
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: Mo 22.05.06 18:27 
Titel: in D2006
In delphi 2006 kannst du von records die operatoren überladen,
du könntest da also alles in den record mit einbauen, das lässt
sich dann viel einfacher handhaben.
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 22.05.06 18:46 
in delphi 2006 :lol:
Beiri22
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: Mo 22.05.06 20:43 
ja in delphi 2006
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 23.05.06 10:08 
es hat aber nunmal nicht jeder delphi2006, ich kann eine delphi2006 version machen, könnte es aber nicht testen weil ich kein d2006 habe ;)
Beiri22
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: Di 23.05.06 14:42 
ich nehm doch auch nur (noch) die trial, is mir nur halt dabei aufgefallen.