フリーキーズ | 独学プログラミング

C言語の関数の基本!初心者でもわかるプログラミングの絶対覚えたい機能

最終更新日
リンドくん

リンドくん

たなべ先生、C言語を始めてみたんですけど、関数ってなんですか?
難しそうで怖いです...

たなべ

たなべ

関数は料理のレシピみたいなもので、一度覚えると何度も使い回せる便利な機能なんだ。
今日はそんな関数の基本を一緒に学んでいこう!

プログラミングにおける関数の重要性

プログラミングを始めたばかりの方にとって、「関数」という言葉は少し難しく感じるかもしれません。
しかし、関数はプログラミングにおいて非常に重要な概念で、これを理解することでコードがぐっと書きやすくなります。

関数とは簡単に言うと、特定の作業をまとめた再利用可能なコードのかたまりです。
例えば「挨拶をする」という関数を作れば、プログラムのどこからでも簡単に挨拶ができるようになります。
料理で言えば、よく使うソースのレシピをメモしておいて、必要なときに参照するようなものですね。

今回は、C言語における関数の基本について、できるだけわかりやすく解説していきます。

関数とは

リンドくん

リンドくん

でも先生、なぜわざわざ関数を使うんですか?
普通にコードを書けばいいんじゃ...

たなべ

たなべ

実はね、同じ処理を何度も書くのは非効率なんだ。
例えば、毎朝の「起きる→顔を洗う→歯を磨く→朝ごはんを食べる」という一連の流れを「朝の準備()」という関数にまとめれば、毎回詳細を説明しなくても済むよね?

関数の基本概念

関数は、プログラムの中の小さなプログラムと考えるとわかりやすいでしょう。
そして、この小さなプログラムには名前がついています。

例えば、sayHello()という関数は「こんにちは」と表示する、という役割を持っているかもしれません。

C言語での関数は主に以下の要素で構成されています。

  • 関数名 = その関数が何をするのかがわかる名前
  • 戻り値の型 = 関数が計算や処理を終えた後に返す値の種類
  • 引数(パラメータ) = 関数が働くために必要な情報
  • 関数本体 = 実際に行われる処理の内容

基本的な関数の形はこのようになります。

戻り値の型 関数名(引数の型 引数名) {
    // 実行されるコード
    return 戻り値; // 何かを返す場合
}

なぜ関数を使うのか

関数を使う主なメリットは以下の3つです。

  1. コードの再利用:一度書いた処理を何度でも使いまわせる
  2. コードの整理:プログラムを論理的な単位に分割できる
  3. デバッグの容易さ:問題が発生した時に、特定の関数だけを修正すれば良い

例えば、数字を2倍にする処理が何度も必要な場合、毎回計算するよりもdoubleNumber()という関数を作って呼び出す方が効率的です。

C言語で関数を作ってみよう

リンドくん

リンドくん

関数って実際にどうやって書くんですか?
何か例を見てみたいです!

たなべ

たなべ

もちろん!まずは簡単な例から見ていこうか。
例えば、二つの数字を足し算する関数を書いてみよう。

関数の基本的な書き方

最も基本的な関数の例として、二つの整数を足す関数を見てみましょう。

int add(int a, int b) {
    int result = a + b;
    return result;
}

この関数を分解してみましょう。

  • int = 戻り値の型(この関数は整数を返します)
  • add = 関数名(何をする関数かわかりやすい名前にするのが良いですね)
  • (int a, int b) = 引数(この関数は2つの整数を受け取ります)
  • { }の中 = 関数本体(実際の処理内容)
  • return result; = 戻り値(計算結果を返します)

関数の使い方(呼び出し方)

作成した関数は以下のように呼び出します。

int main() {
    int sum = add(5, 3); // add関数を呼び出し、結果をsumに保存
    printf("5 + 3 = %d\n", sum); // "5 + 3 = 8" と表示される
    return 0;
}

関数を呼び出すときは、関数名と括弧、そして必要な引数(この場合は5と3)を指定します。
関数は処理を実行し、結果(この場合は8)を返します。

戻り値のない関数

すべての関数が値を返す必要はありません。
例えば、単にメッセージを表示するだけの関数は以下のように書けます。

void sayHello() {
    printf("こんにちは、世界!\n");
    // returnは不要(voidの場合)
}

ここでのvoidは「何も返さない」という意味です。このような関数は以下のように呼び出します。

int main() {
    sayHello(); // "こんにちは、世界!" と表示される
    return 0;
}

引数と戻り値

リンドくん

リンドくん

引数って何ですか?戻り値とは何が違うんですか?

たなべ

たなべ

いい質問だね!引数は関数に渡す情報で、戻り値は関数が計算した結果なんだ。
例えるなら、レストランで「ハンバーグ定食ください(引数)」と注文して、「できあがったハンバーグ(戻り値)」が返ってくるようなものかな。

引数とは

引数(ひきすう)は、関数に渡す情報のことです。料理に例えると、レシピに必要な材料のようなものです。
引数があることで、同じ関数でも異なる入力に対して柔軟に対応できます。

例えば、名前を表示する関数を考えてみましょう。

void greet(char name[]) {
    printf("こんにちは、%sさん!\n", name);
}

この関数は、渡された名前に挨拶します。

int main() {
    greet("田中"); // "こんにちは、田中さん!" と表示
    greet("佐藤"); // "こんにちは、佐藤さん!" と表示
    return 0;
}

引数を変えることで、同じ関数でも異なる結果を得ることができます。
これがプログラムの柔軟性を高める重要な要素です。

戻り値とは

戻り値(もどりち)は、関数が計算や処理を行った後に返す結果のことです。
計算機で言えば、計算結果を表示する感じですね。

円の面積を計算する関数を例に見てみましょう。

double calculateCircleArea(double radius) {
    const double PI = 3.14159;
    double area = PI * radius * radius;
    return area; // 計算結果を返す
}

この関数は以下のように使えます。

int main() {
    double circleArea = calculateCircleArea(5.0);
    printf("半径5.0の円の面積は%.2f\n", circleArea); // "半径5.0の円の面積は78.54" と表示
    return 0;
}

戻り値があることで、関数の結果を変数に保存したり、別の計算に使ったりすることが可能になります。

関数を使った実践的な例

リンドくん

リンドくん

なるほど!でも実際のプログラムでは関数をどう活用するんですか?

たなべ

たなべ

実際のプログラムでは、関数を使って複雑な処理を小さな部品に分割するんだ。
例えば、簡単な電卓プログラムを作る場合を見てみよう。

簡単な電卓プログラム

複数の関数を組み合わせて、簡単な電卓プログラムを作ってみましょう:

#include <stdio.h>

// 四則演算の関数
int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int multiply(int a, int b) {
    return a * b;
}

double divide(int a, int b) {
    if (b == 0) {
        printf("エラー: 0で割ることはできません\n");
        return 0;
    }
    return (double)a / b;
}

int main() {
    int num1, num2;
    char operator;
    
    printf("簡単な電卓\n");
    printf("2つの数字と演算子(+, -, *, /)を入力してください: ");
    scanf("%d %c %d", &num1, &operator, &num2);
    
    switch(operator) {
        case '+':
            printf("%d + %d = %d\n", num1, num2, add(num1, num2));
            break;
        case '-':
            printf("%d - %d = %d\n", num1, num2, subtract(num1, num2));
            break;
        case '*':
            printf("%d * %d = %d\n", num1, num2, multiply(num1, num2));
            break;
        case '/':
            printf("%d / %d = %.2f\n", num1, num2, divide(num1, num2));
            break;
        default:
            printf("無効な演算子です\n");
    }
    
    return 0;
}

このプログラムでは、四則演算のそれぞれを別々の関数として実装しています。
これにより、メインのコードがすっきりとして読みやすくなり、また各演算の処理を個別に管理できます。

関数を活用するためのコツとベストプラクティス

リンドくん

リンドくん

関数の書き方はわかりましたが、上手く使うコツはありますか?

たなべ

たなべ

素晴らしい質問だね!関数を効果的に使うためのコツはいくつかあるよ。
特に名前付けと分割の仕方は重要なんだ。

関数の名前付け

良い関数名は、その関数が何をするのかを明確に示すものであるべきです。
以下のポイントを意識しましょう。

  • 動詞で始める: 関数は何らかの動作を行うため、calculate...get...is...のような動詞で始めると分かりやすい
  • 具体的に: process()ではなくcalculateTotalPrice()のように具体的な名前を付ける
  • 一貫性を保つ: 似たような機能を持つ関数には似たような命名パターンを使う

悪い例と良い例を比較してみましょう。

悪い例

int f(int x) { ... } // 何をする関数かわからない

良い例

int calculateSquare(int number) { ... } // 二乗計算をすることが明確

適切な関数の大きさと分割

関数は一つのタスクに集中するべきです。
以下のポイントを意識しましょう。

  • 1つの関数は1つの仕事 = 複数の役割を持たせない
  • 適切な長さを保つ = 画面に収まる程度(20〜30行程度)が理想的
  • 複雑な処理は小さな関数に分割 = 理解しやすく、テストしやすくなる

例えば、ユーザー登録処理の場合は以下のようになります。

悪い例(1つの関数で全てを処理)

void registerUser() {
    // 入力を受け取る
    // 入力を検証する
    // データベースに保存する
    // 確認メールを送信する
}

良い例(機能ごとに分割)

void registerUser() {
    UserData userData = getUserInput();
    if (validateUserData(userData)) {
        saveUserToDatabase(userData);
        sendConfirmationEmail(userData.email);
    }
}

このように分割することで、各関数が明確な役割を持ち、コードが読みやすくなります。

コメントと文書化

関数には適切なコメントを付けて、何をする関数なのか、どのように使うのかを説明しましょう:

/**
 * 与えられた2つの整数の最大公約数を計算します
 * ユークリッドの互除法を使用します
 * 
 * @param a 1つ目の整数
 * @param b 2つ目の整数
 * @return 最大公約数
 */
int calculateGCD(int a, int b) {
    if (b == 0)
        return a;
    return calculateGCD(b, a % b);
}

特に複雑なアルゴリズムや、他の人も使う可能性のある関数には、このような詳細なコメントが役立ちます。

まとめ

リンドくん

リンドくん

わぁ、関数って思ったより便利ですね!実際に使ってみたくなりました!

たなべ

たなべ

そう言ってもらえて嬉しいよ!関数はプログラミングの基本中の基本だから、しっかりマスターすれば今後の学習もぐっとスムーズになるよ。
ぜひ実際に書いて試してみてね!

C言語の関数は、プログラミングの効率と可読性を大きく向上させる強力な機能です。
この記事でお伝えした通り、関数を使うことで、コードの再利用、整理、デバッグが容易になります。

具体的には以下のポイントを覚えておきましょう。

  • 関数は再利用可能なコードのかたまりで、特定の処理をまとめたもの
  • 引数を使って関数に情報を渡し、戻り値で結果を受け取る
  • 関数名は動詞で始め、具体的
  • 1つの関数は1つの仕事に集中させる
  • 複雑な処理は小さな関数に分割する

関数の考え方は、C言語だけでなく、ほぼすべてのプログラミング言語で使われている基本概念です。
ここでしっかりと理解しておくことで、今後のプログラミング学習が大きく加速するでしょう。

関連するコンテンツ