Fonction de Fibonacci avec C
Je veux calculer la i-ème phrase de la séquence 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;
}
}
Mais il y a une erreur pour 18 lignes pour int a = 0, b = 1;comme ceci:
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;
| ^~~
J'utilise VS Code pour l'IDE.
Réponses
en C, dans une switchinstruction, en a case, pour avoir une variable locale, le corps du casedoit être entre accolades '{' et '}'
#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;
}
}
Ici, j'ai utilisé la partie déclaration en dehors du boîtier du commutateur car à l'intérieur de l'étiquette, seules les déclarations sont autorisées et non la déclaration.
La grammaire C ne permet pas d'étiqueter une déclaration. default:et case <expr>:sont des étiquettes. Il existe 3 façons de résoudre le problème dans votre code:
déplacez les déclarations en dehors du corps de l'
switchinstruction: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; } }inclure les déclarations dans un bloc:
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; } } }ajoutez une instruction null après l'étiquette:
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; } }
Notez également ces remarques:
les
break;instructions de votrefibofonction ne sont jamais atteintes et doivent être supprimées,le
case 2:est redondant: ledefault:code produirait le même résultat,votre code n'implémente pas la séquence classique de Fibonacci:
1 1 2 3... au lieu de cela, il produit0 1 1 2... Vous devriez changer les tests comme suit :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; } }vous devriez probablement revenir
0pour les nombres négatifs aussi. Simplifiez simplement le code comme suit:int fibo(int i) { int a = 1, b = 0; while (i-- > 0) { b += a; a = b - a; } return b; }