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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 結果が思った数字にならない件について

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]という定義範囲外の領域にアクセスするという悪さをしています。
これ、大丈夫ですか?という返信ですよ。

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

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に変えた方が良いと思います

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]を参照してしまっていますが、
大丈夫ですか?たまたまゼロかもしれないし、そうでない変な値かもしれませんよ。

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

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

ページトップ