C言語の解説と演習

(第八回)

メニュー

「N88BASICについて」へ行く

「C言語の解説と演習(第七回)」へ行

トップページへ行く

質問箱へ行く



はじめに

今回は、関数についてやります.Cにおける関数は BASIC のサブルーチンにあたるものです.ただし、 C言語の関数では、入力と出力の関係をはっきりと指定しなければなりません.関数についてはいろいろと学ぶことが多いですが、今回はその第一歩をやります.ここでつまると、次回から全くわからなくなりますので、しっかり理解してください.


関数の第一歩

例題として、キーボードから入力された2つの数 x,y の和、差、積を計算し、表示するプログラムを作ってみましょう.
#include <stdio.h>

main()
{

  int x,y,wa,sa,seki;

  printf("x=");
  scanf("%d",&x);
  printf("y=");
  scanf("%d",&y);

  wa = x+y;
  sa = x-y;
  seki = x*y;

  printf("x+y=%d\n",wa);
  printf("x-y=%d\n",sa);
  printf("x*y=%d\n",seki);

}

上のプログラムは、今までに学んできたことを思い出せば理解できるはずです.
まず、

  printf("x=");
  scanf("%d",&x);
  printf("y=");
  scanf("%d",&y);

で、変数 x, y にキーボードからの入力を代入し、

  wa = x+y;
  sa = x-y;
  seki = x*y;

で、x+y, x-y, x*y を計算し、それぞれ変数 wa, sa, seki へ代入します.そして
  
 printf("x+y=%d\n",wa);
  printf("x-y=%d\n",sa);
  printf("x*y=%d\n",seki);

でその計算結果を画面に表示しています.
上のプログラムを関数を使って書きなおしてみましょう.関数 tashizan, hikizan, kakezan を整数 a, b が与えれたときにそれぞれ a+b, a-b, a*b を返す関数とします.これらの関数を使って上のプログラムを書きなおします.

#include <stdio.h>

main()
{

  int x,y,wa,sa,seki;
  int tashizan(int x, int y);
  int hikizan(int x, int y);
  int kakezan(int x, int y);

  printf("x=");
  scanf("%d",&x);
  printf("y=");
  scanf("%d",&y);

  wa = tashizan(x,y);
  sa = hikizan(x,y);
  seki = kakezan(x,y);

  printf("x+y=%d\n",wa);
  printf("x-y=%d\n",sa);
  printf("x*y=%d\n",seki);

}

int tashizan(int x, int y) {

  int kekka;

  kekka = x+y;
  return kekka;
}

int hikizan(int x, int y) {

  int kekka;

  kekka = x-y;
  return kekka;
}

int kakezan(int x, int y) {

  int kekka;

  kekka = x*y;
  return kekka;
}


プログラムはちょっと長くなりましたが、たいしたことはやっていません.
上から順に見てみましょう.関数を使ったプログラムでは

  int x,y,wa,sa,seki;

の変数宣言の後に、関数の宣言

  int tashizan(int x, int y);
  int hikizan(int x, int y);
  int kakezan(int x, int y);

があります.関数も変数同様に、使う前に宣言する必要があります.上の関数の宣言では関数 tashizan, hikizan, kakezan を宣言しています
まず、

  int tashizan(int x, int y);

ですが、これは tashizan という関数は int x, int y (整数 x, y) を入力とし、整数を返す関数であると宣言しています.始めにいったように関数 tashizan は 整数 a, b が与えられたとき、a+b を返す関数です.a+b はもちろん整数ですから、上のように関数 tashizan を宣言します.
一般的な関数の宣言は

  型A f(入力1, 入力2, ... , 入力n);

となります. 上の宣言では関数 f が入力1、入力2、...、入力nを入力とし、型Aの値を返す関数であると宣言しています.
同様にして

  int hikizan(int x, int y);
  int kakezan(int x, int y);

もそれぞれ関数 hikizan, kakezan が整数を2つ取って、整数を返す関数であると宣言します.
次に

  wa = tashizan(x,y);
  sa = hikizan(x,y);
  seki = kakezan(x,y);

ですが、関数 tashizan, hikisan, kakezan は整数 x,y が与えられたとき、それぞれ、x+y, x-y, x*y を返す関数ですから、上は

  wa = x+y;
  sa = x-y;
  seki = x*y;

と同じになり、変数 wa, sa, seki にそれぞれ x+y, x-y, x*y が代入されます.そして最後に

  printf("x+y=%d\n",wa);
  printf("x-y=%d\n",sa);
  printf("x*y=%d\n",seki);

で計算結果が表示されます.しかしプログラムはまだ終わりではありません.まだ先程使った関数 tashizan, hikizan, kakezan の定義が終わっていません.

int tashizan(int x, int y) {

  int kekka;

  kekka = x+y;
  return kekka;
}

が関数 tashizan の定義です.
関数の定義は一般的には

関数の返す型 関数名(入力1, 入力2, ... , 入力n) {

  命令1;
  命令2;
  ...;
  命令k;

  return 関数の返す値;

}

の形をとります.
先程の関数 tashizan の定義について説明しましょう.まず変数 kekka の宣言

  int kekka;

の宣言があり、その次に

  kekka = x+y;

で変数 kekka に x+y の値が代入されます.そして

  return kekka;

で変数 kekka ( つまり、x+y ) が関数 tashizan が返すとなります.同様にして関数 hikizan の定義

int hikizan(int x, int y) {

  int kekka;

  kekka = x-y;
  return kekka;
}

では x-y が変数 kekka に代入され、関数 hikizan の返す値となります.
また関数 kakezan の定義

int kakezan(int x, int y) {

  int kekka;

  kekka = x*y;
  return kekka;
}

では x*y が変数 kekka に代入され、関数 kakezan の返す値となります.
以上で、関数の定義の説明を終わりますが、プログラムの全体の流れは次のようになっています.プログラムを実行させると、下の図のように




まず、関数 main が実行され、関数 main より関数 tashizan, hikizan, kakezan が呼ばれ、実行されます.
それでは今回のまとめです.今回もいろいろと新しいことが出てきました.
  1. C言語では、プログラムの中で関数を新たに定義し、使うことができる.
  2. 関数を使うときには、その関数の宣言を行う必要がある. 関数の宣言は一般的には次の形をとる.
      型A f(入力1, 入力2, ... , 入力n);
    この宣言では関数 f が入力1、入力2、...、入力nを入力とし、型Aの値を返す関数であると宣言している.
  3. 関数の定義は次の形で行う.
    
    関数の返す型 関数名(入力1, 入力2, ... , 入力n) {
    
      命令1;
      命令2;
      ...;
      命令k;
    
      return 関数の返す値;
    
    }
    
  4. main も関数の1つである.この関数はプログラムを実行したときに、一番始めに呼ばれる.他の関数はこのmain より呼び出される.

次回の予定

次回は関数の解説の第2回目を行います.具体的には仮引数の説明です.

演習問題

「N88BASIC について」「サブルーチンを使う」に出てきたBASIC のプログラム「サンプルプログラム7」をC言語で書き直してみよ.