C言語

【C言語】第6章第4回:構造体配列とその活用

構造体配列を使用すると、同じ形式のデータを効率的に管理できます。この章では、構造体配列の基本から応用までを学びます。

1. 構造体配列の基本

1.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("Name: %s, Age: %d, Grade: %.2f\n", students[i].name, students[i].age, students[i].grade);
    }

    return 0;
}
動作説明
  1. 構造体定義:学籍情報を格納する構造体Studentを定義しています。
  2. 構造体配列の初期化:
    • 構造体配列studentsを宣言し、3つの学生データを格納します。
    • 各データ(名前、年齢、成績)をリテラル形式で指定しています。
  3. データの表示:
    • forループを使い、配列内の各学生データを出力します。
    • ドット演算子(.)を使って構造体メンバーにアクセスしています。

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}
    };

    // 成績の平均を計算
    float totalGrade = 0.0;
    for (int i = 0; i < 3; i++) {
        totalGrade += students[i].grade;
    }
    float averageGrade = totalGrade / 3;

    // 平均成績を表示
    printf("Average Grade: %.2f\n", averageGrade);

    return 0;
}
動作説明
  1. 構造体配列の初期化:前の例と同じ方法で3人の学生データを初期化します。
  2. 合計成績の計算:
    • forループを使用して各学生の成績を合計します。
    • totalGradeに各学生の成績を足していきます。
  3. 平均成績の計算:
    • 合計成績を学生数で割り、平均成績を計算します。
  4. 結果の表示:計算された平均成績を出力します。

3. 練習問題

以下の課題に挑戦して、構造体配列の活用方法を学びましょう。

  1. 5人の学生情報(名前、年齢、成績)を構造体配列で管理し、最高成績を持つ学生を表示するプログラムを作成してください。
  2. 従業員情報(名前、部署、給与)を構造体配列で管理し、部署ごとの平均給与を計算してください。
  3. 商品の情報(名前、価格、数量)を構造体配列で管理し、在庫の総価値を計算するプログラムを作成してください。

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

問1の解答

#include <stdio.h>

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

int main() {
    // 構造体配列の初期化
    Student students[5] = {
        {"Alice", 20, 88.5},
        {"Bob", 22, 75.0},
        {"Charlie", 19, 90.0},
        {"Daisy", 21, 85.0},
        {"Eve", 23, 92.0}
    };

    // 最高成績を持つ学生を探す
    int maxIndex = 0;
    for (int i = 1; i < 5; i++) {
        if (students[i].grade > students[maxIndex].grade) {
            maxIndex = i;
        }
    }

    // 結果の表示
    printf("Top Student: %s\n", students[maxIndex].name);
    printf("Grade: %.2f\n", students[maxIndex].grade);

    return 0;
}
動作説明
  1. 構造体配列の初期化:5人の学生データをリテラルで初期化します。
  2. 最高成績を持つ学生を探す:
    • maxIndexに最高成績のインデックスを格納します。
    • forループを使い、全学生の成績を比較します。
  3. 結果の表示:
    • 最高成績を持つ学生の名前と成績を出力します。

5. まとめ

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