Función de Fibonacci con C
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
en C, en una switchdeclaración, en a case, para tener una variable local, el cuerpo del casedebe estar entre llaves '{' y '}'
#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.
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 sufibofunción nunca se alcanzan y deben eliminarse,el
case 2:es redundante: eldefault: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 produce0 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; }