計算機実習 I

第五回 (2015 年 5 月 7 日)

関数の作り方と使い方

http://www.sw.it.aoyama.ac.jp/2015/CP1/lecture5.html

Martin J. Dürst

AGU

© 2005-15 Martin J. Dürst 青山学院大学

今日の予定

ミニテスト

C 言語の応用: Linux

前回の演習結果

04A1 04A2 04A3 04B1 04B2 04C1
100点 73 59 65 23 17 1
60点 20 34 28 66 68 36
部分点 - - - - - 31
エラー 1 - - 2 6 8
未提出 - 1 1 3 3 18

前回の演習問題について

04C1 の解答例

[昨年度資料につき削除] 

関数の大切さ

(関数: function)

プログラム言語の関数と数学の関数

 

関数関係の概念

関数の考え方の基本

関数の作る方と使う方を全く別のこととして考える!

 

宣言と定義

関数 (とグローバル変数) で区別

(定義は宣言にもなるため、教科書の様に関数の定義の直前に宣言するのは不必要:

int main(void);

int main(void)

{...)

 

関数の抽出の手順

(Refactoring: Improving the Design of Existing Code, Martin Fowler et al., Addison-Wesley, 1999 の「メソッドの抽出より」)

 

レファクタリング

(refactoring)

 

関数の自己呼び出し

すごく単純な例: 1 から n までの合計 (∑ni=0 i):

int sumN (int n)
{
if (n <= 0)
return 0;
else
return n + sumN(n-1);
}

数学的根拠: ∑ni=0 i = n + ∑n-1i=0 i (n>0 の場合); ∑0i=0 i = 0

 

sumN の実行例

→ 結果が 6

 

再帰的関数

再帰的関数のもう一例

ある数 in 進数で出力:

void printNary (int i, int n) {
static char letters[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

if (i < n)
putchar (letters[i]);
else {
printNary (i/n, n);
putchar (letters[i%n]);
}
}

printNary の実行例

→ 結果: 215

 

再帰的関数の要点

再帰のパターン (1)

再帰のパターン (2)

プログラム開発のコツ

(advice for program development)

演習問題の概要

ヒント: 入力の関数の戻り値をうまく利用

(05C1 以外は全部非常に短い)

問題再利用の目的

次回の準備