Menu
Coddy logo textTech

まとめ:ポインタによる構造体の変更

CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 49/63。

challenge icon

チャレンジ

簡単

動的メモリ割り当て、構造体ポインタ、および関数を使用して、完全な従業員管理システムを実証するCプログラムを作成してください。プログラムは以下の要件を満たす必要があります:

  1. 以下のメンバを持つ Employee という名前の struct を定義します:
    • 従業員IDを格納する整数型の id
    • 従業員名を格納するサイズ50の文字配列 name
    • 部署名を格納するサイズ30の文字配列 department
    • 従業員の給与を格納する浮動小数点型の salary
    • 勤続年数を格納する整数型の yearsOfService
  2. 以下の処理を行う fillEmployeeData という名前の関数を作成します:
    • Employee 構造体へのポインタをパラメータとして受け取ります
    • 入力から、ID、名前、部署、給与、勤続年数の順に従業員情報を読み取ります
    • アロー演算子を使用して、構造体のメンバに値を代入します
    • 勤続年数に基づいてボーナスを計算します:勤続年数が5年以上の場合は給与の10%、それ以外の場合は5%とします
    • ボーナスを給与に加算します:empPtr->salary += bonus;
  3. 以下の処理を行う displayEmployee という名前の関数を作成します:
    • Employee 構造体へのポインタをパラメータとして受け取ります
    • 以下の正確な形式で従業員情報を出力します:
      • Employee Details:
      • ID: [id]
      • Name: [name]
      • Department: [department]
      • Salary: [salary]
      • Years of Service: [yearsOfService]
  4. 以下の処理を行う promoteEmployee という名前の関数を作成します:
    • Employee 構造体へのポインタをパラメータとして受け取ります
    • アロー演算子を使用して給与を15%増やします
    • 勤続年数を1増やします
    • Employee promoted successfully! と出力します
  5. main関数内で以下の処理を行います:
    • Employee 構造体へのポインタ empPtr を宣言します
    • malloc() を使用して、1つの Employee 構造体に対してメモリを動的に割り当てます
    • メモリ割り当てが成功したか確認します:
      • empPtrNULL の場合、Memory allocation failed と出力してプログラムを終了します
      • 成功した場合は、Memory allocated successfully と出力します
    • fillEmployeeData を呼び出して従業員データを入力します
    • Initial employee data: と出力します
    • displayEmployee を呼び出して、初期の従業員情報を表示します
    • promoteEmployee を呼び出して、従業員を昇進させます
    • After promotion: と出力します
    • 再度 displayEmployee を呼び出して、更新された情報を表示します
    • free(empPtr) を使用して、動的に割り当てられたメモリを解放します
    • Memory freed successfully と出力します

このチャレンジは、構造体の定義、malloc() による動的メモリ割り当て、割り当て失敗のチェック、関数への構造体ポインタの渡し方、アロー演算子を使用した構造体メンバへのアクセスと修正、そして free() による適切なメモリのクリーンアップといった、この章のすべての主要な概念を組み合わせています。これらの関数は、ポインタによって元の構造体データを直接修正できることを示しています。

自分で試してみよう

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

// TODO: ここでEmployee構造体を定義します

// TODO: ここでfillEmployeeData関数を実装します

// TODO: ここでdisplayEmployee関数を実装します

// TODO: ここでpromoteEmployee関数を実装します

int main() {
    // TODO: empPtrを宣言し、メモリを割り当てます
    
    // TODO: メモリ割り当てが成功したか確認します
    
    // TODO: 従業員データを入力し、初期データを表示し、昇進させ、昇進後のデータを表示します
    
    // TODO: メモリを解放し、成功メッセージを表示します
    
    return 0;
}

Logic & Flowのすべてのレッスン