![]() |
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:
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:
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; Danke schonmal... |
Re: Brüche kürzen- wieder einmal
form1.edit1 ;)
|
Re: Brüche kürzen- wieder einmal
:wall: Dankeschön :)
Delphi-Quellcode:
selbes Programm, anderes Problem:Inkompatible Typen (siehe Oben)- was muss ich tuen???
...
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; |
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.
|
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; |
Re: Brüche kürzen- wieder einmal
Du musst die Deklaration logischerweise auch ändern, nicht nur den Implementierungsteil deiner Methode.
|
Re: Brüche kürzen- wieder einmal
Delphi-Quellcode:
THX!
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; nu hab ich aber wieder einen Fehler -_- |
Re: Brüche kürzen- wieder einmal
Zitat:
PS: Du solltest deinen Code mal besser, lesvbarer formatieren. |
Re: Brüche kürzen- wieder einmal
... und danach einfach das t entfernen.
Delphi-Quellcode:
Ich wollt' jetzt die begins und ends net nachzählen, aber wenn das innerhalb von TForm1 aufgerufen wird, dann gings auch so
form1.kuerze(z, n, z1, n1);
Delphi-Quellcode:
kuerze(z, n, z1, n1);
|
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:
Wenn sich evtl. jemand die Zeit nehmen würde, und sich das mal anschaut, wäre ich sehr dankbar :roll:
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. |
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:
Du kannst den Befehl mod nicht auf den Typ real anwenden, sondern nur auf Ganzzahlen wie Integer, Byte und Word.
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; Ob dein Programm durch meine Veränderung richtige Werte liefert habe ich aber nicht überprüft. Flare |
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:
Du musst dir aber zuerst mal ein Konzept ausdenken, exakt wann du von Integer- auf Float-Arithmetik wechselst.
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; Freundliche Grüße vom marabu |
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