• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

pq- Formel in C++ - Frage

ApF3LsAfT

Hobby-Spieler/in
Registriert
22.04.2004
Beiträge
881
Reaktionspunkte
1
Hi,

ich habe mal eben die pq- Formel programmiert.
void __fastcall TForm1::btn_berechneClick(TObject *Sender)
{
long double p=(StrToFloat(edt_b->Text)), q=(StrToFloat(edt_c->Text)), a=(StrToFloat(edt_a->Text)), b;
if(a!=0){
p=p/a;
q=q/a;
a=-(p/2)+sqrt((p/2)*(p/2)-q);
b=-(p/2)-sqrt((p/2)*(p/2)-q);
lb_Ausgabe->Items->Add("X1 = " + FloatToStr(a));
lb_Ausgabe->Items->Add("X2 = " + FloatToStr(b));
}
else{
a=-(p/2)+sqrt((p/2)*(p/2)-q);
b=-(p/2)-sqrt((p/2)*(p/2)-q);
lb_Ausgabe->Items->Add("X1 = " + FloatToStr(a));
lb_Ausgabe->Items->Add("X2 = " + FloatToStr(b));
}
}
So. Wenn ich allerdings in mein ax² + bx + c Werte eingebe, die kein Sinn ergeben, gibt er mir ein Domain Error. Hat jemand eine Idee wie ich das abfangen kann?

euer Apf3l
 
was meinst du damit, dass die werte keinen sinn ergeben? also, ich kenn mich mit C++ zwar überhaupt nicht aus, aber du musst natürlich für die formel an sich bei jeder programmiersprache eine kontrolle vorschalten, die abc überpüft und dann zB für negative werte unter der wurzel dann statt nem fehler einen nachricht "nicht möglich" oder "keine lösung" ausgibt.
 
Herbboy am 07.10.2005 00:00 schrieb:
was meinst du damit, dass die werte keinen sinn ergeben? also, ich kenn mich mit C++ zwar überhaupt nicht aus, aber du musst natürlich für die formel an sich bei jeder programmiersprache eine kontrolle vorschalten, die abc überpüft und dann zB für negative werte unter der wurzel dann statt nem fehler einen nachricht "nicht möglich" oder "keine lösung" ausgibt.
Das wollte ich eben am Ende machen. Denn von alleine kommt dieser Error und gibt x1 = "NAN" und x2 = "NAN" aus. Ich könnte das allerdings auch am Anfang machen :-)
 
ApF3LsAfT am 07.10.2005 14:31 schrieb:
Das wollte ich eben am Ende machen. Denn von alleine kommt dieser Error und gibt x1 = "NAN" und x2 = "NAN" aus. Ich könnte das allerdings auch am Anfang machen :-)
Das liegt wahrscheinlich daran, dass wenn du eine nicht lösbare quadratische Gleichung eingibst, dass er die Wurzel einer negativen Zahl ziehen muss, und das geht bekanntlich bei den reellen Zahlen nicht.
 
struy am 07.10.2005 18:01 schrieb:
ApF3LsAfT am 07.10.2005 14:31 schrieb:
Das wollte ich eben am Ende machen. Denn von alleine kommt dieser Error und gibt x1 = "NAN" und x2 = "NAN" aus. Ich könnte das allerdings auch am Anfang machen :-)
Das liegt wahrscheinlich daran, dass wenn du eine nicht lösbare quadratische Gleichung eingibst, dass er die Wurzel einer negativen Zahl ziehen muss, und das geht bekanntlich bei den reellen Zahlen nicht.
ja, so meinte ich das auch: man muss bevor man eine rechenoperation ausführen läßt erst mal checken, ob diese von vornherein nicht schon unlogisch ist. nur wenn der wert überhaupt berechnbar ist darf dann die formel/berechnung starten. außer man hätte eine programmiersprache, die bei nicht möglichen berechnungen statt mit einem fehler anzubrechen einfach automatisch nur den hinweis anzeigt...

da ich c++ aber nicht beherrsche hab ich es oben halt erstmal nur "vermutet"... ;)
 
Herbboy am 07.10.2005 18:07 schrieb:
Ups, ich habe dein Posting nur so überflogen, und nicht gesehen, dass du in etwa das gleiche geschrieben hast :-] .
Aber bei solchen Sachen sollte man schon vorher überprüfen, ob man eine Operation ausführen kann.
@Herb, cool, ich sah bei dir gerade 2 verschiedene Avatare auf einmal ;-) .
 
Es stellen sich bei mir en paar allg. Fragen!
Nutzt du immer extra Bezeichnungen für ein so kleines Programm?
(Button1Click reicht ja eigentlich schon, oder? :-) )
Nutze die pow funktion für die Potenzrechnungen!
Syntax = pow(variable,Potenz);
Benutzt du ein Memofeld zur Ausgabe?
Wenn ja, dann nimm
Memo1->SelText=("Ergebnis :"+StrToFloat(Varaible));
Und als "Zeilenumbruch"
Memo1->Lines->Add("");
So wird das nächste Ergebnis mit Text in der nächsten Zeile ausgegeben.
Falls du eine andere Komponente nutzen solltest, schreib ma welche?
Welchen Compiler nutzt du??
 
Was ich vergessen hab!
Schreib dir das am besten in Klassen.
Bsp. (für Dreieckberechnung) :
class Dreieck
{ private:
float grundlinie;
float hoehe;
public:
float ergebnis();
void getgrundlinie(float);
void gethoehe(float);
};
float Dreieck::ergebnis()
{
return(hoehe*grundlinie);
}
void Dreieck::getgrundlinie(float x)
{
grundlinie=x;
}
void Dreieck::gethoehe(float x)
{
hoehe=x;
}


Beim ButtonClick Event müsst ihr dann natürlich einen Pointer setzen und eine neue Instanz bilden. Dann muss man die Gleichungen gleich den Editfeldern setzen!
 
Zurück