第6章 関数・1

1 最も簡単な関数

 自分で決めた処理単位ごとに関数を作り、 その関数をmain関数から呼び出すことができる。

1-1 関数の作り方(Old Version)

書式

#include <stdio.h>

自作関数名()
{
    処理;
}

main()
{
    自作関数名();
}

※main関数から自作関数を呼び出すことにより、自作関数内の処理が行われる。
(呼び出さないと、何もしない)

[例]

#include <stdio.h>

helloprint()
{
    printf("自作関数からのHello!!\n");
}

main()
{
    printf("main関数からのHello!!\n");
    helloprint();
}
[実行結果]
main関数からのHello!!
自作関数からのHello!!

2 引数を与えられる関数

 関数には引数を与えることができ、与えられた引数によって処理を分けることができる。

2-1 引数の与え方

例えば変数aを関数に与え、偶数か奇数かを判定するには、 次のようなプログラムになる。

#include <stdio.h>

sub1(int x)
{
    if (x%2 == 0)
        printf("偶数\n");
    else
        printf("奇数\n");

}

main()
{
    int a;
    a = 10;
    sub1(a);

}

※main関数から自作関数sub1を呼び出すとき、カッコ内に変数を入れると、 自作関数sub1内ではxに与えられた数値が入り、処理が行われる。

[トレース]

練習問題

年(西暦)、月を引数として与えられ、 うるう年かどうかを判定して結果を表示する関数「uru」を作成せよ。

#include <stdio.h>

uru(int y, int m)
{
    ここの処理を考える
}

main()
{
    int     year, month;

    printf("年,月を入力 : ");
    scanf("%d,%d", &year, &month);
    uru(year, month);

}

2-2 変数の有効範囲

変数は、宣言した関数の中だけで有効である。 つまり、main関数内で宣言したaと、sub1関数内で宣言したaは全く別物である。

[例]

#include <stdio.h>

sub1()
{
    int     a;
    a = 100;
    printf("sub1のa = %d\n", a);

}

main()
{
    int     a;

    a = 1;
    printf("mainのa = %d\n", a);
    sub1();
    printf("mainのa = %d\n", a);

}

このプログラムを実行した場合の実行結果は次のようになる。

mainのa = 1
sub1のa = 100
mainのa = 1

練習問題

次のプログラムを実行したときの実行結果を答えよ。

#include <stdio.h>

sub1(int a)
{
    a = 100;
    printf("sub1のa = %d\n", a);

}

main()
{
    int     a;

    a = 1;
    printf("mainのa = %d\n", a);
    sub1(a);
    printf("mainのa = %d\n", a);

}

3 値を返す関数

 関数は引数をもらうだけでなく、値を1つだけ返すことができる。

3-1 値の返し方(return文)

例えば変数aとbを関数に与え、a+bの演算結果を返すには、 次のようなプログラムになる。

#include <stdio.h>

int sub1(int x, int y)
{
    int     z;

    z = x + y;

    return z;

}

main()
{
    int a = 10, b = 30, c;

    c = sub1(a, b);

    printf("%d + %d = %d\n", a, b, c);

}

※int型の値を返すので、関数をint型で宣言する。

[もうちょっとかっこよく書くと・・・]

#include <stdio.h>

int sub1(int x, int y)
{
    return (x + y);

}

main()
{
    int a = 10, b = 30;

    printf("%d + %d = %d\n", a, b, sub1(a, b));

}

練習問題

年(西暦)、月を引数として与えられ、 その月の末日を返す関数「matubi」を作成せよ。 ただし、うるう年の2月は29を返すこと。

#include <stdio.h>

int matubi(int y, int m)
{
    int d;

    ここの処理を考える

    return d;
}

main()
{
    int     year, month, lastday;

    printf("年,月を入力 : ");
    scanf("%d,%d", &year, &month);
    lastday = matubi(year, month);
    printf("%d年%d月の末日は%dです\n", year, month, lastday);

}

4 プロトタイプ宣言

4-1 関数の作り方のまとめ

[関数の定義]

型 関数名(型 仮引数, 型 仮引数,・・・)
{
   ・
   ・
   ・
  return (式); ←返す値が無い場合は必要ない
}

[関数の呼び出し]

   ・
   ・
   関数名(実引数,実引数,・・・); ←関数の呼び出し
   ・
   ・

[例]

      ・
      ・
      abc(10, 20);
      ・
      ・
int abc(int a, int b)
{
    int c;
      ・
      ・
    return c;
}

練習問題

  1. 教科書102ページ例題21のプログラムを改造する。 2つのデータの最大を求める関数maxと、最小を求める関数minを作成せよ。
  2. 教科書103ページ練習問題21のプログラムを作成せよ。

4-2 プロトタイプ宣言

 教科書のやり方はMS-DOSのころの古いやり方であり、 ソース内でmain関数は一番下になければならない。
 今から紹介する方法を使えば、main関数がどこにあってもよいように 関数を宣言・使用することができる。

[書式]

#include <stdio.h>

/* プロトタイプ宣言 */
型 自作関数名(型, 型, ・・・);

main()
{
    自作関数名(実引数, 実引数, ・・・);
}

型 自作関数名(型 仮引数, 型 仮引数, ・・・)
{
    処理;
}

※最初の関数(main関数を含む)が現れるよりも前に、自作関数の宣言を行う。 これを「プロトタイプ宣言」と呼ぶ。
(プロトタイプ宣言を省略すると、コンパイル時にWorning Errorが出る)
プロトタイプ宣言を明示的に行うことにより、 関数をどこに配置しても使えるようになる(コーディングの自由度が上がる)

[例]

#include <stdio.h>

/* プロトタイプ宣言 */
hellowprint();

main()
{
    printf("main関数からのHello!!\n");
    hellowprint();
}

hellowprint()
{
    printf("自作関数からのHello!!\n");
}

4-3 void型

 引数が無い場合や、関数に返す値が無い場合、 何もない型としてvoidを宣言する。

[例]

#include <stdio.h>

/* プロトタイプ宣言 */
void hellowprint(void);

void main(void)
{
    printf("main関数からのHello!!\n");
    hellowprint();
}

void hellowprint(void)
{
    printf("自作関数からのHello!!\n");
}

[ TOP ]