おさらい!関数

おさらい!関数
とっても大事
ちょっぴり難しい
書けなきゃ始まらないね
書けるようになろう!
おさらい!関数
2
そもそも関数って?
数学の関数と似たようなもの
►sin とか cos とか
►だけど数学っぽくない関数もある
printf や scanf も関数
►別に計算に使うわけじゃなくても関数なんだね
►何か共通点は見えてくるかな?
FunctionName(arg1, arg2)
こんな形で使うのが関数
おさらい!関数
3
今回やりたいこと
なるほど関数って今まで使ってたんだね
►じゃあもう勉強することはない?
今度は自分で作れるようになろう
►関数は自分で書いてこそ威力を発揮する
まずはC言語講習の頃と同じ
Win32 コンソールアプリケーション
のプロジェクトを作ろう
おさらい!関数
4
まず書いてみる
まずは下のコードを main 関数より上に書こう
// x の y 乗を返す関数
double Power(double x, int y) {
double result = 1;
// 0 < y のときは掛け算
for (int i = 0; i < y; i++) {
result *= x;
}
// y < 0 のときは割り算
for (int i = 0; y < i; i--) {
result /= x;
}
// 結果を返す
これで関数を自作したことになる
return result;
}
おさらい!関数
5
作ったら使おう
さっきのコードの下に main 関数を書こう
►ファイルの最初で #include を忘れないようにね!
int main() {
printf("3^3 = %f\n", Power(3, 3));
printf("4^-1 = %f\n", Power(4, -1));
printf("2^0 = %f\n", Power(2, 0));
return 0;
}
3^3 = 27.000000
4^-1 = 0.250000
2^0 = 1.000000
続行するには何かキーを押してください . . .
おさらい!関数
6
関数の作り方
関数の書き方を抽象化するとこんな感じ
戻り値の型 XXXXXXX(XXXX,
関数名
引数1
XXXXXX
引数2
XXX) {
処理
戻り値
return XXXXXXX;
}
►
►
戻り値
引数
の型は 戻り値の型 であることに注意!
の個数はいくつでも良い(無くても良い)
おさらい!関数
7
どうやって動くの?
例えばこんなコードを実行すると
// fooに○○を保持
戻り値の型 foo = XXXXXXX(XXXX,
関数名
引数1
XXXXXX

処理
引数2
XXX);
を経た上で・・・
// fooに○○を保持
戻り値の型 foo = XXXXXXX;
戻り値
XXXXXX
こんな風に変身する
6ページの例で確認してみよう!
おさらい!関数
8
スラスラ書くために
コードを組み立てる戦略
おさらい!関数
9
実践してみよう
2点間の距離
を取得する関数を作ってみよう!
アプローチはこんな感じ
►戻り値の型は何かな?
►関数名は和英辞書とかで調べて考えてみよう
►引数は何が必要かな?
►肝心の処理はどうしよう?
おさらい!関数
10
戻り値の型は?
座標が整数でも距離は実数になるよね
►距離がピッタリ整数になることはそんなにない
►切り捨てると精度に問題がありそう
戻り値は double にしよう
おさらい!関数
11
関数名は?
一目瞭然な名前が良いね
►「動詞+名詞」の形にするのが一般的
►「距離」は「Distance」
►「取得」は「Get」
►「距離」を「取得」するので・・・
関数名は GetDistance にしよう
おさらい!関数
12
引数は?
2点間の距離を求めるのに必要な物は?
►「2点」だよね
►ここでは2次元整数座標と仮定する
►(x, y) の組が2つ必要
►4つの変数 (x1, y1), (x2, y2) が必要だね
おさらい!関数
13
処理を考える前に一息
関数の外枠を作ってしまおう
►こんな感じになるね
double GetDistance(int x1, int y1, int x2, int y2) {
処理
return
戻り値
;
}
 処理 をクネクネして
戻り値
おさらい!関数
を欲しい式にしよう
14
処理は?
もう察しがつくよね
►いわゆる三平方の定理的なアレです
►プログラムで実装するとこんな感じになるね
double result = 0;
// 各成分の差の2乗を足していく
result += (x1-x2) * (x1-x2);
result += (y1-y2) * (y1-y2);
// その平方根
result = sqrt(result);
おさらい!関数
15
完成!
全部合わせるとこういうことだね!
double GetDistance(int x1, int y1, int x2, int y2) {
double result = 0;
// 各成分の差の2乗を足していく
result += (x1-x2) * (x1-x2);
result += (y1-y2) * (y1-y2);
// その平方根
result = sqrt(result);
// 結果を返す
return result;
}
おさらい!関数
16
別解
まとめてこう書くことも可能だよ
►あまり長くならない処理は1行にしても良いね
double GetDistance(int x1, int y1, int x2, int y2) {
return sqrt((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2));
}
これで関数おさらいはおしまい!
►みんなおつかれさま!
おさらい!関数
17