C言語

【C言語】第6章第11回:構造体を用いたデータベースの設計

構造体を使用して、シンプルかつ効率的なデータベースを設計できます。この章では、実用的なデータベースプログラムを作成する方法を学びます。

0. 記事の概要

この記事を読むメリット

  • データ管理スキルの向上:構造体を活用した効率的なデータ管理が可能になります。
  • 設計力の習得:データベース設計の基本的な考え方を理解できます。
  • 実践的な応用:リアルなプロジェクトで役立つ知識を習得できます。

この記事で学べること

  • 構造体を用いたデータベース設計の基本
  • データの登録、検索、表示の実装
  • 構造体を活用した高度なデータ操作

活用のイメージ

例えば、学生情報や商品の在庫管理システムを構築する際に、構造体を用いたデータベース設計を活用できます。これにより、データの登録、検索、表示が簡単になります。

1. 構造体を用いたデータベースの基本

1.1 データの登録と表示

#include <stdio.h>

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

// 学生情報を表示する関数
void displayStudent(Student student) {
    printf("ID: %d, Name: %s, Grade: %.2f\n", student.id, student.name, student.grade);
}

int main() {
    // 学生情報の登録
    Student student1 = {1, "Alice", 88.5};

    // 学生情報の表示
    displayStudent(student1);

    return 0;
}
動作説明
  1. 構造体の定義:学生のID、名前、成績を管理するStudent構造体を定義します。
  2. データの登録:Student型の変数student1にデータを登録します。
  3. データの表示:displayStudent関数を使用して、登録したデータを表示します。

2. 構造体を用いたデータベース操作

2.1 データの検索

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

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

// 学生情報を検索する関数
int findStudent(Student students[], int size, const char *name) {
    for (int i = 0; i < size; i++) {
        if (strcmp(students[i].name, name) == 0) {
            return i; // 一致する学生のインデックスを返す
        }
    }
    return -1; // 見つからない場合
}

int main() {
    // 学生情報の配列を初期化
    Student students[3] = {
        {1, "Alice", 88.5},
        {2, "Bob", 75.0},
        {3, "Charlie", 92.0}
    };

    // 学生情報を検索
    const char *searchName = "Bob";
    int index = findStudent(students, 3, searchName);

    if (index != -1) {
        printf("Student Found: ");
        printf("ID: %d, Name: %s, Grade: %.2f\n", 
                students[index].id, students[index].name, students[index].grade);
    } else {
        printf("Student not found.\n");
    }

    return 0;
}
動作説明
  1. 構造体配列の初期化:3人分の学生データを構造体配列studentsに格納します。
  2. 検索の実行:
    • findStudent関数を使用し、nameが一致する学生を検索します。
    • 一致する学生のインデックスを返します。
  3. 結果の表示:検索結果に応じて学生情報を表示します。

3. 練習問題

以下の課題に挑戦して、構造体を使ったデータベース設計のスキルを高めましょう。

  1. 学生情報を追加・削除できるプログラムを作成してください。
  2. 商品の在庫情報を管理し、在庫数を更新できるプログラムを作成してください。
  3. 従業員情報(ID、名前、給与)を検索し、指定した従業員の給与を更新するプログラムを作成してください。

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

問3の解答

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

// 従業員情報を表す構造体
typedef struct {
    int id;
    char name[50];
    float salary;
} Employee;

// 従業員情報を検索する関数
int findEmployee(Employee employees[], int size, const char *name) {
    for (int i = 0; i < size; i++) {
        if (strcmp(employees[i].name, name) == 0) {
            return i; // 一致する従業員のインデックスを返す
        }
    }
    return -1; // 見つからない場合
}

int main() {
    // 従業員情報の配列を初期化
    Employee employees[3] = {
        {1, "Alice", 50000.0},
        {2, "Bob", 55000.0},
        {3, "Charlie", 60000.0}
    };

    // 従業員情報を検索
    const char *searchName = "Bob";
    int index = findEmployee(employees, 3, searchName);

    if (index != -1) {
        printf("Before Update: %s, Salary: %.2f\n", 
                employees[index].name, employees[index].salary);

        // 給与を更新
        employees[index].salary += 5000.0;

        printf("After Update: %s, Salary: %.2f\n", 
                employees[index].name, employees[index].salary);
    } else {
        printf("Employee not found.\n");
    }

    return 0;
}
動作説明
  1. 構造体配列の初期化:3人分の従業員データを構造体配列employeesに格納します。
  2. 検索の実行:
    • findEmployee関数を使用して、指定された名前に一致する従業員を検索します。
  3. 給与の更新:検索結果を基に、該当従業員の給与を更新します。
  4. 結果の表示:給与の更新前後のデータを表示します。

5. まとめ

構造体を使ったデータベース設計は、複雑なデータ操作を効率的に行う上で非常に有用です。次回はさらに高度なデータ操作技術を学びます。