AIで楽して稼げたらいいのに

独学でプログラミングを学んでいる大学生です。忘れないために備忘録としてここに残すことにします

【C言語入門】自作関数がわからない人のために徹底解説!

C言語を習得していく中で、「関数」という用語についてよく学んでおく必要があります。


なので今回は「関数とは何か」という話から、「自作関数」というところまで説明していきたいと思います。
自作関数について知りたい方は、目次から自作関数のところまで飛んでみてください。

関数とは


そもそも関数とは何かという話から始めます。

printf();
scanf();



普段から見覚えのあるprintf()やscanf()も実は一つの関数です。


#include <stdio.h>

int main(void){
}




何の気無しにこのソースコードを記入して、内容を書き始める人が多いと思います。
誰かに習ったりした人は、「おまじない」と習った人も多いかもしれません。


#include <ヘッダーファイル>

一行目の『#include <stdio.h>』という文を書き込むことでライブラリ関数を呼び出しています。
ライブラリ関数を呼び出すことによってprintf()関数やscanf()関数を呼びだすことができます。


#include <stdio.h>
#include <math.h>

int main(void){
    double x, y;
    printf("実数値を入力 : ");
    scanf("%lf", x);
    y = sqrt(x);
    printf("%dの平方根は%dです。", x, y);
}

一つの例として、平方根を算出する関数sqrt()関数を使う為に「#include <math.h>」によってライブラリ関数を呼び出します。


sqrt()関数は、()内に実数値を入れるとその値を平方根に算出して返す役割を持っています。


int main(void)も1つの関数


int main(void)というソースコードも実はmain()関数という一つの関数です。


原則として、main()関数は必ず最初に実行されます。
詳細はこの後紹介する自作関数で説明します。

自作関数

自作関数とは

自作関数とは呼んで字の如く「自分で作る 関数」です。
ある一連の計算を関数として定義することでソースコードを1段階グレードアップさせる事ができます。


何がグレードアップするのかというと、基本的にソースコードが「見やすく」なります。
どういう所が便利なのかはまとめに掲載しています。


自作関数の作り方


例えば、階乗の計算をしてくれる関数を作成するとします。

int kaizyo(int x){
    int i, y=1;
    for(i=x; i>0; i--){
        y = y * i;
    }
    return y;
}



階乗を計算する関数はこのようになります。
計算の概要は省きますが、注意すべき点は3つです。


1. 関数の名前と変数型を指定する

自作関数は自分で名前をつけることができます。
今回はわかりやすいように「kaizyo」という名前にしていますが、プログラミング言語は万国共通なので基本的に英単語にする事をおすすめします。日本国内でのみ使われるソースコードの場合はローマ字でも構わないと思います。



int kaizyo(int x){
}

最初のintは関数そのものの値の型を指定しています。
()の中のint xはこの自作関数が呼び出された時に代入する引数の型(ここではint)と名前(ここではx)ということになります。


2. 最後は必ずreturn文


main()関数との決定的な違いとして自作関数ではreturn文を必要とします。


基本の動作はmain()関数で行われるため、他の関数で処理を行う時は最後に値を元のmain()関数に返す必要があります。


この返す値の事を「返り値」「返却値」あるいは「戻り値」と言います。人によって呼び方が違うのでどの呼び方で呼んでもらっても基本的に構いませんが、相手にどの言葉を言われてもすぐにわかるようにしておきましょう。


return 式;
/*例*/
return s;  // 変数s
return a * b - c;

return文の書き方は「return + 式」でつくります。
「式」はただ単に変数だけでも構いません。


3. 自作関数を入れる位置

さて、自作関数の作り方の概要は大体終了したので、早速ソースコードに自作関数を入れていきましょう。

#include <stdio.h>

int kaizyo(int x){
    int i, y=1;
    for(i=x; i>0; i--){
        y = y * i;
    }
    return y;
}
int main(void){
    int i;
    i = kaizyo(6);
    printf("6の階乗は%dです", i);
}



見てわかるように、main()関数の外に自作関数が位置しています。
これで自作関数の作成、追加の仕方は終了です。
次の章では自作関数の呼び出し方について解説します。

自作関数の呼び出し方

自作関数を呼び出すには、
「変数名(引数)」
で呼び出すことが出来ます。


先程のソースコードでは以下のように書いてあります。

int i;
i = kaizyo(6);

kaizyo関数に引数「6」を代入し、その処理結果を整数iに代入する。
という流れで処理が行われています。


この引数は数字でなく変数であったとしても大丈夫です。

int i, x=6;
i = kaizyo(x);

つまり、先程のソースコードと上記のソースコードは同じ処理をします。

実引数と仮引数

先程のソースコードで、引数がxだったとしても自作関数に入るときにはxとして変換され計算されるので、引数を自作関数の変数値の名前と同じにする必要はありません。


じゃあ、main()関数の中のiと自作関数のiは一緒で大丈夫なの?
と思った方はとても鋭いです。


ここには実引数と仮引数の関係があります。
自作関数に代入する時にmain()関数から代入される数字を実引数、自作関数で定義したxを仮引数といいます。


仮引数はローカル変数の一つで、その関数内でしか役割を持ちません。なので、一見同じに見える同じに見える自作関数のxとmain()関数のxは違った意味を持っている事になります。


まとめ

将来的に複数人でプログラムを作成する時に、各々でモジュール*1に分けて作業する事が多くなると思います。


その時に今回解説した自作関数を用いることによって、main()関数で同じ変数が使われていたとしても重複することはなく、効率的に仕事を進める事ができます。


さらに、仕事の依頼先から追加で訂正を頼まれた時でも、最小限の修正で済むので必ず習得しておきましょう。

*1:プログラムの小さな機能単位