PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : beenden, wenn Funktion aufgerufen wurde?



Berufspenner
06-11-2005, 13:37
Hi

Ich bin hier grade dabei meine Übungsaufgabe, für die Informatikvorlesung zu schreiben und bin eigentlich auch so gut wie fertig. Nur hab ich hier ein schon fast peinliches Problem:
Ich rufe ein Funktion auf, der ich einige Variablen übergebe. Diese funktioniert in sich auch soweit. Nur möchte ich nun das Programm beenden, wenn diese Funktion aufgerufen wurde, weil dann auch die Aufgabe des Programms zu Ende ist. Ich hab mir nun gedacht, ich mache eine minimale if-Konstrucktion mit "return 0;" nach dem Funktionsaufruf wie diese hier:


//Berechne die Lösungen nach p-q-Formel
wurzel = sqrt((pow(p/2,2))-q);
x1 = (-p/2)+wurzel;
x2 = (-p/2)-wurzel;

//falls x1 oder x2 Null ergeben sollten, wir der Wurzelsatz von Vieta angewendet
if(vieta(x1,x2,p,q))
{
return 0;
}
else
{
cout << "\nWurzelergebnis: " << wurzel << endl;
cout << endl;

cout << "L\224sungen der Gleichung: " << endl;
cout << "x1 = -(p/2)+Wurzelausdruck " << x1 << endl;
cout << "x2 = -(p/2)-Wurzelausdruck " << x2 << endl;
}Die Funktion "vieta()" wird aufgerufen, wenn "x1" oder "x2" Null ergeben sollten. Nun hab ich halt mal zum testen einen der Wert gleich Null gesetzt. Es funktioniert auch, nur anstatt dass die "else"-Konstrucktion übersprungen wird, wird sie ausgeführt. Wie kann ich das nun verhindern?
Ist es relevant, dass diese "if-else"-Konstrucktion sich selber auch nochmal in einer "else"-Konstrucktion befindet?

Vielen Danke schonmal für die Hilfe

Detrius
06-11-2005, 13:44
Hast Du mal mit einem Debugger nachgeschaut, welcher Teil der if-Bedingung überhaupt ausgeführt wird? Ich vermute doch mal ganz stark, dass Deine Funktion vieta dann false zurückliefert und es daher bei else weitergeht.

BLUESCREEN3D
06-11-2005, 16:58
Ich würde auch sowas vermuten.

Einfach mal vor dem if dies einfügen:

cout << "vieta: " << ((vieta(x1,x2,p,q))?"true":"false") << endl;

Dann siehst du sofort, ob das Problem da liegt.


Ist es relevant, dass diese "if-else"-Konstrucktion sich selber auch nochmal in einer "else"-Konstrucktion befindet?
Falls das return(0); wirklich erreicht wird, dann ist es auch egal, in wievielen verschachtelten if-Abfragen es sich befindet.

Berufspenner
06-11-2005, 19:21
Einfach mal vor dem if dies einfügen:

cout << "vieta: " << ((vieta(x1,x2,p,q))?"true":"false") << endl;
Diese Abfrage spuckt bei mir "false" aus. Vielleicht wäre es ja am einfachsten, wenn ich das ganze Programm mal poste:


#include<iostream>
#include<cmath>
using namespace std;

//Prototyp für die Wurzelsatz von Vieta-Funktion
double vieta(double prot_x1, double prot_x2, double prot_p, double prot_q);

int main()
{
cout << "################################################## #################" << endl;
cout << "# #" << endl;
cout << "# Programm zur L\224sung der Gleichung a*x^2 + b*x + c = 0 #" << endl;
cout << "# mit dem Wurzelsatz von Vieta #" << endl;
cout << "# #" << endl;
cout << "################################################## #################" << endl;


double a, b, c; //Koeffizienten
double x1, x2; //Lösungen
double wurzel; //Lösung der Wurzel

//abbrechen, wenn Eingabe fehlschlägt
cout << "\nBitte drei Zahlen eingeben: \n";
if(!(cin >> a >> b >> c))
{
cerr << "\nFehler: Eingabe der Variablen ist fehlgeschlagen";
return 0;
}

//anpassen des Ausdrucks an die p-q-Formel
double p;
double q;
cout << "\nDie drei Koeffizienten sind a = " << a
<< ", b = " << b << " und c = " << c << endl;


//prüft, ob es sich um eine quadratische oder lineare Gleichung handelt
if(a > 0 || a < 0) //Gleichung ist quadratische
{
p = b/a;
q = c/a;
cout << "\np = " << p << endl;
cout << "q = " << q << endl;
}
else if(a == 0) //Gleichung ist linear
{
//lösen der linearen Gleichung
if(b!=0)
{
double x_linear = -(c/b);
cout << "Die L\224sung der linearen Gleichung \"b*x + c = 0\" ist: "
<< "-c/b = x => " << x_linear << endl;
return 0;
}
}

//Variable zum Testen, ob der Wert unter der Wurzel 0 oder kleiner 0 wird
double test = pow(p/2,2)-q;

if(test <= 0)
{
//bricht ab, weil der Wurzelausdruck keine Lösung ergibt
cout << "\nGleichung hat keine L\224sung" << endl;
return 0;
}
else
{
//Berechne die Lösungen nach p-q-Formel
wurzel = sqrt((pow(p/2,2))-q);
x1 = (-p/2)+wurzel;
x2 = 0;//(-p/2)-wurzel;

//cout << "vieta: " << ((vieta(x1,x2,p,q))?"true":"false") << endl;

//falls x1 oder x2 Null ergeben sollten, wir der Wurzelsatz von Vieta angewendet
if(vieta(x1,x2,p,q)==false)
{
return 0;
}
cout << "\nWurzelergebnis: " << wurzel << endl;
cout << endl;

cout << "L\224sungen der Gleichung: " << endl;
cout << "x1 = -(p/2)+Wurzelausdruck " << x1 << endl;
cout << "x2 = -(p/2)-Wurzelausdruck " << x2 << endl;


}
return 0;
}

double vieta(double prot_x1, double prot_x2, double prot_p, double prot_q)
{
if(prot_x1 == 0 && prot_x2 != 0)
{
//Wurzelsatz von Vieta
cout << "\nWurzelsatz von Vieta => x1+x2=-p => x1=-p-x2" << endl;
cout << "x1 = " << -prot_p-prot_x2
<< "\nx2 = " << prot_x2 << endl;
return 0;
}
else if(prot_x1 != 0 && prot_x2 == 0)
{
//Wurzelsatz von Vieta
cout << "Wurzelsatz von Vieta => x1+x2=-p => x2=-p-x1" << endl;
cout << "x1 = " << prot_x1
<< "\nx2 = " << -prot_p-prot_x1 << endl;
return 0;
}
return 0;
}

Detrius
06-11-2005, 19:31
Diese Abfrage spuckt bei mir "false" aus
Also ist es nur logisch, dass auch in den else-Zweig gesprungen wird.

Berufspenner
06-11-2005, 19:52
Hi

Ich glaube, dass ich es jetzt geschaft habe. Nachdem ich aus meiner Vieta-Funktion eine des Typs Bool gemacht habe funktioniert es jetzt. Hier der Nun vollkommen funktionierende Code:


#include<iostream>
#include<cmath>
using namespace std;

//Prototyp für die Wurzelsatz von Vieta-Funktion
bool vieta(double prot_x1, double prot_x2, double prot_p, double prot_q);

int main()
{
cout << "################################################## #################" << endl;
cout << "# #" << endl;
cout << "# Programm zur L\224sung der Gleichung a*x^2 + b*x + c = 0 #" << endl;
cout << "# mit dem Wurzelsatz von Vieta #" << endl;
cout << "# #" << endl;
cout << "################################################## #################" << endl;


double a, b, c; //Koeffizienten
double x1, x2; //Lösungen
double wurzel; //Lösung der Wurzel

//abbrechen, wenn Eingabe fehlschlägt
cout << "\nBitte drei Zahlen eingeben: \n";
if(!(cin >> a >> b >> c))
{
cerr << "\nFehler: Eingabe der Variablen ist fehlgeschlagen";
return 0;
}

//anpassen des Ausdrucks an die p-q-Formel
double p;
double q;
cout << "\nDie drei Koeffizienten sind a = " << a
<< ", b = " << b << " und c = " << c << endl;


//prüft, ob es sich um eine quadratische oder lineare Gleichung handelt
if(a > 0 || a < 0) //Gleichung ist quadratische
{
p = b/a;
q = c/a;
cout << "\np = " << p << endl;
cout << "q = " << q << endl;
}
else if(a == 0) //Gleichung ist linear
{
//lösen der linearen Gleichung
if(b!=0)
{
double x_linear = -(c/b);
cout << "Die L\224sung der linearen Gleichung \"b*x + c = 0\" ist: "
<< "-c/b = x => " << x_linear << endl;
return 0;
}
}

//Variable zum Testen, ob der Wert unter der Wurzel 0 oder kleiner 0 wird
double test = pow(p/2,2)-q;

if(test <= 0)
{
//bricht ab, weil der Wurzelausdruck keine Lösung ergibt
cout << "\nGleichung hat keine L\224sung" << endl;
return 0;
}
else
{
//Berechne die Lösungen nach p-q-Formel
wurzel = sqrt((pow(p/2,2))-q);
x1 = (-p/2)+wurzel;
x2 = (-p/2)-wurzel;
//cout << "vieta: " << ((vieta(x1,x2,p,q))?"true":"false") << endl;

//falls x1 oder x2 Null ergeben sollten, wir der Wurzelsatz von Vieta angewendet
if(vieta(x1,x2,p,q)==true)
{
return 0;
}
else
{
cout << "\nWurzelergebnis: " << wurzel << endl;
cout << endl;

cout << "L\224sungen der Gleichung: " << endl;
cout << "x1 = -(p/2)+Wurzelausdruck " << x1 << endl;
cout << "x2 = -(p/2)-Wurzelausdruck " << x2 << endl;
}

}
return 0;
}

bool vieta(double prot_x1, double prot_x2, double prot_p, double prot_q)
{
if(prot_x1 == 0 && prot_x2 != 0)
{
//Wurzelsatz von Vieta
cout << "\nWurzelsatz von Vieta => x1+x2=-p => x1=-p-x2" << endl;
cout << "x1 = " << -prot_p-prot_x2
<< "\nx2 = " << prot_x2 << endl;
return true;
}
else if(prot_x1 != 0 && prot_x2 == 0)
{
//Wurzelsatz von Vieta
cout << "Wurzelsatz von Vieta => x1+x2=-p => x2=-p-x1" << endl;
cout << "x1 = " << prot_x1
<< "\nx2 = " << -prot_p-prot_x1 << endl;
return true;
}
return false;
}

bischi
06-11-2005, 19:52
Diese Abfrage spuckt bei mir "false" aus. Vielleicht wäre es ja am einfachsten, wenn ich das ganze Programm mal poste:


Logisch hast du ein false! Die Vieta-Funktion gibt ja nur 0-en zurück - ne null ist halt false...

MfG Bischi

PS: Uups - da war wohl jemand schneller...