PQ Formel Lösen



  • Hi
    Ich habe ein Programm geschrieben das die PQ Formel lösen soll. An anfang werden P und Q eingelesen und dan Arbeiter das Programm. Die Ergebnise für X1 und X2 die es lösst sind auch richtig. Allerdings setzt es vor die Ausgabe der Ergebnisse immer
    0x4375e4
    und dann kommt das richtige Ergebnis. Durch ausprobieren bin ich mir Mitlerweile sicher das das Problem beim + bzw. - Rechnen in der Ausgabe Funktion entsteht

    Wisst ihr woran das liegen kann

    Hier der Quelltext:

    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    float Wz=0;
    float N=1; 
    float W=0;
    float N1=0;
    float N2=0; 
    float P=0; 
    float Q=0; 
    float P2=0; 
    float X1=0; 
    float X2=0; 
    
    //FUNKTIONEN: 
    
     //Funktionsprototyp E_PQ 
    
        void E_PQ (void);
    
        //Funktionsdefinition E_PQ
    
        void E_PQ (void)
        {
    
        cout <<"Bitte geben Sie P ein"; 
        cin  >>P;
        cout <<"Bitte geben Sie Q ein"; 
        cin >>Q; 
        cout <<"\n"; 
    
        //P/2berechnen.
        P2=P/2; 
        }    
    
            //Funktionsprototyp B_PQ
            float B_PQ (float, float, float );
    
            //Funktionsdefinition B_PQ
            float B_PQ(float Wz)
                 {
    
                //PQ_Formel
    
                //Berechnen Wurzle (alle Zahlen die unter der Wurzel stehen werden zusammengerechnet: 
                Wz=P2*P2-Q;
    
                  do{
    
                  //Wurzel Ziehen so oft bis =Wz ist.
                  N1=Wz/N;
                  N2=N+N1;
                  N=N2/2;
    
                  W=N*N;    
                  } while (W>(Wz+0.01));  
                   //N ist jetzt der Ausdruck der unter der Wurzel steht 
    
                   cout <<N; 
                   cout <<"\n";
                    return N; 
                  }      
    
      //PQ_Ausgabe Prototyp 
    
      void PQ_Ausgabe (float); 
    
     //PQ_Ausgabe Definition (N ist der Ausdruck unter der Wurzel) 
    
     void PQ_Ausgabe (float N)
     {
      cout << "Vor dem Tausch:\n ";
      cout << P2; 
      cout << "\n"; 
      //Forzeichen Tausch 
      P2=P2*-1;
    
      cout <<"Nach dem Tausch:\n ";
      cout <<P2; 
      cout <<"\n";
    
      cout <<"Wurzel nach der Übergabe\n"; 
      cout <<N;
      cout <<"\n";
    
      //Hier entsteht das Problem! 
      X1=P2+N;
      X2=P2-N;
    
      cout <<"X1:" << cout <<X1; cout <<"\n";
      cout <<"X2:" << cout <<X2; cout <<"\n";
    
     }     
    
    //HAUPTPROGRAMM
    
    int main(int argc, char *argv[])
    {
        //Funktionsaufruf E_PQ (Eingabe) 
        E_PQ(); 
    
        //Funktionsaufruf B_PQ (Berechnung) 
        N = B_PQ (Wz);
    
        //Funktionsaufruf PQ_Ausgabe 
        PQ_Ausgabe (N);
    
      system("PAUSE");	
      return 0;
    }
    


  • Nulltens: Für die Zukunft - sfds (dieses Mal habe ich deinen Beitrag noch angepasst)

    Erstens: Globale Variablen sind nie gut - nimm lieber Parameter, um Informationen zwischen den einzelnen Funktionen auszutauschen. (und auch sonst ist es ein Krampf, deinen Quelltext zu lesen)

    Zweitens: cout <<"X1:" << cout <<X1; cout <<"\n"; - in der Zeile ist eindeutig ein 'cout' überflüssig - versuch's mal mit 'cout<<"X1:"<<X1<<endl;'.

    Drittens: Hast du auch bedacht, daß eine quadratische Gleichung nicht immer zwei Lösungen hat?

    (PS: übrigens brauchst du die Wurzel nicht von Hand auszurechnen - dazu bietet C++ die Funktion 'sqrt()')



  • Mittagspause ...:

    Ich habe gerade nichts besseres zu tun, als nachzulesen, was PQ-Formeln sind.

    // pq.cpp
    #include <iostream>
    #include <cmath>
    using namespace std;
    
    // Funktionsprototypen
    double ergebnisPQ1(double p, double q);
    double ergebnisPQ2(double p, double q);
    
    // Programmeinsprungpunkt
    int main(int argc, char** args)
        {
            double p;
            double q;
    
            // Die Werte für p und q vom Benutzer abfragen
            //  Hinweis: Eingaben werden nicht geprüft!
            cout << "Bitte geben Sie den Wert fuer p ein: " << flush;
            cin >> p;
            cout << "Bitte geben Sie den Wert fuer q ein: " << flush;
            cin >> q;
    
            // Ergebnisse für x1 und x2 berechnen und ausgeben
            //  Achtung (diese Vereinfachung geht davon aus, dass zwei
            //  Lösungen bestehen !!!)
            cout << "\nFuer p = " << p << " und q = " << q
                << " ist x1 = " << ergebnisPQ1(p, q)
                << " und x2 = " << ergebnisPQ2(p, q) << "." << endl;
    
            return 0;
        }
    
    double ergebnisPQ1(double p, double q)
        {
            // X1 nach PQ-Formel berechnen und zurückgeben
            double x1 = -p / 2.0 + sqrt( pow(p, 2.0) / 4.0 - q);
            return x1;
        }
    
    double ergebnisPQ2(double p, double q)
        {
            // X2 nach PQ-Formel berechnen und zurückgeben
            double x2 = -p / 2.0 - sqrt( pow(p, 2.0) / 4.0 - q);
            return x2;        
        }
    

    @OP:
    1. Funktionsprototypen zu bezeichnen und direkt im Anschluss die Definition der Funktion zu geben ist überflüssig.

    2. Trenne Ein- und Ausgabe von der Logik.

    3. (die Anmerkungen von CStoll)

    4. Kopiere diesen Code NICHT! Lese und verstehe ihn, danach schmeißt du ihn weg und schreibst deinen Code noch einmal neu.

    Hinweis: Der von mir generierte Code erhebt keinen Anspruch auf Richtigkeit. Ich habe ihn lediglich an EINER Aufgabe getestet. Außerdem deckt es nur das Ergebnis mit zwei Lösungen ab.



  • Ja gut danke für anpassen ich kannte das Forum vorher nicht.

    Stimmt das war ein cout zu viel, das lösst aber das Problem leider nicht.



  • Oh da haben sich gerade die Postings überschnitten.

    Jo Danke für den Code.

    Weißt du den warum in meinem Eigeneb (ich weiß der ist nicht das Gelbe von Ei) der fehler auftritt einfach mal aus Intresse



  • Nein, wo es da hakt, kann ich dir nicht sagen. Es war für mich jetzt wesentlich weniger Aufwand zu lesen, was man mit PQ anstellt und den Code da hinzupfeffern als mich durch deinen Code zu wühlen 😉

    Ich, an Deiner Stelle würde das Ding komplett neu zu schreiben. Da ist wirklich keine Übersicht drin. Diese fehlende Übersicht wurde dir hier sicherlich auch zum Verhängnis.

    Kein Beinbruch, kann passieren, gerade am Anfang.

    Grüße...

    Heiko



  • Der Ausgabe-Fehler wurde von CStoll schon beschrieben, nämlich bzgl. cout (Punkt Zweitens).
    P.S. Warum? Es wird eine Hexadezimalzahl ausgegeben, da du den Wert des Objekts 'cout' selbst ausgibst (Speicheradressen werden so dargestellt).



  • jaja aber das ändern der Ausgabe hat das Problem nicht gelöst. Ich weiß nicht warum für den Quelltext doch mal aus das siehst du was ich meine



  • Nur nochmal zum Mitschreiben - wie genau sieht denn das Problem aus? (kryptische Hex-Zahlen sollten jetzt eigentlich nicht mehr kommen, außer du gibst noch irgendwo 'cout' aus - bleibt nur noch die fehlende Fallunterscheidung zur Bestimmung der Lösungsmenge (quadratische Gleichungen haben je nach Vorzeichen der Determinante (bei dir "Wz=P2*P2-q") null bis zwei reelle Lösungen))



  • Ich hab das was du mir mit den couts aufgeschrieben hast flalsch umgesetzt (bin halt noch anfänger) 🙂 . Ich hab das jetzt gerade umgestellt und siehe da es tut.

    So vielen danke für die Hilfe und für das Durcharbeiten durch das kleine Prog..

    Bin froh das das jetzt läuft aber ich denke ich werde mir das mal zu herzen nehmen und soblad ich Zeit hab das ding nochmal in ordentlich neu schreiben

    MFG
    Johannes


Anmelden zum Antworten