(7)[C] 関数定義

[ トップ | 目次 | 前ページ | 次ページ ]


Cでのプログラミングの基本は,メモリー領域を変更しながら要求される値をメモリー領域のどこかに作り出す効果をもつ実行文を書いていくことであった.メモリー領域の操作のために,メモリー領域に付けた名前が変数である.変数は,そのメモリー領域の使い方に応じて型が付けられている.プログラムは変数を宣言して,必用なメモリー領域を確保し,それらを操作(参照、変更)する実行文を書いていくことになる.

その例として,自然数の階乗の計算をする関数を書いてみよう.自然数のnの階乗は,

n * (n - 1) * (n - 2) * ... * 2 * 1

の様な計算の結果である.自然数の階乗を計算する一つの戦略は,上記の計算を左から繰り返し実行していく文を書くことである.以下がその例である.

int factorial (int n) {
  int s = 1;
  while (n > 0) {
    s = s * n;
    n = n - 1;
  }
 return s;
}

各要素の意味は以下のとおりである.

  • int factorial (int n) --- 関数factorialの宣言。最初のintはこの関数の返値の型の宣言、関数名の後の(int n)は引数の型がintであることおよび、関数本体で引数をnと呼ぶことの宣言である。この宣言に続く{と対応する}で挟まれた部分が関数本体である。
  • int s = 1 --- int型のメモリー領域を確保するための変数宣言。= 1は初期値の指定であり、メモリー領域を確保したとき1に初期される。この領域は左から計算して来た途中結果を保持するために使用する。
  • while (n > 0) ---- 変数n(で指されるメモリ領域に格納された)値が0より大きい間はそれに続く実行文のまとまりを繰り返す.
  • s = s * n; --- 変数Sの値をs * n(sとnの値を乗算した結果)で置き換える.
  • n = n - 1; --- 変数nの値をn - 1で置き換える.
  • return s; --- sの値を関数の結果として返す。
  • 変数と引数に関する補足:関数内で宣言された変数int s = 1は関数が呼び出される毎に新しいメモリー領域が割り当てられ,この場合のように初期値の指定があれば初期化される.引数(int n)には関数内の変数の宣言と同様,int型を表現するための領域が割り当てられ,その初期値が,関数を呼び出した時の引数で初期化されている.関数の本体では,このnは,関数内で宣言された変数sと同様に使用できる.nの値を変更しても,呼び出し元に影響を与えない.

上記は関数を定義しただけである.関数を実際に実行し結果をみるためには,関数を呼び出すコードを書かなければならない.このために,前の例と同様,システムから呼び出される特別関数であるmain関数をfactorialの定義に続き定義すればよい.プログラム全体は例えば以下のように定義できる。

#include <stdio.h>
int factorial (int n) {
  int s = 1;
  while (n > 0) {
    s = s * n;
    n = n - 1;
  }
 return s;
}

main () {
  printf("factorial(10) is : %d\n", factorial(10));
}

printfの引数文字列に現れる%dは,カンマの後ろの引数で与えられる整数値を十進数表現に変換して埋め込み指示である.この例では、%dが式factorial(10)の結果の整数値に置き換えられ,印字される.

これらを二つの定義をファイルfactorial.cに作成し,コンパイルして実行すると,以下のように10の階乗がプリントされる.

C:\SMLSharpAndC\c>gcc factorial.c
gcc factorial.c

C:\SMLSharpAndC\c>a.exe
a.exe
factorial(10) is : 3628800

C:\SMLSharpAndC\c>

Cのプログラムはこのような繰り返しにより,変数が目的の値を持つまで変更することを基本とする.Cを初めて学ぶ者は,補足:繰り返しによる計算の例 によってこのような考え方にに慣れておこう.

階乗の計算は、上記以外にもいろいろな書き方がある。制御構文の学習をかねて、factorial関数の種々の書き方 を見てみよう。


[ トップ | 目次 | 前ページ | 次ページ ]