情報基礎演習B
後半第2回
担当 岩村
TA 谷本君
前回の課題の回答例1
(for文を使った場合)
#include <stdio.h>
/* 階乗を計算する関数 */
int fact(int x) {
int i, fact = 1;
for(i = 2; i <= x; i++) {
fact *= i;
} fact = 1 * 2 * 3 * 4 *…
return(fact);
}
0!や1!もok
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 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)
2) {
if (x==1 || x==0) {
return(1);
} else {
return(2*fact(2-1));
return(x*fact(x-1));
}
fact(1)
}
1
=
/* 階乗を計算する関数 */
int fact(int x)
1) {
if (x==1 || x==0) {
return(1);
} else {
return(x*fact(x-1));
return(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のときは計算できる
後半の予定
1.
2.
3.
4.
5.
6.
関数
ポインタ(前半)
ポインタ(後半) & メモリの動的確保
ファイルの入出力
構造体など
未定
ポインタ

ポインタとは何か
 どのように働くか

値の参照渡し

ポインタの演算
 配列との関係
動的メモリ確保
今週
来週
ポインタとは
メモリの番地(アドレス)を指し示すもの
 何に使うのか?

 関数を使う場合
 ローカル変数の値を変更して欲しいとき
 例:scanf()
 2つ以上の値を受け取りたいとき
 リスト構造など
 メモリの動的確保
ポインタの働き1
4
「&」と「*」の意味
変数の前に「&」がつくと「のアドレス(番地)」
 変数の前に「*」がつくと「番地~にある値」
例

 pa=&a
*pa=*(&a)=a
aの値
変数a
aのアドレス=pa
pa←aのアドレス
番地paにある値 = a
サンプルプログラム1
ポインタの働き2(ポインタのポインタ)
4
変数の参照渡し:サンプルプログラム2
サンプルプログラム2
変数の参照渡し

ローカル変数の値を関数に変更して欲しいと
きに使える
 例:scanf()

関数から2個以上の値を返したいときに使え
る
ダウンロード

情報基礎演習B