Heron-Verfahren (ANDERE LÖSUNG)



  • Hallo liebe Programmierer.

    Ich habe heute in der Schule von meinem Kumpel das Heron-Verfahren erklärt bekommen und hatte schon währenddessen die Idee, dieses in C++ umzusetzen.
    Meine Lösung schaut nun wie folgt aus:

    #include "header.h"
    
    using namespace std;
    
    long double	a;
    long double x_alt;
    long double x_neu;
    
    long double heronverfahren(long double a)
    {
    	x_neu=(0.5)*(x_alt+(a/x_alt));
    
    	if(x_neu==x_alt)
    	{
    		return x_neu;
    	}
    	else
    	{
    		x_alt=x_neu;
    		heronverfahren(a);
    	}
    }
    
    int main()
    {
    	SetConsoleTitleA("Heron-Verfahren");
    
    	system("cls");
    	cout << "Bitte geben Sie den Wert f" << ue << "r den Radikanten an: ";
    	cin >> a;
    
    	x_alt=a;
    	heronverfahren(a);
    
    	cout << "Die N" << ae << "hrung f" << ue << "r die Wurzel ist: " << heronverfahren(a) << endl;
    
    	system("PAUSE");
    	return 0;
    }
    

    Wenn ich diese Variante verwende bekomme ich ein zufriedenstellendes Ergebnis!

    Wenn ich nun aber den Aufruf der Funktion heronverfahren() nach

    x_alt=a;
    

    weglasse, dann bekomme ich eine seltsame Ausgabe:

    Bitte geben Sie den Wert für den Radikanten an: 25
    Die Nährung für die Wurzel ist: -1.#IND
    Drücken Sie eine beliebige Taste...
    

    Kann mir das einer erklären?

    Vielen Dank im Voraus!

    PS: Und noch eine Frage:
    In C konnte man mit

    printf("%.5d", variable);
    

    Die Anzahl der angezeigten Nachkommastellen festlegen...
    Wie geht das in C++?



  • also erstmal dürftest du das so viel ich weiß gar nicht kompilieren können. Die Variable a gibt es doppelt. Einmal als globale variable und einmal in der funktion heronverfahren (die parameter gelten als deklarationen).

    Zweitens ist dein Aufbau nicht so praktisch. Das Heronverfahren läuft ja so ab, dass du ihm die Zahl dessen wurzel du möchtest gibst und deinen alten wert. Beim ersten durchlauf bestimmst du den anfangswert. Da brauchst du keine globalen variablen.

    Design deine funktion eher so:

    HeronDurchlauf(long double zahl, long double x_alt);
    

    und x_alt setzt du dann eben immer neu nach jedem durchlauf.

    Und wieso willst das setzen des startwertes überhaupt weglassen? Dann benutzt er ja als initialisierung undefinierte Pampe und ich glaube nicht dass das heronverfahren mit negativen startwerten beispielsweise zurecht kommt.

    gruß



  • tobZel schrieb:

    also erstmal dürftest du das so viel ich weiß gar nicht kompilieren können. Die Variable a gibt es doppelt. Einmal als globale variable und einmal in der funktion heronverfahren (die parameter gelten als deklarationen).

    Natürlich darf man zwei Variablen mit gleichem Namen in verschiedenen Scopes haben.

    3P!CF41L: In deiner Funktion benutzt du die globale Variable x_alt , ohne sie vorher zu initialisieren. Benutze (für den Anfang) nie globale Variable. Dann warnt dich dein Compiler auch, wenn du unitialisierte Variablen lesend benutzt (Compilerwarnungen beachten!).


Anmelden zum Antworten