結果が思った数字にならない件について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sio-salt
記事: 2
登録日時: 2年前

結果が思った数字にならない件について

#1

投稿記事 by sio-salt » 2年前

フィボナッチ数列の一般項F_n (F_n=F_n-1 + F_n-2 ,F_0=0,F_1=1)
を計算したくて書いていたのですがどうもうまくいきません。
桁あふれ的な何かかと思って考えていたのですが分かりませんでした。
下のコードの#define MAX が1のとき2のとき3以上のときでFibo()の結果が変わってしまいます。
main関数の中にprintf("%d\n\n",Fibo(10)); がたくさんあるのはどこで変になっているか見るためです。
整数の読みとりはfgets関数を使わなければなりません。
プログラミング環境等はまだよく分からないのでこのサイト(https://www.tutorialspoint.com/compile_c_online.php)
を使っています。
誰かお助け願います。

コード:

#include <stdio.h>
#include <stdlib.h>
#define MAX 2
//フィボナッチ数列一般項F_n//
int Fibo(int n)
{
    int i, F[n+1];
    F[1]=1;
    for(i=0;i<=n+1;i++)
        F[i+2]=F[i+1]+F[i];
    return F[n];
}

int main(void)
{
    
    printf("整数nを入れるとフィボナッチ数列n項目F_nを出力します。\n\n");
    char moji[MAX]; int n;
    printf("%d\n\n",Fibo(10));
    fgets(moji, MAX, stdin);
    printf("%d\n\n",Fibo(10));
    int m = atoi(moji);
    printf("F_%d = %d",m,Fibo(m));

    return 0;
}

box
記事: 2002
登録日時: 13年前

Re: 結果が思った数字にならない件について

#2

投稿記事 by box » 2年前

下のコードの#define MAX が1のとき2のとき3以上のときでFibo()の結果が変わってしまいます。
そりゃ変わるでしょうね。
1文字っていうと改行コードしか受け取れないし、
2文字っていうと1桁の数値しか受け取れないし、
3文字っていうと2桁までの数値しか受け取れないですが、
そのあたりは大丈夫ですか?

コード:

    int i, F[n+1];
    F[1]=1;
    for(i=0;i<=n+1;i++)
        F[i+2]=F[i+1]+F[i];
ループの中で、
初期化していないF[0]を参照してしまっていますが、
大丈夫ですか?たまたまゼロかもしれないし、そうでない変な値かもしれませんよ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Butter
記事: 18
登録日時: 3年前

Re: 結果が思った数字にならない件について

#3

投稿記事 by Butter » 2年前

コード:

for(i=0;i<=n+1;i++)
        F[i+2]=F[i+1]+F[i];
ここ、配列の範囲外にアクセスしています。
ループ条件をi+2<n+1とかi+2<=nに変えた方が良いと思います

sio-salt
記事: 2
登録日時: 2年前

Re: 結果が思った数字にならない件について

#4

投稿記事 by sio-salt » 2年前

本当ですね!F[0]を定義し直したら動作しました!皆さんありがとうございます。
scanfで作ってからfgets関数に直す順番でやって、scanfでF[0]の定義なしでうまくいっていたので
そのままにしていたのを忘れていました。scanfだとうまくいっていた訳は分からずじまいですが、
fgets関数のときはサボらず定義すればうまくいくことだけは分かりました。もしその辺詳しい人がいて
後からの投稿で教えて貰ってもありがたく拝見します。
↓scanfバージョン

コード:

#include <stdio.h>
//フィボナッチ数列一般項Fn//
int Fibo(int n)
{
    int i, F[n+1];
    F[1]=1;
    for(i=0;i<=n+1;i++)
        F[i+2]=F[i+1]+F[i];
    return F[n];
}

int main(void)
{
    printf("整数nを入れるとフィボナッチ数列n項目F_nを出力します。\n\n");
    int n;
    scanf("%d",&n);
    printf("F_%d = %d",n,Fibo(n));

    return 0;
}

box
記事: 2002
登録日時: 13年前

Re: 結果が思った数字にならない件について

#5

投稿記事 by box » 2年前

Butterさんからの返信にはどう対応しますか?

コード:

    int i, F[n+1];
    F[1]=1;
    for(i=0;i<=n+1;i++)
        F[i+2]=F[i+1]+F[i];
F[n+1]という定義をしているので、正しく参照できるのは
F[0]~F[n]の範囲です。それに対し、ループの中で
iがn-1になったとき
F[n+1]という定義範囲外の領域にアクセスするという悪さをしています。
これ、大丈夫ですか?という返信ですよ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

返信

“C言語何でも質問掲示板” へ戻る