Programmieren in C



  • Hy!!

    Ich weiß nicht genau wo genau das hingehört, darum poste ich es einfach mal hier rein.

    Ich hab da ein Problem mit meine Hausübung. Ich muss einen goldenen Schnitt programmieren.
    In etwa so:
    Der Goldene Schnitt ist eine bemerkenswerte Zahl, die in vielen Proportionen in der Mathematik und Natur vorkommt. Auch in der Kunst und Architektur wird sie oft verwendet, da sie zu 'gefälligen' Proportionen führt.
    (Beispiel: Notebook-Bildschirme mit 16:10)
    Interessanterweise gibt es einen Zusammenhang mit der Fibonacci-Reihe, die aus der Anweisung "zn = zn-1n-1n-1 + zn-2n-2n-2" (der neue Wert ist die Summe der beiden vorigen Werte) zusammen mit den Startbedingungen z0 = 0, z1 = 1 entsteht. Es gilt, dass zn / zn-1n-1n-1 mit steigendem n gegen den Goldenen Schnitt strebt. Somit kann der Goldene Schnitt beliebig genau bestimmt werden.
    Schreiben Sie ein Programm, das die ersten Werte der Fibonacci-Reihe berechnet und für jeden Schritt die aktuelle Approximation für den Goldenen Schnitt ausgibt. Die Anzahl der auszugebenden Werte soll vom Benutzer eingegeben werden können.
    Berechnen Sie in jedem Schritt zunächst zn (aus zn-1n-1n-1 und zn-2n-2n-2); geben Sie dann die Schrittnummer und das Verhältnis zn / zn-1n-1n-1 aus und bereiten Sie schließlich den nächsten Schritt vor (zn-1n-1n-1 wird zn-2n-2n-2, zn wird zn-1n-1n-1).
    Verwenden Sie für die beiden Anfangswerte z0 und z1 Präprozessordirektiven (#define)
    Wandeln Sie die beiden Zahlen vor der Division mit einem Typecast in double-Werte um.
    Geben Sie soweit möglich alle verfügbaren Nachkommastellen des double-Zahlenbereichs aus.

    Bei mir kommt da aber immer das falsche raus.
    Bisher habe ich:
    include <stdio.h>

    void main()
    { int a = 0; int b = 1; int num = 0; int n = 1; double c = 0; double d = 0;

    printf("Wie viele Schritte sollen durchgeführt werden?");
    scanf("%d";, &num);

    c = (double)b + (double)a;
    printf("%d\t", n);
    printf("%lf\n", c);

    while (n != num)
    {c = (c-1) + (c-2);
    n++;
    printf("%d\t", n);
    printf("%lf\n", c/(c-1);
    }
    }

    Was mach ich falsch? Wer gibt mir den Schubs in die richige Richtung?

    Lg Doty



  • void main()

    GTFO!



  • Ah sorry, programmierst ja in C. Ignore my post 😉



  • den goldenen schnitt kann man eigendlich ziemlich eifnach mit den fibonacci zahlen errechnen...

    man braucht eine schrittanzahl (also wie genau gerechent werden soll...) und dnan gehts los

    [cpp]
    int main()
    {
    long fib1 = 0, fib2 = 0, puffer = 0;

    for(int i = 0; i < schrittanzahl; ++i)
    {
    puffer = fib2;
    fib2 = fib1 + fib2;
    fib1 = puffer;
    }

    long double gold_schnitt = ( (long double)fib2 / (long double) fib1 );
    printf("%d", gold_schnitt);
    }
    [cpp]

    Ka ob das komplett C ist weil ich aus der C++ abteilung komme und kein C kann... 😉

    aber sollte verständlich sein



  • wenn du auf den "C/C++" knopf klickst, dann den code eingibst und dann nochmal draufklickst sieht das gleich viiiiel schöner aus 😉

    #include <stdio.h>
    
    int main()
    {
        // klammern bekommen eine eigene zeile
        //int a = 0, b = 1;
    
        double values[2] = {0, 0}; // 2 doubles um die letzten werte zu speichern
    
        int num = 0, n = 1;
        double c = 1;
        // ausschlagskräftige variablennamen ! z.b. zahl1, zahl2 ...
    
        printf("Wie viele Schritte sollen durchgef&uuml;hrt werden?");
        scanf("%d", &num);     // ein semikolon im ausdrück
    
        while (n != num)
        {
            c = values[0] + values[1];   // du subtrahierst von c ! indices gibt es nur bei arrays !
            values[1] = values[0];
            values[0] = c;
            n++;
            printf("%d\t", n);
            printf("%lf\n", c/values[0]);  // wenn man "1" eingibt, gibt das hier eine division durch 0 !
        }
    }
    

    dein problem war, dass du die werte so indizieren wolltest, die die formel das vorgibt. guck dir mal das thema arrays an

    MfG helferlein



  • kleine bemerkung am rande is immer hässlich wenn man oben

    int main
    

    anfängt und dann nix zurück bringt. Dann lieber void main wie oben wobei das natürlich auch nicht so toll ist.

    mfg tobZel



  • Lass doch mal solche Tipps stecken, void main ist einfach falsch. Und in aktuellem C99 zumindest gibt main, wenn nichts anderes dasteht, 0 zurück.

    Edit: Hier stand ein bisschen Müll, siehe Poster unter mir.



  • warum soll er sich aktuelles c++ anlesen wenn er ansi c programmiert lolz 👎



  • Hy!

    Danke Leute... mir kommt es zwar so vor als würden immer noch das falsche rauskommen. In der Angabe ist nämlich ein Beispiel von der Lösung angegeben:
    Beispiel
    Wie viele Schritte sollen durchgeführt werden? 20
    1 1.000000
    2 2.000000
    3 1.500000
    4 1.666667
    (…)
    18 1.618034
    19 1.618034
    20 1.618034
    Press any key to continue

    Trotzdem Danke... vielleicht geht es jetzt leichter weiter...

    Lg Doty



  • Doty schrieb:

    Hy!

    Danke Leute... mir kommt es zwar so vor als würden immer noch das falsche rauskommen. In der Angabe ist nämlich ein Beispiel von der Lösung angegeben:
    Beispiel
    Wie viele Schritte sollen durchgeführt werden? 20
    1 1.000000
    2 2.000000
    3 1.500000
    4 1.666667
    (…)
    18 1.618034
    19 1.618034
    20 1.618034
    Press any key to continue

    Trotzdem Danke... vielleicht geht es jetzt leichter weiter...

    Lg Doty

    #include<stdio.h>
    
    #define schrittanzahl 20
    #define gold_schnitt ((double)fib2/(double)fib1)
    
    int main()
    {
    
        int fib1 = 0, fib2 = 1, puffer = 0;
    
        for (int i = 0; i < schrittanzahl; i++)
        {
            puffer = fib2;
            fib2 = fib1 + fib2;
            fib1 = puffer;
    
            printf("%f\n", gold_schnitt);
        }
        return 0;
    }
    

    mfg


Anmelden zum Antworten