int

第8回
関
数 (1)
関数の作成
数学ライブラリの関数
以下のような数学関数は,数学ライブラリに関数として登録されている。
<math.h> をインクルードすれば使用できる。
コンパイルするときには,-lm を付ける。
double
double
double
double
double
double
double
double
double
double
double
exp(double x)
log(double x)
pow(double x, double
sqrt(double x)
cos(double x)
acos(double x)
cosh(double x)
y)
𝑒𝑒 𝑥𝑥
𝑙𝑙𝑙𝑙𝑙𝑙𝑒𝑒 𝑥𝑥
𝑥𝑥 𝑦𝑦
𝑥𝑥
cos 𝑥𝑥
arccos 𝑥𝑥
cosh 𝑥𝑥
fabs(double x) 絶対値 𝑥𝑥
floor(double x) 床 関 数 切り捨て : 𝑥𝑥を超えない最大の整数: 𝑥𝑥
ceil(double x) 天井関数 切り上げ : 𝑥𝑥以上の最小の整数: 𝑥𝑥
round(double x) 四捨五入:
𝑥𝑥 に最も近い整数
数学関数の使用(呼び出し)
#include <stdio.h>
#include <math.h>
int main(void)
{
double a, b;
scanf(”%lf”, &a);
b = cos(a);
printf(”%f¥n”, b);
return 0;
}
1引数の関数の定義
例: double square(double
x)
xの2乗
関数名
引数の型
戻り値の型
仮引数 (formal arguments)
(return value)
(arguments) (パラメータ) (parameters)
double square(double x)
{
double y;
y = x * x;
return y;
呼び出し元に関数値(戻り値)
}
を戻す (return a value)
int main(void)
{
double a,b;
a = 2.3;
b=square(a);
printf(”%f¥n”, b);
return 0;
}
関数を呼び出す(call a function)
(a の値は実引数)
(actual arguments)
2引数の関数の定義
例:
(0, 0)と(x, y)
の距離
double distance(double x, double y)
double distance(double x, double y)
{
square は1つ前のスライド
double z;
で自分で定義した関数
z = sqrt(square(x)+square(y));
return z;
sqrt はmath.hで
}
定義されている関数
int main(void)
{
double theta;
scanf(”%lf”, &theta);
printf(”%f¥n”,
distance(cos(theta),sin(theta));
return 0;
}
引数や戻り値のない「関数」の定義
#include <stdio.h>
戻り値なし
引数なし
void greeting(void)
{
printf(”Hello!¥n”);
}
戻り値はint型
関数(function)
手続き(procedure)
引数なし
int main(void)
{
greeting();
return 0;
}
int型の 0 をOSに戻してプログラムを終了
後方参照の原則
(backward reference)
■プロトタイプ宣言 で 前方参照 が可能になる
(prototype proclamation) (forward reference)
プロトタイプ宣言
int add(int a, int b);
int add(int a, int b)
{
int c;
c=a+b;
return c;
}
int main(void)
後方参照
{
int x=1, y=2, z;
z=add(x,y);
printf(”%d¥n”, z);
return 0;
}
int main(void)
{
int x=1, y=2, z;
z=add(x,y);
printf(”%d¥n”, z);
return 0;
前方参照
}
int add(int a, int b)
{
int c;
c=a+b;
return c;
}
ローカル変数(局所変数)のスコープ(1/2)
(local variable)
(scope)
■スコープ:有効範囲
int add(int a, int b)
{
int c;
c=a+b;
return c;
}
「値がコピー」されて
戻される
異なる変数に
「値がコピー」される
int main(void)
{
int a, b=2, c=3;
a=add(b,c);
printf(”%d¥n”, a);
return 0;
}
a, b, c のスコープ
(局所的)
a, b, c: ローカル変数 (local variable)
これらの a, b, c は
名前が同じだが
異なる変数
a, b, c: ローカル変数
a, b, c のスコープ
(局所的)
ローカル変数(局所変数)のスコープ(2/2)
double dol2yen(double d);
int main(void)
{
double myDol= 26.0,
rate = 116.2,
myYen;
myYen = dol2yen(myDol);
printf(”%f¥n”, myYen);
return 0;
}
double dol2yen(double d)
{
double yen;
yen = d * rate;
return yen;
}
■スコープ:有効範囲
myDol, rate, myYen:
ローカル変数
myDol,rate,myYenのスコープ
d:ローカル変数
yen :ローカル変数
d, yen のスコープ
この rate はスコープの外に
書かれているのでコンパイルエラー
グローバル変数(大域変数)のスコープ
(global variable)
double dol2yen(double d);
double rate = 116.2;
int main(void)
{
double myDol = 26.0,
myYen;
myYen = dol2yen(myDol);
printf(”%f¥n”, myYen);
return 0;
}
double dol2yen(double d)
{
double yen;
yen = d * rate;
return yen;
}
rate: グローバル変数
rate のスコープ(大域的)
この rate は大域変数
(期待どおり動く)
ローカル変数のライフタイム
(lifetime)
int countup(void);
int main(void)
{
int one,two;
one=countup();
two=countup();
printf(”%d¥n”, two);
return 0;
}
int countup(void)
{
int count = 0;
count = count + 1;
return count;
}
■ライフタイム:生存期間
countup
countup
count=0 count=1
count=0 count=1
time
countのライフタイム
countのライフタイム
(局所的)
(局所的)
count :ローカル変数
ローカル変数は,
スコープもライフタイムも局所的
グローバル変数のライフタイム
int countup(void);
int count = 0;
int main(void)
{
int one,two;
one=countup();
two=countup();
printf(”%d¥n”, two);
return 0;
}
int countup(void)
{
count=count+1;
return count;
}
■ライフタイム(lifetime):生存期間
count :グローバル変数
グローバル変数は,
スコープもライフタイムも大域的
countup
countup
time
count=0 count=1 count=1 count=2
countのライフタイム:
大域的(永続的)
スタティック変数
(static variable)
int countup(void);
int main(void)
{
int one,two;
one=countup();
two=countup();
printf(”%d¥n”, two);
return 0;
}
int countup(void)
{
static int count = 0;
count=count+1;
return count;
}
countup
スタティック変数は,
過去の記憶を持つ
countup
time
count=0 count=1 count=1 count=2
countのライフタイム(永続的)
count :スタティック変数
宣言と同時に初期値を指定しておくと,
はじめて関数が呼び出されたときだけ
count は初期値に初期化される
count のスコープ(局所的)
スタティック変数は,
スコープは局所的,
ライフタイムは永続的
擬似乱数を発生する関数
(pseud-random number)
rand 関数 ( #include < stdlib.h> )
int rand(void)
rand関数は過去に生成した擬似乱数を
スタティック変数 r に記憶し,適当な数 A
を用いて
static int r = seed;
r = (A*r)%(RAND_MAX+1);
return r;
のような処理で新たな擬似乱数を返す.
rand 関数は,0 から RAND_MAX までを範囲とする int 型の擬似乱数を発生して返す.
RAND_MAX の値は stdlib.h のなかで 2147483647 と定義されている.
使用例: int x = rand();
srand 関数
( #include < stdlib.h> )
void srand(unsigned seed)
srand 関数は,擬似乱数列の開始点(seed)をセットするための関数で,rand関数で擬似乱数
系列を発生させる前に1度だけ実行する. 引数には, time関数によって得られる現在の時
刻(秒単位)を与えることが多い.
使用例:#include <stdlib.h>;
#include <time.h>
srand((unsigned)time(NULL));