ページ 11

C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 01:26
by samusu0905
5月に入ってからC言語の教科書(猫でもわかるC言語プログラミング)をもう一度やり直したんですが、教科書の関数の練習問題でわからなくなってしまったところがあります。ここに問題文を軽く書きます。
「添え字を引数として与えたときにフィボナッチ数を返す関数を作ってください。また、実際にこの関数を使ってnが1から30までのフィボナッチ数を表示するプログラムを作ってください。」
フィボナッチ数については練習問題のところに説明が書いてあったので大丈夫です。
この問題のヒントを教えてほしいです。答えは書かなくていいですよ。
ヒントを元に、自分で答えを導きだしますので。お願いします。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 01:31
by Poco
分からない点は、何でしょうか?
問題全部わからない、ってのはヒントの出しようがありません。

もしくは分かるところは何でしょうか?
こちらはソースコードで書けるところまで書いてください。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 01:57
by samusu0905
すみません。わからない点を書き忘れました・・。
まず、練習問題にもある「添え字を引数として与えた時にフィボナッチ数を返す関数」ってありますよね?この添え字を引数にするところの意味が良くわかりませんでした。フィボナッチ数を返すのは理解できました。関数の引数に添え字を渡したのですが、プログラミングてきにあっているのかわかりません。まだ完成してないですが、途中までのコードを載せます。

コード:

#include <stdio.h>

int Fibonatti(int );

int main(){
	//b:終了, i:フィボナッチ数
	int b,i;
	b=0;
	for( i=1; i<30; i++)
	{
		printf("Fn = %d+",i);
	}

	getchar();
	return 0;
}


int Fibonatti(int [30])
{
	int Fn=0;
	Fn = Fn-1;
	return Fn;
}
こんな感じなんですが、どうでしょうか?

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 04:07
by rascal
こんばんは

添え字を引数として与える ですが
添え字とは 配列変数のうちのひとつの要素を指定するために使用される文字 です
つまり 10と指定するなら 10番目の数 ということになります

あってるかどうかは実際に動かしてみてはいかがでしょうか?

自分で動かさないことには自分での判断ができませんよ

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 09:11
by みけCAT
まずはフィボナッチ数の代わりに正の整数の数列を返す関数を作ってみませんか?
すなわち、添え字をそのまま項の値にします。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 09:31
by usao
>添え字

例えばフィボナッチ数を
F_0 = 0
F_1 = 1
F_n = F_(n-1) + F_(n-2) (n>=2のとき)
としたら,
この問題文が言うところの「添え字」って,{ _の右側の値.0とか1とnとかで書いてるやつ.何番目の数なのかってこと }
ってだけかと.

だから,
>添え字を引数として与えたときにフィボナッチ数を返す関数を作ってください。
ってことは,
引数の値が n だったら,F_n の値を返す(例えば,引数に 5 を指定したら,F_5 の値を返す)ような関数を作れって話でしょう.
素直に読めば.

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 11:29
by box
具体例で考えてみましょうか。
フィボナッチ数列を求める関数に
1
2
3
4
5
の5種類の引数を与えたとき、それぞれ
どういう結果がほしいですか?

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 12:15
by samusu0905
rascalさん>>回答有難うございます。
実際に動かしてみたんですが、ダメでした。

みけCATさん>>回答有難うございます。
>フィボナッチ数の代わりに正の整数の数列を返す関数を作ってみませんか?
それもいいですが、それは後でやってもいいですか?
ちょっと練習問題の方に力を入れたいので、申し訳ないですがそれは後回しでお願いします。
すみません。

usaoさん>>回答有難うございます。
>引数の値が n だったら,F_n の値を返す(例えば,引数に 5 を指定したら,F_5 の値を返す)ような関数 >を作れって話でしょう.
なるほどそのような感じで書けばいいんですね?
>F_0 = 0
>F_1 = 1
>F_n = F_(n-1) + F_(n-2) (n>=2のとき)
>としたら,
>この問題文が言うところの「添え字」って,{ _の右側の値.0とか1とnとかで書いてるやつ.何番目の >数なのかってこと }
>ってだけかと.
フィボナッチ数ってこの練習問題の場合、そういう事だったんですね。
よみがはずれました。問題の文に説明が書いてあったので「Fn_1」←これがフィボナッチ数かとおもってました。試しにプログラムをかいてみます。

boxさん>>回答有難うございます。
こんな結果ですか?
Fn-1
Fn-2
Fn-3
Fn-4
Fn-5
合ってるかわかりませんが。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 12:22
by box
samusu0905 さんが書きました: Fn-1
Fn-2
Fn-3
Fn-4
Fn-5
Fn-
の部分が何を意味しているのかよくわかりませんが、その後に続く
1~5というのは、単にnを出力しているだけで、フィボナッチ数を出力していないですね。
私は、てっきり
引数に1を与えたら1を得る
引数に2を与えたら1を得る
引数に3を与えたら2を得る
引数に4を与えたら3を得る
引数に5を与えたら5を得る
という、フィボナッチ数列の最初の5項を得るものだとばかり思っていました。

ちなみに、引数に6~10を与えた場合、
引数に6を与えたら8を得る
引数に7を与えたら13を得る
引数に8を与えたら21を得る
引数に9を与えたら34を得る
引数に10を与えたら55を得る
ということではないんですか?だって、フィボナッチ数列ですよね。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 12:26
by softya(ソフト屋)
>実際に動かしてみたんですが、ダメでした。
どうダメだったか書かないと意味が無いですよ。何度も言ってますが。

みけCATさんの提案は、フィボナッチ数以前にこれが出来ないとフィボナッチ数も出来ませんよと言う意味ですね。
なので先にやらないと意味が無いです。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 13:08
by samusu0905
boxさん>>回答有難うございます。
>ちなみに、引数に6~10を与えた場合、
>引数に6を与えたら8を得る
>引数に7を与えたら13を得る
>引数に8を与えたら21を得る
>引数に9を与えたら34を得る
>引数に10を与えたら55を得る
>ということではないんですか?だって、フィボナッチ数列ですよね。
確かにそうですが、今自分がやりたいのはフィボナッチ数を求めるということです。
フィボナッチ数列とは言ってませんよ・・。

softyaさん>>回答有難うございます。
具体的に言うと、フィボナッチ数を返すための関数を作って引数に添え字を与えたんですが、
引数に添え字を書くとエラーが発生した、ということです。
練習問題の最初の文章には「F1=1,F2=1,nが3以上のときFn=Fn-1+Fn-2で与えられる数列をフィボナッチ数列といい、各項をフィボナッチ数という。」これがNo1の文章に書いた文(添え字を引数として与えたとき)の前に書かれていた文章なのですが。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 13:10
by softya(ソフト屋)
> 引数に添え字を書くとエラーが発生した、ということです。

コンパイルエラーでしょうか? であればロジック以前の文法的な問題です。
先にその質問をすべきですね。

みけCATさんの提案はスルーされるということでしょうか?

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 13:25
by box
samusu0905 さんが書きました: 確かにそうですが、今自分がやりたいのはフィボナッチ数を求めるということです。
フィボナッチ数列とは言ってませんよ・・。
そういう用語の細かい使い方の違いは、この際どうでもいいです。
要するに
フィボナッチ数列の最初の30項を出したいのだから

コード:

1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
のような結果がほしいんですよね?
そういうへりくつをこねくり回す人には、答えを見せちゃう。

コード:

#include <stdio.h>

int fib(int n)
{
    return (n == 1 || n == 2) ? 1 : fib(n-1) + fib(n-2);
}
int main(void)
{
    int n;

    for (n = 1; n <= 30; n++) {
        printf("%d\n", fib(n));
    }
    return 0;
}

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 14:04
by samusu0905
softyaさん>>
>コンパイルエラーでしょうか? であればロジック以前の文法的な問題です。
そうですねコンパイルエラーですよ。

boxさん>>
いえそのような結果ではありません・・。
もう一度練習問題で求められている文章を書きますよ。
「フィボナッチ数を返す関数を作ってください。また、実際にこの関数を使ってnが1から30までフィボナッチ数を表示するプログラムを作ってください。」これが練習問題で問われているところです。
フィボナッチの数列ではなく数です。
多分ですが、Fn=Fn-1+Fn-2と文章には書いてあるんです。
nが1から30までのフィボナッチ数と言っているので、普通は練習問題にも書いてあるFn-1を使うべきだと思うのですが。よって、
Fn-1,Fn-2,Fn-3,Fn-4....Fn-30とこのようにしなければいけないはずなんですが。
どうでしょうか?
ごめんなさい、わざわざコードまで載せていただいているのにこんな事を言ってしまい。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 14:08
by softya(ソフト屋)
samusu0905 さんが書きました:softyaさん>>
>コンパイルエラーでしょうか? であればロジック以前の文法的な問題です。
そうですねコンパイルエラーですよ。
であれば、コンパイルエラーの出ているソースコードと、そのエラーの詳細を書いてください。
フォーラムルールの最初に項に書いてあるとおりです。
「C言語何でも質問掲示板~規約~」
http://dixq.net/board/board.html

引用
コンパイルエラーの質問時は必ず最低限のエラーメッセージも書きましょう。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 14:38
by samusu0905
softyaさん>>あの、そのコンパイルエラーを書く前に一つ質問なんですが。
関数に引数int 30とか数だけを与えることってできませんよね?
実は自分が書いてコンパイルエラーが発生したのは引数にint 30と書いたからなんです。
「')' が必要です,')'が定義の前にありません,';'が '{'の前にありません」
これがコンパイルエラーです。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 14:47
by softya(ソフト屋)
仮引数には式を書くことが出来ます。
式は、単なる数値だけの定数も含みます。
仮引数の式に型を書いたら文法エラーです。

これは、正確なソースコードやエラーメッセージの行が書かれていないので推測に過ぎません。
時間の無駄だと思いますので、毎回、正確な情報を頂ければと思います。
何度も言っているように初心者には必要な情報の徒手選択が困難です。
ベストは、情報を出来るだけ正確に漏らさず報告していただくことです。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 15:15
by rascal
こんにちわ
えっとフィポナッチ数と数列の違いはなんでしょう? 検索してみましたがboxさんがおっしゃってることであってると
思うのですが・・・。
関数の作り方から勉強したほうがいいですね

関数の宣言は以下の書式で行います
[関数の型] 関数名( 引数の型 [,...]);

コード:

              test1();
        char    itoc(int);
        float   rmap1(int);
        float   test(int, char);
        char *  string();

で これらの関数を呼び出すときの記述は

        test1();
        int x;
        char b;
    itoc(x);
        rmap1(x);
        test(x, b);

のような形で呼び出します

また関数をさきに宣言せず呼び出そうとするとコンパイルエラーになります

コード:

int a;
int main()
{

 fib(a);
printf("a=%d",a);

}

int fib(int x){
x=x+1;
return 0;
}

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 15:33
by box
samusu0905 さんが書きました: boxさん>>
いえそのような結果ではありません・・。
では、どういう結果がほしいのか、コンピューターを使わなくてもいいですから具体的に書いてみてください。
samusu0905 さんが書きました: フィボナッチ数を返す関数を作ってください。
当方が書いたfibという関数が、それに相当します。
samusu0905 さんが書きました: また、実際にこの関数を使ってnが1から30までフィボナッチ数を表示するプログラムを作ってください。
いったんコンピューターから離れて、「nが1から30まで『フィボナッチ数』を表示するという部分を
手で書いてみてください。
繰り返します。表示するのは『フィボナッチ数』です。
1, 2, 3, 4, 5... というような連番『ではありません』。
Fn-1, Fn-2, Fn-3, ... というような記号列『でもありません』。
フィボナッチ数という、具体的な『数値』です。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 15:43
by samusu0905
rascalさん>>ではboxさんのプログラムが正しいということで宜しいですね?
>関数の作り方から勉強したほうがいいですね
関数の作り方は今のところ大丈夫ですけど。

boxさん>>では、問題の文書に書かれていた「Fn=Fn-1+Fn-2」の中でFnがフィボナッチ数でことですね?
失礼しました。自分の勘違いで・・。てっきりFn-1がフィボナッチ数かと思ってました。
昨日この関数の練習問題をやっていたもので、よくわからなかったのでboxさんのプログラムがあっているのか分かりませんでした・・。では、実際にこちらでも試しに書いてみます。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 15:46
by softya(ソフト屋)
samusu0905 さんが書きました:rascalさん>>ではboxさんのプログラムが正しいということで宜しいですね?
>関数の作り方から勉強したほうがいいですね
関数の作り方は今のところ大丈夫ですけど。
コンパイルエラーが出ている時点で大丈夫じゃないと思います。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 15:54
by samusu0905
boxさん>>失礼しました・・。boxさんが正しかったです。今、フィボナッチ数について自分も検索しました。 boxさんのプログラムはあってました・・。大変ご迷惑をお掛けしました。

softyaさん>>自分のちょっとしたミスです。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 15:56
by softya(ソフト屋)
samusu0905 さんが書きました:boxさん>>失礼しました・・。boxさんが正しかったです。今、フィボナッチ数について自分も検索しました。 boxさんのプログラムはあってました・・。大変ご迷惑をお掛けしました。

softyaさん>>自分のちょっとしたミスです。
ミスが直ったコードを投稿してくださいね。
それをベースに皆さんが進めると思いますので。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 15:56
by box
samusu0905 さんが書きました: 失礼しました。自分の勘違いで・・。てっきりFn-1がフィボナッチ数かと思ってました。
Fn-1もフィボナッチ数です。
「フィボナッチ数の定義については大丈夫です」とおっしゃっている質問者さんには
釈迦に説法かもしれませんが、フィボナッチ数の定義は、

最初の2個を1とする。
3個目以降は、直前の2個の合計とする。ここを数式で書いたのが、Fn = Fn-1 + Fn-2ということです。

この漸化式を満たすFnもFn-1もFn-2も、フィボナッチ数列を構成する要素です。

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 16:04
by rascal
プログラムの動作があってるかはともかく samusu0905さんのコードでは19行目が明らかにおかしいです
なので関数の作り方の説明をしました
関数の記述があっていればソフト屋さんのおっしゃってる通りコンパイルエラーは出ないはずです


動作もあってないですがこれはsamusu0905さんがフィポナッチ数について勘違いしたとのことなので触れないでおきます

Re: C言語の教科書で少し分からないところが出てきたのでトピックに載せます。

Posted: 2014年5月15日(木) 16:18
by samusu0905
皆さんの言った通りですね。私がフィボナッチ数について勘違いをしてました。
boxさんのプログラムを少し形を変えてプログラムを変えました。

コード:

#include <stdio.h>

int Fib(int );

int main(void){
	int b;
	b=0;
	for( int n=1; n<=30; n++)
	{
		printf("n = %d\n", Fib(n));
	}

	while(b == 0)
	{
		printf("終了する場合,0を選択してEnter---");
		getchar();
		return 0;
	}
	return 0;
}


int Fib(int n)
{
	if( n == 1 || n == 2)
	{
		return 1;
	}
	else
	{
		return Fib(n-1)+ Fib(n-2);
	}
}
こんな感じですね。これがboxさんのプログラムの形を少し変えたコードです。
フィボナッチ数と数列についてはよく理解できました。
この問題に関してはもう大丈夫です。納得がいきました。
皆さん、フィボナッチ数と数列について教えていただき有難うございました!