Presentation is loading. Please wait.

Presentation is loading. Please wait.

情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.

Similar presentations


Presentation on theme: "情報基礎演習B 後半第2回 担当 岩村 TA 谷本君."— Presentation transcript:

1 情報基礎演習B 後半第2回 担当 岩村 TA 谷本君

2 前回の課題の回答例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

3 前回の課題の回答例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); }

4 前回の課題の回答例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 =

5 前回の課題の回答例2 (関数の再帰的呼び出し)
#include <stdio.h> /* 階乗を計算する関数 */ int fact(int x) { if (x==1 || x==0) { return(1); } else { return(x*fact(x-1)); }

6 気付いた点 階乗を計算する関数を作ってない場合がある 階乗の関数に引数が2つある場合がある 「大きな数を入れると答えがおかしくなる」 おまけ
for文で使う変数は関数の中で宣言する 「大きな数を入れると答えがおかしくなる」 long intやunsigned long intを使うと良い おまけ n=rのときは計算できる

7 後半の予定 関数 ポインタ(前半) ポインタ(後半) & メモリの動的確保 ファイルの入出力 構造体など 未定

8 ポインタ ポインタとは何か どのように働くか 値の参照渡し ポインタの演算 配列との関係 動的メモリ確保 今週 来週

9 ポインタとは メモリの番地(アドレス)を指し示すもの 何に使うのか? 関数を使う場合 ローカル変数の値を変更して欲しいとき
例:scanf() 2つ以上の値を受け取りたいとき リスト構造など メモリの動的確保

10 ポインタの働き1

11 「&」と「*」の意味 変数の前に「&」がつくと「のアドレス(番地)」 変数の前に「*」がつくと「番地~にある値」 例 pa=&a
*pa=*(&a)=a pa←aのアドレス 番地paにある値 = a 変数a aの値 aのアドレス =pa

12 サンプルプログラム1

13 ポインタの働き2(ポインタのポインタ)

14

15 変数の参照渡し:サンプルプログラム2

16 サンプルプログラム2

17 変数の参照渡し ローカル変数の値を関数に変更して欲しいときに使える 例:scanf() 関数から2個以上の値を返したいときに使える


Download ppt "情報基礎演習B 後半第2回 担当 岩村 TA 谷本君."

Similar presentations


Ads by Google