C 言語で関数を構築する

CCBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、C プログラミング言語で関数を作成する方法を学びます。この実験では、関数の目的、構文、および実装など、関数の基本概念を扱います。まず、関数の目的と構文を説明し、次に関数プロトタイプを定義し、関数のロジックを実装し、メインプログラムから関数を呼び出し、最後にコンパイルして結果を確認します。この実験が終了するとき、C プログラムで関数を作成して使用する方法を十分に理解しているでしょう。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/CompoundTypesGroup -.-> c/strings("Strings") c/FunctionsGroup -.-> c/function_declaration("Function Declaration") c/FunctionsGroup -.-> c/function_parameters("Function Parameters") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/strings -.-> lab-438329{{"C 言語で関数を構築する"}} c/function_declaration -.-> lab-438329{{"C 言語で関数を構築する"}} c/function_parameters -.-> lab-438329{{"C 言語で関数を構築する"}} c/math_functions -.-> lab-438329{{"C 言語で関数を構築する"}} c/output -.-> lab-438329{{"C 言語で関数を構築する"}} end

関数の目的と構文を説明する

関数は、特定のタスクを実行するコードのブロックです。関数は、複雑な問題を小さくて管理可能な部分に分解し、コードの再利用性を向上させ、コードを読みやすく保守しやすくします。関数を、メインプログラム内のミニプログラムと考えてください。それぞれが独自の目的と機能を持っています。

C で関数を定義するには、次の構文を使用します。

return_type function_name(parameter_list) {
    // 関数本体
}
  • return_type:関数が返す値のデータ型(たとえば、intvoid)。これは、関数がタスクを完了したときに期待される結果の種類をコンパイラに伝えます。
  • function_name:関数の名前。関数が何を行うかを明確に示す説明的な名前を選びます。
  • parameter_list:関数が受け取るパラメータ(引数)のコンマ区切りのリスト。これらは、関数が処理する入力です。

WebIDE で新しいファイルを作成して、関数の宣言と定義を調べてみましょう。WebIDE を開き、次の手順に従います。

  1. ファイルエクスプローラで右クリックし、「新しいファイル」を選択します。
  2. ファイル名を functions_intro.c にします。
  3. ファイルをクリックしてエディタで開きます。

または、ターミナルを使ってファイルを作成することもできます。

touch ~/project/functions_intro.c

では、関数の宣言と定義を示す簡単なプログラムを書いてみましょう。この例では、関数をどのように宣言、定義、呼び出すかを示します。

#include <stdio.h>

// 関数宣言(プロトタイプ)
void greet(char* name);
int add_numbers(int a, int b);

int main() {
    // 関数呼び出し
    greet("LabEx User");

    int result = add_numbers(5, 7);
    printf("5 + 7 = %d\n", result);

    return 0;
}

// 挨拶用の関数定義
void greet(char* name) {
    printf("Hello, %s! Welcome to functions in C.\n", name);
}

// 加算用の関数定義
int add_numbers(int a, int b) {
    return a + b;
}

コードを分解して、その構成要素を理解しましょう。

  • void greet(char* name);:これは、関数の完全な定義の前にコンパイラに関数を知らせる関数宣言(プロトタイプ)です。まるで、チームメンバーが仕事を始める前に紹介するようなものです。
  • void greet(char* name) {... }:これは、関数の実際の実装を含む関数定義です。ここでは、挨拶のメッセージを表示します。
  • int add_numbers(int a, int b);:これは、もう 1 つの関数宣言で、数値を加算する関数が存在することをコンパイラに知らせています。
  • int add_numbers(int a, int b) { return a + b; }:これは、2 つの整数の和を返す関数定義です。

プログラムをコンパイルして実行するには、ターミナルで次のコマンドを使用します。

gcc functions_intro.c -o functions_intro
./functions_intro

出力例:

Hello, LabEx User! Welcome to functions in C.
5 + 7 = 12

関数に関する重要なポイント:

  • 複雑な問題を小さくて管理可能な部分に分解します。
  • パラメータを受け取り、値を返すことができます。
  • コードの再利用性と読みやすさを向上させます。
  • 関数により、コードがより整然とし、理解しやすくなります。

関数呼び出しを変更したり、独自の関数を作成して練習してみましょう! さまざまな戻り値の型、パラメータ、関数の目的を試して、この強力なプログラミング概念の理解を深めましょう。

関数プロトタイプを定義する

このステップでは、関数プロトタイプについてさらに深く掘り下げます。関数プロトタイプは、関数の完全な実装の前に関数を宣言する際に重要です。関数プロトタイプは、実際の関数定義の前に、関数の名前、戻り値の型、およびパラメータの型をコンパイラに知らせます。

WebIDE で新しいファイルを作成して、関数プロトタイプを調べてみましょう。

  1. WebIDE を開き、新しいファイルを作成します。
cd ~/project
touch function_prototype_demo.c
  1. 次のコードを入力します。
#include <stdio.h>

// 関数プロトタイプ
// 構文: return_type function_name(parameter_types);
int calculate_rectangle_area(int length, int width);
void print_greeting(char* name);

int main() {
    // プロトタイプの後に関数を使用する
    int length = 5;
    int width = 3;
    int area = calculate_rectangle_area(length, width);

    printf("Rectangle area: %d square units\n", area);

    print_greeting("LabEx Student");

    return 0;
}

// 長方形の面積を計算する関数定義
int calculate_rectangle_area(int length, int width) {
    return length * width;
}

// 挨拶を表示する関数定義
void print_greeting(char* name) {
    printf("Hello, %s! Welcome to function prototypes.\n", name);
}

このコードを見ると、main() 関数の前に 2 つの関数プロトタイプがあることに気付きます。これらのプロトタイプは、コンパイラに対する事前通知のようなもので、後で定義される 2 つの関数について知らせています。1 つは長方形の面積を計算する関数で、もう 1 つは挨拶を表示する関数です。

関数プロトタイプに関する重要なポイント:

  • main() 関数の前に宣言されます
  • 関数の戻り値の型とパラメータの型を指定します
  • 関数の完全な実装の前にコンパイラに関数を知らせることができます
  • 実際の関数定義はコードの後半にあります
  1. プログラムをコンパイルして実行します。
gcc function_prototype_demo.c -o function_prototype_demo
./function_prototype_demo

出力例:

Rectangle area: 15 square units
Hello, LabEx Student! Welcome to function prototypes.

なぜ関数プロトタイプを使うのでしょうか? 複雑なプログラミングの世界では、関数プロトタイプはいくつかの重要な役割を果たします。プログラムが実行される前に潜在的な型の不一致をキャッチするのに役立つ早期警戒システムとして機能します。関数の完全な定義が書かれる前に関数を使用できるようにすることで柔軟性を提供します。さらに、コードの整理と読みやすさに役立ち、コードをより構造化され、理解しやすくします。

関数プロトタイプを理解して使用することで、ただコードを書くだけでなく、整然とした、効率的な、プロフェッショナルなプログラミング環境を作り出しています。関数プロトタイプは、初心者のプログラマと経験豊富な開発者を区別する C プログラミングの基本的なスキルを表しています。

プロトタイプを変更したり、関数を追加して練習し、理解を深めてみましょう!

ソースファイルに関数ロジックを実装する

このステップでは、C のソースファイルに関数ロジックをどのように実装するかを調べます。計算、文字列操作、条件論理を含むさまざまな種類の関数の実装を示す実際的な例を作成します。

  1. WebIDE を開き、新しいファイルを作成します。
cd ~/project
touch function_implementation_demo.c
  1. 次のコードを入力します。
#include <stdio.h>
#include <string.h>

// 温度変換用の関数プロトタイプ
float celsius_to_fahrenheit(float celsius);

// 文字列の長さを計算する関数プロトタイプ
int calculate_string_length(char* input_string);

// 数値が偶数かどうかをチェックする関数プロトタイプ
int is_even_number(int number);

int main() {
    // 温度変換の実行
    float temp_celsius = 25.0;
    float temp_fahrenheit = celsius_to_fahrenheit(temp_celsius);
    printf("%.1f°C is equal to %.1f°F\n", temp_celsius, temp_fahrenheit);

    // 文字列の長さを計算する実行
    char sample_text[] = "LabEx Programming";
    int text_length = calculate_string_length(sample_text);
    printf("Length of '%s' is %d characters\n", sample_text, text_length);

    // 偶数のチェックの実行
    int test_number = 14;
    if (is_even_number(test_number)) {
        printf("%d is an even number\n", test_number);
    } else {
        printf("%d is an odd number\n", test_number);
    }

    return 0;
}

// 温度変換用の関数実装
float celsius_to_fahrenheit(float celsius) {
    return (celsius * 9/5) + 32;
}

// 文字列の長さを計算する関数実装
int calculate_string_length(char* input_string) {
    return strlen(input_string);
}

// 偶数のチェック用の関数実装
int is_even_number(int number) {
    return (number % 2 == 0);
}

関数の実装を理解することは、C のプログラマにとって重要です。各関数は一貫したパターンに従っています。まずプロトタイプ宣言が行われ、その後に完全な実装が続きます。このアプローチにより、コンパイラは関数の実際の定義の前に関数のシグネチャを理解することができ、型チェックを行い、潜在的なエラーを防ぐことができます。

関数の実装に関する重要なポイント:

  • 各関数プロトタイプの後に完全な実装が続きます
  • 関数は計算を行い、データを操作し、値を返すことができます
  • 文字列の長さを計算するために <string.h> から strlen() 関数を使用します
  • 偶数をチェックするために剰余演算子 % を使用します
  1. プログラムをコンパイルして実行します。
gcc function_implementation_demo.c -o function_implementation_demo
./function_implementation_demo

出力例:

25.0°C is equal to 77.0°F
Length of 'LabEx Programming' is 17 characters
14 is an even number

この例は、C プログラミングにおける関数の多様性を見事に示しています。さまざまなタスクを特殊な関数に分解することで、読みやすくなるだけでなく、デバッグや保守も容易になるコードを作成します。

この例の 3 つの関数は、さまざまなプログラミング技術を示しています。

  • 数学的変換 (celsius_to_fahrenheit) は、関数が複雑な計算を行う方法を示しています
  • 文字列操作 (calculate_string_length) は、テキストデータを扱う方法を示しています
  • 条件論理 (is_even_number) は、関数がブール型の結果を返す方法を示しています

C を学び続けるにつれて、独自の関数を作成して実験してみましょう。既存の関数を変更したり、入力パラメータを変更したり、新しい機能を追加したりしてみます。練習すればするほど、関数の実装に慣れていきます。

関数を変更したり、独自の関数を追加して、関数ロジックの実装を練習してみましょう!

main() 関数から関数を呼び出す

このステップでは、main() 関数から関数をどのように呼び出すかを調べます。C プログラミングにおける関数の呼び出し方法と使用方法の違いを示します。関数を使うことで、複雑な問題を小さくて管理しやすいコードに分解でき、理解しやすく保守しやすくなります。

  1. WebIDE を開き、新しいファイルを作成します。
cd ~/project
touch function_calling_demo.c
  1. 次のコードを入力します。
#include <stdio.h>

// 関数プロトタイプ
int add_numbers(int a, int b);
void print_greeting(char* name);
float calculate_average(float a, float b, float c);

int main() {
    // 方法 1: 関数を直接呼び出して即座に表示する
    printf("Addition Result: %d\n", add_numbers(5, 7));

    // 方法 2: 関数の戻り値を変数に格納する
    int sum = add_numbers(10, 20);
    printf("Sum of 10 and 20 is: %d\n", sum);

    // 方法 3: 直接引数を使って関数を呼び出す
    print_greeting("LabEx Student");

    // 方法 4: 関数の戻り値を計算して使用する
    float avg = calculate_average(10.5, 20.3, 30.7);
    printf("Average of numbers: %.2f\n", avg);

    return 0;
}

// 加算用の関数実装
int add_numbers(int a, int b) {
    return a + b;
}

// 挨拶用の関数実装
void print_greeting(char* name) {
    printf("Hello, %s! Welcome to function calls.\n", name);
}

// 平均計算用の関数実装
float calculate_average(float a, float b, float c) {
    return (a + b + c) / 3;
}

C で関数を使う際には、いくつかの重要な概念に気付くでしょう。ファイルの上部に宣言された関数プロトタイプは、関数が完全に定義される前に関数のシグネチャをコンパイラに知らせます。これにより、コンパイルエラーを防ぎ、コードをより柔軟に整理できます。

関数を呼び出す際の重要なポイント:

  • 関数を printf() の中で直接呼び出すことができます
  • 関数の戻り値を変数に格納することができます
  • 直接引数を使って関数を呼び出すことができます
  • さまざまな型の関数(void、int、float)を呼び出すことができます
  1. プログラムをコンパイルして実行します。
gcc function_calling_demo.c -o function_calling_demo
./function_calling_demo

出力例:

Addition Result: 12
Sum of 10 and 20 is: 30
Hello, LabEx Student! Welcome to function calls.
Average of numbers: 20.50

この例では、関数を呼び出す 4 つの一般的な方法を示しています。

  1. printf() の中で直接関数を呼び出す:ここでは、関数の戻り値を print 文の中ですぐに使用しています。
  2. 関数の戻り値を格納する:関数の結果を後で使用するために変数に保存できます。
  3. 引数を使って void 関数を呼び出す:値を返さない関数でも、印刷などのアクションを実行できます。
  4. 関数の戻り値を計算して使用する:複雑な計算を関数の中にカプセル化できます。

初心者として、これらの関数呼び出し技術を練習することで、C で関数がどのように機能するかを強く理解することができます。各方法にはそれぞれの使い方があり、これらのアプローチに慣れることで、プログラミングがより効率的で読みやすくなります。

関数呼び出しを変更したり、独自の関数を作成して練習してみましょう!

まとめ

この実験では、C プログラミングにおける関数の基本概念を学びました。関数は、特定のタスクを実行する再利用可能なコードのブロックであり、コードの整理とモジュール化に役立ちます。関数の目的と構文、関数宣言(プロトタイプ)、関数定義、関数呼び出しについて調べました。また、関数のパラメータと戻り値の重要性、およびそれらがコードの再利用性と読みやすさをどのように向上させるかについても議論しました。最後に、関数の実装の前に関数のインターフェイスを定義する際に重要な関数プロトタイプについてさらに掘り下げました。