Quản lý Dữ liệu Phức hợp bằng Mảng Cấu trúc trong C

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;
}

Thẻ: C-Language struct-arrays pointers memory-layout Data-Structures

Đăng vào ngày 24 tháng 5 lúc 19:58