Übungsaufgabe Struktogramm Primfaktorzerlegung



  • Lies nochmal nach, wie eine for-Schleife aussieht.



  • Thaelisin schrieb:

    Ich habe es mal mit for probiert.

    Warum?



  • Ah ja stimmt. Initialisierung, Bedingung, Statement.
    Da wird das wohl gar nicht die richtige Schleife sein. Ich habe es jetzt mal mit der while-Schleife probiert. Da bekomme ich zwar keine Fehler aber es änndert auch nichts.^

    #include <iomanip>
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main()
    
    {
    	int faktor = 2, zahl, rest;
    	cout << "Geben Sie eine Zahl ein: " << endl;
    	cin >> zahl;
    
    	while (faktor <= (int)sqrt((double)zahl))
    	{
    
    		rest = zahl%faktor;
    
    			if (rest == 0)
    			{
    				cout << "Faktor: " << faktor << endl;
    					zahl = zahl / faktor;
    					faktor = 2;
    			}
    			else
    			{
    				faktor = faktor + 1;
    			}
    	}
    	cout << "Zahl:" << zahl << endl;
    }
    


  • Warum setzt du den 'factor' innerhalb der Schleife wieder auf 2 zurück?
    Du kannst dir ja mal mit

    cout << "Faktor:" << faktor << endl;
    

    diesen in der Schleife ausgeben lassen.



  • Thaelisin schrieb:

    Ich habe es jetzt mal mit der while-Schleife probiert.

    Warum?



  • Ich habe mir den Faktor jetzt mal innerhalb der Schleife ausgeben lassen. Da bekomme ich aber gar nichts mehr angezeigt.

    Ich habe mich gegen die for-Schleife entschieden, da ich denke (irrtümer natürlich nicht ausgeschlossen) das ich hier nichts hoch zähle oder ähnliches.

    Ist denn überhaupt irgendwas richtig, von dem was ich hier tue?

    Edit: Ach so, vll doch mit der for-Schleife. Da ich ja bei false faktor = faktor+1 zähle. Nur wo muss ich denn dann die schleife ansetzen?



  • Th69 schrieb:

    Warum setzt du den 'factor' innerhalb der Schleife wieder auf 2 zurück?
    Du kannst dir ja mal mit

    cout << "Faktor:" << faktor << endl;
    

    diesen in der Schleife ausgeben lassen.

    Weil er einen Primfaktor gefunden hat und die nächste Primfaktor Prüfung wieder bei 2 beginnt.



  • Das sieht doch schon besser aus oder?

    #include <iomanip>
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main()
    
    {
    	int faktor, zahl, rest;
    	cout << "Geben Sie eine Zahl ein: " << endl;
    	cin >> zahl;
    
    	for (faktor = 2; faktor<=(int)sqrt(double(zahl));faktor++)
    	{
    
    		rest = zahl%faktor;
    
    			if (rest == 0)
    			{
    				cout << "Faktor: " << faktor << endl;
    					zahl = zahl / faktor;
    					faktor = 2;
    			}
    
    	}
    	cout << "Zahl:" << zahl << endl;
    }
    


  • Thaelisin schrieb:

    Das sieht doch schon besser aus oder?

    Hat das noch was mit deinem Struktogramm zu tun?


  • Mod

    Thaelisin schrieb:

    Das sieht doch schon besser aus oder?

    Nein. Bei dir hat die 36 die Primfaktoren 2, 3 und 6!



  • Ach mist...
    Kann mir jemand von euch irgendwie weiterhelfen? Ich weiß nicht was ich falsch mache.



  • Thaelisin schrieb:

    Ach mist...
    Kann mir jemand von euch irgendwie weiterhelfen? Ich weiß nicht was ich falsch mache.

    Du hältst dich nicht ans Struktogramm.



  • Jetzt sieht es doch gut aus oder?

    #include <iomanip>
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main()
    
    {
    	int faktor = 2, zahl, rest;
    	cout << "Geben Sie eine Zahl ein: " << endl;
    	cin >> zahl;
    
    	while (faktor<=(int)sqrt(double(zahl)))
    	{
    
    		rest = zahl%faktor;
    
    			if (rest == 0)
    			{
    				cout << "Faktor: " << faktor << endl;
    					zahl = zahl / faktor;
    					faktor = 2;
    			}
    			else
    			{
    				faktor = faktor + 1;
    			}
    
    	}
    	cout << "Zahl:" << zahl << endl;
    }
    


  • Ja? Ich sage nur Struktogramm.



  • Hmm ich erkenne nicht, wo mein Programm aktuell von dem Struktogramm abweicht. Kannst du mir bitte weiterhelfen?



  • #include <iomanip>
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main()
    
    {
        int faktor = 2, zahl, rest;
        cout << "Geben Sie eine Zahl ein: " << endl;
        cin >> zahl;
    
        do
        {
            rest = zahl%faktor;
    
                if (rest == 0)
                {
                    cout << "Faktor: " << faktor << endl;
                        zahl = zahl / faktor;
                        faktor = 2;
                }
                else
                {
                    faktor = faktor + 1;
                }
    
        }while (faktor<=(int)sqrt(double(zahl)))
        cout << "Zahl:" << zahl << endl;
    }
    


  • Ach so, war es daran zu erkennen wie die Schleife im Struktogramm dargestellt ist? Also wo der Block nur links und unten von der Schleife eingefasst wird?

    Vielen Dank schon mal!



  • Ich habe dem Struktogramm entnommen, dass die Schleife auf jeden Fall ein Mal ausgeführt werden soll, und erst am Ende geprüft werden soll, ob die Bedingung für einen weiteren Durchlauf gegeben ist.
    Bei Deiner Version war es je nach Eintrittsbedingung möglich, dass die Schleife kein Mal ausgeführt wird.


  • Mod

    Thaelisin schrieb:

    Ach so, war es daran zu erkennen wie die Schleife im Struktogramm dargestellt ist? Also wo der Block nur links und unten von der Schleife eingefasst wird?

    Bedingung im Diagramm oben: Bedingung am Anfang prüfen.
    Bedingung im Diagramm unten: Bedingung am Ende prüfen.

    https://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm#Schleifen



  • Vielen, vielen Dank euch für die Hilfe!


Anmelden zum Antworten