• ベストアンサー

C言語について分からない事

#include<time.h> #include<stdio.h> #include<stdlib.h>  の意味と、 int combination(int, int); int factorial(int);     の()の意味、 a[r]=combination(n, r);    ←の意味、 return(factorial(n)/factorial(r)/factorial(n-r)); の()の中の意味      が分かりません。      どなたかおしえてもらえないでしょうか?

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

  • ベストアンサー
  • madman
  • ベストアンサー率24% (612/2465)
回答No.1

#include<time.h> はシステムで用意している、time.hというヘッダファイルの内容を、コンパイル時に読み込みます。 int factorial(int); これはプロトタイプ宣言です。 factorialという関数の()内が、引数の数と型になり、コンパイル時に呼び出している部分が正しいか比較します。 a[r]=combination(n, r);     combinationという関数の戻り値を、aというint型の配列変数のr番目に格納します。 return(factorial(n)/factorial(r)/factorial(n-r)); factorialに渡す引数の違いで、関数の戻り値が異なり、その値を順に割り算しています。で、その割り算の結果を、関数の戻り値として返します。

kou_hana
質問者

お礼

アドバイスありがとうございました!! とても役に立ちました! また何かありましたらお願いします!

kou_hana
質問者

補足

追加質問なんですが、よければ教えていただきたいです。 a[r]=combination(n, r);     という所なんですが、combinationのあとの()内はどうゆう意味でしょうか?

その他の回答 (4)

  • brogie
  • ベストアンサー率33% (131/392)
回答No.5

>例えば、stdio.h を読み込むことで、printf等が、利用出来るようになります。 とありますが、他の time.h stdlib.h を読み込むことで、どのようになるのでしょうか? それらのファイルをメモ帳で開くと沢山宣言してあります。 ヘッダーファイルはincludeフォルダにあります。このファイルを見るだけで、大変勉強になります。一度は誰でも覗いていますよ。 ヘッダファイルの場所がエックスプロ―ラーのツールの検索で、見つけて下さい。

kou_hana
質問者

お礼

アドバイスありがとうございました!!

  • sssohei
  • ベストアンサー率33% (33/98)
回答No.4

> a[r]=combination(n, r);     > という所なんですが、combinationのあとの()内はどうゆう意味でしょうか? combination という関数に n, r の引数(引数→英語のパラメータという方がイメージ的にわかりやすいかも知れません)を渡すという意味です。 ()なのは文法の決まりです。 >他の time.h stdlib.h これらにも、色々な関数が用意されています。 たとえば、 time.h  は時間関係のライブラリで time 関数(現在時間を取得)等が使えるように stdlib.h は標準ライブラリ(StandardLibraryの略)でrand関数やsrand関数等が使えるようになります。 それぞれのファイルには他にも色々な関数があります。C言語の参考書を調べてみてください。 本を最初から読んでいけば、まず間違いなく記述されている事柄だと思います。(わかりやすさ、詳しさは本によりけり

kou_hana
質問者

お礼

何度もありがとうございました! とてもわかりやすかったです。

回答No.3

下記、No.2の方の#include "" 補足として、 この場合は、コンパイル時のオプションで、参照するディレクトリを指定でき、 その場所にファイルがあれば大丈夫です。

kou_hana
質問者

お礼

回答ありがとうございました!

  • sssohei
  • ベストアンサー率33% (33/98)
回答No.2

> #include C言語では、よく使われる関数や、便利な関数をまとめたものが「ライブラリ」として用意されています。 #include というのは、他のファイルの中身を読み込むもので、この場合、time.h, stdio.h, stdlib.h を読み込んでいます。 #include "" の場合は、ソースファイルから見た相対パスから、 #include <> の場合は、C言語のライブラリからファイルを探します。 例えば、#include "xxx.h" だったら、ソースファイルと同じフォルダにある、 xxx.h が読み込まれます。 例えば、stdio.h を読み込むことで、printf等が、利用出来るようになります。 > 残りの3点 お手元の参考書や解説書の関数の部分をお読み下さい。 > int combination(int, int); は関数の宣言 > a[r]=combination(n, r); は配列、関数の呼び出しと返り値 > return(....) は関数の呼び出しと返り値 をお読み下さい。なお、 return (....); は return ....; でも構いません。

kou_hana
質問者

お礼

詳しく教えていただき、ありがとうございました! また機会がありましたらお願いします!

kou_hana
質問者

補足

>例えば、stdio.h を読み込むことで、printf等が、利用出来るようになります。 とありますが、他の time.h stdlib.h を読み込むことで、どのようになるのでしょうか?

関連するQ&A

  • 困ってます…nCrを求めるC言語プログラミング

    nCr、つまりn個のうちr個を取り出すときの場合の数を求めるプログラミングを作りたいのですが、どうもうまくいきません。 関数combinationを作って求めるという指定もあり、自分で出来るとこまで作ってみたのですが訳がわからなくなってしまい、かなり困っています…; コンパイルは出来るのですが実行してもセグメントエラーが出るばかりで… すみませんがご指摘していただけないでしょうか…? #include<stdio.h> //階乗を計算する関数 int fact(int num){ int i; if(num < 0){ return -1; } else if(num == 0){ return 1; } else if(num == 1){ return 1; } else { i = num * fact(num - 1); return i; } } //コンビネーションを計算 int combination(int n, int r) { int fact(int num); int i; i=fact(n)/fact(r)/fact(n-r); return combination(n-1, r-1)-combination(n,r-1); } int main(void) { int n, r; while ( printf("n r を入力して下さい。"), scanf("%d%d", &n, &r) == 2 ) { printf("nCr(%d,%d)=%d\n", n, r, combination(n, r)); } return 0; }

  • C言語のプログラムでおかしな動作をするのですが教えて頂けないでしょうか?

    VisualStudio2008使用しています。 問題は、サイコロを200回振ってその出た目の数の個数分*を表示するプログラムです。 サイコロの目はランダムで出しています。 次のプログラムは正常に動作するものです。 /* #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 200 int DICE(int min,int max); int main() { int n,i,j; int y[7]={0}; srand((unsigned int)time(NULL)); for(i=0;i<N;i++){ n=DICE(1,6); y[n]++; } for(i=1;i<7;i++){ printf(" %2d: ",i); for(j=0;j<y[i];j++){ printf("*"); } printf("\n"); } return 0; } int DICE(int min,int max) { return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } */ 次のプログラムが問題で、授業で先生が配列にはstaticをおまじないとしてつけないと暴走すると言われたので、つけて見ると明らかに間違ってると思われるプログラムで動作するのですが原因を教えて頂けないでしょうか? 以下問題のプログラム! 配列の前にstaticをつけたら、添え字をいくつにしても正常に動作します。普通は添え自分しか領域って確保されないですよね??? /* #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 200 int DICE(int min,int max); int main() { int n,i,j; //以下が問題の配列宣言 static int y[2]={0}; srand((unsigned int)time(NULL)); for(i=0;i<N;i++){ n=DICE(1,6); y[n]++; } for(i=1;i<7;i++){ printf(" %2d: ",i); for(j=0;j<y[i];j++){ printf("*"); } printf("\n"); } return 0; } int DICE(int min,int max) { return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } 質問の意味が正確に伝わらなかった場合は補足しますので、ご回答よろしくお願いします。

  • C言語

    このプログラムを作りたいのですが… ??????????? 物の総数を入れてください:12 取り出す物の数を入れてください:2 12個の異なる物から2個をを取り出す組み合わせの数は66です ?????????????? ここに出てくる数字は scanfで入れます。 だいたい こんな感じだと思うのですが… ***********の部分が わかりません。 ??????????????? #include<stdio.h> int factorial(int m,int r) { ************** } int main(void) {int a,b; printf("物の総数を入れてください:") scanf("%d",&a); printf("取り出す物の数を入れてください:") scanf("%d",&b); printf("12個の異なる物から2個を取り出す組み合わせの数は%dです。\n",a,b,factorial(a,b));) ?????????????? お願いします(>_<)

  • C言語でこのプログラムを完成させるには

    C言語でこのプログラムを完成させるには C言語初心者です。 1~6の乱数を100回発生させて、それぞれの出現回数をカウントし、ヒストグラムとして表示するプログラムを作成したいのですが上手くいきません。 #include <stdio.h> #include <time.h> #include <stdlib.h> int rnd(int m, int n) { return (int)(n-m+1)*(rand()/(RAND_MAX+0.1))+m; } int main(void) { int i, j, r; int hist[7]; for (i=1; i<7; i++) hist[i]=0; srand((unsigned)time(NULL)); for (i=0; i<100; i++) { r=6; while (6-- > 0) putchar('*'); putchar('\n'); } for (i=1; i<7; i++) { printf("%2d:", i); for (j=0; j<hist[i]; j++) printf("*"); printf("\n"); } return 0; } 何がいけないのでしょうか? よろしくお願いします。

  • 桁数が増えると正しく計算されません。

    今、Perlで作成したモジュールをCに移しています。 Perlではうまく動いているのですが、Cで作った以下のプログラムでは、 nを13以上にすると、値が正しく計算されなくなります。 ユーザ関数をdoubleにしたりすると、全て0になったりコンパイルできません。 せめてdouble型の最大値くらいまでは計算したいと考えています。 また、下のプログラムでC言語ならではの修正すべき点があれば教えてください。 よろしくお願いします。 #-----------------------------------------------------------# #include <stdio.h> int factorial(int j); int main(void) { /* 試行回数n回 */ int i, j, n, r, x; int combination; //printf("試行回数は?"); //scanf("%d", &n); n=13; for (i=1; i<=n; i++){ for (r=0; r<=i; r++){ combination = factorial(i) / (factorial(r) * factorial(i - r)); printf("%5d",combination); } printf("\n"); } } int factorial(int j){ int i; int x; x = 1; for (i = 1; i <= j; i++){ x *= i; } return x; } #-----------------------------------------------------------#

  • C言語

    以下の出力結果はどうなりますか? 教えてください。 #include <stdio.h> #include <stdib.h> int main (void){ int n,f; n=792; f=2; while(f*f<=n){ while(n%f==0){ printf("%d",f); n=n/f; } f++; } if(n !=1) printf("%d",n); printf("\n"); return 0; }

  • このプログラム見てください

    これで動いたと書いてあるのに動きません。 どこを直せば良いのか教えてください。 #include <stdio.h> int combination(int n,int r){ if ( r==0 ){ return 1; }else if( r==n ){ return 1; }else{ return (combination(n-1,r-1)+combination(n-1,r)); } } int main(){ int num_n=0; int num_r=0; int answer=0; printf("組み合わせの計算をします。数値を入力してください。N=?。\n"); printf("[n]:"); scanf("%d",&num_n); rewind(stdin); printf("[r]:"); scanf("%d",&num_r); rewind(stdin); answer=combination(num_n,num_r); printf("%dC%d=%d\n" , num_n, num_r, answer); return 0; }

  • お願いします。

    0から9までの数字を入力しあたりかはずれかを表示するプログラム。 #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void){ int r,a; printf("0から9までの数字を入力してください。\n"); scanf("%d",&a); srandom(time(NULL)); r = random()%10; printf("%d \n",r); if(a==r){ printf("アタリ\n");} else{ printf("ハズレ\n");} return 0; }

  • 解説お願いします。

    0から9までの数字を入力しあたりかはずれかを表示するプログラム。 #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void){ int r,a; printf("0から9までの数字を入力してください。\n"); scanf("%d",&a); srandom(time(NULL)); r = random()%10; printf("%d \n",r); if(a==r){ printf("アタリ\n");} else{ printf("ハズレ\n");} return 0; } 例えば%10は何のためにあるのかとか・・

  • C言語 スロットみたいにするやり方が分かりません

    今自由課題でスロットのように数字を乱数で表示させて、Enterを押すと押したときの値を表示させたいです しかし、今書いているやつだとなぜかスロットみたいに数字の表示ができません。 おそらくif文で一旦止まってしまっていると思うのですが、どこが悪いのか教えてください。 #include <stdio.h> #include <stdlib.h> int main(){ int a,b,c; srand(time(NULL)); c = getchar(); b = rand()%6+1; for(;;){ a = rand()%6+1; printf("\033[H\033[J"); printf("%d",a); if(getchar() == '\n'){ printf("あなたのサイコロの値は%dです!!\n",a); break; }else{ continue; } } return 0; }