Konsole gibt bei Ausführung Fehler



  • Hallo, folgendes Programm möchte ich in der Konsole ausführen:

    #include <stdio.h>
    
    float funk (int zahl);
    
    void main ()
    {
      int i;
      printf("\n Eingabe");
      scanf("%d",&i);
      printf("\n \n Ausgabe(%d) = %f",i,funk(i));
    }
    
    float funk (int zahl)
    {
      float erg=0.0;
      if (zahl>0)
        erg=5+funk(5/3) / funk(5-1);
      else
        erg=1.0;
      return(erg);
    }
    

    Da die Datei Rekursion.cpp heißt, gebe ich in der Konsole nach dem Pfad dann:

    bcc32 Rekursion ein.
    Daraufhin erscheint dann der Warnhinweis: W8004 für Zeile 15: 'erg' is assigned a value that is never used in function funk(int)

    Da ich absoluter Anfänger bin, weiß ich nun nicht, wie ich den Fehler behebe, habe ich was vergessen zuzuweisen??

    Vielen Dank im voraus für eure Hilfe!



  • Hallo frequenzwechsel,

    ich weiß nicht, was deine Funktion tun soll, jedenfalls wird sie damit nicht fertig werden. Das große Problem: Du rufst im Rumpf immer funk(1) und funk(4) auf, unabhängig von irgendwelchen Berechnungen. D.h. dein "Rekursionsanker" greift nicht.

    Viele Grüße,
    MaBa



  • Hallo

    Zur eigentlichen Frage : Die Warnung bezieht sich auf die Zuweisung in der Zeile. Der Wert 0 für erg wird im weiteren Verlauf der Funktion nicht wieder gebraucht. Du kannst also auch einfach schreiben :

    float erg;
    

    und die Warnung sollte verschwinden.

    Allerdings ist das nur eine Warnung des Compilers, dein Programm wird trotzdem erstellt und ausgeführt. Und dann wird, wie MaBa schon gesagt hat, dein Programm von einem echten Fehler beendet : Deine Rekursion ergibt keinen Sinn und endet in einem Stacküberlauf. Mit der Warning hat das aber nichts zu tun. Du must nochmal überlegen was deine Rekursion überhaupt bezwecken soll.

    bis bald
    akari



  • Hallo, danke für den Hinweis.
    eigentlich soll die Rekursion sich so oft aufrufen, bis das ergebnis der funktion(also: erg=5+funk(5/3) / funk(5-1); ) nicht mehr größer null ist, dann ist das Abbruchkriterium erfüllt und das Programm sollte 1.0 "ausspucken" . Aber irgendwie funktioniert es nicht 😕
    Habt ihr noch nen Lösungsansatz für mich??



  • Hallo

    Was sollen wir dazu sagen? Der Computer hat natürlich Recht. Deine Berechnung gibt niemals ein Ergebnis kleiner 0 aus, die Bedingung wird nie erfüllt. Das liegt an deiner Rechnung, nicht an Fehlern im Programm.
    Wie kommst du denn zu der Annahme, das nach endlich vielen Schritten irgendwann das Ergebnis negativ wird? Das ist ganz einfach berechenbar. Zumal die Rekursion auch keinerlei Einfluß hat. Und warum schreibst du "5 - 1", wenn du doch auch einfach "4" schreiben kannst?

    bis bald
    akari



  • hallo,
    laut meiner Aufgabenstellung soll ich das Ergebnis für dieses Programm für die Eingabe i=5 berechnen lassen. Das Programm war so in der Aufgabenstellung vorgegeben.
    Weiterhin soll ich die Werte für "erg" und "zahl" Schritt für Schritt in einer Tabelle wiedergeben. 😞

    beste grüße!



  • Hallo

    So wie du hier die Aufgabe darstellst ergibt sie keinen Sinn. Frag doch bitte mal bei dem Aufgabensteller nach.
    Kann es sein, das du statt (5-1) doch eher (5-i) verwenden sollst? Mit i als Variable (z.B. die Rekursionstiefe) würde das schon eher Sinn machen.

    bis bald
    akari



  • Es soll: erg=5+funk(5/3) / funk(5-1); berechnet werden. Die Funktion wird daraufhin 17mal aufgerufen bis sie endet.(laut anderen student aus forum mit folgender Erläuterung:

    "
    relevant für das Aufstellen der Tabelle ist ja diese Formel:

    erg=zahl+funk(zahl/3) / funk(zahl-1);

    in Verbindung mit if (zahl>0) als Abbruchkriterium für jeden Zweig der Rekursion.

    Wenn wir als Beispiel mal i=zahl=5 annehmen, dann sieht das am Anfang wie folgt aus:

    1. Aufruf: erg=5+funk(5/3) / funk(5-1);
    daraus gibt es 2 neue Aufrufe der Funktion funk mit
    2. Aufruf funk (5/3) ==> funk (1) // nach diesem Aufruf kein weiterer Aufruf von funk
    3. Aufruf funk (5-1) ==> funk (4) // hat weitere rekursive Aufrufe zur Folge
    und wird wieder in die bekannte Formel eingesetzt. Das geht dann immer so weiter (eben rekursiv), bis "if (zahl>0)" nicht mehr true ist, also die Zahl nicht mehr größer Null ist. Somit wird erg = 1.0 zurückgegeben und dieser Zweig der Rekursion beendet."



  • Hallo

    Siehst du, und schon ein Fakt den du uns bisher nicht erzählst hast.

    erg=zahl+funk(zahl/3) / funk(zahl-1);

    Denk mal drüber nach, und vergleiche mit deinem Quellcode.

    bis bald
    akari



  • sorry, ich komm einfach nicht drauf, war eigentlich in der annahme, dass ich für zahl die eingabe 5 tätigen muss, damit meine formel berechnet wird.
    (hab leider erst vor 2tagen mit meinem lehrbuch C++ von dirk luis begonnen) 😞



  • Hallo

    Ist doch ganz einfach :

    float funk (int zahl)
    {
      float erg=0.0;
      if (zahl>0)
        erg=5+funk(zahl/3) / funk(zahl-1); // Nicht die feste 5, sondern die Variable zahl
      else
        erg=1.0;
      return(erg);
    }
    

    bis bald
    akari



  • ah, ist das peinlich.. 🙄
    vielen dank!!


Anmelden zum Antworten