Khái niệm Mảng Cấu trúc
Mảng cấu trúc là một dạng dữ liệu cho phép lưu trữ nhiều biến cấu trúc cùng kiểu liên tiếp trong bộ nhớ. Thay vì khai báo từng biến riêng lẻ, lập trình viên có thể quản lý một tập hợp các đối tượng đồng nhất thông qua một tên biến duy nhất.
Phương pháp Khai báo
Có hai cách phổ biến để định nghĩa một mảng cấu trúc trong C, tùy thuộc vào việc bạn muốn tái sử dụng kiểu dữ liệu hay không.
Phương pháp 1: Khai báo kiểu riêng biệt
Đầu tiên, định nghĩa một kiểu cấu trúc mới sử dụng typedef, sau đó sử dụng kiểu này để khai báo mảng.
typedef struct {
int studentId;
char* fullName;
char gender;
float gpa;
} Student;
Student classA[5]; // Khai báo mảng gồm 5 sinh viên
Phương pháp 2: Khai báo trực tiếp
Kết hợp việc định nghĩa cấu trúc và khai báo biến mảng trong cùng một khối lệnh. Cách này thường dùng khi kiểu cấu trúc không cần dùng lại ở nơi khác.
struct StudentRecord {
int studentId;
char* fullName;
char gender;
float gpa;
} classA[5];
Khởi tạo Dữ liệu cho Mảng
Việc gán giá trị ban đầu cho các phần tử trong mảng cấu trúc tuân theo cú pháp khởi tạo mảng thông thường, với mỗi phần tử là một khối dữ liệu cấu trúc.
Khởi tạo tương ứng Phương pháp 1
Student classA[3] = {
{101, "Nguyen Van A", 'M', 8.5},
{102, "Tran Thi B", 'F', 7.8},
{103, "Le Van C", 'M', 9.0}
};
Dữ liệu sau khi khởi tạo sẽ được lưu trữ như sau:
| Phần tử | ID | Họ tên | Giới tính | Điểm GPA |
|---|---|---|---|---|
| classA[0] | 101 | Nguyen Van A | M | 8.5 |
| classA[1] | 102 | Tran Thi B | F | 7.8 |
| classA[2] | 103 | Le Van C | M | 9.0 |
Khởi tạo tương ứng Phương pháp 2
struct StudentRecord {
int studentId;
char* fullName;
char gender;
float gpa;
} classA[3] = {
{101, "Nguyen Van A", 'M', 8.5},
{102, "Tran Thi B", 'F', 7.8},
{103, "Le Van C", 'M', 9.0}
};
Truy cập Thành phần của Phần tử
Để đọc hoặc ghi dữ liệu vào các trường cụ thể của một phần tử trong mảng, có thể sử dụng chỉ số mảng hoặc con trỏ.
Sử dụng chỉ số mảng (Index)
Cú pháp truy cập trực tiếp thông qua toán tử chấm (.):
classA[1].gpa = 8.0; // Cập nhật điểm cho sinh viên thứ 2
Sử dụng con trỏ (Pointer)
Khi làm việc với con trỏ trỏ đến một phần tử của mảng, sử dụng toán tử mũi tên (->):
Student *ptr = &classA[0];
ptr->gpa = 8.5; // Cập nhật điểm cho sinh viên đầu tiên qua con trỏ
Ví dụ Thực tế: Phân tích Điểm Số
Đoạn mã dưới đây minh họa việc nhập thông tin sinh viên, tính điểm trung bình của cả lớp và liệt kê những sinh viên có thành tích cao hơn mức trung bình.
#include <stdio.h>
typedef struct {
int id;
char name[50];
float score;
} StudentInfo;
int main() {
StudentInfo students[3] = {
{1, "Alice", 8.5},
{2, "Bob", 6.0},
{3, "Charlie", 9.2}
};
float totalScore = 0;
int count = 3;
// Tính tổng điểm
for (int i = 0; i < count; i++) {
totalScore += students[i].score;
}
float average = totalScore / count;
printf("Diem trung binh lop: %.2f\n", average);
printf("Sinh vien co diem cao hon trung binh:\n");
// Lọc và hiển thị sinh viên khá giỏi
for (int i = 0; i < count; i++) {
if (students[i].score > average) {
printf("- %s: %.2f\n", students[i].name, students[i].score);
}
}
return 0;
}