回顾:使用指针修改结构体
本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 49 课,共 63 课。
挑战
简单创建一个 C 程序,演示如何使用动态内存分配、结构体指针和函数构建完整的员工管理系统。你的程序应当:
- 定义一个名为
Employee的struct,包含以下成员:- 一个整数
id,用于存储员工编号 - 一个大小为 50 的字符数组
name,用于存储员工姓名 - 一个大小为 30 的字符数组
department,用于存储部门名称 - 一个浮点数
salary,用于存储员工薪资 - 一个整数
yearsOfService,用于存储服务年限
- 一个整数
- 编写一个名为
fillEmployeeData的函数,该函数:- 接收一个指向
Employee结构体的指针作为参数 - 按以下顺序读取输入中的员工信息:编号、姓名、部门、薪资、服务年限
- 使用箭头运算符将值赋给结构体成员
- 根据服务年限计算奖金:如果年限 >= 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()为一个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;
}逻辑与流程中的所有课
自己练习: C 在线编译器