4

宿題として、フィボナッチ数列を生成するプログラムを書くように言われました。だから私は最初のn個のフィボナッチ数を生成するプログラムを書きました.hereは正しく動作しない最初のコードです

# 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 行目を入れ替えるとコードがうまく機能することがわかりました。すなわち

# 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-i は初心者です。C 言語を使い始めてわずか 3 週間で、ループについて学習しています。

4

5 に答える 5

4

ステートメントの順序は重要です。

b = c;
a = b;

これが実行されるとb、 とaの両方が の元の値と等しくcなり、 の古い値はb失われます。これはおそらくあなたが望んでいたものではありません。

a = b;
b = c;

これが実行aされると、 は の古い値bb等しくなり、 の元の値と等しくなりますc

于 2012-11-10T11:38:43.023 に答える
2

フィボナッチ数列では、前の 2 つの数値の合計として新しい数値が生成されます。

前の 2 つの数値がAB、新しく生成された数値が であるとしましょうC。次の反復では、忘れる必要がありAますB&Cは、新しい以前の番号です。

あなたを新しくするために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

それは同じ論理的権利です。最初のコードで間違った出力が表示されるのはなぜですか?

疑問に思ったことはありますか、なぜ

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 に答える
1

これを単独で見てください:

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

これを実行した後のaとの両方の値は になります。bc

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

ステートメントを並べ替えると、aの古い値が取得され、 の新しい値が取得されます。bbc

于 2012-11-10T11:39:18.127 に答える
1

行は順番に実行されるため、最初の例では become前のbecome になりbます。実際には、両方に割り当てて、フィボナッチ数列の代わりにある種の指数級数 (ただしゼロ) を作成しています。cabcab

セグメンテーション違反は、プログラムがメモリへのアクセスが許可されていない場所でメモリにアクセスしていることを意味します。これは通常、無効なポインターを逆参照しているか、範囲外の配列にアクセスしているためです。

于 2012-11-10T11:39:49.277 に答える