Endlosschleife in Epsilonberechnung (war :Ich bräuchte bitte Hilfe!)



  • Hallo ihr C++ler!^^

    Ich habe ein Problem bei einem Programm, die Aufgabe dazu lautet:

    Entwerfen und implementieren Sie ein C++-Programm, welches Funktionswerte der hyperbolischen Funktion

    y = f(x) = tan(x)

    berechnet.

    Verwenden Sie dazu die folgende Summenformel:

    x+1/3x³+2/15x5+17/315x7+62/2835x9+...+((2(2n)*(2^(2n)-1)Bn) / (2n)!)*x^(2n-1)+...für [x]<pi/2

    Die Berechnung soll abbrechen, wenn die Differenz zweier aufeinanderfolger Glieder z i und z i+1 kleiner als ein zudefinierender Abbruchwert epsilon wird oder aber wenn maximal 11 Summenglieder berechnet wurden.

    Testen Sie zunächst, ob der Nutzer ein x eingeben hat, welches dem Definitionsbereich der Summenformel entspricht.

    //Bibliotheken
    #include<iostream>
    #include<cmath>
    
    using namespace std;
    
    //Hauptprogramm
    main()
    {
          int anzahl;
          int k;
          long x,e;
          double summand,summe,m,n,fktan,b,c,d,i,Bn,sum;
          long double fak;
    
          //Abfrage wieviel Funktionswerte berechnet werden sollen
          cout<<"Geben Sie die Anzahl der zu berechnenden Funktionswerte ein.\n";
          cout<<"Die Anzahl sollte groeßer oder gleich 3 sein.\n";
          cin>>anzahl;
    
          //Prüfen ob die Anzahl größer oder gleich 3 ist.
          if(anzahl<3)
          {
               cout<<"Bitte geben Sie eine Anzahl groeßer oder gleich 3 ein.\n";
               cin>>anzahl;
          }
    
              for(k=1;k=anzahl;k++)
              {
                              //Eingabe x
                              cout<<"Geben Sie einen Wert fuer x ein.\n";
                              cout<<"Der Wert sollte zwischen -pi/2 und +pi/2 liegen.\n";
                              cin>>x;
                              //Überprüfen Defnitionsbereich
                              if((x<-3.14/2)or(x>3.14/2))
                              {
                                 cout<<"\n Das eingegebene x liegt nicht im Definitionsbereich.\n";
                                 cout<<"Bitte geben Sie erneut einen Wert für x ein.\n";
                                 cin>>x;
                              }
    
                                  cout<<"\n Geben Sie einen Abbruchwert Epsilon ein.\n";
                                  cin>>e;
    
                                   //Berechnung Funktionswerte Summenformel
                                   for(n=1;n=2;n++)
                                   {         
                                      b=pow(2.0,2*n);
                                      c=pow(2.0,(2*n)-1);
                                      d=pow(x,(2*n)-1); 
    
                                     summe=0;
                                     sum=0;
                                     for(m=1;m=n;m++)
                                     {
                                        fak=1;
                                        fak=(fak*m)*2;
                                     }
                                        for(i=1;i=11;i++)
                                        {
                                        sum=sum+(1.0/pow(i,2*n));
                                        }
    
                                     Bn=(fak/c*pow(3.14,2*n))*sum;
    
                                     summand=((b*c*Bn)/fak)*d;
                                     summe=summe+summand;
    
                                           //Prüfen Abbruchbedingung
                                           if(summe-summand<e)
                                           {
                                               cout<<"/n/n Summenformel: " ;
                                               cout<<"/n der Funktionswert für x =  " ;
                                               cout<<x ;
                                               cout<<" beträgt: " ;
                                               cout<<summe;
                                           }
    
                                   cout<<"/n/n Summenformel: " ;
                                   cout<<"/n der Funktionswert für x =  " ;
                                   cout<<x ;
                                   cout<<" beträgt: " ;
                                   cout<<summe;
                                   }
    
                                //Berechnung Funktionswerte Tangensfunktion
                                 fktan = tan(x) ;
                                 cout<<"/n/n Tangensfunktion: " ;
                                 cout<<"/n der Funktionswert für x =  " ;
                                 cout<<x ;
                                 cout<<" beträgt: " ;
                                 cout<<fktan ;
    
              }
    
       //Vergleich Summenformel und Tangensfunktion
       cout<<"/n/n Ergebnisdiskussion: " ;
       cout<<"/n für x =  " ;
       cout<<x ;
       cout<<": für den Funktionswert der Summenformel erhalten wir  " ;
       cout<<summe ;
       cout<<", dieser entspricht annähernd dem Funktionswert der Tangensfunktion  " ;
       cout<<fktan ;
    
    getchar() ;  //get character --> hole zeichen von Tastatur oder warte auf Eingabe
    return 0 ;  // zurückgeben einer Zahl
    }
    

    Das Problem ist:

    nach Eingabe des Abbruchwertes Epsilon begibt sich das Proggi in eine Enlosschleife! Könnt ihr mir helfen und das Proggi am Besten noch berichtigen?!:-) Wäre seeeeeehr hilfreich!

    MfG
    Pablo

    /Edit Akari : Cpp-tages und Threadtitel. Nächstesmal bitte aussagekräftigen Titel wählen! Und ins richtige Forum posten!



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo

    du hast in den for-Schleifen beim Endekriterium Zuweisung anstatt
    Vergleich verwechselt.
    ---> for(k=1;k=anzahl;k++)
    zu for(k=1; k == anzahl ;k++)

    Gruss



  • das is jetzt nicht teil des topics, aber ich bin mir nicht sicher, wie cool das is, wenn die moderatoren die beiträge anderer verändern. man kann die poster auf fehler hinweisen, aber gleich die sachen anderer zu verändern halte ich nicht für angebracht.



  • namenlos schrieb:

    das is jetzt nicht teil des topics, aber ich bin mir nicht sicher, wie cool das is, wenn die moderatoren die beiträge anderer verändern. man kann die poster auf fehler hinweisen, aber gleich die sachen anderer zu verändern halte ich nicht für angebracht.

    In diesem Fall nehme ich die Moderatoren in Schutz.

    Wenn Cpp-tages eingeführt wurden und der Threadtitel geändert wurde ändert dies nichts, aber auch gar nichts am Inhalt. Die Tags heben bloss den Code hervor damit er lesbar ist, der Threadtitel sollte den Inhalt beschreiben (der alte Titel steht ja noch in Klammern).

    Ich glaube kaum das es Sinn und Zweck eines Posts sein sollte ohne Antwort in dem Forum zu versauern. Sowohl der schlechte Threadtitel als fehlende Lesbarkeiten sind für mich meist Grund genug den Eintrag nicht zu lesen. Und wenn zudem der Post in dem falschen Forum steht gehört er ebenso verschoben.

    Wenn es um eine Inhaltliche Änderung ginge, würde ich das anders sehen. Aber sofern die Angaben stimmen (wovon ich hierbei ausgehe), ist dies nicht der Fall.

    cu André



  • danke für die Hilfe!



  • Aber jetz bricht der nach der ersten Eingabe ab, wenn ich das so änder:

    du hast in den for-Schleifen beim Endekriterium Zuweisung anstatt
    Vergleich verwechselt.
    ---> for(k=1;k=anzahl;k++)
    zu for(k=1; k == anzahl ;k++)

    MfG
    Pablo



  • Und es sollen halt auch alle Berechnungen ordnungsgemäß durchgeführt werden! 🙂



  • Ich habe grad nicht viel Zeit, werde aber mal schauen was ich beim drüberfliegen bemerke... Ich werde aber mit sicherheit nicht die Formeln überprüfen.

    Dein Code angepasst/abgeändert/mit Anmerkungen versehen (und in ein für mich lesbares Format gebracht):

    //Bibliotheken
    #include<iostream>
    #include<cmath>
    
    using namespace std;
    
    //Hauptprogramm
    // Fehler: Dies muss "int main()" nicht "main()" lauten. Nach C++ Standard gibt
    //   es keine Defaultrückgabewerte!
    int main()
    {
      // Anmerkung: Variablen sollte man eigentlich dort definieren wo man sie
      //   verwendet, und sie sollten auch sprechend benannt werden. Wenn du
      //   Platzhalter für komplexe Formeln verwendest solltest du die Formel
      //   zumindestens als Kommentar rein schreiben damit man die Variablennamen
      //   auch zuordnen kann. Zumindestens einen Teil der Variablen lösche ich
      //   hier.
      int anzahl;
      long x,e;
      double summand,summe,m,n,fktan,b,c,d,i,Bn,sum;
      long double fak;
    
      //Abfrage wieviel Funktionswerte berechnet werden sollen
      cout << "Geben Sie die Anzahl der zu berechnenden Funktionswerte ein.\n";
      cout << "Die Anzahl sollte groeßer oder gleich 3 sein.\n";
      cin >> anzahl;
    
      //Prüfen ob die Anzahl größer oder gleich 3 ist.
      // Logikfehler: Mit einer if Anweisung kannst du nur einmal um Korrektur
      //   bitten, was ist aber wenn man wieder eine falsche Zahle eingibt?
      //   ==> Geändert auf while Schleife
      while(anzahl>3)
      {
        cout<<"Bitte geben Sie eine Anzahl groeßer oder gleich 3 ein.\n";
        cin>>anzahl;
      }
    
      // Anmerkung: Sofern es nicht bei der Lesbarkeit einen unterschied macht
      //   Preincrement dem Postincrement vorziehen (pos++ => ++pos)
      // Fehler: Das Zweite Argument bedeutet "solange <bedingung> wahr ist 
      //   durchlaufe die Schleife...". Da ist ein Vergleich oder gar eine
      //   Zuweisung mit dem Endwert nicht hilfreich.
      for(int pos=1; pos<=anzahl; ++pos)
      {
        // Eingabe x
        cout << "Geben Sie einen Wert fuer x ein.\n";
        cout << "Der Wert sollte zwischen -pi/2 und +pi/2 liegen.\n";
        cin >> x;
    
        // Überprüfen Defnitionsbereich
        // Anmerkung: Übliche Schreibweise vom logischen Oder in C++ ist ||
        // Logikfehler: Mit einer if Anweisung kannst du nur einmal um Korrektur
        //   bitten, was ist aber wenn man wieder eine falsche Zahle eingibt?
        //   ==> Geändert auf do-while Schleife
        while((x<-3.14/2) || (x>3.14/2))
        {
          cout << "\n Das eingegebene x liegt nicht im Definitionsbereich.\n";
          cout << "Bitte geben Sie erneut einen Wert für x ein.\n";
          cin >> x;
        }
    
        cout << "\n Geben Sie einen Abbruchwert Epsilon ein.\n";
        cin >> e;
    
        //Berechnung Funktionswerte Summenformel
    
        // ... <== Schnipp
        // Fehler: Du verwendest for-Schleifen falsch, ohne jetzt deine Formeln
        //   durchzuarbeiten schneide ich sie hier mal raus, eine genaue Erklärung
        //   folgt im Anschluß
    

    for-Schleife:

    for(<1>; <2>; <3>)
    {
      <4>
    }
    
    • 1: Initialwert, Wird einmalig zu Begin der Schleife gesetzt (in der Regel wird die Zählvariable dort auch definiert). Beispiel: "int i=0"
    • 2: Bedingung: Wird einmalig vor jedem Schleifendurchlauf geprüft. Wenn die Bedingung wahr ist, wird die Schleife durchlaufen. Beispiel "i<3" (Hier machst du Vergleiche/Zuweisungen: Das ist mit Sicherheit nicht gewünscht!)
    • 3: Anweisung die zum Ende jedes Schleifendurchgangs durchgeführt wird. Häufig eine Incrementanweisung. Beispiel: "++i"
    • 4: Schleifeninhalt: Dieser Wird jeden Durchgang ausgeführt, anschließend wird <3> ausgeführt.

    cu André


Anmelden zum Antworten