noob braucht hilfe



  • HI all ^^

    erstmal sorry für den dummen thread titel, ich hasse solche Titel selbst über alles aber diesesmal steh ich im dunkeln und muss solch einen namen verwenden ⚠ wenn einer eine idee hat wie ich das richtig benennen kann bitte nur sagen 🙂

    um die situation ermal zu schilder....

    also ich bin 15 und lerne mit hilfe eines buches C++ 🙄 und ich stehe... ehm sehr sehr weit am anfang hab das buch erst ein paar tage ^^'''

    hier der code mit dem ich probs habe

    #include <iostream.h>
    
    int x (int n);
    
       int main()
       {
    
         int n, answer;
         cout << "Zu findende Zahl eingeben: "; 
         cin >> n;
    
          cout << "\n\n";
    
          answer = x(n);
    
          cout << "Die " << n << ". Zahl" << " lautet " << answer;
          cout << endl;
          return 0;
        }
    
        int x (int n)
        { 
          if (n >= 1 )
          {
    		  return( x(1) - x(4*n));
          }
          else
          {
    		  return (-3);
          }
        }
    

    da soll eine zahlen brechnet werden nach der formel [[ 1 - 4n ]].Wenn ich den code jetzt copeliere in Visual C++ und dann eine exe erstelle kommt keine fehler meldung. aber sobald ich die exe starte und eine eingabe mache kommt eine fehler meldung... ich weiß aber nciht so recht wo der fehler liegen soll. hoffe ihr önnt mir helfen



  • Also erstens, es heißt iostream im namespace std;
    also:

    #include <iostream>
    using namespace std;
    

    Desweiteren wenn du in die Formel (das bekannte) n einsetzen willst, und dann das daraus resultierende Ergebnis bekommen möchtest, (so habe ich das verstanden),
    dann in der Return zeile der funktion x() (übrigens kein guter Funktionsname)

    return (1 - (4*n));
    

    //Edit:
    Oder wie meinst du das?

    Caipi



  • ich vermute mal den fehler hier:

    if (n >= 1 )
          {
              return( x(1) - x(4*n));
    

    und zwar ist es ein denkfehler: bei mir im Debugger kommt nämlich irgendwo in diesem Bereich ein Stackoverflow... das heißt dass hier bei dir die bedienung n<1 nie erreicht wird. Am besten man erstellt auf Papier eine Verlaufstabelle um zu verstehen warum es nicht klappt. Meine vermutung ist dass wenn die X-Funktion mit x(4*n) aufgerufen wird dass N dadurch immer größer wird 😉 und deshalb immer wieder x() aufgerufen wird => eine rekursive endlosschleife die nicht nur CPU sondern auch Speicher verbrät 🙄 (bei rekursiven aufrufen wird neuer lokaler Speicher auf dem Stack reserviert ohne den alten vorher freizugeben (denn den braucht man ja noch). Irgendwann ist aber kein Speicher mehr da...



  • @capi

    das erste was du gesagt hast das muss ich nur bei Visual c++ 2005 beta machen damit es geht, bei Visual C++ 6 geht es so 😕

    das zweite was du gesagt hast habe ich gemacht und siehe da es funzt ^^
    vielen dank ^^

    PS: das mit X ist mir klar bin aber bissel faul gewessen oder bin es immer *gg*

    @CDW....
    hmmm N soll ja immer das selbe bleiben... N ist das was der user eingibt, also wenn er 2 eingibt ist N = 2 hmmm



  • LittelD schrieb:

    @capi

    das erste was du gesagt hast das muss ich nur bei Visual c++ 2005 beta machen damit es geht, bei Visual C++ 6 geht es so 😕

    Mach es am besten ab jetzt immer so wie ich es oben gesagt habe. Denn das ist Standard. Dazu siehe am besten auch hier.

    LittelD schrieb:

    @CDW....
    hmmm N soll ja immer das selbe bleiben... N ist das was der user eingibt, also wenn er 2 eingibt ist N = 2 hmmm

    Ist das Absicht mit der rekursiven Funktion x(int n)?
    Ich glaube nicht.
    Zu den rekursiven Funktionen:
    Eine rekursive Funktion ist eine Funktion die sich selber immer wieder aufruft. Sie braucht daher ein Abruchkriterium. (Ansonsten ensteht eine Endlos-Rekursion, d.h die Funktion ruft sich endlos auf => *crash* ;))
    Ein einfaches Beispiel für eine rekursive Funktion ist:

    // Diese Funktion berechnet die Fakultät einer Zahl rekursiv
    unsigned int fakultaet(int x)
    {    
          // Abruchkriterium
         if(x > 1)
                 return x * fakultaet(x - 1);
         return 1;
    }
    

    Am besten du schaust die die rekursiven Funktionen noch mal genauer an.

    /edit:
    Z.B. hier: http://tutorial.schornboeck.net/rekursion.htm
    oder hier: http://www.volkard.de/vcppkold/rekursion.html

    Caipi



  • ok werd ich machen ^^

    hmm das mit x(int n)

    puhhhh... kA 😃 ich werd mir das alles mal durchlesen und schlau machen ^^

    aber sollte eigentlich keine endlos schleife sein. Hauptsache ist erstmal das es funktioniert. 🙂 die ganzen fachausdrücke muss ich noch lernen 🤡

    EDIT: aber eine frage hab ich noch im moment die mir wichtig wäre...

    wenn ich diesen code in Visual C++ 6 compeliere und die exe starte über VC++ kann ich einen wert eingeben und die ausgabe wird berechnet und dann angezeigt, danach kommt dann "please press a button to continue...." aber wenn ich ihn manuel starte kommt das nicht.... why???



  • kann einer mein edit lesen ?? 🙂





  • Probe-Nutzer schrieb:

    Hallo,

    siehe dazu:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39328.html

    MfG

    das hab ich probiert ging aber nicht 😞

    #include <iostream.h>
    #include <math.h>  // oder C++-Header: #include <cmath>
    #include <conio.h>
    #include <windows.h>
    void wait ()
    {
        FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
        getch();
    }
    
    double Add (double a, double b)
    {
    
      return pow(a, b);
    }
    
    int main()
     {
          double a, b, c;
          cout << "Geben die anzahl Ziffern ein: ";
          cin >> a;
    	  cout << "Geben die anzahl Stellen ein: ";
    	  cin >> b;
          c = Add(a,b);
          cout << "Es gibt " << c << " Kombinationen" ;
          cout << "\nBeenden...\n\n";
      return 0;
     }
    

    so und so

    #include <iostream.h>
    #include <math.h>  // oder C++-Header: #include <cmath>
    #include <conio.h>
    #include <windows.h>
    
    double Add (double a, double b)
    {
    
      return pow(a, b);
    }
    
    int main()
     {
          double a, b, c;
          cout << "Geben die anzahl Ziffern ein: ";
          cin >> a;
    	  cout << "Geben die anzahl Stellen ein: ";
    	  cin >> b;
          c = Add(a,b);
          cout << "Es gibt " << c << " Kombinationen" ;
          cout << "\nBeenden...\n\n";
      return 0;
     }
    
    void wait ()
    {
        FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
        getch();
    }
    

    oder mach ich was falsch 😕

    hab auch versucht in die main funktion einzubauen aber ging nicht



  • Die Obere Variante ist schon in Ordnung. Aber du musst die Funktion in main() doch aufrufen ;).
    Klar, du kannst auch die untere Variante nehmen, nur musst du die Funktion (anhand ihres Prototypes) dann vor ihrem ersten Aufruf bekannt machen.

    Und ich sag es noch einmal: Benutz doch die Neuen C++ Header!

    /edit:
    Ich seh grad deine unterste Zeile, in der du schreibst, "Habe es auch in main() eingebaut, ohne Effekt" oder so ähnlich.
    Welches Betriebssystem verwendest du denn. Diese Lösung ist AFAIK nur auf der Windows32-Konsole verwendbar.

    /edit2: Hast du außerdem diese Funktion probiert. Müsste eigentlich funktionieren. (Aus der FAQ kopiert)

    void wait ()
    {
        std::cin.clear();
        std::cin.ignore(std::cin.rdbuf()->in_avail());
        std::cin.get();
    }
    

    Falls es nicht funktioniert eventuell noch ein zweites std::cin.get() reinhauen 🙂

    Caipi



  • ok ok so gehts endlich

    #include <iostream>
    #include <cmath>
    #include <cstdio>
    
    using namespace std;
    
    double Add (double a, double b)
    {
    
      return pow(a, b);
    }
    
    void wait ()
    {
        std::cin.clear();
        std::cin.ignore(std::cin.rdbuf()->in_avail());
        std::cin.get();
    }
    int main()
     {
          double a, b, c;
          cout << "Geben die anzahl Ziffern ein: ";
          cin >> a;
    	  cout << "Geben die anzahl Stellen ein: ";
    	  cin >> b;
          c = Add(a,b);
          cout << "Es gibt " << c << " Kombinationen" ;
          cout << "\nBeenden...\n\n";
    	  wait ();
      return 1;
     }
    

    ok capi werde jetzt die neuen header benutzen so weit es geht ^^ denn jetzt kann ich ja endlich VC++ 2005 benutzen 🙂 sag ich mal ich werds versuchen ^^

    das mit in main einbauen..... hm war mein fehler will ich nicht genauer beschreiben ist peinlich 🤡


Log in to reply