Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit Pq-Formel


Seminex - So 12.12.10 21:12
Titel: Problem mit Pq-Formel
Hey Leute,
ich arbeite nicht sehr lange mit Delphi 5 und habe auch kaum Erfahrung mit ähnlichem und kenne keine Fachwörter ,also dieses bitte in der Antwort berücksichtigen!
Am besten direkt in meinem Text verbessern und eine kurze Erklärung warum dieses gemacht wird!
So eine kurze Erklärung was ich gemacht habe:
Ich will eine quadratische Gleichung mit der Pq-Formel lösen. Also in 2 verschiedenen Editfenstern wird einmal p und das andere Mal q angegeben. Dann soll es erkennen ob die Gleichung lösbar ist oder nicht und das kommt ja auf die Wurzel an! Sprich, wenn der Wurzelinhalt >0 ist, gibt es 2 Möglichkeiten, bei =0 gibt es nur eine Möglichkeit und wenn der Inhalt <0 ist, dann gibt es keine Lösung und das soll er auch angeben! Deswegen habe ich 3 Labelfenster ,in dem einem wird x1 angegeben, in dem anderen x2 und in dem 3. ,falls der Inhalt der Wurzel <0 ist, "nicht lösbar" steht! Nur leider funktioniert es nicht so wie ich es mir gedacht habe, deswegen such ich euch nun um Rat auf und hoffe auf schnelle Hilfe!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
var
  Form1: TForm1;
  p,q,a,b,c:real;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
label1.caption:=' ';
label2.caption:=' ';
p:=strtofloat(edit1.text) ;
q:=strtofloat(edit2.text)  ;
a:=(p/2)*(p/2)+q            ;
if (a>0then  b:=0-(p/2)*(p/2)+sqrt((p/2)*(p/2)-q);
if (a>0then  c:=0-(p/2)*(p/2)-sqrt((p/2)*(p/2)-q);
if (a=0then  b:=0-(p/2)*(p/2);

if (a=0then c:=0-(p/2)*(p/2);
if (a<0then label3.caption:='nicht lösbar';
if (a>=0then label1.caption:=floattostr(b);
if (a>=0then label2.caption:=floattostr(c);


end;

end.


Moderiert von user profile iconGausi: Quote- durch Delphi-Tags ersetzt


jaenicke - So 12.12.10 21:32

Na, wie lautet denn die PQ-Formel? ;-)
user profile iconSeminex hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
a:=(p/2)*(p/2)+q            ;                    


Und noch ein Tipp: Wenn du den Wert unter der Wurzel ohnehin bereits ausgerechnet hast, dann kannst du diese Variable doch auch bei der weiteren Berechnung dort einsetzen. ;-)


HenryHux - So 12.12.10 21:33

Du hast ne Falsche Formel!

Versuche es mal so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
procedure TForm1.Button1Click(Sender: TObject);
var
  p,q,a,b,c:real;
begin
  label1.caption:='';
  label2.caption:='';
  p:=strtofloat(edit1.text);
  q:=strtofloat(edit2.text);

  a:=sqr(p/2)-q;      // direkt mit sqr die Potenz rechnen

  if a>0 then
  begin
    b:=0-(p/2)*(p/2)+sqrt((p/2)*(p/2)+q);
    c:=0-(p/2)*(p/2)-sqrt((p/2)*(p/2)+q);
    label1.caption:=floattostr(b);
    label2.caption:=floattostr(c);
  end
  else if a=0 then
  begin
    b:=0-(p/2)*(p/2);
    c:=0-(p/2)*(p/2);
    label1.caption:=floattostr(b);
    label2.caption:=floattostr(c);
  end
  else
  begin
    label3.caption:='nicht lösbar';
  end;
end;


Lg

Edit : Falsche Mathe Kenntnisse ins Spiel gebracht :D


jaenicke - So 12.12.10 21:35

Na, fast, du hast falsch herum korrigiert. ;-)
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Versuche es mal so:

Delphi-Quelltext
1:
  a:=sqr(p/2)+q;      // direkt mit sqr die Potenz rechnen                    
Richtig ist es mit Minus.


Seminex - So 12.12.10 22:01

Danke ;) Kein Wunder, dass es nicht funktionierte^^


Fiete - Mo 13.12.10 12:19

Mit Mathe Kenntnissen (komplexe Zahlen) läßt sich das Problem vollständig lösen.
Der Radikand kann darf auch negativ sein. :wink:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
 procedure TPQ.RechneClick(Sender: TObject);
  var a,b,c,p,q,Radikand,x1,x2:Extended;
      Fehler:Integer;
  begin
   val(Edita.Text,a,Fehler);
   if Fehler>0 then
    begin
     MessageDlg('Fehler in der ersten Zahl an Position '+IntToStr(Fehler)+'!!!',mtError,[mbRetry],0);
     exit;
    end;
   val(Editb.Text,b,Fehler);
   if Fehler>0 then
    begin
     MessageDlg('Fehler in der zweiten Zahl an Position '+IntToStr(Fehler)+'!!!',mtError,[mbRetry],0);
     exit;
    end;
   val(Editc.Text,c,Fehler);
   if Fehler>0 then
    begin
     MessageDlg('Fehler in der dritten Zahl an Position '+IntToStr(Fehler)+'!!!',mtError,[mbRetry],0);
     exit;
    end;
   if a=0 then
    begin
     MessageDlg('keine quadratische Gleichung!',mtError,[mbRetry],0);
     exit;
    end;
   p:=b/a;q:=c/a;
   Radikand:=sqr(p)/4-q;
   if Radikand<0 then
    begin
     MessageDlg('negativer Radikand!',mtError,[mbOk],0);
     MessageDlg('Es gibt zwei komplexe Lösungen!',mtInformation,[mbOk],0);
     EditX1.Text:=FloatToStr(-p/2)+'+'+FloatToStr(sqrt(-Radikand))+'i';
     EditX2.Text:=FloatToStr(-p/2)+'-'+FloatToStr(sqrt(-Radikand))+'i';
    end
   else
    begin
     x1:=-p/2+sqrt(Radikand);
     x2:=-p/2-sqrt(Radikand);
     EditX1.Text:=FloatToStr(x1);
     EditX2.Text:=FloatToStr(x2);
    end
  end;

Mehr Infos hier http://de.wikipedia.org/wiki/Komplexe_Zahl
Gruß
Fiete