Fakultät - Struktogramm und Schleifen reduzieren



  • Hallo,

    es geht um folgendes (kleines) Programm:

    #include <iostream>
    
    using namespace std;
    
    void main() {
    
    	const int untereGrenze=1;
    	const int obereGrenze=9;
    	int i=untereGrenze;
    
    	while (i <= obereGrenze) {			// für alle Zahlen im Bereich
    
    			unsigned long fak = 1;
    			int j = 1;
    
    			while (j <= i) {			// berechne Fakultät von i
    					fak = fak*j;
    					j++;
    			}
    
    			cout << "fak("				// Ausgabe Fakultät von i
    			<< i << ") = "
    			<< fak << endl;
    			i++;						// nächste Zahl im Bereich
    	}
    
    }
    

    Es sollte hier zuerst einmal ein Struktogramm angefertig werden und zwar mit dem PC (hierzu wurde das Programm StruktEd empfohlen). Ich muss hier dazu sagen, dass bisher wenig bis nichts zur Erstellung von Struktogrammen allgemein (mit dem Programm sowieso nicht) gesagt wurde.
    Ich habe daher mal die StruktEd-Struktogrammdatei hochgeladen und evtl. könnte sich die ja ma jemand anschauen und ggf. berichtigen oder sagen, was verkehrt ist. Die Datei (gepackt als rar-Archiv) liegt hier.

    Nun soll - abgesehen von der Anfertigung des Struktogramms - das Programm so umgeschrieben werden, dass nur noch eine Schleife (es ist nicht gesagt, was für eine Schleife) benötigt wird.
    Wie das Ganze mit nur einer while-Schleife gehen sollte, konnte ich mir bisher nicht klar machen.

    Das Programm gibt ja alle Fakultäten von 1-9 hintereinander bzw. untereinander aus.
    Hierzu muss ich also einmal zwingend sagen, in welchem Bereich er das machen soll (hier untereGrenze - obereGrenze) und die eigentliche Fakultätsberechnung wurde hier eben mit der zweiten while-Schleife realisiert, soweit ich das sehe.

    Im Prinzip weiß ich jedoch auch, wie oft das ganze passieren muss, bei den Grenzen 1-9, nämlich neun Mal, also neun Fakultäten werden ausgegeben.
    Evtl. wäre dies dann auch mit einer for-Schleife möglich? Nur wie genau, wüsste ich dann jetzt auch noch nicht...

    Freue mich über Antworten/Hilfe/Tips.

    Danke im Voraus.

    Grüße
    TrAsTe



  • #include <iostream>
    
    int main() {
    
            int i = 1, fakul = 1;
            int min = 0, max = 0;
            std::cin >> min >> max;
    
            while(i <= max) {
    
                    fakul *= i;
    
                    if(i >= min)
                            std::cout << i << ": "
                            << fakul << std::endl; 
    
                    i++;
            }
    
    }
    

    Ich bin mal so nett...



  • Hallo,

    danke für die Antwort.
    Ist mir nur leider noch nicht komplett klar.

    Soweit ist ja alles gleich, nur hast du jetzt die Variable j gar nicht mehr benötigt.

    Diese Zeile hier

    fakul *= i;
    

    ersetzt dann wohl irgendwie die zweite while-Schleife.
    Nur was genau macht/beudetet "fakul ***=**i"?



  • fakul *= i;
    

    ist das gleiche wie

    fakul = fakul * i;
    

    simon



  • Der Sinn von nur einer Schleife besteht darin, die Fakultät aus der Fakultät der um eins kleineren Zahl zu berechnen: fak(n) = n * fak(n-1).
    Anstatt die Fakultät immer wieder neu zu berechnen, wird in der Variablen 'fakul' der Wert gespeichert und im nächsten Schleifenschritt mit dem Schleifenzähler 'i' multipliziert.


Anmelden zum Antworten