Fibonacci-Funktion mit C.

Nov 01 2020

Ich möchte den i-ten Satz der Fibonacci- Sequenz berechnen :

#include <stdio.h>

int fibo(int i);

int main()
{
    return 0;
}

int fibo(int i)
{
    switch (i)
    {
    case 1:
        return 0;
        break;
    case 2:
        return 1;
        break;
    default:
        int a = 0, b = 1;
        for (int p = 3; p <= i; p++)
        {
            b += a;
            a = b - a;
        }
        return b;
        break;
    }
}

Aber es hat einen Fehler für 18 Zeilen int a = 0, b = 1;wie folgt :

10.c: In function 'fibo':
10.c:18:9: error: a label can only be part of a statement and a declaration is not a statement
   18 |         int a = 0, b = 1;
      |         ^~~

Ich benutze VS Code für IDE.

Antworten

2 user3629249 Nov 03 2020 at 14:56

in C, in einer switchAnweisung, in a case, um eine lokale Variable zu haben, muss der Körper von casein geschweiften Klammern '{' und '}' eingeschlossen sein.

adrsh23 Nov 01 2020 at 15:36
  #include <stdio.h>
    int fibo(int i);
    int main()
    {
        return 0;
    }
    int fibo(int i)
    {
        int a = 0, b = 1;
        switch (i)
        {
        case 1:
            return a;
            break;
        case 2:
            return b;
            break;
        default:
            for (int p = 3; p <= i; p++)
            {
                b += a;
                a = b - a;
            }
            return b;
            break;
        }
    }

Hier habe ich den Deklarationsteil außerhalb des Switch-Falls verwendet, da innerhalb des Labels nur Anweisungen erlaubt sind, keine Deklaration.

chqrlie Nov 09 2020 at 05:22

Die C-Grammatik erlaubt es nicht, eine Deklaration zu kennzeichnen. default:und case <expr>:sind Etiketten. Es gibt drei Möglichkeiten, um das Problem in Ihrem Code zu beheben:

  • Verschieben Sie die Deklarationen aus dem Hauptteil der switchAnweisung:

    int fibo(int i) {
        int a, b;
        switch (i) {
        case 1:
            return 0;
        case 2:
            return 1;
        default:
            a = 0, b = 1;
            for (int p = 3; p <= i; p++) {
                b += a;
                a = b - a;
            }
            return b;
        }
    }
    
  • Deklarationen in einen Block einschließen:

    int fibo(int i) {
        switch (i) {
        case 1:
            return 0;
        case 2:
            return 1;
        default: {
                int a = 0, b = 1;
                for (int p = 3; p <= i; p++) {
                    b += a;
                    a = b - a;
                }
                return b;
            }
        }
    }
    
  • Fügen Sie nach dem Label eine Null-Anweisung hinzu:

    int fibo(int i) {
        switch (i) {
        case 1:
            return 0;
        case 2:
            return 1;
        default:;  // this is a null statement
            int a = 0, b = 1;
            for (int p = 3; p <= i; p++) {
                b += a;
                a = b - a;
            }
            return b;
        }
    }
    

Beachten Sie auch diese Bemerkungen:

  • Die break;Aussagen in Ihrer fiboFunktion werden nie erreicht und sollten entfernt werden.

  • Das case 2:ist redundant: Der default:Code würde das gleiche Ergebnis liefern.

  • Ihr Code implementiert nicht die klassische Fibonacci-Sequenz: 1 1 2 3... stattdessen erzeugt er 0 1 1 2... Sie sollten die Tests folgendermaßen ändern:

    int fibo(int i) {
        switch (i) {
        case 0:
            return 0;
        default:;  // this is a null statement
            int a = 1, b = 1;
            for (int p = 2; p < i; p++) {
                b += a;
                a = b - a;
            }
            return b;
        }
    }
    
  • Sie sollten wahrscheinlich auch 0für negative Zahlen zurückkehren. Vereinfachen Sie den Code einfach wie folgt:

    int fibo(int i) {
        int a = 1, b = 0;
        while (i-- > 0) {
            b += a;
            a = b - a;
        }
        return b;
    }