Problem mit for Schleife



  • Hallo

    Ich studiere gerade Wirtschaftsinformatik im ersten Semester und irgendwie scheinen mir for-Schleifen nicht zu liegen. Bisher bin ich zwar mit einiger Anstrengung zurecht gekommen, aber hier weiß ich echt nicht weiter. Hier mal der Programmcode:

    #include <iostream>
    #include <cmath>
    using namespace std;

    unsigned int quersummeRekursiv(unsigned long zahl) {
    if (zahl < 10)
    return 0;
    else
    return zahl % 10 + quersummeRekursiv(zahl / 10);
    }

    unsigned int quersummeIterativ(unsigned long zahl) {
    if (zahl < 10)
    return 0;
    else
    for (unsigned long a = zahl; a <= 10; a / 10) {
    unsigned long ergebnis = 0;
    ergebnis += a;

    return ergebnis;
    }
    }

    int main() {
    unsigned long zahl;
    cout << "Zahl: ";
    cin >> zahl;
    cout << "Quersumme: " << quersummeIterativ(zahl) << endl;
    system ("pause");
    return 0;
    }

    Mit den Rekursiven Funktionsaufruf klappt alles wunderbar, aber sobald ich dann versuche dasselbe Ergebnis mit der for Schleife zu erzielen wird immer die Zahl 16284 ausgegeben, sofern die eingegebene Zahl größer als 10 ist.

    Ich steh echt aufn Schlauch, also bitte helft mir. 👍



  • Erstmal herzlich willkommen als Winfer,
    nun zu deinem Problem. Erstmal grundsätzlich: Fällt dir an dem Code unten etwas auf, er ist durch die Funktionen des Forums in dieser ansprechenden Optik gestaltet worden 🙂 ( bitte beim nächsten mal Cpp-Tags benutzen)
    Und dann hab ich mir noch die kleine Mühe gemacht den Code ein wenig einzurücken, das war bei uns damals aber schon im 1. Semester Wirtschaftsinformatik dran. Nun mal mein Code:

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    unsigned int quersummeRekursiv(unsigned long zahl) {
       if (zahl < 10)
          return zahl;
       else
           return zahl % 10 + quersummeRekursiv(zahl / 10);
    }
    
    unsigned int quersummeIterativ(unsigned long zahl) {
       if (zahl < 10)
           return zahl;
       else {
           unsigned long ergebnis = 0;
           unsigned long a;
           for (a = zahl; a >= 10; a = a/10) ergebnis += a%10;
           ergebnis += a;
           return ergebnis;}
    
    }
    
    int main() {
        unsigned long zahl;
        cout << "Zahl: ";
        cin >> zahl;
        cout << "Quersumme: " << quersummeIterativ(zahl) << endl;
        system ("pause");
        return 0;
    }
    

    Ich hab auch mal deine Funktion für rekursiv geändert, hab sie aber nicht getestet. Meiner Meinung nach ist bei Zahlen unter 10 die Quersumme gleich der Zahl.
    Bei deinem Code war zum Beispiel ein Problem das die Funktion bei einer Zahl über zehn nie zu einer return- Anweisung gekommen ist weil sie die for-Schleife nie betreten hat wegen a <= 10, da a ja immer größer als 10 war. Die Berechnung der Quersumme war dann noch etwas fehlerhaft, aber das Problem mit der Abbruchbedingung war wohl das, was dich nicht hat vorwärts kommen lassen.

    MfG Jaschi



  • Danke erstmal für die überaus schnelle Hilfe. Jetzt läuft das Programm, jedoch sind mir einige Passagen noch unklar.

    for (a = zahl; [b]a >= 10[/b]; a = a/10)
    

    Wieso ist die Abbruchbedingung so gewählt? Ist es also so das wenn diese Bedingung nicht mehr gilt, die Schleife abgebrochen wird? Wenn dem so ist, dann erklärt das natürlich wieso ich immer wieder Probleme mit der Schleife hab.

    ergebnis += a;
    

    Wieso wurde wurde diese Zeile hinzugefügt?



  • P@trick schrieb:

    for (a = zahl; [b]a >= 10[/b]; a = a/10)
    

    Wieso ist die Abbruchbedingung so gewählt? Ist es also so das wenn diese Bedingung nicht mehr gilt, die Schleife abgebrochen wird?

    Jo das ist nicht die Abbruchbedingung, sondern ne Weitmachbedingung^^ So lange wie a größer gleich 10 ist führe diesen Code aus



  • Hallo,
    wegen dem

    ergebnis += a;
    

    Das steht so hinter der for-Schleife weil die for Schleife ja in dem Fall nur läuft, solange a >= 10 ist. und deswegen noch die letzte Zahl (die die ganz vorne steht hinzugerechnet werden muss. Aber eigentlich müsste auch das funktionieren:

    //nicht getestet
    for(unsigned long a = zahl ; a >=1; a /=10) ergebnis += a%10;
    

    dann kanste dieses

    ergebnis += a;
    

    auch weglassen.

    MfG Jaschi



  • Im Grunde würde ich sagen eignet sich eine while-Schleife hier besser

    while(zahl) {
        summe += zahl % 10;
        zahl /= 10;
    }
    

    Oder sogar so 🙂

    do summe+=zahl%10; while(zahl/=10);
    

    Gruß


Anmelden zum Antworten