AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rechner machen mit Brüche

Ein Thema von OwNy · begonnen am 17. Dez 2005 · letzter Beitrag vom 18. Dez 2005
Antwort Antwort
Seite 1 von 3  1 23      
OwNy

Registriert seit: 16. Dez 2005
Ort: Iffezheim
11 Beiträge
 
Delphi 6 Enterprise
 
#1

Rechner machen mit Brüche

  Alt 17. Dez 2005, 23:41
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:
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.
nur kommt da immer eine dezimal zahl raus!
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: Klick mich
Chris Lorenz
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Rechner machen mit Brüche

  Alt 18. Dez 2005, 03:02
Übersetzt von VB nach Delphi von hier: http://www.geocities.com/oosterwal/c.../dec2frac.html

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
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
OwNy

Registriert seit: 16. Dez 2005
Ort: Iffezheim
11 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Rechner machen mit Brüche

  Alt 18. Dez 2005, 11:40
ohje :/ das versteh ich nit
welchen code muss ich nehmen? den oberen oder unteren oder beide?
mfg
Chris Lorenz
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Rechner machen mit Brüche

  Alt 18. Dez 2005, 11:51
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
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Rechner machen mit Brüche

  Alt 18. Dez 2005, 12:00
Zitat von OwNy:
ohje :/ das versteh ich nit
welchen code muss ich nehmen? den oberen oder unteren oder beide?
mfg
Ich verstehe dein Problem so, dass du eine Dezimalzahl hast und diese einfach in einen Bruch umwandeln möchtest.

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 von OwNy:
entweder per replys oder per icq: 339188648Klick mich
Nur zur Info: Sowas soll generell über's Forum laufen, andere interessiert das evtl. auch.
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Rechner machen mit Brüche

  Alt 18. Dez 2005, 12:15
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)... }
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
OwNy

Registriert seit: 16. Dez 2005
Ort: Iffezheim
11 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: Rechner machen mit Brüche

  Alt 18. Dez 2005, 12:30
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.
Chris Lorenz
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Rechner machen mit Brüche

  Alt 18. Dez 2005, 13:18
Zitat von OwNy:
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)
Soll es aber nicht . f ist eine lokale Variable in der Prozedur, den Wert änderst du hier:
Delphi-Quellcode:
// Werte zuweisen:
  Decimal := 5.46;
237/50 = 5.46
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
OwNy

Registriert seit: 16. Dez 2005
Ort: Iffezheim
11 Beiträge
 
Delphi 6 Enterprise
 
#9

Re: Rechner machen mit Brüche

  Alt 18. Dez 2005, 13:23
also ist decimal := edit1 ?
mfg

edit.: wenn ich decimal := edit1 sagt er [Fehler] Unit10.pas(63): Inkompatible Typen: 'Double' und 'TEdit'
mfg
Chris Lorenz
  Mit Zitat antworten Zitat
Ratte

Registriert seit: 12. Dez 2003
Ort: Erfurt
345 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Rechner machen mit Brüche

  Alt 18. Dez 2005, 13:51
decimal:=strtofloat(Edit1.text);
so heist es richtig

EDIT: kleiner fehler, mein Gedächnis
Schiffsratte der U.S.S. Delphipraxis, Laderaum 4538
BUSH:= TTerminator.create;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 03:06 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