【C言語】第6章第4回:構造体配列とその活用方法
構造体配列は、大量の関連データを効率的に管理するための便利なツールです。この章では、構造体配列の定義、初期化、アクセス方法について学びます。
1. 構造体配列とは?
1.1 概要
構造体配列は、同じ型の構造体を複数まとめて扱うデータ構造です。たとえば、複数の学生情報を管理する場合に使用します。
1.2 使用例
以下のようなデータを効率的に管理できます:
- 学生情報(名前、年齢、成績)
- 商品情報(名前、価格、在庫数)
- 住所録(名前、住所、電話番号)
2. 構造体配列の定義と初期化
2.1 基本的な定義
#include <stdio.h>
// 学生を表す構造体
typedef struct {
char name[50];
int age;
float grade;
} Student;
int main() {
// 構造体配列の定義と初期化
Student students[3] = {
{"Alice", 20, 85.0},
{"Bob", 22, 90.5},
{"Charlie", 19, 88.0}
};
// データの表示
for (int i = 0; i < 3; i++) {
printf("Name: %s\n", students[i].name);
printf("Age: %d\n", students[i].age);
printf("Grade: %.2f\n", students[i].grade);
}
return 0;
}
2.2 プログラムの動作をフローチャート風に説明
#include <stdio.h>
// 学生を表す構造体
typedef struct {
char name[50];
int age;
float grade;
} Student;
int main() {
// 構造体配列の定義と初期化
Student students[3] = {
{"Alice", 20, 85.0},
{"Bob", 22, 90.5},
{"Charlie", 19, 88.0}
};
// データの表示
for (int i = 0; i < 3; i++) {
printf("Name: %s\n", students[i].name);
printf("Age: %d\n", students[i].age);
printf("Grade: %.2f\n", students[i].grade);
}
return 0;
}
2.2 プログラムの動作をフローチャート風に説明
プログラムの流れを以下のように整理できます:
Initialize structure array --> For loop starts |--> Display data for Student 1 |--> Display data for Student 2 |--> Display data for Student 3 |--> End of loop --> Program terminates
解説:
- 構造体配列をリテラルで初期化しています。
- ループで各要素のデータを順次表示します。
3. 構造体配列の操作
3.1 特定の要素へのアクセス
#include <stdio.h>
int main() {
Student students[3] = {
{"Alice", 20, 85.0},
{"Bob", 22, 90.5},
{"Charlie", 19, 88.0}
};
// 特定の学生のデータを更新
students[1].grade = 92.0; // Bobの成績を更新
// 更新後のデータを表示
printf("Updated grade for Bob: %.2f\n", students[1].grade);
return 0;
}
3.2 プログラムの動作をフローチャート風に説明
Initialize structure array --> Access Bob's data
|--> Update Bob's grade
|--> Display updated grade --> Program terminates
#include <stdio.h>
int main() {
Student students[3] = {
{"Alice", 20, 85.0},
{"Bob", 22, 90.5},
{"Charlie", 19, 88.0}
};
// 特定の学生のデータを更新
students[1].grade = 92.0; // Bobの成績を更新
// 更新後のデータを表示
printf("Updated grade for Bob: %.2f\n", students[1].grade);
return 0;
}
3.2 プログラムの動作をフローチャート風に説明
Initialize structure array --> Access Bob's data
|--> Update Bob's grade
|--> Display updated grade --> Program terminates
解説:特定の要素にアクセスして値を更新する方法を示しています。
4. 構造体配列を使ったソート
4.1 成績順でソートする例
#include <stdio.h>
#include <string.h>
// 構造体の定義
typedef struct {
char name[50];
int age;
float grade;
} Student;
// 比較関数(成績順)
int compareGrades(const void *a, const void *b) {
return (((Student *)b)->grade - ((Student *)a)->grade);
}
int main() {
Student students[3] = {
{"Alice", 20, 85.0},
{"Bob", 22, 90.5},
{"Charlie", 19, 88.0}
};
// qsort関数を使用してソート
qsort(students, 3, sizeof(Student), compareGrades);
// ソート後のデータを表示
for (int i = 0; i < 3; i++) {
printf("Name: %s, Grade: %.2f\n", students[i].name, students[i].grade);
}
return 0;
}
4.2 フローチャート風説明
Initialize structure array --> Call qsort function
|--> Sort data by grades
|--> For loop displays sorted data --> Program terminates
#include <stdio.h>
#include <string.h>
// 構造体の定義
typedef struct {
char name[50];
int age;
float grade;
} Student;
// 比較関数(成績順)
int compareGrades(const void *a, const void *b) {
return (((Student *)b)->grade - ((Student *)a)->grade);
}
int main() {
Student students[3] = {
{"Alice", 20, 85.0},
{"Bob", 22, 90.5},
{"Charlie", 19, 88.0}
};
// qsort関数を使用してソート
qsort(students, 3, sizeof(Student), compareGrades);
// ソート後のデータを表示
for (int i = 0; i < 3; i++) {
printf("Name: %s, Grade: %.2f\n", students[i].name, students[i].grade);
}
return 0;
}
4.2 フローチャート風説明
Initialize structure array --> Call qsort function
|--> Sort data by grades
|--> For loop displays sorted data --> Program terminates
解説:qsort関数を使って成績順にソートしています。
5. 練習問題
以下の課題に挑戦して、構造体配列の操作を実践しましょう。
- 商品の情報(名前、価格、在庫数)を構造体配列で管理し、価格の安い順にソートしてください。
- 学生の情報を管理し、指定した名前の学生の成績を更新してください。
- 構造体配列を使って、住所録を作成し、特定の市に住む人のリストを表示してください。
6. まとめ
構造体配列を使うと、複数のデータを効率的に管理できます。次回は、動的配列を使用したデータの管理について学びます。