自分で決めた処理単位ごとに関数を作り、 その関数をmain関数から呼び出すことができる。
書式
#include <stdio.h> 自作関数名() { 処理; } main() { 自作関数名(); }※main関数から自作関数を呼び出すことにより、自作関数内の処理が行われる。
(呼び出さないと、何もしない)[例]
#include <stdio.h>helloprint() { printf("自作関数からのHello!!\n"); }main() { printf("main関数からのHello!!\n");helloprint();}[実行結果]
main関数からのHello!!
自作関数からのHello!!
関数には引数を与えることができ、与えられた引数によって処理を分けることができる。
例えば変数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); }
変数は、宣言した関数の中だけで有効である。 つまり、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); }
関数は引数をもらうだけでなく、値を1つだけ返す
ことができる。
例えば変数aとbを関数に与え、a+bの演算結果を返すには、 次のようなプログラムになる。
#include <stdio.h>intsub1(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>intsub1(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); }
[関数の定義]
型 関数名(型 仮引数, 型 仮引数,・・・) { ・ ・ ・ return (式); ←返す値が無い場合は必要ない }[関数の呼び出し]
・ ・ 関数名(実引数,実引数,・・・); ←関数の呼び出し ・ ・
- 関数は値を返すという性質を持っているため、 その関数が
どのような型のデータを返すかを 関数の型として明確に宣言しなければならない。- return (式) の式の値が関数の戻り値として呼び出し元に帰るため、
式の値と関数の型は一致していなければならない。- 呼び出し元と関数との間でデータをやり取りするには引数を用いる。 呼び出し側で指定する引数を
実引数、 関数定義側で指定する引数を仮引数と呼ぶ。- 仮引数は関数定義部において、その型を宣言しておく必要がある。
- 実引数には「定数」「変数」「式」が書ける。
- 仮引数は(データを受け取るうつわなので)変数しか書けない。
- 対応する実引数と仮引数は同じ変数名でも違う変数名でもかまわないが、
型は必ず一致していなければならない。[例]
・ ・ abc(10, 20); ・ ・ int abc(int a, int b) { int c; ・ ・ return c; }練習問題
- 教科書102ページ例題21のプログラムを改造する。 2つのデータの最大を求める関数maxと、最小を求める関数minを作成せよ。
- 教科書103ページ練習問題21のプログラムを作成せよ。
教科書のやり方は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"); }
引数が無い場合や、関数に返す値が無い場合、 何もない型として
voidを宣言する。[例]
#include <stdio.h> /* プロトタイプ宣言 */voidhellowprint(void);voidmain(void) { printf("main関数からのHello!!\n"); hellowprint(); }voidhellowprint(void) { printf("自作関数からのHello!!\n"); }