Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Brüche kürzen- wieder einmal (https://www.delphipraxis.net/82722-brueche-kuerzen-wieder-einmal.html)

Spynx 18. Dez 2006 18:58


Brüche kürzen- wieder einmal
 
Hallo, ich bin hier gerade am verzweifeln...
Ich habe einen P-Q Formel Rechner geschrieben, der auch automatisch die eingegebenen Brüche mitkürzen soll.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
z,n,x1,x2,a,p,px,p2,q,disk,p5,e: real;
begin
a:= strtofloat(edit1.text) /  strtofloat(edit2.text);
px:= strtofloat(edit3.text) /  strtofloat(edit4.text);
p:=px / a;
q:= (strtofloat(edit5.text) /  strtofloat(edit6.text))/a;
p2:=p / 2;
disk:=sqr(p2) -q;

if disk<0  then begin
edit7.text:='';
edit8.text:='';
edit9.text:='Keine Lösung'
end
else if disk>0 then begin
edit9.text:='Zwei Lösungen';
x1:=-p/2+sqrt(disk);
x1:=round(x1 * 100) / 100 ;
x2:=p/2+sqrt(disk);
x2:=round(x2 * 100) / 100 ;
edit7.text:=''+floattostr(x1);
edit8.text:=''+floattostr(x2);
end
else if disk=0 then begin
edit9.text:='Eine Lösungen';
e:=-p/2;
x1:=e;
x1:=round(x1 * 100) / 100;
edit7.text:=''+floattostr (x1);
edit8.text:='';
end;
end;

var z,n:real;
begin
z:=strtoint(edit1.text); //hier ist der Fehler- nur wo?
n:=strtoint(edit2.text);
kuerze(z,n,z1,n1);
edit1.text:=inttostr(z1);
edit2.text:=inttostr(n1);
end;
end;
end;

Procedure kuerze(a,b:integer;var c,d:integer);
var teiler:integer;
begin
     teiler:=a;
     while (a mod teiler <> 0) or (b mod teiler <>0) do
           teiler:=teiler-1;
     c:=a div teiler;
     d:=b div teiler;
end;
ich schätze mal, das müsste soweit richtig sein, allerding markiert er mir die erste Zeile, nach dem "edit1." und sagt "undefinierter Bezeichner "edit1"". Ich schätze mal das ist ein ganz banaler Fehler, aber ich komme gerade echt net drauf -_- :wall:

Danke schonmal...

3_of_8 18. Dez 2006 19:02

Re: Brüche kürzen- wieder einmal
 
form1.edit1 ;)

Spynx 18. Dez 2006 19:20

Re: Brüche kürzen- wieder einmal
 
:wall: Dankeschön :)

Delphi-Quellcode:
...

else if disk=0 then begin
edit9.text:='Eine Lösungen';
e:=-p/2;
x1:=e;
x1:=round(x1 * 100) / 100;
edit7.text:=''+floattostr (x1);
edit8.text:='';
end;
end;

var z,n:real;
begin
z:=strtofloat (form1.edit1.text);
n:=strtofloat(form1.edit2.text);
tform1.kuerze (z,n,z1,n1);    // inkompatible Typen: Integer und real
edit1.text:=inttostr(z1);
edit2.text:=inttostr(n1);
end;
end;
end;

Procedure TForm1.kuerze(a,b:integer;var c,d:integer);
var teiler:real;
begin
     teiler:=a;
     while (a mod teiler <> 0) or (b mod teiler <>0) do
           teiler:=teiler-1;
     c:=a div teiler;
     d:=b div teiler;
selbes Programm, anderes Problem:Inkompatible Typen (siehe Oben)- was muss ich tuen???

Goldesel 18. Dez 2006 19:42

Re: Brüche kürzen- wieder einmal
 
Du hast die Variable z als Real deklariert, allerdings werden in der Procedure TForm1.Kuerze Integer-Werte verlangt. Ich denke, dass hier dein Fehler liegt.

Spynx 18. Dez 2006 20:43

Re: Brüche kürzen- wieder einmal
 
so siets momentan aus- aber immernoch das selbe Prob!?

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit7: TEdit;
    Edit8: TEdit;
    Label5: TLabel;
    Label6: TLabel;
    Button1: TButton;
    Edit9: TEdit;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    CheckBox1: TCheckBox;
    procedure Button1Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    Procedure kuerze(a,b:integer;var c,d:integer);
    procedure Button2Click(Sender: TObject);
    private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
z,n,x1,x2,a,p,px,p2,q,disk,p5,e: real;
begin
a:= strtofloat(edit1.text) /  strtofloat(edit2.text);
px:= strtofloat(edit3.text) /  strtofloat(edit4.text);
p:=px / a;
q:= (strtofloat(edit5.text) /  strtofloat(edit6.text))/a;
p2:=p / 2;
disk:=sqr(p2) -q;

if disk<0  then begin
edit7.text:='';
edit8.text:='';
edit9.text:='Keine Lösung'
end
else if disk>0 then begin
edit9.text:='Zwei Lösungen';
x1:=-p/2+sqrt(disk);
x1:=round(x1 * 100) / 100 ;
x2:=p/2+sqrt(disk);
x2:=round(x2 * 100) / 100 ;
edit7.text:=''+floattostr(x1);
edit8.text:=''+floattostr(x2);
end
else if disk=0 then begin
edit9.text:='Eine Lösungen';
e:=-p/2;
x1:=e;
x1:=round(x1 * 100) / 100;
edit7.text:=''+floattostr (x1);
edit8.text:='';
end;
end;

var z,n:real;
begin
z:=strtofloat (form1.edit1.text);
n:=strtofloat(form1.edit2.text);
tform1.kuerze (z,n,z1,n1);
edit1.text:=inttostr(z1);
edit2.text:=inttostr(n1);
end;
end;
end;

Procedure TForm1.kuerze(a,b:real;var c,d:real);
var teiler:real;
begin
     teiler:=a;
     while (a mod teiler <> 0) or (b mod teiler <>0) do
           teiler:=teiler-1;
     c:=a div teiler;
     d:=b div teiler;
end;

GuenterS 18. Dez 2006 21:51

Re: Brüche kürzen- wieder einmal
 
Du musst die Deklaration logischerweise auch ändern, nicht nur den Implementierungsteil deiner Methode.

Spynx 18. Dez 2006 23:17

Re: Brüche kürzen- wieder einmal
 
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit7: TEdit;
    Edit8: TEdit;
    Label5: TLabel;
    Label6: TLabel;
    Button1: TButton;
    Edit9: TEdit;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    CheckBox1: TCheckBox;
    procedure Button1Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    Procedure kuerze(a,b:real;var c,d:real);
    private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
z,n,x1,x2,a,p,px,p2,q,disk,p5,e: real;
begin
a:= strtofloat(edit1.text) /  strtofloat(edit2.text);
px:= strtofloat(edit3.text) /  strtofloat(edit4.text);
p:=px / a;
q:= (strtofloat(edit5.text) /  strtofloat(edit6.text))/a;
p2:=p / 2;
disk:=sqr(p2) -q;

if disk<0  then begin
edit7.text:='';
edit8.text:='';
edit9.text:='Keine Lösung'
end
else if disk>0 then begin
edit9.text:='Zwei Lösungen';
x1:=-p/2+sqrt(disk);
x1:=round(x1 * 100) / 100 ;
x2:=p/2+sqrt(disk);
x2:=round(x2 * 100) / 100 ;
edit7.text:=''+floattostr(x1);
edit8.text:=''+floattostr(x2);
end
else if disk=0 then begin
edit9.text:='Eine Lösungen';
e:=-p/2;
x1:=e;
x1:=round(x1 * 100) / 100;
edit7.text:=''+floattostr (x1);
edit8.text:='';
end;
end;

var z,z1,n,n1:real;
begin
z:=strtofloat (form1.edit1.text);
n:=strtofloat(form1.edit2.text);
tform1.kuerze (z,n,z1,n1);  //[Fehler] Unit1.pas(88): Diese Form des Methodenaufrufs ist nur für   Klassenmethoden erlaubt
edit1.text:=inttostr(z1);
edit2.text:=inttostr(n1);
end;
end;
end;

Procedure TForm1.kuerze(a,b:real;var c,d:real);
var teiler:real;
begin
     teiler:=a;
     while (a mod teiler <> 0) or (b mod teiler <>0) do
           teiler:=teiler-1;
     c:=a div teiler;
     d:=b div teiler;}
end;
THX!

nu hab ich aber wieder einen Fehler -_-

Luckie 19. Dez 2006 00:19

Re: Brüche kürzen- wieder einmal
 
Zitat:

Zitat von Spynx
nu hab ich aber wieder einen Fehler -_-

Und?

PS: Du solltest deinen Code mal besser, lesvbarer formatieren.

Sunlight7 19. Dez 2006 01:14

Re: Brüche kürzen- wieder einmal
 
... und danach einfach das t entfernen.

Delphi-Quellcode:
form1.kuerze(z, n, z1, n1);
Ich wollt' jetzt die begins und ends net nachzählen, aber wenn das innerhalb von TForm1 aufgerufen wird, dann gings auch so
Delphi-Quellcode:
kuerze(z, n, z1, n1);

Spynx 19. Dez 2006 17:12

Re: Brüche kürzen- wieder einmal
 
Liste der Anhänge anzeigen (Anzahl: 1)
habs mal passen formatiert und editiert...
aber es funktioniert immernoch nicht...

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit7: TEdit;
    Edit8: TEdit;
    Label5: TLabel;
    Label6: TLabel;
    Button1: TButton;
    Edit9: TEdit;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    CheckBox1: TCheckBox;
    procedure Button1Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    Procedure kuerze(a,b:real;var c,d:real);
    private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
z,n,x1,x2,a,p,px,p2,q,disk,p5,e,z1,n1:real;
begin
     a:= strtofloat(edit1.text) /  strtofloat(edit2.text);
     px:= strtofloat(edit3.text) /  strtofloat(edit4.text);
     p:=px / a;
     q:= (strtofloat(edit5.text) /  strtofloat(edit6.text))/a;
     p2:=p / 2;
     disk:=sqr(p2) -q;

                   if disk<0  then begin
                   edit7.text:='';
                   edit8.text:='';
                   edit9.text:='Keine Lösung'
                   end
                      else if disk>0 then begin
                      edit9.text:='Zwei Lösungen';
                      x1:=-p/2+sqrt(disk);
                      x1:=round(x1 * 100) / 100 ;
                      x2:=p/2+sqrt(disk);
                      x2:=round(x2 * 100) / 100 ;
                      edit7.text:=''+floattostr(x1);
                      edit8.text:=''+floattostr(x2);
                      end
   else if disk=0 then begin
   edit9.text:='Eine Lösungen';
   e:=-p/2;
   x1:=e;
   x1:=round(x1 * 100) / 100;
   edit7.text:=''+floattostr (x1);
   edit8.text:='';
   end;




z:=strtofloat (form1.edit1.text);
n:=strtofloat(form1.edit2.text);
form1.kuerze (z,n,z1,n1);
form1.edit1.text:=floattostr(z1);
form1.edit2.text:=floattostr(n1);
end;


Procedure TForm1.kuerze(a,b:real;var c,d:real);
var teiler:real;
begin
     teiler:=a;
     while (a mod teiler <>{!!!Operator ist auf diesen Operandentyp nicht anwendbar!!!} 0) or (b mod teiler <>0) do
           teiler:=teiler-1;
     c:=a div teiler;
     d:=b div teiler;}
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  if checkbox1.checked=false then begin
  edit2.visible:=false;
  edit4.visible:=false;
  edit6.visible:=false;
  edit2.text:='1';
  edit4.text:='1';
  edit6.text:='1';
  label7.visible:=false;
  label8.visible:=false;
  label9.visible:=false;
  edit1.top:=77;
  edit3.top:=77;
  edit5.top:=77;
  end
  else begin
  edit2.visible:=true;
  edit4.visible:=true;
  edit6.visible:=true;
  label7.visible:=true;
  label8.visible:=true;
  label9.visible:=true;
  edit1.top:=64;
  edit3.top:=64;
  edit5.top:=64;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  edit2.visible:=false;
  edit4.visible:=false;
  edit6.visible:=false;
  edit2.text:='1';
  edit4.text:='1';
  edit6.text:='1';
  label7.visible:=false;
  label8.visible:=false;
  label9.visible:=false;
  edit1.top:=77;
  edit3.top:=77;
  edit5.top:=77;
end;

end.
Wenn sich evtl. jemand die Zeit nehmen würde, und sich das mal anschaut, wäre ich sehr dankbar :roll:

Flare 19. Dez 2006 17:20

Re: Brüche kürzen- wieder einmal
 
Also unter formatiert verstehe ich zwar etwas anderes, habe es mir aber tortzdem mal angeschaut. Du hattest einen Fehler in der Procedure Kuerze, so müsste sie richtig aussehen:
Delphi-Quellcode:
Procedure TForm1.kuerze(a,b:real;var c,d:real);
var teiler:real;
begin
     teiler:=a;
     while (frac(a/teiler) <> 0) or (frac(b/teiler) <>0) do // mod mit frac ersetzt
           teiler:=teiler-1;
     c:=a/teiler;
     d:=b/teiler;
end;
Du kannst den Befehl mod nicht auf den Typ real anwenden, sondern nur auf Ganzzahlen wie Integer, Byte und Word.
Ob dein Programm durch meine Veränderung richtige Werte liefert habe ich aber nicht überprüft.


Flare

marabu 19. Dez 2006 17:22

Re: Brüche kürzen- wieder einmal
 
Hallo,

das ist wie Augenpulver: Edit1 und Edit2 sind nunmal keine leicht zu lesenden Komponentennamen. Außerdem musst du nicht alle möglichen Teiler probieren, wenn du zuerst den größten gemeinsamen Teiler bestimmtst:

Delphi-Quellcode:
function GCD(n1, n2: Integer): Integer;
begin
  if n2 = 0
    then Result := n1
    else Result := GCD(n2, n1 mod n2);
end;

procedure Normalize(var Numerator, Denominator: Integer);
var
  n: Integer;
begin
  if Numerator <> 0 then
  begin
    n := GCD(Numerator, Denominator);
    Numerator := Numerator div n;
    Denominator := Denominator div n;
    if Denominator < 0 then
    begin
      Numerator := - Numerator;
      Denominator := - Denominator;
    end;
  end else
  begin
    Numerator := 0;
    Denominator := 1;
  end;
end;
Du musst dir aber zuerst mal ein Konzept ausdenken, exakt wann du von Integer- auf Float-Arithmetik wechselst.

Freundliche Grüße vom marabu

Spynx 19. Dez 2006 17:30

Re: Brüche kürzen- wieder einmal
 
JAAA FLARE DANKE DANKE DANKE!!! DAS WARS WAS ICH BRACUHTE!!!! :hello: :hello: :hello: :hello: :hello: :cheers:

:dp: :dp: :dp: :dp: :dp:

edit: wie kann ich die Markierung dieses threads als "Offene Frage" ausschalten!?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:49 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-2025 by Thomas Breitkreuz