Função Fibonacci com C
Quero calcular a i-ésima frase da sequência 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;
}
}
Mas há um erro para 18 linhas int a = 0, b = 1;assim:
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;
| ^~~
Eu uso o código VS para IDE.
Respostas
em C, em uma switchdeclaração, em a case, para ter uma variável local, o corpo de casedeve ser colocado entre colchetes '{' e '}'
#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;
}
}
Aqui, usei a parte da declaração fora do caso de switch, pois dentro do rótulo apenas as declarações são permitidas, não a declaração.
A gramática C não permite que uma declaração seja rotulada. default:e case <expr>:são rótulos. Existem 3 maneiras de corrigir o problema em seu código:
mova as declarações para fora do corpo da
switchdeclaração: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; } }coloque as declarações em um bloco:
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; } } }adicione uma instrução nula após o rótulo:
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; } }
Observe também estas observações:
as
break;declarações em suafibofunção nunca são alcançadas e devem ser removidas,o
case 2:é redundante: odefault:código produziria o mesmo resultado,seu código não implementa a sequência clássica de Fibonacci:
1 1 2 3... em vez disso, produz0 1 1 2... Você deve alterar os testes para: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; } }você provavelmente deve retornar
0para números negativos também. Basta simplificar o código como:int fibo(int i) { int a = 1, b = 0; while (i-- > 0) { b += a; a = b - a; } return b; }