Fonction de Fibonacci avec C

Nov 01 2020

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

2 user3629249 Nov 03 2020 at 14:56

en C, dans une switchinstruction, en a case, pour avoir une variable locale, le corps du casedoit être entre accolades '{' et '}'

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

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.

chqrlie Nov 09 2020 at 05:22

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 votre fibofonction ne sont jamais atteintes et doivent être supprimées,

  • le case 2:est redondant: le default: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 produit 0 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;
    }