C言語

【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 プログラムの動作をフローチャート風に説明

プログラムの流れを以下のように整理できます:

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
        

解説:特定の要素にアクセスして値を更新する方法を示しています。

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
        

解説:qsort関数を使って成績順にソートしています。

5. 練習問題

以下の課題に挑戦して、構造体配列の操作を実践しましょう。

  1. 商品の情報(名前、価格、在庫数)を構造体配列で管理し、価格の安い順にソートしてください。
  2. 学生の情報を管理し、指定した名前の学生の成績を更新してください。
  3. 構造体配列を使って、住所録を作成し、特定の市に住む人のリストを表示してください。

6. まとめ

構造体配列を使うと、複数のデータを効率的に管理できます。次回は、動的配列を使用したデータの管理について学びます。