![]() |
Rechner machen mit Brüche
Hallo!
wie schon einmal gesagt bin ich neu und solangsam vertraut, mein bruder hilft mir auch mal ab und zu aber dies weis er nicht: wie bekomme ich bei einer Division das ergebniss als bruch raus? wenn es geht, wie? bisher hab ich das ganze so:
Delphi-Quellcode:
nur kommt da immer eine dezimal zahl raus!
procedure TForm1.Rechnen2Click(Sender: TObject);
VAR a, b, e : REAL; begin a:= strtofloat (TFa.text); b:= strtofloat (TFb.text); e:= a/b; TFe.Text := floattostr (e); showmessage ('kannste haben :>'); end; procedure TForm1.FormCreate(Sender: TObject); begin end; end. ich möchte nun ein neuen button und labels machen (das krieg ich hin :) ) wo man die dezimal zahl eingibt und der "rechner" sie zu einem bruch umwandelt. wäre cool wenn ihr mir erklären würdet wies geht. entweder per replys oder per icq: 339188648 danke und mfg OwNy edit.: hier der momentane rechner: ![]() |
Re: Rechner machen mit Brüche
Übersetzt von VB nach Delphi von hier:
![]() Die Funktion versucht eine rationale Zahl (= Bruch) zu finden, die der Dezimalzahl möglichst nahe liegt (im Bereich von Accuracy).
Delphi-Quellcode:
type
TFraction = record Numerator: Integer; Denominator: Integer; end; function Dec2Frac(const Decimal, Accuracy: Double): TFraction; var tempd: Double; f: TFraction; neg: Shortint; begin f.Numerator := 0; f.Denominator := 1; if Decimal < 0 then neg := -1 else neg := 1; tempd := 0; while Abs(tempd - Decimal) > Accuracy do begin if Abs(tempd) > Abs(Decimal) then inc(f.Denominator) else f.Numerator := f.Numerator + neg; tempd := f.Numerator / f.Denominator; end; Result := f; end;
Delphi-Quellcode:
var
f: TFraction; ... f := Dec2Frac(1.66667,0.001); // f.Numerator = 5 // f.Denominator = 3 |
Re: Rechner machen mit Brüche
ohje :/ das versteh ich nit :gruebel:
welchen code muss ich nehmen? den oberen oder unteren oder beide? mfg |
Re: Rechner machen mit Brüche
Hallo Chris,
ich muss zugeben, dass ich nicht so recht erkennen kann, was du eigentlich willst. Geht es um das exakte Rechnen mit rationalen Zahlen oder suchst du ein Verfahren zur näherungsweisen gebrochenen Darstellung einer reellen Zahl? Grüße vom marabu |
Re: Rechner machen mit Brüche
Zitat:
Wie das geht hast Mystic ja schon geschrieben. Für dich hier mal der Implementation-Teil einer Unit im Zusammenhang, dass du siehst, wie man das anwendet:
Delphi-Quellcode:
implementation
{$R *.dfm} type TFraction = record Numerator: Integer; Denominator: Integer; end; function Dec2Frac(const Decimal, Accuracy: Double): TFraction; var tempd: Double; f: TFraction; neg: Shortint; begin f.Numerator := 0; f.Denominator := 1; if Decimal < 0 then neg := -1 else neg := 1; tempd := 0; while Abs(tempd - Decimal) > Accuracy do begin if Abs(tempd) > Abs(Decimal) then inc(f.Denominator) else f.Numerator := f.Numerator + neg; tempd := f.Numerator / f.Denominator; end; //tempi := gcd(f.Numerator,f.Denominator); Result := f; end; procedure TForm1.Button1Click(Sender: TObject); var Decimal: Double; Rational: TFraction; begin // Werte zuweisen: Decimal := 5.46; // Umwandlung in einen Bruch // je kleiner der 2. Parameter, desto genauer das Ergebnis und desto länger die Rechenzeit Rational := Dec2Frac(Decimal, 0.000001); // Ergebnis anzeigen (Ausgabe für 5.46: 273/50): ShowMessage('Numerator: ' + IntToStr(Rational.Numerator) + #13#10 + 'Denumerator: ' + IntToStr(Rational.Denominator)); end; Nachtrag: Zitat:
|
Re: Rechner machen mit Brüche
Eine sichere Methode (solgane der Bruch nicht periodisch ist):
Deine Zahl durch 10^(Zeichen nach dem Komma dividieren). Bsp: 0,75 -> 075/100. Jetzt musst du nur noch kürzen, wozu du vielleicht noch einen ggt-Algorhytmus oder eine stupide Schleife brauchst. {Die Namensgebung von deinem tollen Programm ist doch etwas lächerlich, oder? '1337-Haxxor' für ein Programm mit diesem Umfang? Bei der Multiplikation heissen beide Zahlen (da kommutativ) übrigens Faktor und bei der Division Divident oder Divisor (da eben nicht kommutuativ)... } |
Re: Rechner machen mit Brüche
ja toxman mir war halt langweilig un auserdem is das das erste "programm" das ich mache :/
matze genau so meinte ich das :) die dezimalzahl zu einem bruch umwandeln. ich probier jetz ma dran rum. ich melde mich dan später. mfg edit.: Also: Ich hab einen Button gemacht mit dem caption button1 und ein edit fenster mit dem namen f (hab ich so aus dem code von matze rausgelesen das der so heisen soll) und hab die ganze sache mal reingekopiert, geht aber anscheinend auch! nun trag ich in das edit feld mit dem namen f die dezimalzahl 0,5 ein (sollte dan ja 1/2 rauskommen ;) ) und klick auf den rechenbutton. scheint zu funktionieren nur sagt er dann: Numerator: 273 Denumerator:50 und nich 1/2. was hab ich falsch gemacht? hier mal der code :
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; f: TEdit; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} type TFraction = record Numerator: Integer; Denominator: Integer; end; function Dec2Frac(const Decimal, Accuracy: Double): TFraction; var tempd: Double; f: TFraction; neg: Shortint; begin f.Numerator := 0; f.Denominator := 1; if Decimal < 0 then neg := -1 else neg := 1; tempd := 0; while Abs(tempd - Decimal) > Accuracy do begin if Abs(tempd) > Abs(Decimal) then inc(f.Denominator) else f.Numerator := f.Numerator + neg; tempd := f.Numerator / f.Denominator; end; //tempi := gcd(f.Numerator,f.Denominator); Result := f; end; procedure TForm1.Button1Click(Sender: TObject); var Decimal: Double; Rational: TFraction; begin // Werte zuweisen: Decimal := 5.46; // Umwandlung in einen Bruch // je kleiner der 2. Parameter, desto genauer das Ergebnis und desto länger die Rechenzeit Rational := Dec2Frac(Decimal, 0.000001); // Ergebnis anzeigen (Ausgabe für 5.46: 273/50): ShowMessage('Numerator: ' + IntToStr(Rational.Numerator) + #13#10 + 'Denumerator: ' + IntToStr(Rational.Denominator)); end; end. |
Re: Rechner machen mit Brüche
Zitat:
Delphi-Quellcode:
237/50 = 5.46 :wink:
// Werte zuweisen:
Decimal := 5.46; |
Re: Rechner machen mit Brüche
also ist decimal := edit1 ?
mfg edit.: wenn ich decimal := edit1 sagt er [Fehler] Unit10.pas(63): Inkompatible Typen: 'Double' und 'TEdit' mfg |
Re: Rechner machen mit Brüche
decimal:=strtofloat(Edit1.text);
so heist es richtig EDIT: kleiner fehler, mein Gedächnis :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz