情報基礎演習B 後半第2回 担当 岩村 TA 谷本君
前回の課題の回答例1 (for文を使った場合) #include <stdio.h> /* 階乗を計算する関数 */ int fact(int x) { int i, fact = 1; for(i = 2; i <= x; i++) { fact *= i; } return(fact); int main (void){ int n, r, p, c; printf("n: "); scanf("%d", &n); printf("r: "); scanf("%d", &r); p = fact(n) / fact(n-r); c = fact(n) / fact(n-r) / fact(r); printf("nPr = %d\n", p); printf("nCr = %d\n", c); return(0); } fact = 1 * 2 * 3 * 4 *… 0!や1!もok
前回の課題の回答例2 (関数の再帰的呼び出し) #include <stdio.h> /* 階乗を計算する関数 */ int fact(int x) { if (x==1 || x==0) { return(1); } else { return(x*fact(x-1)); } int main (void){ int n, r, p, c; printf("n: "); scanf("%d", &n); printf("r: "); scanf("%d", &r); p = fact(n) / fact(n-r); c = fact(n) / fact(n-r) / fact(r); printf("nPr = %d\n", p); printf("nCr = %d\n", c); return(0); }
前回の課題の回答例2 (関数の再帰的呼び出し) #include <stdio.h> /* 階乗を計算する関数 */ int fact(int x) { if (x==1 || x==0) { return(1); } else { return(x*fact(x-1)); } /* 階乗を計算する関数 */ int fact(int x) { if (x==1 || x==0) { return(1); } else { return(x*fact(x-1)); } /* 階乗を計算する関数 */ int fact(int 2) { if (x==1 || x==0) { return(1); } else { return(2*fact(2-1)); } /* 階乗を計算する関数 */ int fact(int 1) { if (x==1 || x==0) { return(1); } else { return(1*fact(1-1)); } /* 階乗を計算する関数 */ int fact(int x) { if (x==1 || x==0) { return(1); } else { return(x*fact(x-1)); } fact(1) = 1 =
前回の課題の回答例2 (関数の再帰的呼び出し) #include <stdio.h> /* 階乗を計算する関数 */ int fact(int x) { if (x==1 || x==0) { return(1); } else { return(x*fact(x-1)); }
気付いた点 階乗を計算する関数を作ってない場合がある 階乗の関数に引数が2つある場合がある 「大きな数を入れると答えがおかしくなる」 おまけ for文で使う変数は関数の中で宣言する 「大きな数を入れると答えがおかしくなる」 long intやunsigned long intを使うと良い おまけ n=rのときは計算できる
後半の予定 関数 ポインタ(前半) ポインタ(後半) & メモリの動的確保 ファイルの入出力 構造体など 未定
ポインタ ポインタとは何か どのように働くか 値の参照渡し ポインタの演算 配列との関係 動的メモリ確保 今週 来週
ポインタとは メモリの番地(アドレス)を指し示すもの 何に使うのか? 関数を使う場合 ローカル変数の値を変更して欲しいとき 例:scanf() 2つ以上の値を受け取りたいとき リスト構造など メモリの動的確保
ポインタの働き1 4
「&」と「*」の意味 変数の前に「&」がつくと「のアドレス(番地)」 変数の前に「*」がつくと「番地~にある値」 例 pa=&a *pa=*(&a)=a pa←aのアドレス 番地paにある値 = a 変数a aの値 aのアドレス =pa
サンプルプログラム1
ポインタの働き2(ポインタのポインタ)
4
変数の参照渡し:サンプルプログラム2
サンプルプログラム2
変数の参照渡し ローカル変数の値を関数に変更して欲しいときに使える 例:scanf() 関数から2個以上の値を返したいときに使える