まだC言語を習い始めたばかりのものですが、教科書に書いてあった課題が
解けません...
問題はこういうものですが↓
#include <stdio.h>
■factor(■)
{
int i;
long p;
p = 1L;
for (i = 2; i <= n; i++) p = p * (long)i;
■;
}
void main(void)
{
int n, r, c;
printf("n = "); scanf("%d", &n);
printf("r = "); scanf("%d", &r);
c = (int)(factor(n) / factor(r) / factor(n-r));
printf("nCr = %d\n", c);
}
というプログラムなのですが、黒い四角の記号「■」が僕が埋めるべき空欄です。
以下が僕自身の回答ですが、ぜんぜんわかりません;;
#include <stdio.h>
int factor(int i)
{
int i;
long p;
p = 1L;
for (i = 2; i <= n; i++) p = p * (long)i;
■;
}
void main(void)
{
int n, r, c;
printf("n = "); scanf("%d", &n);
printf("r = "); scanf("%d", &r);
c = (int)(factor(n) / factor(r) / factor(n-r));
printf("nCr = %d\n", c);
}
ですが、正直なんでそういう風に埋めたのかもあまり分かっていません。
正しい答えがわかれば、そこから自分で調べて理解することができると思うので、
ぜひ正しい回答をお願いいたします。
C言語の初心者ですが
Re:C言語の初心者ですが
質問に答えるために幾つかお願いがあります。スムーズに回答するために必要な事柄ですのでぜひお願いします。
・ 使用している環境やコンパイラ(VisualC++2008ExpressEdition等)、自分が習っている言語の規格(CにもC89やC99など幾つか規格があります)を教えて下さい。
・ 自分はどこまで理解しているのか、学校ではどこまで習ったのか明確にして下さい。
・ ソースコードは< pre>と< /pre>のタグで囲んで下さい。
詳しくはこの掲示板の使い方をご覧ください→ http://dixq.net/board/board.html
・ 使用している環境やコンパイラ(VisualC++2008ExpressEdition等)、自分が習っている言語の規格(CにもC89やC99など幾つか規格があります)を教えて下さい。
・ 自分はどこまで理解しているのか、学校ではどこまで習ったのか明確にして下さい。
・ ソースコードは< pre>と< /pre>のタグで囲んで下さい。
詳しくはこの掲示板の使い方をご覧ください→ http://dixq.net/board/board.html
Re:C言語の初心者ですが
> ぜひ正しい回答をお願いいたします。
何をしたいのかが分かりませんが、とりあえず正しいプログラムにしてみました。
何をしたいのかが分かりませんが、とりあえず正しいプログラムにしてみました。
#include <stdio.h> int main(void) { return 0; } #define main hoge #define n p int factor() { int i; long p; p = 1L; for (i = 2; i <= n; i++) p = p * (long)i; return 1; } void main(void) { int n, r, c; printf("n = "); scanf("%d", &n); printf("r = "); scanf("%d", &r); c = (int)(factor(n) / factor(r) / factor(n-r)); printf("nCr = %d\n", c); }動作については、どうなるのが正しいのか不明ですので、関知していません。
Re:C言語の初心者ですが
質問者さんは正しく質問を書いたほうがいいですよ。
これだけではなんなので、
すぐにわかると思います。main文で関数に値を渡していることがわかるので、
factorの関数ではpに渡している値を代入していることがわかります。
全部教えるのはなんなので、あと一つは自分で考えてください。といっても
答えを教えているようなものですが、まぁあっているかはわかりませんが。
これだけではなんなので、
#include <stdio.h> int factor(int 1L); { int i; long p; p = 1L; for (i = 2; i <= n; i++) p = p * (long)i; return ■; } void main(void) { int n, r, c; printf("n = "); scanf("%d", &n); printf("r = "); scanf("%d", &r); c = (int)(factor(n) / factor(r) / factor(n-r)); printf("nCr = %d\n", c); }一つだけ■で囲んでいますが、そこは関数内で計算した結果を返せばいいだけなので
すぐにわかると思います。main文で関数に値を渡していることがわかるので、
factorの関数ではpに渡している値を代入していることがわかります。
全部教えるのはなんなので、あと一つは自分で考えてください。といっても
答えを教えているようなものですが、まぁあっているかはわかりませんが。
Re:C言語の初心者ですが
例え話をします。以下の文章を読んで下さい。
目の桿体は光を、錐体は色を感知するもので、目に入る光によってその特性は変化する。桿体、錐体ともに一度化学反応をすると、再び反応可能な状態に復帰するまで一定の時間が必要である。
突然変な事を言ってすみません。
いきなり突拍子もない文章を読むと意味が理解できなかったのではないでしょうか?
国語力の高い人じゃないと、一度読んで、もう一度読み返してしまうのではないかと思います。
人間は脳に情報が入ってくると、その「仕分け」作業が完了しないと、記憶出来ず、結果として理解出来ないそうです。
ですから「これからこんなデータが来ますよ」と脳に信号を送っておかないと理解がスムーズにできないわけですね。
何か多い文章の冒頭にはよく「概要」とか「要旨」がくっついていると思いますが、
それは本体の情報を読まなくても理解させる為だけでなく、
これから読む人の脳にスムーズにデータが入るように用意されているものなんですね。
・・と長い前置きはこれ位にして・・。
要するに、これ位のソースコードは見たらわかるだろうと自分は思ったとしても、
「ソースコードの概要としてはこんな処理をするものです」と一言あるかないかで、
すごくこちら側の読めるスピードが変わります。
ですから、自分がしたい事は何で、ソースコードがある場合、そのソースコードの概要を一言添えて頂けるとありがたいです。
ではまずどこが解らないかを明確にしていきましょう。
もっと簡単なプログラムから考えてみます。
目の桿体は光を、錐体は色を感知するもので、目に入る光によってその特性は変化する。桿体、錐体ともに一度化学反応をすると、再び反応可能な状態に復帰するまで一定の時間が必要である。
突然変な事を言ってすみません。
いきなり突拍子もない文章を読むと意味が理解できなかったのではないでしょうか?
国語力の高い人じゃないと、一度読んで、もう一度読み返してしまうのではないかと思います。
人間は脳に情報が入ってくると、その「仕分け」作業が完了しないと、記憶出来ず、結果として理解出来ないそうです。
ですから「これからこんなデータが来ますよ」と脳に信号を送っておかないと理解がスムーズにできないわけですね。
何か多い文章の冒頭にはよく「概要」とか「要旨」がくっついていると思いますが、
それは本体の情報を読まなくても理解させる為だけでなく、
これから読む人の脳にスムーズにデータが入るように用意されているものなんですね。
・・と長い前置きはこれ位にして・・。
要するに、これ位のソースコードは見たらわかるだろうと自分は思ったとしても、
「ソースコードの概要としてはこんな処理をするものです」と一言あるかないかで、
すごくこちら側の読めるスピードが変わります。
ですから、自分がしたい事は何で、ソースコードがある場合、そのソースコードの概要を一言添えて頂けるとありがたいです。
ではまずどこが解らないかを明確にしていきましょう。
もっと簡単なプログラムから考えてみます。
int abc( int n ){ if( n==1 ) return 2; else return 0; } int main(){ printf("%d",abc(■)); return 0; }このプログラムで「2」を表示させるには■に何をいれたらいいでしょうか?
Re:C言語の初心者ですが
1番目の■(以後(1)) は関数factorの返値のタイプ。
2番目の■(以後(2)) は関数factorの引数(タイプと変数)。
3番目の■(以後(3)) は関数factorの返値。
を記述すればよいです。
(2)のタイプは簡単ですね。実際にfactorを使っている所をみればいいから。
(2)の変数はfactor内で使用されている変数で定義されていないものを探せばよい。
コンパイラが教えてくれるから実際はもっと簡単。
(3)が判れば(1)はおのずと決まってくるので、問題は(3)。
何をするプログラムかが明示的に示されていないので
何を返しても問題無い事になります。結果で割り算しているので、0は
まずいかなとは思いますが、そんな事はfactorさんには責任はないですね。
printf("nCr = %d\n", c); から、nCrを計算する為に必要な関数だと予想されるので
きっと、long pを返す関数なんだろうと予想されます。
という事で、答えが推測されますが、何をするプログラムかが明記されていないので
答えはいくつもありますね。
2番目の■(以後(2)) は関数factorの引数(タイプと変数)。
3番目の■(以後(3)) は関数factorの返値。
を記述すればよいです。
(2)のタイプは簡単ですね。実際にfactorを使っている所をみればいいから。
(2)の変数はfactor内で使用されている変数で定義されていないものを探せばよい。
コンパイラが教えてくれるから実際はもっと簡単。
(3)が判れば(1)はおのずと決まってくるので、問題は(3)。
何をするプログラムかが明示的に示されていないので
何を返しても問題無い事になります。結果で割り算しているので、0は
まずいかなとは思いますが、そんな事はfactorさんには責任はないですね。
printf("nCr = %d\n", c); から、nCrを計算する為に必要な関数だと予想されるので
きっと、long pを返す関数なんだろうと予想されます。
という事で、答えが推測されますが、何をするプログラムかが明記されていないので
答えはいくつもありますね。