C言語

【C言語】第6章第7回:構造体と関数の組み合わせ

構造体と関数を組み合わせることで、データ操作が効率化されます。この章では、構造体を関数の引数や戻り値として利用する方法を学びます。

0. 記事の概要

この記事を読むメリット

  • データ管理の効率化:構造体を関数で扱うことで、複雑なデータ操作が容易になります。
  • 再利用性の向上:関数を使った構造体操作で、コードの再利用性が高まります。
  • 設計力の向上:関数設計とデータ構造の融合を学ぶことで、応用力が身につきます。

この記事で学べること

  • 構造体を関数の引数として渡す方法
  • 構造体を戻り値として返す方法
  • ポインタを使った構造体の効率的な操作

この記事の構成

  1. 構造体を引数として渡す:コピー方式とポインタ方式の違いを解説
  2. 構造体を戻り値として返す:関数から構造体を返す実践例
  3. 構造体と関数の応用例:データ管理や操作の具体例を紹介
  4. 練習問題:実践的な課題と解答付き

1. 構造体を関数の引数として渡す

1.1 コピー方式

#include <stdio.h>

// 学生情報を表す構造体
typedef struct {
    char name[50];
    int age;
} Student;

// 関数の宣言
void printStudent(Student student);

int main() {
    Student student1 = {"Alice", 20};
    printStudent(student1); // 構造体を引数として渡す
    return 0;
}

// 関数の定義
void printStudent(Student student) {
    printf("Name: %s, Age: %d\n", student.name, student.age);
}
動作説明
  1. 構造体の定義:名前と年齢を持つStudent構造体を定義します。
  2. 関数の宣言:構造体を引数として受け取る関数printStudentを宣言します。
  3. 構造体の渡し方:関数にStudent構造体をコピーして渡します。
  4. データの表示:受け取った構造体のデータをprintfで出力します。

1.2 ポインタ方式

#include <stdio.h>

// 学生情報を表す構造体
typedef struct {
    char name[50];
    int age;
} Student;

// 関数の宣言
void updateAge(Student *student);

int main() {
    Student student1 = {"Bob", 22};
    updateAge(&student1); // 構造体のアドレスを渡す
    printf("Updated Age: %d\n", student1.age);
    return 0;
}

// 関数の定義
void updateAge(Student *student) {
    student->age += 1; // ポインタを使って年齢を更新
}
動作説明
  1. 構造体の定義:同じStudent構造体を使用します。
  2. 関数の宣言:ポインタを引数として受け取る関数updateAgeを宣言します。
  3. 構造体の渡し方:&を使って構造体のアドレスを渡します。
  4. データの更新:ポインタを介して構造体メンバーを変更します。

2. 構造体を戻り値として返す

#include <stdio.h>

// 学生情報を表す構造体
typedef struct {
    char name[50];
    int age;
} Student;

// 関数の宣言
Student createStudent(const char *name, int age);

int main() {
    Student student1 = createStudent("Charlie", 19);
    printf("Name: %s, Age: %d\n", student1.name, student1.age);
    return 0;
}

// 関数の定義
Student createStudent(const char *name, int age) {
    Student student;
    sprintf(student.name, "%s", name);
    student.age = age;
    return student; // 構造体を返す
}
動作説明
  1. 構造体の定義:同じStudent構造体を使用します。
  2. 関数の宣言:名前と年齢を受け取り、構造体を返す関数createStudentを宣言します。
  3. 構造体の生成:関数内で構造体を初期化し、生成します。
  4. 構造体の返却:returnを使って生成した構造体を返します。
  5. 結果の表示:戻り値として受け取った構造体のデータを出力します。

3. 練習問題

以下の課題に挑戦して、構造体と関数の組み合わせを理解しましょう。

  1. 本(タイトル、著者、価格)の構造体を定義し、関数で価格を割引するプログラムを作成してください。
  2. 車(メーカー、モデル、価格)の構造体を定義し、関数で車の情報を出力してください。
  3. 商品の構造体を定義し、関数で在庫数を増減させるプログラムを作成してください。

4. 練習問題の解答と解説

問1の解答

#include <stdio.h>

// 本情報を表す構造体
typedef struct {
    char title[100];
    char author[50];
    float price;
} Book;

// 関数の宣言
void applyDiscount(Book *book, float discount);

int main() {
    Book book1 = {"C Programming", "Dennis Ritchie", 3000.0};
    applyDiscount(&book1, 0.1); // 10%割引
    printf("Discounted Price: %.2f\n", book1.price);
    return 0;
}

// 関数の定義
void applyDiscount(Book *book, float discount) {
    book->price *= (1 - discount);
}
動作説明
  1. 構造体の定義:Book構造体を定義し、タイトル、著者、価格を含めます。
  2. 関数の宣言:ポインタで構造体を受け取り、割引を適用する関数applyDiscountを宣言します。
  3. 関数の実行:構造体の価格を更新し、割引後の価格を計算します。
  4. 結果の表示:割引後の価格を出力します。

5. まとめ

構造体と関数を組み合わせることで、データ操作が効率的になります。次回は、構造体ポインタと動的メモリ確保について学びます。