Função Fibonacci com C

Nov 01 2020

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

2 user3629249 Nov 03 2020 at 14:56

em C, em uma switchdeclaração, em a case, para ter uma variável local, o corpo de casedeve ser colocado entre colchetes '{' e '}'

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

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.

chqrlie Nov 09 2020 at 05:22

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 sua fibofunção nunca são alcançadas e devem ser removidas,

  • o case 2:é redundante: o default: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, produz 0 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;
    }