C++ Nullstellen berechnen

gamemammut

mammut
25 Mai 2007
800
71
Hallo,

ich bin c++ Anfänger, deswegen nicht gleich böse werden wenn Ihr mit meiner Lösung nicht zufrieden seit. Ich habe ein kleines Programm geschrieben um eine Wertetabelle für eine quadratische Gleichung der Form ax²+bx+c zu erstellen.
Als Zusatz wollte ich noch die Nullstellen berechnen, mit der Mitternachtsformel.
Hier das Programm:
PHP:
#include <iostream>
#include <cmath>
using namespace std;

double a,b,c;
double ba,be;
double schrittweite;
double i;
double ergebnis;
double diskriminante;
double x1,x2;

int main()
{
    cout<<"Hier kann eine Wertetabelle für qaudratische Gleichungen der Form ax²+bx+c angezeigt werden";
    cout<<endl<<"Bitte geben Sie die Werte ein:"<<endl<<"a= ";
    cin >>a;
    cout<<endl<<"b= ";
    cin >>b;
    cout<<endl<<"c= ";
    cin >>c;
    cout<<endl<<"Anfangswert= ";
    cin>>ba;
    cout<<endl<<"Endwert= ";
    cin>>be;
    cout<<endl<<"Schrittweite= ";
    cin>>schrittweite;
cout<<"x\t\ty"<<endl;

    for(i=ba;i <= be; i=i+schrittweite)
    {
       ergebnis=a*i*i+b*i+c;


       cout<<i<<"\t\t"<<ergebnis<<endl;
    }

    cout<<"Nun zu den Nullpunkten:";
    diskriminante=b*b-4*a*c;
    if (diskriminante<0){
    cout<<"Da die Diskriminante negativ ist, hat die Funktion keine Nullstellen"<<endl;
    }
    else{

        x1=-b+sqrt(b*b-4*a*c)/2*a;
        x2=-b-sqrt(b*b-4*a*c)/2*a;
cout<<"x1= "<<x1<<endl<<"x2= "<<x2<<endl<<"Wenn x1=x2 ist, dann hat die Parabel nur eine Nullstelle";
    }
}
Die Nullstellen die ich berechne stimmen aber nicht mit der Wertetabelle überein. Mein Verdacht ist, daß da etwas mit dem -b nicht funktioniert.

Könnte mir jemand meinen Fehler sagen?
 
PHP:
 x1=-b+sqrt(b*b-(4*a*c))/(2*a);
        x2=-b-sqrt(b*b-(4*a*c))/(2*a);

Klappt leider nicht so, hab immernoch unterschiedliche Werte.
 
So müsste die Klammerung richtig sein:
PHP:
x1 = ( -b +sqrt(b*b - 4*a*c) ) / (2*a);
Eventuell wäre es noch gut, wenn du Division durch Null etc. abfängst.
 
Hab gerade keine Zeit aber da sind noch weiter Fehler dirn.
Wenn du spickeln möchtest mach das hier aber nicht abschreiben. ;)

PHP:
/**
 * Gauss.cpp
 *
 * @Created on: 08.11.2010
 * @Author: Markus Nemet
 *
 * @short LGS Loeser
 * @details Loest die Gleichung ax²+bx+c = 0.
 */

#include <iostream>
#include <math.h>
#include <complex>

using namespace std;

/**
 * @short Berechnet die Diskriminante
 * @details Berechnet die Diskriminante der Koeffizenten und gibt diese zurueck.
 *
 * @param a float Koeffiezient a
 * @param b float Koeffiezient b
 * @param c float Koeffiezient c
 * @return float berechnete Diskriminante
 */
float berechneDiskriminante(float a, float b, float c);

/**
 * @short Hauptprogramm
 * @details Startet den LGS-Loeser. Liest ein und berechnet.
 */
int main () {

	float a, b, c = 0.0;			//Koeffizienten
	float diskriminante = 0.0;		//Diskriminante
	float x1, x2 = 0.0;				//Loesungen

	cout << ("LGS Loeser") << endl;
	cout << ("ax² + bx + c = 0") << endl;
	cout << ("Bitte a eingeben: ");
	cin >> a;
	cout << ("Bitte b eingeben: ");
	cin >> b;
	cout << ("Bitte c eingeben: ");
	cin >> c;

	// Spezialfaelle
	if ((a == 0.0) && (b == 0.0) && (c != 0.0)) {	// ax² + bx + c != 0
		cout << ("Keine Loesung");
		return 0;
	} else {
		if ((a == 0.0) && (b != 0.0)) {				// bx + c = 0
			x1 = -c / b;
			cout << ("Loesung x: ") << x1;
			return 0;
		}
	}
	// Spezialfaelle Ende

	diskriminante = berechneDiskriminante(a, b, c);

	if (diskriminante > 0) {						// D > 0 => 2 Loesungen
		x1 = (-b + sqrtf(diskriminante)) / 2*a;
		x2 = (-b - sqrtf(diskriminante)) / 2*a;

		cout << ("Loesung x1: ") << x1 << endl;
		cout << ("Loesung x2: ") << x2 << endl;
	} else {
		if (diskriminante == 0) {					// D = 0 => 1 doppelte Loesung
			x1 = (-b + sqrtf(diskriminante)) / 2*a;
			cout << ("Doppelte Loesung x: ") << x1 << endl;
		} else {									// D < 0 => komplexe Loesung

			//                   realteil         imaginaerteil
			complex<double> x1((-b/(2*a)), (sqrt(fabs(diskriminante))/(2*a)));
			complex<double> x2 = conj(x1);

			cout << ("Komplexe Loesung") << endl;
			cout << ("Loesung x1: r:") << real(x1) << (" i:") << imag(x1) << endl;
			cout << ("Loesung x1: r:") << real(x2) << (" i:") << imag(x2) << endl;
		}
	}

	return 0;
}

float berechneDiskriminante(float a, float b, float c) {
	return (powf(b, 2) - (4*a*c));	// D = b²-4ac
}
 
So klappts, muss wohl jeweils den Zähler und Nenner in eine Klammer schreiben, da er sonst mit Punkt vor Strich Rechnung durcheinander kommt.

Dankeschön!
 
Hab gerade keine Zeit aber da sind noch weiter Fehler dirn.
Wenn du spickeln möchtest mach das hier aber nicht abschreiben. ;)

Trotzdem Danke!

Ich denke mal unser Lehrer ist auch zufrieden, wenn wir es erstmal ohne Funktionen auf die Reihe kriegen.

Aber du hast Recht, die Fälle a=0, b=0 und c=0 muss ich noch mit reinbringen.
 
Nochmal zum Verständniss

PHP:
x1 = (-b +sqrt(b*b-4*a*c) ) / 2 * a;

Bedeutet

PHP:
x1 = (-b +sqrt(b*b-4*a*c))  / 2 ;
x1 = x1 * a;

Besser zuviel Klammern als zu wenig. ;)