Wertübergabe während Funktion arbeitet



  • Hallo Community!
    Ich bräuchte mal wieder eure Hilfe und zwar möchte ich während meine Funktion hochzählt, dass sie Werte übergibt. Über das Internet habe ich erfahren, dass dies nicht mit dem return Befehl geht. Ich glaube ich brauche dafür Zeiger, ich versteh das aber nicht so ganz. Außerdem würde mich noch interessieren, wie ich noch mehr Nachkommastellen generieren kann.

    #include <iostream>
    using namespace std;
    int counter = 0;
    
    double calcseries(int n) {
    	double temp = 1.00;
    	double temp3 = 1.00;
    	double temp4 = 1.00;
    	if (n == 0) {
    		return temp = 1.00;
    	}
    	else {
    		for (double temp2 = 1.00; temp2 <= n; ++temp2) {
    			counter++;
    			temp = temp * temp2; //Fakultät berechnen
    			temp3 = temp;
    			temp4 = temp4 + 1 / temp3; //eulerische Zahl berechnnen
    		}
    		return temp4;
    	}
    }
    
    int main()
    {
    	int n;
    
    	cout << "enter factorial n for euler series: ";
    	cin >> n;
    
    	while (counter != n) {
    		cout << "n=" << counter << " " << "e=" << calcseries(n) << "\n" << endl;
    	}
    }
    

    Aufgabenstellung:
    Schreiben Sie ein C++-Programm, das die Eulersche Zahl bis zum Eingabewert n
    𝑛 berechnet und in folgender Form auf dem Bildschirm ausgibt:

    n=1 e=2
    n=2 e=2.5
    n=3 e=2.66667

    n=10 e=2.71828

    Danke schon mal im Voraus für eure Bemühungen! ☺



  • @joules Dann mach die Ausgabe innerhalb der Schleife.

    Die Nachkommastellen werden vom cout begrenzt. Das kann man aber über Modifier ändern.



  • hi!
    wie mach ich das ohne return?



  • @joules sagte in Wertübergabe während Funktion arbeitet:

    Ich glaube ich brauche dafür Zeiger,

    oder Referenzen.

    double calcseries(int n, double &fakultaet) {
       ....
       fakultaet = temp;
       return temp4;
    

    Die Werte solltest du dann aber vor dem cout Variablen zuweisen.

    double e, fak;
    e = calcseries(n,fak) ;
    


  • @joules Aber so gehst du, wenn du n von 1 bis 10 laufen lässt, insgesammt 55 mal durch die for- Schleife.
    Wenn du die Ausgabe direkt in der for-Schleife machst, bleibt es bei 10 mal



  • @joules: Das, was du möchtest, gibt es im kommenden C++20 Standard und nennt sich Coroutines. ;- )



  • @Th69 sagte in Wertübergabe während Funktion arbeitet:

    @joules: Das, was du möchtest, gibt es im kommenden C++20 Standard und nennt sich Coroutines. ;- )

    Man könnte das jetzt auch mit static Variablen verbrechen.

    Aber soll man das einem Anfänger antun, der mit Zeigern/Referenzen Probleme hat?



  • @joules Was soll die Funktion denn machen? Alle Eulerzahlen von 1-n berechnen, oder nur eine Eulerzahl berechnen und n-mal aufgerufen werden?



  • @joules sagte in Wertübergabe während Funktion arbeitet:

    möchte ich während meine Funktion hochzählt, dass sie Werte übergibt

    Du musst dir den aktuellen Zustand irgendwo merken. Dazu kann man in C++ Klassen verwenden, deren Instanzen wie Funktionen aufgrerufen werden können.

    #include <iostream>
    
    class Generator
    {
    public:
        int operator()()
        {
    	i = i+1; // Ergebnis berechnen und speichern
    	return i; // Ergabnis abliefern
        }
    
    private:
        int i = 0;
    };
    
    int main()
    {
        Generator g;
    
        int j;
    
        while( ( j = g() ) < 100 ) {
    	std::cout << j << " ";
        }
    
        std::cout << "\n";
    }
    

    Deine Funktion ist hier int operator()(). Die kann auch Werte entgegennehmen, z.B. int operator()( int x )



  • Danke für die zahlreiche Hilfe! Ich habe mich jetzt einwenig mit Pointer und Zeigern auseinander gesetzt. Das kam dabei raus.

    #include <iostream>
    using namespace std;
    
    double calc(int n) {
    	double f = 1;
    	int g = 1;
    	double* iptr;
    	double iptr2;
    
    	while (g <= n) {
    		f = f * g;
    		iptr = &f;
    		iptr2 = *iptr;
    		cout << "factorial(" << g << ")= " << iptr2 << endl;
    		g++;
    	}
    	return f;
    }
    
    int main(void) {
    
    	double result;
    	int n;
    
    	cout << "Enter your factorial: ";
    	cin >> n;
    
    	result = calc(n);
    	cout << "factorial of entry is: " << result << endl;
    }
    

    Das Programm funktioniert jetzt so wie ich wollte. Gerne könnte ihr mir Verbesserungsvorschläge schicken. 🙂
    Im Programm gibt man eine Zahl n ein, welche dann die Fakultät der Eingabe Schritt für Schritt berechnet.



  • Und den Pointer und den Nichtpointer mit ptr im Namen brauchst du warum?

    double calc(int n) {
    	double f = 1;
    	int g = 1;
    
    	while (g <= n) {
    		f = f * g;
    		cout << "factorial(" << g << ")= " << f << endl;
    		g++;
    	}
    	return f;
    }
    


  • @joules WT (sorry:) F?

    #include <iostream>
    
    auto fac(unsigned n)
    {
    	long long unsigned result{ 1 };
    	for (unsigned i{ 1 }; i <= n; ++i) {
    		result *= i;
    		std::cout << "fac(" << i << ") = " << result << '\n';
    	}
    	return result;
    }
    
    int main()
    {
    	std::cout << "Enter your number: ";
    	unsigned n;
    	std::cin >> n;
    
    	auto result{ fac(n) };
    	std::cout << "factorial of " << n << " is: " << result << "\n\n";
    }
    


  • Ohje! Ich habe mich in der Aufgabe geirrt. Tut mir sehr leid.



  • @joules sagte in Wertübergabe während Funktion arbeitet:

    Ohje! Ich habe mich in der Aufgabe geirrt. Tut mir sehr leid.

    ???


Log in to reply