return-Werte weiterverwenden



  • Lies die Variable n vor der for- Schleife ein, vielleicht hilft es.



  • Nebenbei hast du da nen Fehler:

    static unsigned long z;  
    for (int i = 1; i <= n; i++) {  
      z *= i;  
    }
    

    z wurde nie initialisiert. Du benutzt es ohne das es jemals initialsiert wurde, böser fehler. z hat in deiner Schleife einen undefinierten Wert. Und was ist der Sinn von einer mit static deklarierten Variablen? return benutzt du um aus Methoden an die Stelle zurückzukehren von der die Methode aufgerufen wurde bzw. das return in main beendet das Programm.

    Ich glaube du willst gar nicht das in n die Anzahl übergebener Parameter stehen sondern was du willst ist glaube ich folgendes, bei mir allerdings mit initialisiertem z und da es ausgelagert ruhig static sein kann lasse ich es auch:

    #include <iostream>
    using namespace std;
    
    int fakultaet(int n)
    {
      static unsigned long z=1;  
      for (int i = 1; i <= n; ++i)
      {  
        z *= i;  
      }  
      return z; 
    }
    
    int main()
    {    
      cout << "Dieses Programm berechnet die Fakultaet einer Zahl, die Sie eingeben und mit \n[Enter] bestaetigen.\n";  
      cin >> n;  
      cout << n << "!=" << fakultaet(n) << "\n";  
      return 0; // oder was der Geier will 
    }
    

    In meinem Beispiel wird die Methode fakultaet aufgerufen, diese Berechnet dann die Fakultät und liefert am Ende der Funktion die Fakultät von n zurück. Du kannst auch wenn du das Ergebnis in einer Variablen haben möchstest folgendes schreiben:

    int x = fakultaet(n);
    // oder:
    int y;
    y = fakultaet(n);
    

    Und n bleibt nur deswegen unbearbeitet weil du es auch nicht bearbeitet hast. Was du getan hast war die Anzahl Parameter die an main übergeben wurden zu zählen. main sieht nämlich oft auch so aus:

    int main(int argc, char* argv[])
    

    argc speichert die Anzahl Parameter und argv speichert die Parameter in einem Zeiger auf ein Array von chars.

    Welches Buch benutzt du? Du solltest dir nochmal ein vernünftiges holen, guck mal hier, da findest du zwei Buchempfehlung wovon du dir die erstere mal zu gemüte ziehen solltest:
    http://www.coder-welt.de/thread.php?threadid=104&sid=0bb0d09b328ca5bca8cbac7d062f3d40

    Code-Hacker



  • Code-Hacker schrieb:

    static unsigned long z;
    

    z wurde nie initialisiert.

    Doch. Siehe unter static in deinem Lieblings-C++-Buch.



  • Bashar schrieb:

    Code-Hacker schrieb:

    static unsigned long z;
    

    z wurde nie initialisiert.

    Doch. Siehe unter static in deinem Lieblings-C++-Buch.

    Bei ihm ist sie aber nicht initialisiert und laut "C++-Programmierung" dürfte es dann einen Compilerfehler geben, denn in dem Buch steht "Statische Variablen müssen bei ihrer Definition initialisiert werden.". In dem Buch "Die C++-Programmiersprache" habe ich nichts gefunden zu der Aussage des anderen Buches. Achja und woher weißt du welches mein Lieblingsbuch ist? Ich persönlich lege mich da eigentlich nicht fest, ich kann aber nur Bücher empfehlen die ich kenne und das fand ich von den gelesenen sehr gut ("C++-Programmierung").

    Code-Hacker



  • "Statische Variablen müssen bei ihrer Definition initialisiert werden."
    Ich nutze zwar keine C++ Bücher, aber das wiederspricht dem was ich gelernt habe. Und zwar das globale und statische Variablen standartmässig mit 0 initialisiert werden, sofern nicht anders angegeben.



  • mit static deklarierte variablen werden defaul-mäßig mit 0 initialiesiert!

    EDIT: zuspät 🙄



  • Entyl_Sa schrieb:

    "Statische Variablen müssen bei ihrer Definition initialisiert werden."
    Ich nutze zwar keine C++ Bücher, aber das wiederspricht dem was ich gelernt habe. Und zwar das globale und statische Variablen standartmässig mit 0 initialisiert werden, sofern nicht anders angegeben.

    Danke für die Aufklärung. Im Buch stand es so das statische Variablen mit bei ihrer definition initialisiert werden müssen und da ich nie mit statischen Variablen arbeite wusste ich das nicht, habe es auch nie getestet.

    Code-Hacker



  • Ahja, danke...
    Das return kann ich also in dem Fall ganz weg lassen, oder?

    Das würde dann insgesamt so aussehen:

    #include <iostream> 
    using namespace std; 
    
    int fakultaet(int n) 
    { 
      static unsigned long z=1;   
      for (int i = 1; i <= n; ++i) 
      {   
        z *= i;   
      }   
    } 
    
    int main() 
    { 
    int n;  
      cout << "Dieses Programm berechnet die Fakultaet einer Zahl, die Sie eingeben und mit \n[Enter] bestaetigen.\n";   
      cin >> n;   
      cout << n << "!=" << fakultaet(n) << "\n";   
    }
    

    Allerdings läuft's dann auch nur bis zur Eingabe von n & bricht dann ab, ohne die Fakultät auszugeben... sorry, dass ich euch hier so damit nerv 😃

    Ich benutze Oliver Böhm - C++ Echt Einfach (Verlag: Franzis')

    microchip



  • vielleicht noch ein

    cin.ignore(cin.rdbuf()->in_avail());
    cin.get();
    

    hinterher? (nach dem

    cout << z << "! = " << /*etc*/
    

    (sorry, hab nicht gecheckt, dass er das return in fakultät meint. dachte an das return in main)



  • Doch das return muss sein, schließlich musst du den Wert ja auch wieder zurükgeben. Deswegen ja auch das int vor Fakultät was bedeutet das die Funktion einen Rückgabewert erwartet.

    Code-Hacker



  • [quote="davie"]vielleicht noch ein

    cin.ignore(cin.rdbuf()->in_avail());
    cin.get();
    

    hinterher? [quote]

    Uhm, was bedeutet denn das?? Und nein, es hilft leider nicht...



  • #include <iostream> 
    using namespace std; 
    
    int fakultaet(int n) 
    { 
      static unsigned long z=1;   //warum static?
      for (int i = 1; i <= n; ++i) 
      {   
        z *= i;   
      }   
      return z; //hier: einen wert zurückgeben!
    } 
    
    int main() 
    { 
    int n;  
      cout << "Dieses Programm berechnet die Fakultaet einer Zahl, die Sie eingeben und mit \n[Enter] bestaetigen.\n";   
      cin >> n;   
      cout << n << "!=" << fakultaet(n) << "\n";   
      //eventuell noch cin.ignore etc. 
    }
    

    Tut mir sehr leid, ich hab nur gedacht, du meinst das return in main und hab nicht gesehen, dass du das return in fakultaet auch ausgelassen hat. dort ist es nämlich notwendig, denn die funktion muss ja einen wert zurückgeben.
    Seltsam, dass sich dein Compiler nicht darüber aufgeregt hat.



  • Ah, mit Visual C++ funktioniert's, nur mit Bloodshed Dev-C++ nicht. Warum auch immer...



  • static habe ich gelassen, sollte man natürlich nicht tun, wenn man die fakultät berechnet.

    Code-Hacker


Anmelden zum Antworten