Quadratwurzel mit Heronverfahren



  • aus ästhetischen Gründen würde ich hier allerdings ein Makro einsetzen:

    #define F(x,y) double x = (y + a/y) /2
    

    und dann schreiben

    F(x1,x0);   //statt: double x1 = (x0 + a/x0) / 2;
    [...]
    F(x7,x6);   //statt: double x7 = (x6 + a/x6) /2;
    

    Man könnte auch noch die cout << ..-Zeile ins Makro packen.



  • zufallswert schrieb:

    aus ästhetischen Gründen würde ich hier allerdings ein Makro einsetzen:

    #define F(x,y) double x = (y + a/y) /2
    

    und dann schreiben

    F(x1,x0);   //statt: double x1 = (x0 + a/x0) / 2;
    [...]
    F(x7,x6);   //statt: double x7 = (x6 + a/x6) /2;
    

    Man könnte auch noch die cout << ..-Zeile ins Makro packen.

    ich glaube , dass mein proff damit nicht einverstanden würde(näheres lese vorherige Posts). Habe define nur in headern gesehen in main noch nie 🙄
    Aber trotzdem Danke für den Hinweis 😋



  • oder so:

    #include <iostream>
    using namespace std;
    double F(double a, double x){ return (x + a/x)/2; }
    int main() {
        double a;
        cout << "Bitte geben Sie eine Fließkommazahl ein: ";
        cin >> a;
        cout << F(a, F(a, F(a, F(a, F(a, F(a, F(a, F(a, a)))))))) << endl;
    }
    


  • oder besser:

    cout << F(a, F(a, F(a, F(a, F(a, F(a, F(a, F(a, 1)))))))) << endl;
    


  • ... oder so ....

    #include <iostream>
    using namespace std;
    
    double F(double a, double x){ return (x + a/x)/2; }
    double F2(double a, double x){ return F(a, F(a, x)); }
    double F4(double a, double x){ return F2(a, F2(a, x)); }
    double F8(double a, double x){ return F4(a, F4(a, x)); }
    
    int main() {
        double a;
        cout << "Bitte geben Sie eine Fließkommazahl ein: ";
        cin >> a;
        cout << F8(a, 1) << endl;
    }
    

  • Mod

    Proggerin schrieb:

    SG1 schrieb:

    Nein, das sind ja nur 4 Durchgänge.

    Wenn ich acht Schritte mache bekomme ich das als Ausgabe:

    Bitte geben Sie eine Fließkommazahl ein: 9.7
    5.35
    3.58154
    3.14494
    3.11463
    3.11448
    3.11448
    3.11448
    3.11448

    Deine Ausgabe hat nur 7 Stellen (ist die Standardeinstellung), der double wird aber genauer sein (so ca. 15 Stellen). Wenn du die precision erhöhst, sollte man das sehen können.



  • SeppJ schrieb:

    Proggerin schrieb:

    SG1 schrieb:

    Nein, das sind ja nur 4 Durchgänge.

    Wenn ich acht Schritte mache bekomme ich das als Ausgabe:

    Bitte geben Sie eine Fließkommazahl ein: 9.7
    5.35
    3.58154
    3.14494
    3.11463
    3.11448
    3.11448
    3.11448
    3.11448

    Deine Ausgabe hat nur 7 Stellen (ist die Standardeinstellung), der double wird aber genauer sein (so ca. 15 Stellen). Wenn du die precision erhöhst, sollte man das sehen können.

    PS: bin die Proggerin, habe mich registriert 🕶
    darf keine setter und getter benutzen . Geht es auch nicht mit float ?


  • Mod

    Du könntest theoretisch auch printf nutzen, wenn es unbedingt sein muss (Tu es nicht!), aber ich vermute ganz stark, dass du die Vorgabe missverstehst.



  • SeppJ schrieb:

    Du könntest theoretisch auch printf nutzen, wenn es unbedingt sein muss (Tu es nicht!), aber ich vermute ganz stark, dass du die Vorgabe missverstehst.

    Printf haben wir noch nie benutzt( ist wahrscheinlich verboten 🚫).
    Kannst du aus deiner Sicht erzählen wie du die Vorgaben siehst, bin leider ziemliche Anfängerin in Programmierung 🙄 .


  • Mod

    Ich weiß nicht, wie genau die Formulierung deiner Vorgaben lautet, aber mit "keien Getter/Setter" ist garantiert nicht gemeint, dass du nicht setprecision benutzen dürftest. Das ist was anderes.



  • in nächsten Aufgabe soll ich es genauso ,nur über Selektion und Iteration machen.
    Hier ist mein Versuch :

    #include <iostream>
    
    using namespace std;
    
    int main() {
    
        double a;
        double x, xn = 1; 
        cout<< "Bitte geben Sie eine Fliesskomazahl ein: ";
        cin >> a;
         if (a > 0){ 
          cout<< a << endl;
         }
    
     do { 
        x = xn; 
        xn = (x + a/x)/2; 
      } while (x != xn); 
      cout << x;
    
     return 0;
    }
    

    wie mache ich es das n bei 8 aufhört? Es fehlen noch Zwischenschritte bei der Ausgabe , wie gibt man die am besten aus? 🙄



  • Hi Helenchen,

    nimm entweder ne for-Schleife, oder lass ne Laufvariable mitlaufen, die Du vorher auf 0 setzt und dann bei jedem Durchlauf um 1 erhöhst. Die dann zusätzlich in der while-Bedingung abfragen.
    Den Text auf gleichheit würde ich bei Gleitkommazahlen nicht als einziges Abbruchkriterium nehmen. Kann zu leicht pasieren, dass die Schleife nie endet, weil das Ergebnis immer abwechselnd mal drunter und mal drüber liegt.
    Die Zwischenschritte nach dem jeweiligen Rechnen in der Schleife ausgeben.
    Eventuell den Startwert für xn auf ( a + 1 ) / 2 legen, dann könnte es schneller konvergieren.
    und natürlich die schleife in den if-Block legen, sonst wird bei negativem Wert doch gerechnet.

    #include <iostream>
    
    using namespace std;
    
    int main() 
    {
      double a;
      double x, xn = 1;
      cout<< "Bitte geben Sie eine Fliesskomazahl ein: ";
      cin >> a;
      if (a > 0)
      {
        cout<< a << endl;
        int n = 0;
        do 
        {
          x = xn;
          xn = (x + a/x)/2;
          cout<< n << " : " << x << endl;
          n++;
        } while ((x != xn)&&(n < 8));
        cout << x;
      }
      return 0;
    }
    

    oder so:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      double a;
      double x, xn = 1;
      cout<< "Bitte geben Sie eine Fliesskomazahl ein: ";
      cin >> a;
      if (a > 0)
      {
        cout<< a << endl;
        for ( int n = 0; n < 8; n++ )
        {
          x = xn;
          xn = (x + a/x)/2;
          cout<< n << " : " << x << endl;
        }
        cout << x;
      }
      return 0;
    }
    

    Gruß Mümmel



  • danke Mümmel 😋
    zweite Variante passt am Meisten 😃



  • ... aber nicht zur Aufgabenstellung

    Proggerin schrieb:

    Die genaue Aufgabenstellung :

    Schreiben Sie das Quadratwurzel Programm jetzt so, dass die Wurzelberechnung ohne den
    Einsatz der Bibliotheksfunktion, ohne Selektion und ohne Iteration (d.h. ohne Schleifen, ohne
    Verzweigungen) erfolgt.



  • Hi Zufallswert,

    zufallswert schrieb:

    ... aber nicht zur Aufgabenstellung

    Proggerin schrieb:

    Die genaue Aufgabenstellung :

    Schreiben Sie das Quadratwurzel Programm jetzt so, dass die Wurzelberechnung ohne den
    Einsatz der Bibliotheksfunktion, ohne Selektion und ohne Iteration (d.h. ohne Schleifen, ohne
    Verzweigungen) erfolgt.

    Doch!

    helenchen schrieb:

    in nächsten Aufgabe soll ich es genauso ,nur über Selektion und Iteration machen.

    Das ist jetzt schon die zweite Variante.

    @helenchen: Ich würde die geöffnete geschweifte Klammer immer in ne neue Zeile setzen, so dass sie auf gleicher Höhe wie die schließende Klammer und wie das Schlüsselwort (if, while, for...) steht und alles dazwischen einrücken. Das erhöht zumindest für Anfänger etwas die Übersichtlichkeit.

    Irgendwie blicke ich bei Dir nicht durch, Du schreibst, dass Du dich jetzt registriert hast, aber es gibt von Dir Anfragen von 2014. Warst Du da schon mal registriet, oder war das jemand, der zufällig den gleichen Pseudo hatte und nicht mehr im Forum ist oder noch drin ist aber nicht mehr schreibt?

    @Admins: Vielleicht kan da einer von den Admins mal einen Blick drauf werfen, das sieht nach ner Doppelbelegung aus.



  • ach so


  • Mod

    Was der "Lehrer" tatsächlich meint(e), dürfte wohl sein: Das Verfahren zuerst mit Papier und Bleistift machen (8 - 10 Durchgänge).

    2. wichtiger Punkt: Eine Liste/Listenausgabe erstellen.

    3. wirklich guter Punkt wäre noch: dieses Verfahren in Haskell umzusetzen.


Anmelden zum Antworten