4

我们被要求编写一个程序来生成斐波那契数列作为我们的作业。所以我写了一个程序来生成前 n 个斐波那契数。这是我的第一个代码,它可以正常工作

# include <stdio.h>
void main()
{
    int a = -1, b = 1, c = 0, i, n, sum = 0 ;
    printf("Enter the limit : ") ;
    scanf("%d", &n) ;
    printf("\nThefibonacci series is : \n\n") ;

    for(i = 1 ; i <= n ; i++)
    {
        c = a + b ;
        printf("%d \t", c) ;
        b=c;
        a=b;
    }
}

所以我尝试了各种组合,我发现如果我将第 12 行和第 13 行互换,我的代码会运行良好。IE

# include <stdio.h>
void main()
{
    int a = -1, b = 1, c = 0, i, n, sum = 0 ;
    printf("Enter the limit : ") ;
    scanf("%d", &n) ;
    printf("\nThefibonacci series is : \n\n") ;
    for(i = 1 ; i <= n ; i++)
    {
        c = a + b ;
        printf("%d \t", c) ;
        a=b;
        b=c;
    }
}

这是相同的逻辑对。为什么第一个代码给我错误的输出?

什么是分段错误?(我的编译器经常告诉我我的代码中有分段错误)

PS-我是一个初学者。刚学 c 语言三周,我们正在学习循环。

4

5 回答 5

4

语句的顺序很重要。

b = c;
a = b;

当它运行时,ba都将等于 的原始值c,并且 的旧值b已经丢失。这可能不是你想要的。

a = b;
b = c;

当它运行时,a将等于 的旧值bb并将等于 的原始值c

于 2012-11-10T11:38:43.023 回答
2

在斐波那契数列中,生成一个新数字作为前两个数字的总和。

假设前两个数字是AB,而新生成的数字是C。现在对于下一次迭代,您需要忘记A&是您以前的新数字。BC

要使你成为新的,B你需要做:CAB

A = B   // B becomes the new A
B = C   // C becomes the new B

你正在做的是:

B = C   // C becomes the new B, but you've not saved the old value of B!!!
A = B   // Old value of B gone..B is now C, which is assigned to A
于 2012-11-10T11:40:35.347 回答
1

孤立地看这个:

    c = a + b ;
    printf("%d \t", c) ;
    b=c;
    a=b;

两者的值a以及b执行此操作后的值将是c

    c = a + b ;
    printf("%d \t", c) ;
    a=b;
    b=c;

如果重新排列语句,a则获取 的旧值b,并b获取 的新值c

于 2012-11-10T11:39:18.127 回答
1

行是按顺序执行的,因此在第一个示例中b变为cbefore abecome b,实际上您正在分配c给两者ab创建某种指数级数(但为零)而不是斐波那契数列。

分段错误意味着您的程序正在访问不允许访问内存的某个地方的内存,通常是因为您取消引用无效指针或访问超出范围的数组。

于 2012-11-10T11:39:49.277 回答
1

这是相同的逻辑对。为什么第一个代码给我错误的输出?

你有没有想过,为什么

printf("Enter the limit : ") ;
scanf("%d", &n) ;
printf("\nThe fibonacci series is : \n\n") ;

首先输出Enter the limit,然后等待你输入一个数字,然后输出The fibonacci series is——以特定的顺序?

为什么不反过来或同时做所有事情呢?


什么是分段错误?

一个简单的谷歌搜索会给你大量的解释。这意味着您已经访问了内存,这不是您可以访问的。

于 2012-11-10T11:43:35.903 回答