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, 88.5},
        {"Bob", 22, 75.0},
        {"Charlie", 19, 90.0}
    };

    // データの表示
    for (int i = 0; i < 3; i++) {
        printf("Student %d:\n", i + 1);
        printf("  Name: %s\n", students[i].name);
        printf("  Age: %d\n", students[i].age);
        printf("  Grade: %.2f\n", students[i].grade);
    }

    return 0;
}

フローチャート:

以下のフローチャートで、このプログラムの流れを視覚化します。

3. 構造体配列の操作

3.1 データの検索

構造体配列から特定の条件に一致するデータを検索する方法を紹介します。

#include <stdio.h>
#include <string.h>

// 構造体の定義(省略)

int main() {
    Student students[3] = {
        {"Alice", 20, 88.5},
        {"Bob", 22, 75.0},
        {"Charlie", 19, 90.0}
    };

    // 名前で検索
    char searchName[50];
    printf("Enter name to search: ");
    scanf("%s", searchName);

    for (int i = 0; i < 3; i++) {
        if (strcmp(students[i].name, searchName) == 0) {
            printf("Found: %s, Age: %d, Grade: %.2f\n",
                   students[i].name, students[i].age, students[i].grade);
            return 0;
        }
    }

    printf("Student not found.\n");
    return 0;
}

フローチャート:

検索アルゴリズムの流れを以下に示します。

4. 構造体配列の応用

4.1 データのソート

構造体配列をソートする方法を紹介します。

#include <stdio.h>
#include <string.h>

// 構造体の定義(省略)

int main() {
    Student students[3] = {
        {"Alice", 20, 88.5},
        {"Bob", 22, 75.0},
        {"Charlie", 19, 90.0}
    };

    // バブルソート
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2 - i; j++) {
            if (students[j].grade < students[j + 1].grade) {
                Student temp = students[j];
                students[j] = students[j + 1];
                students[j + 1] = temp;
            }
        }
    }

    // ソート後のデータの表示
    for (int i = 0; i < 3; i++) {
        printf("Student %d:\n", i + 1);
        printf("  Name: %s\n", students[i].name);
        printf("  Age: %d\n", students[i].age);
        printf("  Grade: %.2f\n", students[i].grade);
    }

    return 0;
}

フローチャート:

ソートアルゴリズムのフローを以下に示します。

5. 練習問題

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

  1. 商品の情報(名前、価格、在庫数)を構造体配列で管理し、価格の昇順でソートしてください。
  2. 特定の商品の名前でデータを検索し、見つかった商品の情報を表示してください。
  3. 構造体配列を使って、全商品の合計在庫数と総価格を計算してください。

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

問3の解答

#include <stdio.h>

// 構造体の定義
typedef struct {
    char name[50];
    float price;
    int stock;
} Product;

int main() {
    Product products[3] = {
        {"Laptop", 750.0, 10},
        {"Tablet", 500.0, 15},
        {"Phone", 300.0, 20}
    };

    int totalStock = 0;
    float totalPrice = 0.0;

    for (int i = 0; i < 3; i++) {
        totalStock += products[i].stock;
        totalPrice += products[i].price * products[i].stock;
    }

    printf("Total stock: %d\n", totalStock);
    printf("Total price: %.2f\n", totalPrice);

    return 0;
}

7. まとめ

構造体配列を使うことで、大量の関連データを効率的に管理できます。次回は、構造体とポインタの組み合わせについて学びます。