Anzeige:
Ergebnis 1 bis 7 von 7

Thema: beenden, wenn Funktion aufgerufen wurde?

  1. #1
    Registrierter Benutzer Avatar von Berufspenner
    Registriert seit
    30.03.2002
    Ort
    Hamburg
    Beiträge
    567

    beenden, wenn Funktion aufgerufen wurde?

    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:
    Code:
                //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
    C und C++

  2. #2
    Registrierter Benutzer Avatar von Detrius
    Registriert seit
    09.03.2004
    Ort
    Altena
    Beiträge
    64
    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.

  3. #3
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Ich würde auch sowas vermuten.

    Einfach mal vor dem if dies einfügen:
    Code:
    cout << "vieta: " << ((vieta(x1,x2,p,q))?"true":"false") << endl;
    Dann siehst du sofort, ob das Problem da liegt.

    Zitat Zitat von Berufspenner
    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.

  4. #4
    Registrierter Benutzer Avatar von Berufspenner
    Registriert seit
    30.03.2002
    Ort
    Hamburg
    Beiträge
    567
    Zitat Zitat von BLUESCREEN3D
    Einfach mal vor dem if dies einfügen:
    Code:
    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:
    Code:
    #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;
    }
    C und C++

  5. #5
    Registrierter Benutzer Avatar von Detrius
    Registriert seit
    09.03.2004
    Ort
    Altena
    Beiträge
    64
    Diese Abfrage spuckt bei mir "false" aus
    Also ist es nur logisch, dass auch in den else-Zweig gesprungen wird.

  6. #6
    Registrierter Benutzer Avatar von Berufspenner
    Registriert seit
    30.03.2002
    Ort
    Hamburg
    Beiträge
    567
    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:
    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;
    }
    C und C++

  7. #7
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von Berufspenner
    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...

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •