• ベストアンサー

フィボナッチ数列

C言語の問題です。 フィボナッチ数列について。 以下のプログラムはある整数を入力し、その整数以下のもっとも大きなフィボナッチ数列に含まれる整数を返すものである。 #include <stdio.h> int main(void){ int limit,new=1,pre=0,work result; scanf("%d", &limit); while(new<=limit){ /*printf("%d %d\n,pre,new);トレース用*/ work=new; new=work+pre; pre=work; } result =pre; printf("%d\n", result); } 以下を参考に、このプログラムの一部を関数にして書き換えなさい。 #include <stdio.h> /*ここに関数を記述*/ int main(void){ int limit,result; scanf("%d",&limit); result = fibnum(limit); printf("%d\n", result); } という問題です。 私は以下のように考えたのですが… #include <stdio.h> void fibnum(int limit){ int f0, f1; f0 = 0; f1 = 1; printf("%d\n", f0); printf("%d\n", f1); while(1){ f0 += f1; if (f0 > limit)return; printf("%d\n", f0); f1 += f0; if (f1 > limit)return; printf("%d\n", f1); } } int main(void){ int limit, result; scanf("%d",&limit); result = fibnum(limit); printf("%d\n", result); return result; } 実行すると 「S:\デスクトップ\v\v.cpp(30) : error C2440: '=' : 'void' から 'int' に変換することはできません。(新しい動作 ; ヘルプを参照) void 型の式は他の型へ変換できません。 cl.exe の実行エラー」 と出てきてしまいます。 考えてみたのですが、エラーの理由がよくわかりません。 どこが間違っているのかなど、ご指摘いただければ嬉しいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

質問者さんは課題が要求している内容を把握出来ていません。 「関数にして書き換えなさい」と言う指示だけを読んで、ただ単に関数にするだけでは、合格点は貰えません。 >以下を参考に、このプログラムの一部を関数にして書き換えなさい。 >/*ここに関数を記述*/ (略) >result = fibnum(limit); と言うのですから、この課題は 「引数としてlimitを与えて、limitを超えないフィボナッチ数を返す関数fibnumを作りなさい。なお、結果の表示はmain関数で行っているので、fibnum関数内で結果は表示してはいけません」 と言う事になります。 質問者さんは >void fibnum(int limit){ と「値を返さない関数」を定義した時点で、課題が要求している解答を満足していません。 まず「limitを超えない値を返す」ように、関数を作り直して下さい。 そして、課題の要求通り、関数内で結果を表示しないようにして下さい。 あと、課題の元ソースプログラムにある >/*printf("%d %d\n",pre,new);トレース用*/ も作成した関数内に作っておき、コメントを外すと、課題の元ソースプログラムのコメントを外してトレース表示した時と完全に同じ動作をするようにしておくと、満点が貰えるでしょう。

tiom
質問者

お礼

わかりやすく丁寧な解説ありがとうございます。 ご指摘いただいた点を修正したところ、無事に実行できました! 私は題意が理解しきれていなかったのですね。 このたびは本当に助かりました。 ありがとうございました!

その他の回答 (2)

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.2

> result = fibnum(limit); この部分の処理ですが、fibnum関数が戻した値を、resultに代入しようと、 している様に見えますが、 fibnum関数は、何を戻しますか? また、fibnum関数が値を戻すような処理はどこに記述しましたか? ソースを拝見したところ、fibnum関数が何か値を戻すような個所は見当たりませんよ。 > void fibnum(int limit){ fibnum関数の宣言部も値を戻さないように宣言してあるようです。 > result = fibnum(limit); は、いったい、何をしようとしている個所ですか?

tiom
質問者

お礼

回答ありがとうございます。 言われてみれば全く題意を満たしていませんね… おかげさまで無事に実行できました。 今回は本当にありがとうございました!

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>void fibnum(int limit){ fibnum関数は戻り値がない(void)と言っているのに >result = fibnum(limit); ここで戻り値があるかのようにふるまっているのが理由です。

tiom
質問者

お礼

回答ありがとうございます。 ご指摘いただいた点を修正したところ、無事に実行できました! 単純なミスに気付かず、私もまだまだだめですね… 今回は本当にありがとうございました!

関連するQ&A