PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nullstellen berechnen



_SlayeR_
10.02.2010, 22:54
Hallo,
ich bin Neuling in C++ und lerne es gerade mit Hilfe eines Buches.
Nun hab ich mich mal an die Aufgabe gewagt und versucht eine Konsolenanwendung zu schreiben die anhand der p-q Formel Nullstellen ausrechnet.
Ist das alles soweit richtig?
Für die Variablen sind mir keine anderen Begriffe eingefallen
-p/2 +- √(p/2)^2-q

-p/2 ist abschnitt 1
- √(p/2)^2 ist abschnitt 2
- √(p/2)^2-q ist abschnitt 3

Habe schon versucht die ganze rechenoperation in einem Schritt zu machen aber da kam etwas ganz anderes raus



#include <iostream.h>
#include <cmath>
double main()
{
double p, q, x1, x2,abschnitt1,pdurch2,Hochzahl,abschnitt2,abschnit t3,AB1;

cout << "Gib p ein\t";
cin >> p;
cout << "Gib q ein\t";
cin >> q;

abschnitt1 = -(p/2);
pdurch2 = (p/2);
Hochzahl = pow(pdurch2,2);
AB1 = Hochzahl-q;
abschnitt2 = sqrt(AB1);

abschnitt3 = abschnitt2 - q;

x1 = abschnitt1-abschnitt3;
x2 = abschnitt1+abschnitt3;
cout << "x1="<< x1 <<"\t und\t x2 "<< x2 <<"\n";

return 0;
}

LuLu-X
10.02.2010, 23:22
soweit ich die übersicht behalte gerade sollte es formelmäig gut aussehen.
Du solltest aber noch eine Überprüfung machen, ob AB1 < 0 ist, weil wenn dem der Fall ist, sollte die Wurzel dir eigenartige Ergebnisse auswerfen (falls C++ mit I umgehen kann) oder eine Exception werfen.
Des weiteren wäre der Zustand für dein Programm von nutzen, da wenn AB1 < 0 ist, keine Nullstelle vorhanden ist.

Ansonsten könntest du auch an Variablen sparren ;).
Ich würde maximal AB1 als einzle Variable (neben p/q) nutzen, um den <0 Fall abzufangen, falls du nicht weißt wie du mit Exceptions umgehen sollst.

mfg

inout
10.02.2010, 23:48
double main() [...]
Steht das so in deinem Buch?
Wenn du dich halbwegs an den Standard halten möchtest, nimm hier immer int als Rückgabewert.

_SlayeR_
11.02.2010, 05:19
Danke für die Antworten.

@LuLu-x .. ja ich hätte wirklich an Variablen sparen können :)

Habe gestern auch noch verrsucht
if ( AB1 < 0 )
{
cout <<"Keine Nullstelle..\n";
}

hat nicht funktioniert aber liegt wohl daran dass ich double genommen habe werde ich mir aber nachher nochmal anschauen oder?

@inout
Werde ich beachten danke

mfG

j0kR
11.02.2010, 10:29
abschnitt1 = -(p/2);
pdurch2 = (p/2);
Hochzahl = pow(pdurch2,2);
AB1 = Hochzahl-q;
abschnitt2 = sqrt(AB1);

abschnitt3 = abschnitt2 - q;Warum einen Abschnitt 3 definiert? Du rechnest nachdem du die Wurzel gezogen hast nochmal minus q - das ergibt keinen Sinn.
Abschnitt3 löschen und


x1 = abschnitt1-abschnitt3;
x2 = abschnitt1+abschnitt3;
und hier Abschnitt3 durch Abschnitt2 ersetzen oder einfach so:

#include <iostream.h>
#include <cmath>
int main()
{
double p, q, x1, x2, d;

cout << "Gib p ein\t";
cin >> p;
cout << "Gib q ein\t";
cin >> q;

d = p*p/4-q;
if(d<0)
{
cout << "Keine Nullstelle, da die Dertiminante kleiner als 0 ist!";
}
else
{
x1 = p/2 + sqrt(d);
x2 = p/2 - sqrt(d);
}
cout << "x1="<< x1 <<"\t und\t x2 "<< x2 <<"\n";

return 0;
}

blackberry
11.02.2010, 13:11
@_SlayeR_

Ich habe deinen Code nochmal als Basis benutzt, Fehler korrigiert, die Berechnung um die Überprüfung der Diskriminante erweitert und die Berechnung an sich je auf eine Zeile gebracht, sowie die Usereingaben auf Fehler überprüft.

Außerdem würde ich dir empfehlen bei so einfachen Sachen wie "x hoch 2" die pow()-Funktion weg zu lassen und einfach x*x zu schreiben, weil das einfach schneller ist (ich weiß das macht bei heutigen CPUs fast gar keinen Unterschied, aber bei Projekten, die viele Berechnungen durchführen ist es praktisch, wenn man von Anfang an optimierten Code schreibt).

Und noch eins: NIE IM LEBEN IOSTREAM.H BENUTZEN! Sollte dieses überhaupt noch existieren, ist das aus Kompatibilitätsgründen der Fall. iostream.h ist veraltet und durch iostream ersetzt.

P.S.: deine Art Code einzurücken verursacht bei mir Augenkrebs :S


#include <iostream> // kein .h nach iostream (!!)
#include <cmath>

using namespace std; // cout und cin sin im Namensbereich "std" definiert

int main() // main gibt in std-C++ immer einen Integer zurück
{
double p, q, diskriminante;

cout << "Gib p ein\t";
if (!(cin >> p))
{
cerr << "Falsche Eingabe!" << endl;
return 1;
}
cout << "Gib q ein\t";
if (!(cin >> q))
{
cerr << "Falsche Eingabe!" << endl;
return 2;
}

diskriminante = p*p - 4 * q;
if (diskriminante > 0) // zwei Nullstellen
{
cout << "x1 = " << (- p + sqrt(p * p - 4 * q)) / 2 << endl;
cout << "x2 = " << (- p - sqrt(p * p - 4 * q)) / 2 << endl;
}
else if (diskriminante == 0) // eine Nullstelle
{
// diskriminante = 0 --> sqrt(diskriminante) auch = 0
// --> sqrt(p*p-4*q) kann weg gelassen werden
cout << "x = " << (- p / 2) << endl;
}
else // diskriminante < 0 --> keine Nullstellen
{
cout << "Die Funktion besitzt keine Nullstellen!" << endl;
}
return 0;
}