計算機実習 I

第五回 (2014 年 5 月 8 日)

関数の作り方と使い方

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

Martin J. Dürst

AGU

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

今日の予定

ミニテスト

前回の演習問題について

04C1 の解答例

文字処理の注意点

if (c == 97)if (c == 'a')

putchar('&'); putchar('a'); putchar('m');printf("&am");

関数の大切さ

(関数: function)

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

 

関数関係の概念

関数の考え方の基本

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

宣言と定義

関数 (とグローバル変数) の場合、区別される

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

int main(void);

int main(void)

{...)

 

関数の抽出の手順

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

 

レファクタリング

(refactoring)

 

関数の自己呼び出し

すごく単純な例: 1 から n までの合計:

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 以外は全部非常に短い)

問題再利用の目的

次回の準備