3. Wurzel aus und noch mehr



  • Erst gestern habe ich hier bereits um Hilfe gebeten und jetzt geht das Chaos geradewegs weiter... es geht um selbige Aufgabe wie bereits im vorherigen Thread, mit C++ die Quadratwurzel von X wiedergeben per Newton Verfahren... in der Hausaufgabe wird das ganze mal wieder erweitert und jetzt bin ich mal wieder maßlos überfordert - mit der cmath-Bibliothek hatte ich zuvor eigentlich noch gar nichts zu tun, soll sie für die Hausaufgabe allerdings verwenden.

    Die Aufgabenstellung lautet:
    Lösen Sie das Problem mit Hilfe einer Klasse. (soweit so gut wird ja gemacht). Die Klasse soll neben einer Methode zur Berechnung der Quadratwurzel (ist schon eingefügt) auch eine Methode zur Berechnung der dritten Wurzel enthalten. (warum soll ich hier verteufelt noch mal einen abgespeckten Taschenrechner programmieren? 😡 mal abgesehen davon, ich hab die Formel zwar gefunden aber kann nicht viel mit ihr anfangen T_T) Die Wurzeln sollen jeweils so lange berechnet werden, bis die Differenz der letzten beiden Iterationswerte kleiner als die Größe delta ist (Genauigkeit in meinem Fall dann tolerance). delta soll über die Tastatur eingelesen werden und als Datenelement in der Klasse gespeichert werden. (Was hab ich hier denn falsch gemacht?)
    Schreiben Sie eine weitere Methode mit der eine Tabelle der Quadrat- und Kubikwurzeln der Zahlen von 1 - 20 auf dem Bildschirm ausgegeben werden. (Tabelle? keine Peilung 😕 ) Die Tabelle soll zur Kontrolle auch die Werte aus der cmath-Bibliothek enthalten "mithilfe einer geeigneten Funktion".

    Also meine Probleme in der Kurzfassung:
    Bei der Eingabe der Toleranz macht das Programm schon nicht mehr weiter. ?
    Als die Toleranz vorgegeben war, kam irgendein komischer Müll zustande aber nicht die Quadratwurzel - mit ihr wollte ich das schon mal austesten.
    Ich erhalte immer die Warnung, dass bei der Quadratwurzel Berechnung nicht alle Steuerelementpfade einen Wert zurück gäben - was hab ich denn da vergessen?
    Die Formel für die Kubikwurzel lautet: x 0 1/3*(2*x+a/x*x) <- wo in meinem Code finde ich denn das a? (ja ich bin ein Mathe Doofie ^^')
    Und zu guter letzt das mit der Tabelle und der cmath-Bibliothek, damit kann ich überhaupt nix anfangen.

    Das Script meines Professors, das ich etwa zur Hälfte durchgegangen bin bringt mich nicht weiter... und so weit kommt man nach der 3. Vorlesung leider auch eigentlich nicht im Script. Und mit meinen Büchern zum Selbststudium bin ich leider nicht ansatzweise so schnell 😞

    Hier mein Code, ich weiß es fehlt noch die Formel zur Kubikwurzel und noch einiges mehr, aber damit komme ich aktuell einfach nicht weiter.

    #include <iostream>
    #include <cmath>
    #include <math.h>
    
    using namespace std;
    
    int integerA;
    double xQ, xK;
    
    class Wurzel																// Klasse mit Berechnung zur Annaeherung an die Quadratwurzel der Zahl x
    {
    public:
    
    	double y;
    	double x = y / 4;
    	unsigned i = 0;
    	double tolerance;
    
    	double Wurzel::Quadratwurzel()											// Berechnung Quadratwurzel
    	{
    		while (abs(x*x - y) / y > tolerance)
    		{
    			++i;
    			x = (x - ((x*x) - y) / (2 * x));
    
    			return x;
    		}
    	}
    	double Wurzel::Kubikwurzel()											// Berechnung Kubikwurzel
    	{
    		while (abs(x*x - y) / y > tolerance)
    			++i;
    
    		return x;
    	}
    
    };
    
    int main()
    {
    	double tolerance;
    	double y;
    
    	while (integerA <= 1)
    	{
    
    		cout << "Willkommen zu einem kleinen Programm zur Berechnung der Quadratwurzel.\n\n"
    			 << "Hierzu benoetige ich den Wert der Zahl x, diese muss unbedingt positiv sein.\n"
    			 << "Hast du deine Zahl eingegeben, bestaetige bitte mit Enter.\n";
    		cin  >> y;
    		cout << "Bitte gib jetzt noch die Genauigkeit an, mit der die Annaeherung erfolgen soll.\n";
    		cin  >> tolerance;
    
    		Wurzel Ergebnisse;																					// Erstellt Objekt Ergebnisse der Klasse Quadratwurzel
    		double xQ = Ergebnisse.Wurzel::Quadratwurzel ();
    		double xK = Ergebnisse.Wurzel::Kubikwurzel();
    
    		cout << "++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"
    			 << "Die Quadratwurzel von " << y << " ist " << xQ << ".\n"
    			 << "Die Kubikwurzel von " << y << " ist " << xK << "."
    			 << "\n\n"
    			 << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"
    			 << "Wenn du weitere Berechnungen durchfuehren moechtest, \ndann gib jetzt bitte die 1 ein,"
    			 << "zum Beenden eine beliebige andere \nZahl und bestaetige mit Enter.\n";
    		cin  >> integerA;
    	}
    
    	return 0;
    }
    

    Ich bin für jedes bisschen Hilfe sehr dankbar und freue mich wenn ich dadurch etwas mehr über C++ lernen kann, was mir dann auch in der Zukunft hilft.



  • Du solltest das y und tolerance aus main auch irgendwie in der Klasse ablegen.

    Deine Quadratwurzel wird schon im ersten Durchgang verlssen, da das return in der Schleife ist.

    Als Tabelle ist gemeint Tabelle.
    Eine Spalte mit den Zahlen, ein weitere Spalte mit den Quadratwurzeln, noch eione mit der Kubikwurzel, nochmal sqrt ...

    Wobei die zu einer Zahl gehörenden Werte in der gleichen Zeile stehen.

    1;1;1;1;1
    2;1.414;1.???;1.414;1.???
    ...
    4;2.0;1.???;2.0;1.???

    Schöner wäre aber:

    Wert   2.Wurzel 3.Wurzel sqrt     dritte Wurzel aus cmath
     1     1.000    1.000    1.000    1.000
     2     1.414    1.???    1.414    1.???
    ...
     4     2.000    1.???    2.000    1.???
    


  • Schau dir mal http://www.mathepedia.de/Naeherungsverfahren.aspx an. Da ist ein Beispiel zur Berechnung der 3. Wurzel.

    http://en.cppreference.com/w/ ist eine gute Seite um sich über die Standard-Libs zu informieren. Schau dir mal sqrt(),pow() und für die Tabellen-Ausgabe setw() bzw. basic_ostream.width() an.



  • So ich habe jetzt tolerance und y zwar global deklariert und es rechnet wieder... aber was es rechnet ist mir ehrlich gesagt unbegreiflich. return x steht auch an der richtigen Stelle dummer Fehler ich gestehe.
    Wenn ich die Quadratwurzel von 25 mit einer genauigkeit von 0.001 haben möchte... bzw eig egal bei was ich teste spuckt er mir -1.#IND aus <- woher kommt das denn jetzt und was soll mir das sagen 😕

    AN der Tabelle sitze ich gerade dran. Danke schonmal für die erste Hilfe 🙂 bringt mich schon weiter -



  • Möglicher Fehler:
    Die Membervariablen von Wurzel sind nicht initialisiert. In c++ werden die Variablen nicht automatisch initialisiert und haben dann zufällige Werte.

    class Wurzel
    {
    public:
    
        double y;
        double x;
        unsigned i;
        double tolerance;
    
        Wurzel(double y_,double tolerance_)
        : y(y_),x(y/4.0),i(0),tolerance(tolerance_)
        {
    
        }
    

    Beim Aufruf von Memberfunktionen reicht es wenn du Ergebnisse.Quadratwurzel() schreibst.
    Dein Aufruf ist nicht verkehrt. Ist aber erst notwendig, wenn deine Klasse mehrere Basisklasse mit Methoden gleichen Namens hat.



  • Was soll denn bitte

    Ergebnisse.Wurzel::Quadratwurzel ();
    

    ?
    😮



  • @ patrick: hatte das in einer Übung zuvor so gebraucht und mich daran erinnert - der von Märchenwald genannte Aufruf der Memberfunktion war mir bisher halt unbekannt.

    Soweit steht jetzt die Tabelle, kleine Formfrage: lassen sich sqrt und cbrt auf 4 Nachkommastellen begrenzen?



  • sqrt rechnet immmer mit voller Grnauigkeit.
    Die Nachkommastellen werden bei der Ausgabe begrenzt.



  • Vielen Dank, jetzt ist mein einziges Problem die Kubikwurzelberechnung per Formel und deren While Schleife, da komm ich absolut nicht weiter :S wenn ich das noch hätte stünde alles und ich bin fertig.


Anmelden zum Antworten