Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Rechner machen mit Brüche (https://www.delphipraxis.net/59138-rechner-machen-mit-brueche.html)

OwNy 17. Dez 2005 22:41


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

Mystic 18. Dez 2005 02:02

Re: Rechner machen mit Brüche
 
Ü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

OwNy 18. Dez 2005 10:40

Re: Rechner machen mit Brüche
 
ohje :/ das versteh ich nit :gruebel:
welchen code muss ich nehmen? den oberen oder unteren oder beide?
mfg

marabu 18. Dez 2005 10:51

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

Matze 18. Dez 2005 11:00

Re: Rechner machen mit Brüche
 
Zitat:

Zitat von OwNy
ohje :/ das versteh ich nit :gruebel:
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:

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.

Nikolas 18. Dez 2005 11:15

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)... }

OwNy 18. Dez 2005 11:30

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.

Khabarakh 18. Dez 2005 12:18

Re: Rechner machen mit Brüche
 
Zitat:

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 :wink: . f ist eine lokale Variable in der Prozedur, den Wert änderst du hier:
Delphi-Quellcode:
// Werte zuweisen:
  Decimal := 5.46;
237/50 = 5.46 :wink:

OwNy 18. Dez 2005 12:23

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

Ratte 18. Dez 2005 12:51

Re: Rechner machen mit Brüche
 
decimal:=strtofloat(Edit1.text);
so heist es richtig

EDIT: kleiner fehler, mein Gedächnis :wall:

OwNy 18. Dez 2005 13:02

Re: Rechner machen mit Brüche
 
nun sagt es mir [Fehler] Unit10.pas(63): Undefinierter Bezeichner: 'stringtofloat'

edit: habs es hies Decimal := strtofloat(edit1.text)
edit2.: danke es geht :) ihr seit die besten :D
edit3.: das nächste problem... hatte das vorher in neues unit gemacht nu möchte ich es in das des rechners!

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;
so! nun muss ja das neue darunter, hab ich gemacht nun sieht das so aus:

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.Button1Click(Sender: TObject);

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

  Decimal := strtofloat(TFe.text);

  // 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.
da soll er jetz aus TFe (ergebniss von der division) den bruch machen, also Decimal := strtofloat(TFe.text);

sollte stimmen aber nun sagt er: [Fehler] Unit1.pas(87): ';' erwartet, aber 'IMPLEMENTATION' gefunden

wieso?
mfg

blawen 18. Dez 2005 13:23

Re: Rechner machen mit Brüche
 
Die vielen Edits des obigen Beitrags machen meinen Kommentar überflüssig - gelöscht

malo 18. Dez 2005 15:18

Re: Rechner machen mit Brüche
 
Kann es sein, dass du zweimal "Implementation" in deinem Programm hast? :mrgreen:

Du hast also einen Implemenatation-Abschnitt IN einem selbigen gemacht...

Tipp: Kopiere nicht nur Quelltexte, sondern lies sie, und wende sie an. Du wirst sehen, dass Matzes Implementation-Abschnitt den einer gesamten Unit darstellt.

Also diese beiden Codezeilen löschen:

Delphi-Quellcode:
implementation

{$R *.dfm}
Und zwar die, die weiter unten sind (aus dem reinkopierten Bereich) :zwinker:

OwNy 18. Dez 2005 16:40

Re: Rechner machen mit Brüche
 
hab ich gemacht nu kommen diese fehler:
[Fehler] Unit1.pas(137): Deklaration erwartet, aber Dateiende gefunden
[Fehler] Unit1.pas(135): ';' erwartet, aber '.' gefunden
[Fehler] Unit1.pas(118): ';' erwartet, aber '.' gefunden
:/
mfg

Daniel G 18. Dez 2005 16:48

Re: Rechner machen mit Brüche
 
Zitat:

Zitat von OwNy
hab ich gemacht nu kommen diese fehler:
[Fehler] Unit1.pas(137): Deklaration erwartet, aber Dateiende gefunden

Das

Delphi-Quellcode:
end.
(nicht zu verwechseln mit
Delphi-Quellcode:
end;
) gehört ganz ans Ende des Codes.
Zitat:

Zitat von OwNy
[Fehler] Unit1.pas(135): ';' erwartet, aber '.' gefunden
[Fehler] Unit1.pas(118): ';' erwartet, aber '.' gefunden
:/
mfg

Ohne Quellcode kann ich dir nur das sagen, was da steht. In der Zeile befindet sich ein Punkt, der Compiler erwartet aber ein abschließendes Semikolon (;)

OwNy 18. Dez 2005 17:05

Re: Rechner machen mit Brüche
 
am ende is ein end.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Rechnen: TButton;
    TFx: TEdit;
    TFy: TEdit;
    TFs: TEdit;
    TFa: TEdit;
    TFb: TEdit;
    TFe: TEdit;
    Rechnen2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    procedure RechnenClick(Sender: TObject);
    procedure Rechnen2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}




procedure TForm1.RechnenClick(Sender: TObject);

VAR
x, y, s : REAL;
begin
x:= strtofloat (TFx.text);
y:= strtofloat (TFy.text);

s:= x*y;

TFs.Text := floattostr (s);

showmessage ('kannste haben :>');

end;



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.Button1Click(Sender: TObject);

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

  Decimal := strtofloat(TFe.text);

  // 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.
mfg

ManuMF 18. Dez 2005 18:00

Re: Rechner machen mit Brüche
 
Und immer noch 2 mal implementation :roll: ...

Will sagen: lösche das zweite
Delphi-Quellcode:
implementation

{$R *.dfm}
raus und verschiebe das
Delphi-Quellcode:
type
  TFraction = record
    Numerator: Integer;
    Denominator: Integer;
  end;
hinter
Delphi-Quellcode:
uses
  Windows, ...
.

Gruß,
ManuMF

OwNy 18. Dez 2005 18:42

Re: Rechner machen mit Brüche
 
so, wurde gemacht un wieder 3 fehler :/

[Fehler] Unit1.pas(117): ';' erwartet, aber '.' gefunden
[Fehler] Unit1.pas(134): ';' erwartet, aber '.' gefunden
[Fehler] Unit1.pas(136): Deklaration erwartet, aber Dateiende gefunden

sieht nu folgender masen aus die sachen wo ich machen sollte
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFraction = record
    Numerator: Integer;
    Denominator: Integer;
  end;
das
Delphi-Quellcode:
implementation

{$R *.dfm}
hab ich rausgelöscht.
mfg

Khabarakh 18. Dez 2005 19:00

Re: Rechner machen mit Brüche
 
Zeig doch mal etwas Eigeninitiative :roll: .
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
  Form1: TForm1;
Mit einer halben Prozedur im Code kann das ja nichts werden.

ManuMF 18. Dez 2005 19:04

Re: Rechner machen mit Brüche
 
Lies dir am Besten mal die Grundlagen durch.

Gruß,
ManuMF

OwNy 18. Dez 2005 19:46

Re: Rechner machen mit Brüche
 
Zitat:

Zitat von Khabarakh
Zeig doch mal etwas Eigeninitiative :roll: .
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
  Form1: TForm1;
Mit einer halben Prozedur im Code kann das ja nichts werden.

hast recht!
hab den
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
  Form1: TForm1;
rausgelöscht nu gehts :) merci beacoup

malo 18. Dez 2005 21:56

Re: Rechner machen mit Brüche
 
Zitat:

Zitat von ManuMF
verschiebe das
Delphi-Quellcode:
type
  TFraction = record
    Numerator: Integer;
    Denominator: Integer;
  end;
hinter
Delphi-Quellcode:
uses
  Windows, ...

Wieso?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:46 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