Menu
CoddyTech

回顾:使用指针修改结构体

本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 49 课,共 63 课。

challenge icon

挑战

简单

创建一个 C 程序,演示如何使用动态内存分配、结构体指针和函数构建完整的员工管理系统。你的程序应当:

  1. 定义一个名为 Employee 的 struct,包含以下成员:
    • 一个整数 id,用于存储员工编号
    • 一个大小为 50 的字符数组 name,用于存储员工姓名
    • 一个大小为 30 的字符数组 department,用于存储部门名称
    • 一个浮点数 salary,用于存储员工薪资
    • 一个整数 yearsOfService,用于存储服务年限
  2. 编写一个名为 fillEmployeeData 的函数,该函数:
    • 接收一个指向 Employee 结构体的指针作为参数
    • 按以下顺序读取输入中的员工信息:编号、姓名、部门、薪资、服务年限
    • 使用箭头运算符将值赋给结构体成员
    • 根据服务年限计算奖金:如果年限 >= 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() 为一个 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 在线编译器