Función de Fibonacci con C

Nov 01 2020

Quiero calcular la i-ésima oración de la secuencia de Fibonacci :

#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;
    }
}

Pero tiene un error para 18 líneas int a = 0, b = 1;así:

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;
      |         ^~~

Yo uso VS Code para IDE.

Respuestas

2 user3629249 Nov 03 2020 at 14:56

en C, en una switchdeclaración, en a case, para tener una variable local, el cuerpo del casedebe estar entre llaves '{' y '}'

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;
        }
    }

Aquí utilicé la parte de declaración fuera de la caja del interruptor, ya que dentro de la etiqueta solo se permiten declaraciones, no declaración.

chqrlie Nov 09 2020 at 05:22

La gramática C no permite etiquetar una declaración. default:y case <expr>:son etiquetas. Hay 3 formas de solucionar el problema en su código:

  • mueva las declaraciones fuera del cuerpo de la switchdeclaración:

    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;
        }
    }
    
  • adjuntar declaraciones en un bloque:

    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;
            }
        }
    }
    
  • agregue una declaración nula después de la etiqueta:

    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;
        }
    }
    

Tenga en cuenta también estas observaciones:

  • las break;declaraciones en su fibofunción nunca se alcanzan y deben eliminarse,

  • el case 2:es redundante: el default:código produciría el mismo resultado,

  • su código no implementa la secuencia clásica de Fibonacci: 1 1 2 3... en su lugar produce 0 1 1 2... Debería cambiar las pruebas a esto:

    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;
        }
    }
    
  • probablemente también debería regresar 0para números negativos. Simplemente simplifique el código como:

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