まとめ:ポインタによる構造体の変更
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 49/63。
チャレンジ
簡単動的メモリ割り当て、構造体ポインタ、および関数を使用して、完全な従業員管理システムを実証するCプログラムを作成してください。プログラムは以下の要件を満たす必要があります:
- 以下のメンバを持つ
Employeeという名前のstructを定義します:- 従業員IDを格納する整数型の
id - 従業員名を格納するサイズ50の文字配列
name - 部署名を格納するサイズ30の文字配列
department - 従業員の給与を格納する浮動小数点型の
salary - 勤続年数を格納する整数型の
yearsOfService
- 従業員IDを格納する整数型の
- 以下の処理を行う
fillEmployeeDataという名前の関数を作成します:Employee構造体へのポインタをパラメータとして受け取ります- 入力から、ID、名前、部署、給与、勤続年数の順に従業員情報を読み取ります
- アロー演算子を使用して、構造体のメンバに値を代入します
- 勤続年数に基づいてボーナスを計算します:勤続年数が5年以上の場合は給与の10%、それ以外の場合は5%とします
- ボーナスを給与に加算します:
empPtr->salary += bonus;
- 以下の処理を行う
displayEmployeeという名前の関数を作成します:Employee構造体へのポインタをパラメータとして受け取ります- 以下の正確な形式で従業員情報を出力します:
Employee Details:ID: [id]Name: [name]Department: [department]Salary: [salary]Years of Service: [yearsOfService]
- 以下の処理を行う
promoteEmployeeという名前の関数を作成します:Employee構造体へのポインタをパラメータとして受け取ります- アロー演算子を使用して給与を15%増やします
- 勤続年数を1増やします
Employee promoted successfully!と出力します
- main関数内で以下の処理を行います:
Employee構造体へのポインタempPtrを宣言しますmalloc()を使用して、1つのEmployee構造体に対してメモリを動的に割り当てます- メモリ割り当てが成功したか確認します:
empPtrがNULLの場合、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;
}