Autor |
Beitrag |
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 26.02.06 18:27
_________________ 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
Beiträge: 40
|
Verfasst: So 26.02.06 18:34
|
|
Dezipaitor
Beiträge: 220
|
Verfasst: 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
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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 )
TBruchG repräsentiert einen Bruch mit Ganzzahlanteil, das ist nützlich wenn man sowas darstellen will:
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:
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
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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#
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
Beiträge: 40
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| function ToBruch(Ganze,Zaehler,Nenner:int64) : TBruch; 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):
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'); 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'); end else raise Exception.Create('Syntax-Fehler'); end else result := b1; end; end else raise Exception.Create('Syntax-Fehler'); end; |
- Folgende Funktionen extrahieren Ganzzahl etc. aus einem Bruch, damit muss man der Anwender die interne Darstellung eines Bruchs nicht mehr kennen:
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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function BruchToNiceStr(Bruch:TBruch) : string; var g,z,n : int64; begin Bruch := p_Kuerzen(Bruch); g := Ganze(Bruch); z := Zaehler(Bruch); n := Nenner(Bruch); if (g<>0) then begin if (n<>1) then 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
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
Beiträge: 42
|
Verfasst: 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
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mo 22.05.06 18:46
in delphi 2006
|
|
Beiri22
Beiträge: 42
|
Verfasst: Mo 22.05.06 20:43
|
|
F34r0fTh3D4rk
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
Beiträge: 42
|
Verfasst: Di 23.05.06 14:42
ich nehm doch auch nur (noch) die trial, is mir nur halt dabei aufgefallen.
|
|
|