算機実習 I

第六回 (2005年 5月26日)

関数の作り方と使い方

AGU

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

先週の試験について

先週の演習について

課題について

宣言と定義

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

変数定義とブロック

翻訳ユニット

変数の宣言と定義の種類

記述場所 宣言・定義 存在期間 自動初期化 初期化 使用・識別範囲
int i; ブロック先頭 定義 関数 不定 ブロック
static int i; ブロック先頭 定義 プログラム 0 定数式 ブロック
static int i; 関数外、.c/.cpp 定義 プログラム 0 定数式 翻訳ユニット
int i; 関数外、.c/.cpp 定義 プログラム 0 定数式 プログラム
extern int i; .h 宣言 - - - プログラム

関数の宣言と定義の種類

記述場所 宣言・定義 存在期間 使用・識別範囲
static int f(int i) {...} .c/.cpp 定義 プログラム 翻訳ユニット
static int f(int i); .c/.cpp 宣言 プログラム 翻訳ユニット
int f(int i) {...} .c/.cpp 定義 プログラム プログラム
int f(int i); .h (.c/.cpp) 宣言 - プログラム

値呼び出しと参照呼び出し

多次元配列の定義

引数か初期化の二次元配列の場合には最初の角括弧だけが空で良い

例: matrix[][4], tensor[][2][2]

関数の自己・お互い呼び出し

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

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

再帰的関数のもう一例

ある数を n 進数で出力する:

char letters[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void printNary (int i, int n) {
    if (i >= n) {
        printNary (i/n, n);
        putchar (letters[i%n]);
    }
    else
        putchar (letters[i]);  
}

再帰的関数の要点

演習についての補助

次回の準備