Was geht nur schief???



  • Hallo an alle,

    eins kurz vornweg: Ich bin nicht so betucht was die Programmierung angeht.
    Ich habe bis jetzt mit Ruby programmiert, als ich aber bei der Be- (oder Aus- ?)
    rechnung von Primzahlen gelandet bin, war mir Ruby einfach zu langsam. Ruby wird nur Interpretiert und nicht Kompiliert. So bin ich also bei C++ gelandet.

    Nun aber zurück zum Thema.

    Wenn ich das Progrämmchen ausführe und als Zahl eine 3 eingebe gibt es mir ne 0 anstatt einer 6 zurück. Wo ist mein Denk- bzw. Programmierfehler? Ich komme nicht zurecht.

    #include <iostream>
    using namespace std;
    
    int main()
    {
        /*  Beschreibung  */
        cout << endl << endl;
        cout << "Mit diesem Tool k\x94nnen Sie sich die Fakult\x84t einer" << endl;
        cout << "von Ihnen eingegebenen GANZEN Zahl ausrechnen lassen." << endl;
        cout << endl << endl;
    
        /*  Benutzereingabe  */
        int zahl=0;
        cout << "Geben Sie eine GANZE Zahl ein: ";
        cin >> zahl;
        cout << endl << endl;
    
        /*  Berechnung  */
        int zaehler=0, summe=1;
    
        for(int i=1; i==zahl; i++)
        {    
            ++zaehler;
            summe = summe * zaehler;
        }
    
        /*  Ausgabe  */
        cout << "Die Fakult\x84t von " << zahl << " ist gleich " << summe << "." << endl;
        return 0;
    }
    

    Habt Dank für eine Antwort und Rücksicht auf einen Beginner 😉

    3nt0n3



  • "i==zahl"
    das heisst dein for wird nur 1 (oder 0) mal ausgeführt
    sollte aber
    "i<=zahl" sein in deinem FOR
    koennte auch sein das ich total daneben liege ...bin auch neu
    Edit:
    Wenn man aber Zahl groesser als 31 eingibt(32,33) kommt eine negative Zahl raus .
    Wenn man die Zahl noch mehr erhöht kommt auch "0" raus...hat IMHO etwas mit "Overflow" zu tun.
    aber mit 3 und 5 funktionierts 🙂

    ~Misha



  • Misha schrieb:

    "i==zahl"
    das heisst dein for wird nur 1 (oder 0) mal ausgeführt
    sollte aber
    "i<=zahl" sein in deinem FOR
    koennte auch sein das ich total daneben liege ...bin auch neu
    Edit:
    Wenn man aber Zahl groesser als 31 eingibt(32,33) kommt eine negative Zahl raus .
    Wenn man die Zahl noch mehr erhöht kommt auch "0" raus...hat IMHO etwas mit "Overflow" zu tun.
    aber mit 3 und 5 funktionierts 🙂

    ~Misha

    richtig,
    darum begrenze dein eingabewert auf 30 oder mach summe zu einem double bzw. long int, wobei das letztere dich nicht viel weiter bringt da fakultät zu schnell wächst.



  • Es sollte eigentlich reichen nur "summe" als double zu deklarieren.

    hab aber jetzt eine Frage:
    Hab jetz "summe" als Double deklariert...ausgeführt und da kamm bei eingabe"55" ein Zahl raus:
    1.26964e+073
    ich weiss das SO die grossen Zahlen dargestellt werden(Mein Taschenrechner tuts ja auch^^),aber gibt es eine Möglichkeit sie auch "normal" darzustellen,
    Danke,

    ~Misha



  • Danke für die Antworten, haben mir wirklich geholfen!!!
    Das waren ja wirklich nur kleine Fehler... liegt wohl an der Uhrzeit 😃

    Ich fing schon an mir Gedanken zu machen ob es was bringen würde ob ich zaehler=1
    aber dafür zaehler++ nehmen würde... aber nach ner Tasse Kaffe hab ich doch sein gelassen 🙄

    Misha schrieb:

    1.26964e+073
    ich weiss das SO die grossen Zahlen dargestellt werden(Mein Taschenrechner tuts ja auch^^),aber gibt es eine Möglichkeit sie auch "normal" darzustellen

    Würde ich auch gern wissen.

    EDIT: mit:

    cout << fixed;
    cout << summe;
    

    funktioniert es, sieht aber hässlich aus 😞

    3nt0n3



  • ps

    int summe=1;
    for(int i=0; i<zahl; i++)
        summe *= i;
    

    da spaarst du die die "zaehler" variable, ist aber geschmackssache

    #include <iostream>
    int main()
    {
        std::cout << std::endl << std::endl;
                  << "Mit diesem Tool k\x94nnen Sie sich die Fakult\x84t einer" << std::endl;
                  << "von Ihnen eingegebenen GANZEN Zahl ausrechnen lassen." << std::endl;
                  << std::endl << std::endl;
    
        int zahl=0;
        std::cout << "Geben Sie eine GANZE Zahl ein: ";
        std::cin >> zahl;
        std::cout << std::endl << std::endl;
    
        int summe=1;
    
        for(int i=0; i<zahl; ++i)
            summe = summe * zaehler;
    
        std::cout << "Die Fakult\x84t von " << zahl << " ist gleich " << summe << "." << std::endl;
        return 0;
    }
    


  • Mr Evil schrieb:

    ps

    int summe=1;
    for(int i=0; i<zahl; i++)
        summe *= i;
    

    da spaarst du die die "zaehler" variable, ist aber geschmackssache

    Nur eine Kleinigkeit: Diese Schleife sollte lieber von 1 anfangen zu zählen (sonst rechnest du im ersten Schleifendurchlauf 'summe*=0' - und dann hast du als Endwert immer 0).

    Zum Thema Zahlendarstellung: mit der Angabe cout<<fixed<<summe; stellst du die Zahl in der "üblichen" Form dar - das kann bei Werten in der Größenordnung 1e73 ziemlich lang werden 😉 (und bei so großen Werten reicht double sowieso nicht mehr aus, das Ergebnis exakt darzustellen)



  • ups #gg - stimmt ja, ich ziehe meine aussage mit "zaehler" zurueck #gg



  • Mr Evil schrieb:

    for(int i=0; i<zahl; ++i)
            summe = summe * zaehler;
    

    CStoll schrieb:

    Nur eine Kleinigkeit: Diese Schleife sollte lieber von 1 anfangen zu zählen (sonst rechnest du im ersten Schleifendurchlauf 'summe*=0' - und dann hast du als Endwert immer 0).

    Aber so wie MR Evil das angeht ist es doch auch richtig. Beim initialisieren hat i zwar den Wert 0 aber durch ++i wird doch i erst iteriert und dann ausgewertet oder liege ich da falsch???

    3nt0n3



  • Die Iterationsbedingung wird aber erst am Ende des Schleifendurchlaufs ausgeführt (das heißt, erst nachdem du schon einmal multipliziert hast).



  • Achso, das wusste ich nicht, aber jetzt 🙂 .
    Danke

    3nt0n3


Anmelden zum Antworten