Hàm Fibonacci với C

Nov 01 2020

Tôi muốn tính toán câu thứ i của dãy 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;
    }
}

Nhưng nó có một lỗi cho dòng 18 int a = 0, b = 1;như sau:

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;
      |         ^~~

Tôi sử dụng Mã VS cho IDE.

Trả lời

2 user3629249 Nov 03 2020 at 14:56

trong C, trong một switchcâu lệnh, trong a case, để có một biến cục bộ, phần thân của biến casephải được đặt trong dấu ngoặc nhọn '{' và '}'

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

Ở đây tôi sử dụng phần khai báo bên ngoài trường hợp switch vì bên trong nhãn chỉ cho phép các câu lệnh không được khai báo.

chqrlie Nov 09 2020 at 05:22

Ngữ pháp C không cho phép một khai báo được gắn nhãn. default:và case <expr>:là các nhãn. Có 3 cách để khắc phục sự cố trong mã của bạn:

  • di chuyển các khai báo ra bên ngoài phần nội dung của switchcâu lệnh:

    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;
        }
    }
    
  • bao gồm các khai báo trong một khối:

    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;
            }
        }
    }
    
  • thêm một câu lệnh null sau nhãn:

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

Cũng lưu ý những nhận xét sau:

  • các break;câu lệnh trong fibohàm của bạn không bao giờ đạt được và nên bị xóa,

  • các case 2:là không cần thiết: các default:mã sẽ tạo ra kết quả tương tự,

  • mã của bạn không triển khai chuỗi Fibonacci cổ điển: 1 1 2 3... thay vào đó nó tạo ra 0 1 1 2... Bạn nên thay đổi các kiểm tra thành sau:

    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;
        }
    }
    
  • bạn cũng nên trả về 0số âm. Chỉ cần đơn giản hóa mã như:

    int fibo(int i) {
        int a = 1, b = 0;
        while (i-- > 0) {
            b += a;
            a = b - a;
        }
        return b;
    }