Ôn tập: sửa đổi cấu trúc bằng con trỏ
Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 49 trên 63.
Thử thách
DễTạo một chương trình C minh họa hệ thống quản lý nhân viên hoàn chỉnh bằng cách sử dụng cấp phát bộ nhớ động, con trỏ đến struct và hàm. Chương trình cần:
- Định nghĩa một
structcó tênEmployeevới các thành viên sau:- Một số nguyên
idđể lưu mã nhân viên - Một mảng ký tự
namecó kích thước 50 để lưu tên nhân viên - Một mảng ký tự
departmentcó kích thước 30 để lưu tên phòng ban - Một số thực
salaryđể lưu mức lương của nhân viên - Một số nguyên
yearsOfServiceđể lưu số năm công tác
- Một số nguyên
- Viết một hàm có tên
fillEmployeeDatađể:- Nhận một con trỏ đến struct
Employeelàm tham số - Đọc thông tin nhân viên từ đầu vào theo thứ tự sau: mã nhân viên, tên, phòng ban, mức lương, số năm công tác
- Gán các giá trị cho thành viên của struct bằng toán tử mũi tên
- Tính tiền thưởng dựa trên số năm công tác: nếu số năm >= 5, tiền thưởng bằng 10% mức lương, nếu không thì bằng 5% mức lương
- Cộng tiền thưởng vào mức lương:
empPtr->salary += bonus;
- Nhận một con trỏ đến struct
- Viết một hàm có tên
displayEmployeeđể:- Nhận một con trỏ đến struct
Employeelàm tham số - In thông tin nhân viên theo đúng định dạng sau:
Employee Details:ID: [id]Name: [name]Department: [department]Salary: [salary]Years of Service: [yearsOfService]
- Nhận một con trỏ đến struct
- Viết một hàm có tên
promoteEmployeeđể:- Nhận một con trỏ đến struct
Employeelàm tham số - Tăng mức lương thêm 15% bằng toán tử mũi tên
- Tăng số năm công tác thêm 1
- In
Employee promoted successfully!
- Nhận một con trỏ đến struct
- Trong hàm main:
- Khai báo một con trỏ đến struct
Employeecó tênempPtr - Dùng
malloc()để cấp phát động bộ nhớ cho một structEmployee - Kiểm tra xem cấp phát bộ nhớ có thành công hay không:
- Nếu
empPtrlàNULL, inMemory allocation failedrồi thoát chương trình - Nếu thành công, in
Memory allocated successfully
- Nếu
- Gọi
fillEmployeeDatađể điền dữ liệu nhân viên - In
Initial employee data: - Gọi
displayEmployeeđể hiển thị thông tin ban đầu của nhân viên - Gọi
promoteEmployeeđể thăng chức cho nhân viên - In
After promotion: - Gọi lại
displayEmployeeđể hiển thị thông tin đã cập nhật - Giải phóng bộ nhớ đã cấp phát động bằng
free(empPtr) - In
Memory freed successfully
- Khai báo một con trỏ đến struct
Thử thách này kết hợp tất cả các khái niệm chính trong chương: định nghĩa struct, cấp phát bộ nhớ động bằng malloc(), kiểm tra lỗi cấp phát, truyền con trỏ struct vào hàm, dùng toán tử mũi tên để truy cập và sửa đổi các thành viên của struct, cũng như giải phóng bộ nhớ đúng cách bằng free(). Các hàm minh họa cách con trỏ cho phép sửa đổi trực tiếp dữ liệu của struct gốc.
Tự làm thử
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// TODO: Định nghĩa struct Employee tại đây
// TODO: Triển khai hàm (function) fillEmployeeData tại đây
// TODO: Triển khai hàm displayEmployee tại đây
// TODO: Triển khai hàm promoteEmployee tại đây
int main() {
// TODO: Khai báo empPtr và cấp phát bộ nhớ
// TODO: Kiểm tra việc cấp phát bộ nhớ có thành công không
// TODO: Điền dữ liệu nhân viên, hiển thị dữ liệu ban đầu, thăng chức rồi hiển thị dữ liệu sau khi thăng chức
// TODO: Giải phóng bộ nhớ và in ra thông báo thành công
return 0;
}Tất cả bài học trong Logic và luồng điều khiển
1Nền tảng về con trỏ
Con trỏ là gì?Khai báo con trỏToán tử lấy địa chỉ (&)Toán tử giải tham chiếu (*)Con trỏ NULLÔn tập: kiến thức cơ bản về con trỏ4Dự án: Công cụ xử lý văn bản đơn giản
Tổng quan dự ánĐếm ký tự2Con trỏ và mảng
Tên mảng dưới dạng con trỏPhần tử mảng và con trỏPhép toán con trỏSo sánh con trỏÔn tập: duyệt mảng bằng con trỏ5Con trỏ và hàm
Truyền theo giá trịTruyền con trỏ vào hàmSửa đổi biến qua con trỏVí dụ kinh điển: hoán đổiTruyền mảng vào hàmÔn tập: đối số con trỏ hàm8Cấu trúc và con trỏ
Con trỏ đến cấu trúcToán tử mũi tên (->)Truyền cấu trúc theo giá trịTruyền con trỏ cấu trúcCấp phát động cho cấu trúcÔn tập: sửa đổi cấu trúc bằng con trỏ3Mảng ký tự và chuỗi
Chuỗi dưới dạng mảng charKý tự kết thúc nullNhập chuỗi bằng scanfDùng strlen()Dùng strcpy()Dùng strcat()Dùng strcmp()Ôn tập: các hàm xử lý chuỗi cơ bản6Quản lý bộ nhớ
Bộ nhớ ngăn xếp và bộ nhớ heapCấp phát động với malloc()Dùng sizeof() để cấp phátKiểm tra lỗi cấp phátGiải phóng bộ nhớ với free()Cấp phát với calloc()Ôn tập: Mảng động9Dự án: Nhập thông tin liên hệ đơn giản
Định nghĩa struct ContactHàm tạo liên hệTự luyện tập: Trình biên dịch C online