【C言語】第6章第7回:構造体と関数の組み合わせ
構造体と関数を組み合わせることで、データ操作が効率化されます。この章では、構造体を関数の引数や戻り値として利用する方法を学びます。
0. 記事の概要
この記事を読むメリット
- データ管理の効率化:構造体を関数で扱うことで、複雑なデータ操作が容易になります。
- 再利用性の向上:関数を使った構造体操作で、コードの再利用性が高まります。
- 設計力の向上:関数設計とデータ構造の融合を学ぶことで、応用力が身につきます。
この記事で学べること
- 構造体を関数の引数として渡す方法
- 構造体を戻り値として返す方法
- ポインタを使った構造体の効率的な操作
この記事の構成
- 構造体を引数として渡す:コピー方式とポインタ方式の違いを解説
- 構造体を戻り値として返す:関数から構造体を返す実践例
- 構造体と関数の応用例:データ管理や操作の具体例を紹介
- 練習問題:実践的な課題と解答付き
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);
}
動作説明
- 構造体の定義:名前と年齢を持つ
Student
構造体を定義します。 - 関数の宣言:構造体を引数として受け取る関数
printStudent
を宣言します。 - 構造体の渡し方:関数に
Student
構造体をコピーして渡します。 - データの表示:受け取った構造体のデータを
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; // ポインタを使って年齢を更新
}
動作説明
- 構造体の定義:同じ
Student
構造体を使用します。 - 関数の宣言:ポインタを引数として受け取る関数
updateAge
を宣言します。 - 構造体の渡し方:
&
を使って構造体のアドレスを渡します。 - データの更新:ポインタを介して構造体メンバーを変更します。
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; // 構造体を返す
}
動作説明
- 構造体の定義:同じ
Student
構造体を使用します。 - 関数の宣言:名前と年齢を受け取り、構造体を返す関数
createStudent
を宣言します。 - 構造体の生成:関数内で構造体を初期化し、生成します。
- 構造体の返却:
return
を使って生成した構造体を返します。 - 結果の表示:戻り値として受け取った構造体のデータを出力します。
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);
}
動作説明
- 構造体の定義:
Book
構造体を定義し、タイトル、著者、価格を含めます。 - 関数の宣言:ポインタで構造体を受け取り、割引を適用する関数
applyDiscount
を宣言します。 - 関数の実行:構造体の価格を更新し、割引後の価格を計算します。
- 結果の表示:割引後の価格を出力します。
5. まとめ
構造体と関数を組み合わせることで、データ操作が効率的になります。次回は、構造体ポインタと動的メモリ確保について学びます。