C++ quad. Gleichung
-
Hallo zusammen,
nachdem ich meinen Fehler leider nicht finden kann, hoff ich mal, dass Ihr mir weiterhelfen könnt. Hab mir den Thread zum richtigen Codeposten durchgelesen und werds hoffentlich verständlich hinkriegen
Nun zum eigentlichem Problem.
Steck noch relativ in den Kinderschuhen vom C++ Programmieren. Bei der Aufgabe gehts um die Lösung einer quad. Gleichung. Das Programm funktioniert fast wie gewünscht, nur gibt es bei gewissen Eingaben Probleme. Aber zuerst mal zum Programm selbst:#include <iostream> #include <cmath> using namespace std; int main () { float a, b, c, x, erg1, erg2, diskr, imag1, imag2; cout << "Bitte Wert zur Loesung von Gleichung ax^2+bx+c=0 fuer a, b und c eingeben"; cin >> a >> b >> c; if (a==0.0&&b==0.0&&c==0.0){ cout <<"Das Ergebnis ist eine wahre Aussage. Es gibt unendlich viele Loesungen" << endl; } else if (a==0&&b==0&&c!=0){ cout <<"keine Loesung moeglich" << endl; } else if (a==0&&b!=0&&c!=0){ x=b/c; cout <<"Das Ergebnis ist eine Gerade fuer die gilt: x = " << x << endl; } else{ diskr=b*b-4.0*a*c; cout <<"Die Diskriminante der Gleichung betraegt " << diskr << endl; } if (diskr>=0&&a!=0) { erg1=(-b+sqrt(diskr))/(2*a); erg2=(-b-sqrt(diskr))/(2*a); cout <<"Fuer x1 und x2 gilt: x1 = " << erg1 <<"; x2 = " << erg2 << endl; } else { erg1= -b/(2*a); erg2= -b/(2*a); imag1= sqrt(-diskr)/(2*a); imag2= -sqrt(-diskr)/(2*a); cout <<"Fuer x1 und x2 gilt: x1 = " << erg1 << "+" <<imag1<<"*i ; x2 = " << erg2<< "+"<< imag2<<"*i" << endl; } system ("PAUSE"); return (0); }Wie gesagt, Funktion ist gewährleistet, solange die beiden else if Abfragen in Zeile 17 bzw. 21 _nicht_ genutzt werden.
Sobald ich eines davon benötige, passiert folgendeshttp://imageshack.us/f/337/33799894.jpg/
Vermutlich ist irgendwo eine Klammer falsch gesetzt, anders kann ich es mir nicht erklären.
Zuerst dachte ich, wenn ich zu dem if in Zeile 33 noch die zusätzliche Abfrage "&&a!=0" hinzufüg, es dann funktioniert. Dem war allerdings nicht so^^
Selbstverständlich bin ich aber gerne andersweitig zu überzeugen:)Etwas ganz anderes noch. Kann ich, wenn ich im Programm selbst Zahlen eingeb, kann ich diese immer -wenns Ganzzahlen sind- als ganze Zahl eingeben, oder ist bei double/float/was auch immer, ein z.B. 4.0 nötig?
Schonmal Danke für eure Hilfe
Gruß
-
#include <iostream> #include <cmath> using namespace std; int main () { // float a, b, c, x, erg1, erg2, diskr, imag1, imag2; Variablen so lokal wie möglich halten. Wir sind hier nicht in C cout << "Bitte Wert zur Loesung von Gleichung ax^2+bx+c=0 fuer a, b und c eingeben"; double a, b, c; // Warum float, wenn double doch auf modernen Rechnern praktisch nix kostet? cin >> a >> b >> c; if (a==0.0 && b==0.0 && c==0.0) // Ein paar Leerzeichen helfen Wunder bei der Leserlichkeit { cout <<"Das Ergebnis ist eine wahre Aussage. Es gibt unendlich viele Loesungen" << endl; } else if (a==0 && b==0 && c!=0) // Warum manchmal 0.0, manchmal 0? { cout <<"keine Loesung moeglich" << endl; } else if (a==0 && b!=0 && c!=0) { double x=b/c; cout <<"Das Ergebnis ist eine Gerade fuer die gilt: x = " << x << endl; } else { double diskr=b*b-4.0*a*c; cout <<"Die Diskriminante der Gleichung betraegt " << diskr << endl; // } Logikfehler. Diese Klammer wolltest du wohl nicht hier schließen // Durch die frühzeitige Definition der Variablen diskr konnte der Compiler den Fehler nicht bemerken. // Mit der lokalen Definition würde er sich nun beschweren, wenn in der nächsten Zeile diskr benutzt wird: if (diskr>=0 && a!=0) // Aber nun ist die Klammer ja weg, daher geht's { double erg1=(-b+sqrt(diskr))/(2*a); double erg2=(-b-sqrt(diskr))/(2*a); cout <<"Fuer x1 und x2 gilt: x1 = " << erg1 <<"; x2 = " << erg2 << endl; } else { double erg1= -b/(2*a); double erg2= -b/(2*a); double imag1= sqrt(-diskr)/(2*a); double imag2= -sqrt(-diskr)/(2*a); cout <<"Fuer x1 und x2 gilt: x1 = " << erg1 << "+" <<imag1<<"*i ; x2 = " << erg2<< "+"<< imag2<<"*i" << endl; } } // Hier wolltest du den BLock eigentlich schließen // system ("PAUSE"); unnötig, unportabel, gibt's besser, siehe FAQ // return (0); in main schon implizit }
-
Ich glaube bei deinem Code, war das Problem die Leserlichkeit.
Die zweite Klammer bei deiner ersten if- Anweisung z.B. war so gesetzt, dass man meinen könnten, sie ist der Endpunkt der main- Funktion. Ich habe den Code mal kopiert, alles leserlich eingerückt und schwupps, alles prima.Arbeite vielleicht mehr mit klareren Grenzen zwischen Anweisungen und setze gezielt Kommentare, um deinen Code noch Jahre später nachvollziehen zu können.