アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語プログラミング

漸化式について

a(n+2)=3(an+1)+2a(n)

a(0)=1
a(1)=2

のときにa(10)の値を求めるプログラミングを作りたいです。

ヒントまたは答えを教えてください。

forやifを使うらしいです。

質問者からの補足コメント

  • すいません。
    こっちです。
    質問期間が終わってしまったので再度質問します。

    「C言語プログラミング 漸化式について a」の補足画像1
      補足日時:2018/07/23 22:21
  • 皆さん回答ありがとうございます。

    int foo(int a_0, int a_1)とはなんでしょうか?

      補足日時:2018/07/24 12:05
  • 僕はいつもvoid(int) main()
    から書き初めています。

    fooという形は初めて見ました。

    習ったのは
    mainです。
    他には
    if
    switch
    for
    while
    配列
    scanf
    printf
    のみしか知りません。

      補足日時:2018/07/24 12:41

A 回答 (7件)

> fooという形は初めて見ました。



fooは「形」じゃなくって単なる「関数名」、名前です。自分で好きに付けてよろしい。
例えばprintfも「関数名」ですよね。

# 余談ですが、「真面目なプログラムを書く」んじゃなくって「書捨てでプログラムを書く」場合、英米ではfoo、bar、bazと言う「意味の無い名前」を付ける事が多い模様です。
日本ではhogeとかfugaとか言う「名前を」テキトーに付ける事が多いです。
つまり、int foo(.... じゃなくって int hoge(.... でも全然構いません。こちら側からすればどっちみち「書捨てのプログラム」なんで、「真面目に名前を考える」必要がないから、です。

ちょっと基礎的な事確認してみましょうか。
良くあるHello, Worldプログラムですが。

#include <stdio.h>

int main(void) {
 printf("Hello, World!"); /* ここでprintfと言う「関数」を引数を渡して呼び出してる */
 return 0;
}

printfと言う「関数」(機能は出力表示)はstdio.hと名付けられたライブラリ(標準入出力ライブラリ)で定義されてて、要するに「C言語内で定義されてるbuilt-in関数」として呼び出されています。
fooだろうとbazだろうと、はたまたhogeだろうと「自分で作った関数」も同じようにmain関数から「適切な引数を与えて」呼び出せばプログラムとして機能します。

注意点としては、

1. foo関数はmain関数に「呼び出される」前提なんで、main関数より「前で」定義されてないといけない。
(※ 必ずしもそうじゃないけど、この状態だと「プロトタイプ宣言」やってないのは明らかなんで、ある関数Aから別の関数Bを呼び出す場合、BはAよりファイル上では「前に」定義されてないといけない、って覚えておいた方が良いです)

2. 定義されたfoo関数に何の引数を与えるべきか、ってのは自分で考える事。
(※ と言うより、問題文にそのまま答えが書いてます。「問題を理解してるかどうか」と言うのは貴方の責任です。)

3. 最終的にはmain関数内で「出力」しないと端末(ターミナル)には何も表示されないんで、そこをどうするのか、と言うのも初歩的なお話になる。

の3つがあります。
さぁ、自分でプログラムを完成(コンパイルが通るように)させてみて下さい。
    • good
    • 0

> int foo(int a_0, int a_1)とはなんでしょうか?



関数です。

と言うより、それ以前に、ここの回答者ってのは当然、「貴方がどこまで勉強してるのか」ってのがわからないわけですよ。

C言語では、基本的に、main関数が「他の関数(buit-inにせよ自作にせよ)を呼び出す」カタチでプログラムを書いていきます。
つまり、 main関数からfoo関数を呼び出せば題意のプログラムは完成しますが、「main関数以外の関数を書いた事が無い」、あるいはその方法を「教わってない」のなら致し方無し、って話になるんですが、どうなんですかね。
    • good
    • 1

おっと、またコピーミスしちまった(苦笑)。


a_0とa_1の順番が逆でした。

int foo(int a_0, int a_1) {
 int a_n = 0;
 int count = 0;
 for (;;) {
  a_n = 3*a_1 + 2*a_0;
   if (a_n > 1000) {
   return count;
  } else if (a_n >= 100) {
   count += 1;
  }
  a_0 = a_1;
  a_1 = a_n;
 }
}
    • good
    • 0

ちなみに、どんなプログラムにしても、基本は



1. 逐次実行(書いた順番通りに実行する)
2. 条件分岐(if等を使う)
3. 繰り返し(for等を使う)

の3要素の組み合わせで書けます。
と言う事は、厳しい言い方をすると

> forやifを使うらしいです。

と言うのは、「私は分かってます」ではなくって「プログラミングを全く理解していません」と言うのと同義です(どこまで勉強してるか知りませんが)。
あまりに「使うもの」としては「当たり前過ぎる」からです。

ついでに言うと、基本的に、写真の問題を見る限り、「forを使え」だとすれば、この問題はかなりクソですね。
恐らくこの条件だと、十中八九、プログラミングに慣れてる人なら、繰り返し構文としてはwhileを選択するでしょう。

解の関数を提示しておきます。main関数は例によって書かないんで(自分で作って下さい)、色々弄ってどうなってるのか確かめましょう。

int foo(int a_0, int a_1) {
 int a_n = 0;
 int count = 0;
 for (;;) {
  a_n = 3*a_0 + 2*a_1;
  if (a_n > 1000) {
   return count;
  } else if (a_n >= 100) {
   count += 1;
  }
  a_0 = a_1;
  a_1 = a_n;
 }
}
    • good
    • 0

https://oshiete.goo.ne.jp/qa/10598166.html
のNo2です。

>質問期間が終わってしまったので再度質問します。
「ヒントまたは答えを教えてください。」と言われても
どこがわからないのか、お礼に書かないと、欲しい回答得られないと思いますよ。

前回の回答、よく読んでみてください
>「2つ前のanから今のanが求まる」ということですよね。
    • good
    • 0

a(n+2)=3(an+1)+2a(n)ではなく


a(n+2)=3a(n+1)+2a(n)ですね。
int a[11];として
a[0] = 1;
a[1] = 2;

a[n+2]=3*a[n+1]+2*a[n]なので
n=0の時、
a[2]=3*a[1]+2*a[0]となり、a[2]が求められる。
よって、n=0から8まで、nをfor文で回せば、a[10]が求められる。

for (n=0;n<=8;n++){
a[n+2]=3*a[n+1]+2*a[n];
}
    • good
    • 0
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!