y werte sind falsch!!!
-
Hallo! Wieder einmal stehe ich vor einem großen Problem und weiß nicht weiter. Deshalb richte ich mich an euch, da ich doch weiß, dass ihr meist Rat wisst

Ziel ist es ein Programm zu schreiben, welches verschiedene Rechenoperationen mit einer quadratischen Gleichung anstellt. So weit, so gut. Das besagte Problem tritt nun auf, wenn ich die Schittpunkte zweier Graphen ausrechnen lassen will. x-koordinate ist noch richtig, y-koordinate hoffnungslos falsch. Man wird auch blind mit der zeit... Ich weiß, es ist viel verlangt, da das programm für meine verhältnisse ziemlich groß ist, aber vielleicht erbarmt sich jemand meiner geschundenen Studentenseele. Der Punkt, wo es schwierigkeiten gibt heißt PointOfIntercection.
header:
#ifndef QUA_H // Waechter #define QUA_H class quadratic{ protected: double m_A; double m_B; double m_C; public: quadratic(); quadratic(double newA, double newB, double newC); ~quadratic(); double getCoeffA(); double getCoeffB(); double getCoeffC(); void setCoeffA(double A); void setCoeffB(double B); void setCoeffC(double C); void print(); void normalizeFkt(); void computeZeros(); void computeZeros2(); void computeAxisIntercept(); void computeVertex(); void pointOfIntersection(quadratic q); void menue(); }; #endifcpp:
#include "QuadraticNach.h" #include <iostream> #include <cmath> using namespace std; quadratic::quadratic(){ // Standardkonstruktor m_A = 1; m_B = 1; m_C = 1; } quadratic::quadratic(double newA, double newB, double newC){ m_A = newA; m_B = newB; m_C = newC; } quadratic::~quadratic(){ } double quadratic::getCoeffA(){ return m_A; } double quadratic::getCoeffB(){ return m_B; } double quadratic::getCoeffC(){ return m_C; } void quadratic::setCoeffA(double A){ m_A = A; } void quadratic::setCoeffB(double B){ m_B = B; } void quadratic::setCoeffC(double C){ m_C = C; } void quadratic::print(){ cout << getCoeffA() <<"x^2+ "<< getCoeffB() <<"x+ "<< getCoeffC() << endl; } void quadratic::computeZeros(){ double x0; double x1; double x2; if (m_A == 0){ if( m_B == 0){ cout << "Es gibt keine Nullstelle" << endl; } else{ x0 = - (getCoeffC()/ getCoeffB()); cout << x0 << endl; } } else{ if ((getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC()) < 0){ cout << "Es gibt keine reelle Nullstelle" << endl; } else{ if ((getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC()) == 0){ x1 = (-1*getCoeffB() + sqrt(getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC())) / (2*getCoeffA()); x2 = (-1*getCoeffB() - sqrt(getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC())) / (2*getCoeffA()); cout << x1 << " ist die einzige Nullstelle der Funktion " << endl; } else{ x1 = (-1*getCoeffB() + sqrt(getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC())) / (2*getCoeffA()); x2 = (-1*getCoeffB() - sqrt(getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC())) / (2*getCoeffA()); cout << x1 << " und " << x2 << endl; } } } } void quadratic::computeZeros2(){ //geht das ???? double x0a; double x1a; double x2a; if (m_A == 0){ if( m_B == 0){ cout << "Es gibt keinen Schnittpunkt" << endl; } else{ x0a = - (getCoeffC()/ getCoeffB()); double temp = m_A*pow(x0a,2) + x0a*m_B + m_C; cout << "(" << x0a << " / " << temp << endl; } } else{ if ((getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC()) < 0){ cout << "Es gibt keinen reellen Schnittpunkt" << endl; } else{ if ((getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC()) == 0){ x1a = (-1*getCoeffB() + sqrt(getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC())) / (2*getCoeffA()); x2a = (-1*getCoeffB() - sqrt(getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC())) / (2*getCoeffA()); cout << x1a << " / " << m_A*pow(x1a,2) + x1a*m_B + m_C << endl; } else{ x1a = (-1*getCoeffB() + sqrt(getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC())) / (2*getCoeffA()); x2a = (-1*getCoeffB() - sqrt(getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC())) / (2*getCoeffA()); cout << x1a << " / " << m_A*pow(x1a,2) + x1a*m_B + m_C << "und " << endl; cout << x2a << " / " << m_A*pow(x2a,2) + x1a*m_B + m_C << endl; } } } } void quadratic::computeAxisIntercept(){ cout << "Der Durchgang durch die y-Achse ist hier bei: " << getCoeffC() << endl; } void quadratic::computeVertex(){ double xs; double ys; if (m_A == 0){ cout << "Es gibt keinen Scheitelpunkt" << endl; } else{ xs = (- getCoeffB()) / (2*getCoeffA()); ys = (((4*getCoeffA()*getCoeffC())-(getCoeffB()*getCoeffB())))/(4*getCoeffA()); cout << "Der Scheitelpunkt ist: (" << xs << "," << ys << ")" << endl; } } void quadratic::normalizeFkt(){ if (m_A != 0){ m_B = getCoeffB() / getCoeffA(); m_C = getCoeffC() / getCoeffA(); m_A = 1; } } void quadratic::pointOfIntersection(quadratic q2){ double h,i,j; h = getCoeffA() - q2.getCoeffA(); i = getCoeffB() - q2.getCoeffB(); j = getCoeffC() - q2.getCoeffC(); quadratic intersect = quadratic (h,i,j); intersect.computeZeros2(); //wie geht es weiter? } void quadratic::menue(){ double a, b, c; quadratic q2; int x; while (true) { cout << "Was moechten Sie mit Ihrer quadratischen Funktion machen?" << endl; cout << endl; cout << "Fuer die Berechnung der Nullstellen druecken Sie die 1" << endl; cout << endl; cout << "Fuer die Berechnung des Scheitelpunktes druecken Sie die 2" <<endl; cout << endl; cout << "Fuer die Berechnung des Schnittpunkts mit der y Achse betaetigen Sie die 3" << endl; //mit Normalisierter! cout << endl; cout << "Um die Funktion zu Normalisieren druecken Sie die 4" << endl; cout << endl; cout << "Um die Gleichung anzuzeigen, druecken Sie die 5" << endl; cout << endl; cout << "Um die Gleichung zu aendern, druecken Sie die 6" << endl; cout << endl; cout << "Um die Schnittpunkte mit der vordefinierten Funktion zu berechnen, druecken Sie die 7" << endl; cout << endl; cout << "Um das Programm zu beenden, druecken Sie die 8" << endl; cin >> x; switch(x) { case 1: computeZeros(); break; case 2: computeVertex(); break; case 3: computeAxisIntercept(); break; case 4: normalizeFkt(); break; case 5: print(); break; case 6: cout << "geben Sie den neuen Parameter A ein:" << endl; cin >> m_A; cout << "geben Sie den neuen Parameter B ein:" << endl; cin >> m_B; cout << "geben Sie den neuen Parameter C ein:" << endl; cin >> m_C; break; case 7: //double a,b,c; cout << "Parameter A fuer Schnittpunkt ein" << endl; cin >> a; cout <<"Parameter B fuer Schnittpunkt ein" << endl; cin >> b; cout << "Prameter C fuer Schnittpunkt ein"<< endl; cin >> c; q2 = quadratic (a, b, c); pointOfIntersection(q2); break; case 8: cout << "Auf Wiedersehen" << endl; return; default: cout << "ungültige Eingabe" << endl; } } }Main:
#include "QuadraticNach.h" #include <iostream> using namespace std; int main(){ quadratic Start = quadratic(); /* cout << Start.getCoeffA() << " ist Koeffizient A der unveraenderten Standardfunktion" << endl; cout << endl; */ quadratic Weiter = quadratic(1,0,-3); /*cout << Weiter.getCoeffB() << " ist Koeffizient B der erstellten Instanz" << endl; cout << endl; Start.setCoeffA(7); /* cout <<"Koeffizient A der Standardfunktion wird auf " << Start.getCoeffA()<< " gesetzt" << endl; cout << endl; /* cout << "Das ist die veraenderte Standardfunktion:" << endl; Start.print(); cout << endl; cout << "Das ist die erstellte Instanz:" << endl; Weiter.print(); cout << endl; Start.normalizeFkt(); cout << endl; cout << "Das ist die normalisierte Standardfunktion:" << endl; Start.print(); cout << endl; Weiter.normalizeFkt(); cout << "Das ist die normalisierte Instanz:" << endl; Weiter.print(); cout << endl; cout << "Das sind die Nullstellen der Standardfunktion:" << endl; Start.computeZeros(); cout << endl; cout << "Das sind die Nullstellen der Instanz:" << endl; Weiter.computeZeros(); cout << endl; cout << "Standardfunktion" << endl; Start.computeAxisIntercept(); cout << endl; cout << "Instanz" << endl; Weiter.computeAxisIntercept(); cout << endl; cout << "Standardfunktion" << endl; Start.computeVertex(); cout << endl; cout << "Instanz" << endl; Weiter.computeVertex(); cout << endl; */ Weiter.menue(); }Vielen vielen Dank schon mal im Vorraus!!!!
-
das soll vor raus heißen, keine ahnung, warum da ****** stehen...
-
StehtAufDemC++Schlauch schrieb:
das soll vor raus heißen, keine ahnung, warum da ****** stehen...
Weil es nicht 'vor raus' heißt, sondern 'voraus'!
Was dein Problem angeht: Das ist doch wohl nicht dein Ernst? Wer liest denn 350 Zeilen Quellcode durch? Besonders, da du nur vage Andeutungen machst, was überhaupt dein Problem ist. Stell eine präzise Frage und reduzier Beispielprogramme auf das Wesentliche! "Hoffnungslos falsch" und "Wie geht es weiter?" sind weder brauchbare Fehlerbeschreibungen noch beantwortbare Fragen.
-
Ja, ich weiß. ich habe die frage nicht ausreichend konkretisiert. sorry, wenn man so voll drin steckt, dann vergisst man manchmal, das dritte damit ja gar nix anfangen können.
Im Prinzip geht es darum, dass eine vordefinierte quadratische Gleichung mit einer einzugebenen quadratischen Gleichung gleichgesetzt werden soll und der Schnittpunkt /Schnittpunkte) beider Graphen berechnet wird. Zunächst wird der x-Wert der Schnittpunkte berechnet und zwar so:
void quadratic::computeZeros2(){ double x0a; double x1a; double x2a; if (m_A == 0){ if( m_B == 0){ cout << "Es gibt keinen Schnittpunkt" << endl; } else{ x0a = - (getCoeffC()/ getCoeffB()); double temp = m_A*pow(x0a,2) + x0a*m_B + m_C; cout << "(" << x0a << " / " << temp << endl; } } else{ if ((getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC()) < 0){ cout << "Es gibt keinen reellen Schnittpunkt" << endl; } else{ if ((getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC()) == 0){ x1a = (-1*getCoeffB() + sqrt(getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC())) / (2*getCoeffA()); x2a = (-1*getCoeffB() - sqrt(getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC())) / (2*getCoeffA()); cout << x1a << " / " << m_A*pow(x1a,2) + x1a*m_B + m_C << endl; } else{ x1a = (-1*getCoeffB() + sqrt(getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC())) / (2*getCoeffA()); x2a = (-1*getCoeffB() - sqrt(getCoeffB()*getCoeffB() - 4*getCoeffA()*getCoeffC())) / (2*getCoeffA()); cout << x1a << " / " << m_A*pow(x1a,2) + x1a*m_B + m_C << "und " << endl; cout << x2a << " / " << m_A*pow(x2a,2) + x1a*m_B + m_C << endl; } } } }dann sollen diese x-werte eingesetzt werden um so die dazugehörigen y-werte zu erhalten:
void quadratic::pointOfIntersection(quadratic q2){ double h,i,j; h = getCoeffA() - q2.getCoeffA(); i = getCoeffB() - q2.getCoeffB(); j = getCoeffC() - q2.getCoeffC(); quadratic intersect = quadratic (h,i,j); intersect.computeZeros2(); }Hier scheint offensichtlich etwas nicht zu funktionieren, denn mit Testfunktionen kommen falsche y-werte raus (also hier h,i,j -werte) Entweder werden die x-Parameter nicht korrekt übergeben oder ich hab nen denkfehler und die formeln sind komplett mist.
Ich hoffe ich konnte das Problem ein wenig eindeutiger schildern.
-
Hi StehtaufdemC++Schlauch
Da sich keiner gerne soviel Mühe macht, würde ich dir Raten versuchen den Fehler zufinden. Das ist beim Programmieren ja auch eine der wichtigsten Sachen.
Um dir zu helfen rate ich dir an deinen Code nach Visual C++ bzw Visual Studio zu exportieren und den Debugger zu benutzen. Der kann dir sehr gut anzeigen welchen Wert dein x bzw y durch eine jeweilige Operation hat da du deinen Code Anweisung für Anweisung durchgehen kannst und dabei gleichzeitig die Werte durchgehen kannst.
Ansonsten gefällt mir dein Code und das kann ich beurteilen da ich ein Programm zum lösen von Quadratischen Gleichungen vor wenigen Monaten selbst programmiert habe.MfG cobra11freak
-
Muß ich grad mal saublöd fragen:
ys = (((4*getCoeffA()*getCoeffC())-(getCoeffB()*getCoeffB())))/(4*getCoeffA());
erm - berechnet man das y nicht in jedem Fall aus sowas wie ax^2+bx+c ?
-
erstmal: schrecklicher Code. Wegwerfen und neu machen. Trenne Berechnung von Ausgabe - dann kannste demnächst dein problem auf 5 Zeilen reduzieren, das wette ich mit dir.
Nun zu deinem Problem: Wenn du die Nullstellen einer Funktion berechnest (computeZeros2) was wird dann wohl der y-Wert der Funktion an der Stelle sein? Was du machen musst, ist die Nullstellen deiner Differenzenfunktion finden und dann die gefundenen x-Werte in eine der beiden Originalfunktionen stecken.
Das kannst du natürlich nicht, da du die x-Werte nirgendwo speicherst sondern nur ausgibst -> wegwerfen und neu machen.