問題を解くために作ったプログラムの添削をお願いします。

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

問題を解くために作ったプログラムの添削をお願いします。

#1

投稿記事 by こめかみ » 17年前

環境はcygwinとVusualC++ 2008ExpressEdtionです。
cygwinで一応結果は得られたのですが、動作が少し変です。
VusualC++ではそもそもビルドできずに、

1>d:\ゲームプログラミングの館\試験\試験\main.cpp(13) : error C3861: 'F': 識別子が見つかりませんでした

というエラーが出て来てしまいます。
アドバイスよろしくお願いします。
/*
非負の整数nに対して次のとおりに定義された関数F(n),G(n)がある。F(5)の値は幾らか。
	F(n):if n≦1 then return 1 else return n ×G(n-1)
	G(n):if n=0 then return 0 else return n +F(n-1)
*/
#include<stdio.h>

int G(int n)
{
	if(n==0){
		return 1;
	}else{
		return n+ F(n-1);
	}
}

int F(int n)
{
	if(n<=1){
		return 1;
	}else{
		return n* G(n-1);
	}
}

int main(void)
{
	int m, n;
	
	printf("5を入力してエンター.:");//cygwinだと何故か、5を入力してエンター後、↑キーを押してエンターで表示される。
	scanf("%d\n", &n);

	m=F(n);

	printf("%d\n", m);
    
	return 0;
}

管理人

Re:問題を解くために作ったプログラムの添削をお願いします。

#2

投稿記事 by 管理人 » 17年前

上から下を、下から上を呼んでるからじゃないですか?
基本的に上で宣言したものを下で使う事は出来ますが、下で宣言した物を上で使う事は出来ません。

プロトタイプ宣言をすると、上から下にある関数を呼べるようになるので、
もし無理やり上のコードを解決するならば

#include<stdio.h>

int F(int n);

int G(int n)
{
 
を挿入すればいいかと。

box

Re:問題を解くために作ったプログラムの添削をお願いします。

#3

投稿記事 by box » 17年前

G()でF()を呼び出す前に、F()の定義またはプロトタイプ宣言がないためです。
だからといって、F()とG()の定義順を入れ替えただけでは、今度は

'G':識別子が見つかりませんでした 

というエラーが出てしまうと思います。
解決策は、F()とG()のプロトタイプ宣言を明記することです。

ところで、

> 	scanf("%d\n", &n);

scanf()の書式に \n を含めているのはなぜですか?

こめかみ

Re:問題を解くために作ったプログラムの添削をお願いします。

#4

投稿記事 by こめかみ » 17年前

ありがとうございます。
関数原型宣言でヴィジュアルスタジオでも出来ました。

するとシグウィンは下で宣言したものを上で使える処理系なんですね。

それともう一つ問題があるのですが、

5を入力してエンター.

の後にすぐ下の

printf("%d\n", m);

を動かしたいのですが何故このコードで出来ないのでしょうか。


>scanf()の書式に \n を含めているのはなぜですか?

あ、いらないんでしたっけ、すいません。ソラで書いたので結構いい加減でした。

こめかみ

Re:問題を解くために作ったプログラムの添削をお願いします。

#5

投稿記事 by こめかみ » 17年前

>scanf()の書式に \n を含めているのはなぜですか?

これが原因でした直したらうまくいきました。

ありがとうございました。

box

Re:問題を解くために作ったプログラムの添削をお願いします。

#6

投稿記事 by box » 17年前

G()の実体とコメントが食い違っています。

>	G(n):if n=0 then return 0 else return n +F(n-1)

>	if(n==0){
>		return 1;

また、

>F(5)の値は幾らか。

と問われているのですから、mやnの定義は必須ではなく、単に

>	printf("%d\n", F(5));

とだけ書けばいいのではないでしょうか。

こめかみ

Re:問題を解くために作ったプログラムの添削をお願いします。

#7

投稿記事 by こめかみ » 17年前

>G()の実体とコメントが食い違っています。

ご指摘ありがとうございます。気づかなかったです。

>> printf("%d\n", F(5));
>とだけ書けばいいのではないでしょうか。

おおこれでいいのですね。
授業で習った感覚しか持ってないのでこういうご指摘はありがたいです。

Hermit

Re:問題を解くために作ったプログラムの添削をお願いします。

#8

投稿記事 by Hermit » 17年前

>するとシグウィンは下で宣言したものを上で使える処理系なんですね。

sygwin でエラーが出なかったのは、C としてコンパイルしたからではないでしょうか。
VusualC++ 2008ExpressEdtion でエラーが出たのは、C++ としてコンパイルしたからではないでしょうか。

こめかみ

Re:問題を解くために作ったプログラムの添削をお願いします。

#9

投稿記事 by こめかみ » 17年前

>sygwin でエラーが出なかったのは、C としてコンパイルしたからではないでしょうか。
>VusualC++ 2008ExpressEdtion でエラーが出たのは、C++ としてコンパイルしたからではないでしょうか。

そのとおりでした。cppファイルでやったらcygwinでもエラーがでました。

閉鎖

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