Probleme mit einer C-Quelltext Aufgabe



  • Hallo @ all,

    Ich habe gerade mit meinem Ing. Studium begonnen und stehe nun vor einer mir unlösbaren Aufgabe.
    Folgender Quelltext wurde mir zur Verfügung gestellt:

    //Aufgabe
    #include <iostream>
    #include <stdio.h>
    #include <string>
    using namespace std;

    float funk (int zahl); //defintion der Funktion für den Aufrauf
    void main()
    {
    int i;
    printf("\nEingabe");
    scanf ("%d",&i);
    cout<<"i1:"<<i<<endl;
    printf("\n \n Ausgabe (%d) = %f",i,funk(i));
    }

    float funk (int zahl)
    {
    float erg=0.0;
    cout<< "erg1:"<<erg << "zahl1:"<<zahl<<endl;
    if (zahl>0)

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

    else erg=1.0;
    cout<< "erg2:"<<erg << "zahl2:"<< zahl<<endl;
    return(erg);
    }

    Die "cout" Ausgaben in diesem Quelltext habe ich mir selbst dazu geschrieben, in der Hoffnung das ganze bei der Ausführung zu verstehen.
    Die Frage lautet: Berechnen Sie das Ergebnis für die Eingabe i=5. Geben Sie dazu Schritt für Schritt in einer Tabelle die Werte für erg und zahl (bzw.i) an. Wodurch sind hier die Schritte bestimmt, d.h. an welcher Stelle im Programm verändern sich jeweils zahl und erg?

    Leider komme ich hier nicht wirklich weiter. Mir ist schon noch klar, dass ich den Wert fünf in die Funktion funk übergebe. Die Formel ist eigentlich das, was mir Kopfzerbrechen bereitet. Zahl = 5 aber was bedeutet dann funk(zahl/3)? Wird da die Funktion nochmal aufgerufen mit dem Wert für %d = 1? Wäre schön wenn mir da jemand eine Antwort drauf geben könnte.

    Aber bitte für einen DAU 😉

    Ist einfach nicht meine Welt diese C-Programmierung.

    Thanks

    Best regards

    Michael



  • ja die funktion wird dann nochmal aufgerufen.

    du musst aber beachten, dass int eine ganzzahl darstellt.
    Wenn du da also 1 hast und das durch 3 teilst dann kommt 0 dabei raus und nicht 0.33



  • Falsches Forum!

    Hier werden Leute permanent genötigt c++ zu lernen. Sobald C-Code oder Dinge wie void main () {} auftauchen wetzen schon einige die Messer.

    Du kannst nicht erwarten, dass ein heutiger C++ler der neuen Schule Funktionen wie scanf() oder printf() kennt. 😉

    Zum Problem:

    Ja mit funk(zahl/3) ruft sich die Funktion selbst nochmal auf (Stischwort Rekursion) und zahl/3 bedeutet zahl wird durch 3 dividiert. Da zahl aber ein int ist fallen die Stellen hinter dem Komma einfach weg. Keine Rundung!



  • @daersc
    Du Schnelltipper!!! 😃



  • Und wie läuft das dann ab?
    Rechne ich dann 5+1/4 oder was?
    Ich kappiere da den Ablauf noch nicht so ganz.
    Wenn ich doch eine Funtion habe. In dieser Fkt habe ich eine Formel, dann muß ich die doch erst berechnen.
    und wenn ich eine Rekursion habe, muß die doch gegen einen Endwert laufen oder nicht.
    Die Rekursionsbeispiele die ich bisher hatte fielen mir erheblich einfacher.

    Wieso mach ich so einen Blödsinn nicht mit einer Schleife?
    Da schreibe ich wenigstens meinen Stack nicht zu. Speicher ist Mangelwar bei mir 🙂

    Naja, nochmal zum Thema: Ich lasse mein Fkt laufen. Habe als Zahl 5. Nun kommt die Rekursion. Müsste dann doch wieder 5+ erscheinen. Was passiert da genau? Oder schreibe ich bei der Rekursion nur den übernommenen Wert dann da in die Formel? Wie wird dann meine Variable zahl überschrieben. Dann müsste ja noch irgendwo sowas wie zahl=zahl/3 stehen!
    Und wann komme ich dann an den Punkt /funk(zahl-1)?

    Ganzschön verwirrend!!!

    P.S. @Hoho
    Ich würde sowas wie scanf und printf am liebsten auch nicht kennen. Aber in meinem beschränkten Hirn gibt es da nicht so große Unterschiede zu cout und cin 🙂

    Aber das mit dem nötigen etwas zu lernen ist echt wahr!

    Und es geht mir ja eigentlich nur um diese blöde Formel und nicht um das was in void main() steht!

    Gruß



  • funk(0) = 1 
    funk(1) = funk(1/3) / funk(1-1) = funk(0) / funk(0) = 1 / 1 = 1
    funk(2) = funk(2/3) / funk(2-1) = funk(0) / funk(1) = 1 / 1 = 1
    funk(3) = funk(3/3) / funk(3-1) = funk(1) / funk(2) = 1 / 1 = 1
    ...und so weiter.
    

    diese tabelle sollste erstmal per hand machen. mindestens bis funk(5).
    und zeig sie dann mal, am besten bis mindestens func(10), denn ich bin total neugierig, wie die funktion weiter verläuft.



  • #include <iostream> 
    //#include <stdio.h> falscher header, nennt sich eigtl
    #include <cstdio>
    #include <string> 
    using namespace std; 
    
    float funk (int zahl); //defintion der Funktion für den Aufrauf
    //nennt sich prototyp
    
    //void main() 
    int main()
    { 
    //printf("\nEingabe");
    cout << endl << "Eingabe";
    int i;
    cin >> i;
    cout << "i1:" << i << endl;
    //printf("\n \n Ausgabe (%d) = %f",i,funk(i));
    cout << endl << endl << "Ausgabe (" << i ") = " << funk(i) << endl;
    } 
    
    float funk (int zahl) 
    { 
    float erg=0.0; 
    cout<< "erg1:"<<erg << "zahl1:"<<zahl<<endl; 
    
    if (zahl>0) 
    {
      erg = zahl+funk(zahl/3) / funk(zahl-1); 
    }
    else
    {
      erg = 1.0;
    }
    
    cout<< "erg2:"<<erg << "zahl2:"<< zahl<<endl; 
    
    return erg; 
    }
    

    das erst mal, um es c++ nennen zu können...
    dann kannste jz ma das machen, was volkard gesagt hat 😛

    bb

    PS: Einrücken und ab und an auch mal auf die Leertaste wäre toll - also im Quelltext...



  • unskilled schrieb:

    ...
    

    das finde ich sehr schön, dem Michael112 so konstruktiv und schmerzlos den weg nach c++ zu weisen. 👍



  • Mit einer statischen Variable kannst du die Ausgabe so verschieben, dass die Reihenfolge der Aufrufe erkennbar wird. Im Code unten gekennzeichnet mit //*****

    #include <iostream>
    #include <stdio.h>
    #include <string>
    using namespace std;
    
    float funk (int zahl); //defintion der Funktion für den Aufrauf
    int main()
    {
        int i;
        printf("\nEingabe");
        scanf ("%d",&i);
        cout<<"i1:"<<i<<endl;
        printf("\n \n Ausgabe (%d) = %f",i,funk(i));
        return 0;
    }
    
    float funk (int zahl)
    {
        float erg=0.0;
    
        static int abstand=-2; // *****
    
        // Ausgabe
        abstand = abstand +2; // *****
        for (int n=0; n<abstand; ++n)  // *****
            cout << " ";
        cout << "funk(" << zahl <<")" << endl; // *****
    
        if (zahl>0)
            erg =zahl+funk(zahl/3) / funk(zahl-1);
        else 
            erg=1.0;
    
        // Ausgabe 
        for (int n=0; n<abstand; ++n)  // *****
            cout << " ";
        cout << "return " << erg << endl; //*****
        abstand = abstand - 2;  //*****
    
        return(erg);
    }
    


  • Vielen Dank an alle!!!

    Es ist zwar gerade noch etwas früh für mich, aber ich glaube es verstanden zu haben. Selbstverständlich werde ich demnächst auch mit space, tab etc arbeibten. Bin ja garnicht so.
    Was den C-Quellcode angeht, der war leider so vorgegeben.
    Vieleicht hätte ich mir wirklich die Mühe machen sollen ihn in C++ umzuschreiben. War wohl etwas Faul und dachte, was sich ja auch ziemlich bestätigt hat, dass Ihr mit beiden Sprachen zurecht kommt 🙂

    Ich werde mich dann heute Abend nach der Arbeit gleich nochmla drüber her machen!!!

    Thanks at all

    Best regards

    Michael


Anmelden zum Antworten