2017-02-16 16 views
0

正しい番号を出力するプログラムを取得できません。私は単純な間違いをしているように感じます。これはC言語で書かれています。フィボナッチ数を配列に格納する(C)

#include <stdio.h> 
#include <stdlib.h> 

int main() 
    { 
    int n, i; 
    int list[n]; 

    while(1) 
    { 
     scanf("%d", &n); 
     if(n == -1) 
    { 
     break; 
    } 
    else 
    { 
     for(i = 2; i < n; i++) 
     { 
      list[i] = list[i-1]+list[i-2]; 
     } 
     printf("%d %d", i, list[i]); 
    } 
} 
} 
+3

あなたのコンパイラは 'int list [n];' n 'は初期化されていない、コンパイラの警告レベルを少し上げたいと思うかもしれません。また、フィボナッチシーケンス(インデックス0と1)の基本ケースを初期化していないので、それらの値が設定されていると思う場所が不明です。 – ShadowRanger

+0

不確定の間、自動保存期間を持つオブジェクトの値を使用するための未定義の動作。 – EOF

+0

どのような出力が得られますか?あなたは何をしたいですか? –

答えて

2

(物事を簡単にするため、私は入力を扱う無視するつもりです。)

最初の問題は、コンパイラの警告をオンです。ほとんどのCコンパイラは、デフォルトで警告を出すわけではありません。通常は-Wallでコンパイルします。一度それをすれば、基本的な問題が明らかになります。

test.c:6:14: warning: variable 'n' is uninitialized when used here [-Wuninitialized] 
    int list[n]; 
      ^
test.c:5:10: note: initialize the variable 'n' to silence this warning 
    int n, i; 
     ^
      = 0 
1 warning generated. 

int list[n]すぐにサイズnのリストを作成します。 nは初期化されていないため、ガベージになります。あなたはそれが1551959272.

のようなものだから、どちらかnを初期化する必要がある、またはあなたがn変化に応じて動的listを再割り当てする必要があるだろう、printf("%d\n", n);と見ることができます。ダイナミックな割り当てと再割り当ては複雑になるので、静的なサイズにしましょう。

これを取得します。

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    /* Allocate an array of MAX_N integers */ 
    const int MAX_N = 10; 
    int list[MAX_N]; 

    /* Do Fibonacci */ 
    for(int i = 2; i < MAX_N; i++) { 
     list[i] = list[i-1]+list[i-2]; 
    } 

    /* Print each element of the list and its index */ 
    for(int i = 0; i < MAX_N; i++) { 
     printf("%d\n", list[i]); 
    } 
} 

実行されますが、我々はゼロ(またはゴミ)が、何も得ること。フィボナッチアルゴリズムに問題があります。それはf(n) = f(n-1) + f(n-2)で初期条件はf(0) = 0f(1) = 1です。これらの初期条件は設定しません。 listは決して初期化されないので、list[0]list[1]には、そのメモリの中にあったゴミが含まれます。

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    /* Allocate an array of MAX_N integers */ 
    const int MAX_N = 10; 
    int list[MAX_N]; 

    /* Set the initial conditions */ 
    list[0] = 0; 
    list[1] = 1; 

    /* Do Fibonacci */ 
    for(int i = 2; i < MAX_N; i++) { 
     list[i] = list[i-1]+list[i-2]; 
    } 

    /* Print each element of the list and its index */ 
    for(int i = 0; i < MAX_N; i++) { 
     printf("%d\n", list[i]); 
    } 
} 

これで機能します。ここで

0 0 
1 1 
2 1 
3 2 
4 3 
5 5 
6 8 
7 13 
8 21 
9 34 
+0

あなたの最後のコードは "list [0]は既に0に初期化されていますが、決して" 0 "に初期化されています。 "スタック割り当て配列が0に初期化される"はfalseです –

+0

@ M.Mスタック割り当てリストは0に初期化されるか、明示的な '{}'が必要ですか? – Schwern

+1

@ M.Mあなたは正しいと思います。 "*自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。*" – Schwern

0

あなたはmain関数に戻りません。

nは前に定義する必要があります。さもなければ、それはメモリからランダムな値を取った。 したがって、リスト配列は未知の値で作成されます。

int list[n]; 

また、nは宣言されていても定義されていないので、これは決して起こりません。

i < n; 

これは必要なのですか?

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int F[100]; 
    F[0] = 0; 
    F[1] = 1; 
    int i = 2; 
    while(1) 
    { 
     if(i < 100) 
     { 
      F[i] = F[i-1] + F[i-2]; 
      i++; 
     } 
     else 
     { 
      break; 
     } 
    } 
    i = 0; 
    while(1) 
    { 
     if(i < 100) 
     { 
      printf("%d ; ", F[i]); 
      i++; 
     } 
     else 
     { 
      break; 
     } 
    } 
    return 0; 
} 
+2

'main'に戻る必要はありません。 ISO Cの5.1.2.2.3からmain関数を終了する "*に達する"は0の値を返します。* " – Schwern

+0

" n "が定義されています。それは初期化されていないことを意味します。 –

+1

@Schwernは知らなかった、ありがとう。 –

0

は、コードスニペット、あなたが各反復の需要にメモリを割り当てる必要が

#include <stdio.h> 
int main() 
{ 
    int MAX_SIZE = 100; //Initial value 
    int n, i; 
    int list[MAX_SIZE]; 

    printf("Enter value of 'n'"); 
    scanf("%d",&n); 

    if(n < 0){ 
     printf("'n' cannot be negative number"); 
     return 0; 
    }else if (n==1){ 
     list[0]=0; 
    }else if(n == 2){ 
     list[0]=0; 
     list[1]=1; 
    }else{ 
     list[0]=0; 
     list[1]=1; 
     for(i = 2; i <= n; i++) 
     { 
      list[i] = list[i-1]+list[i-2]; 
     } 
    } 
    //To view array elements 
    for(int i=0;i<n;i++){ 
     printf("%3d",list[i]); 
    } 

    } 
+0

また、配列のサイズを超える 'n 'を扱うべきです –

+0

' int'の容量を上回る 'list [i]'も扱うべきです。 'MAX_SIZE'を47に設定するとよいでしょう。 –

+0

それは本当です、それに対処する余分なロジックを追加する必要があります(配列のメモリの割り当ては動的に変更する必要があります) –

0

です。あなたのコードでは、nは初期化されていないので、予期しない動作につながります。また、list[0]list[1]を初期化する必要があります。これは 'ベース'のケースです。

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int n, i; 
    int* list; /* Declare a pointer to the list */ 

    while(1) 
    { 
    scanf("%d", &n); 
    if(n == -1) 
    { 
     break; 
    } 
    else if (n > 0) 
    { 
     list = (int *) malloc(n * sizeof(int)); 
     list[0] = 1; 
     list[1] = 1; 
     for(i = 2; i < n; i++) 
     { 
     list[i] = list[i-1]+list[i-2]; 
     } 
     printf("%d %d\n", i, list[i-1]); 
     free(list); 
    } 
    } 
} 
関連する問題