C - Mảng các cấu trúc
Xin chào các bạn đang học lập trình! Hôm nay, chúng ta sẽ bắt đầu một hành trình đầy thú vị vào thế giới lập trình C, cụ thể là khám phá Mảng các Cấu trúc. Đừng lo lắng nếu bạn là người mới bắt đầu; tôi sẽ hướng dẫn bạn từng bước với sự kiên nhẫn và sự nhiệt tình mà tôi đã sử dụng trong các lớp học trong nhiều năm. Hãy cùng bắt đầu!
Cấu trúc và Mảng là gì?
Trước khi chúng ta nhảy vào mảng các cấu trúc, hãy nhanh chóng ôn lại cấu trúc và mảng là gì.
Cấu trúc
Một cấu trúc trong C giống như một容器 có thể chứa các loại dữ liệu khác nhau. Hãy tưởng tượng một chiếc ba lô mà bạn có thể chứa các vật phẩm khác nhau - đó là cấu trúc của bạn! Ví dụ:
struct Student {
char name[50];
int age;
float gpa;
};
Ở đây, cấu trúc Student
của chúng ta có thể chứa một tên, một tuổi, và một GPA. Rất thú vị, phải không?
Mảng
Một mảng, ngược lại, là một bộ sưu tập các mục cùng loại. Hãy tưởng tượng nó như một hàng các két identical, mỗi két chứa cùng một loại vật phẩm. Ví dụ:
int numbers[5] = {1, 2, 3, 4, 5};
Mảng có tên numbers
có thể chứa 5 số nguyên.
Bây giờ, nếu chúng ta kết hợp hai khái niệm này? Đó chính là nơi phép thuật xảy ra!
Mảng các Cấu trúc
Một mảng các cấu trúc chính xác là những gì nó听起来 như - một mảng mà mỗi phần tử là một cấu trúc. Nó giống như có một lớp học đầy học sinh, mỗi học sinh có một bộ đặc điểm riêng.
Hãy cùng khám phá cách làm việc với các cấu trúc mạnh mẽ này!
Khai báo một Mảng Cấu trúc
Để khai báo một mảng các cấu trúc, chúng ta đầu tiên định nghĩa cấu trúc của mình, sau đó tạo một mảng của loại cấu trúc đó. Dưới đây là cách nó trông như thế nào:
struct Student {
char name[50];
int age;
float gpa;
};
struct Student class[30];
Trong ví dụ này, chúng ta đã tạo một mảng có tên class
có thể chứa thông tin cho 30 học sinh. Nó giống như có 30 thẻ học sinh, mỗi thẻ chứa một tên, tuổi, và GPA.
Khởi tạo một Mảng Cấu trúc
Bây giờ chúng ta đã khai báo mảng của mình, hãy điền nó với một số dữ liệu. Chúng ta có thể làm điều này theo hai cách:
- Khởi tạo tại khai báo:
struct Student class[3] = {
{"Alice", 20, 3.8},
{"Bob", 22, 3.5},
{"Charlie", 21, 3.9}
};
- Khởi tạo sau khi khai báo:
strcpy(class[0].name, "Alice");
class[0].age = 20;
class[0].gpa = 3.8;
strcpy(class[1].name, "Bob");
class[1].age = 22;
class[1].gpa = 3.5;
// ... và tiếp tục
Nhớ rằng, khi làm việc với các chuỗi trong C, chúng ta sử dụng strcpy
để gán giá trị cho các mảng char.
Đọc một Mảng Cấu trúc
Đọc từ một mảng cấu trúc rất đơn giản. Chúng ta có thể truy cập các phần tử cá nhân bằng cách sử dụng chỉ số mảng và ký hiệu chấm cho các thành viên của cấu trúc:
printf("Tên học sinh: %s\n", class[0].name);
printf("Tuổi học sinh: %d\n", class[0].age);
printf("GPA học sinh: %.2f\n", class[0].gpa);
Chúng ta cũng có thể sử dụng các vòng lặp để đọc qua toàn bộ mảng:
for (int i = 0; i < 3; i++) {
printf("Học sinh %d:\n", i+1);
printf("Tên: %s\n", class[i].name);
printf("Tuổi: %d\n", class[i].age);
printf("GPA: %.2f\n\n", class[i].gpa);
}
Mã này sẽ in thông tin cho tất cả ba học sinh trong mảng class
.
Sắp xếp một Mảng Cấu trúc
Sắp xếp một mảng các cấu trúc là một chút phức tạp hơn, nhưng đừng lo lắng - chúng ta sẽ phân tích nó từng bước. Giả sử chúng ta muốn sắp xếp học sinh theo GPA theo thứ tự giảm dần:
#include <string.h>
void swap(struct Student *a, struct Student *b) {
struct Student temp = *a;
*a = *b;
*b = temp;
}
void sortByGPA(struct Student arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j].gpa < arr[j+1].gpa) {
swap(&arr[j], &arr[j+1]);
}
}
}
}
// Sử dụng:
sortByGPA(class, 3);
Mã này sử dụng thuật toán bubble sort để sắp xếp học sinh của chúng ta dựa trên GPA. Sau khi gọi sortByGPA
, mảng class
sẽ được sắp xếp với GPA cao nhất ở trước.
Khai báo một Con Trỏ đến một Mảng Cấu trúc
Con trỏ là công cụ mạnh mẽ trong C, và chúng ta cũng có thể sử dụng chúng với các mảng cấu trúc. Dưới đây là cách khai báo một con trỏ đến mảng cấu trúc của chúng ta:
struct Student *classPtr = class;
Bây giờ, classPtr
chỉ đến phần tử đầu tiên của mảng class
. Chúng ta có thể sử dụng con trỏ này để truy cập các phần tử:
printf("Tên học sinh đầu tiên: %s\n", classPtr->name);
printf("Tuổi học sinh thứ hai: %d\n", (classPtr+1)->age);
Chú ý sử dụng toán tử mũi tên (->
) khi làm việc với con trỏ đến cấu trúc.
Kết luận
Chúc mừng! Bạn đã vừa bước một bước lớn trong hành trình lập trình C của mình. Mảng các cấu trúc rất hữu ích trong các tình huống lập trình thực tế. Hãy tưởng tượng quản lý cơ sở dữ liệu trường học, tổ chức thư viện, hoặc theo dõi tồn kho trong cửa hàng - tất cả các nhiệm vụ này trở nên dễ dàng hơn với mảng các cấu trúc.
Nhớ rằng, thực hành làm nên hoàn hảo. Hãy thử tạo ra các mảng cấu trúc của riêng bạn, điền chúng với dữ liệu, sắp xếp chúng, và thử nghiệm với các cách khác nhau để manipul dữ liệu. Trước khi bạn biết điều đó, bạn sẽ structuring mã của mình như một chuyên gia!
Chúc các bạn lập trình vui vẻ, và mong rằng các mảng của bạn luôn được chỉ định đúng chỉ số!
Phương pháp | Mô tả |
---|---|
struct Student class[30] |
Khai báo một mảng cấu trúc Student |
strcpy(class[0].name, "Alice") |
Gán một chuỗi giá trị cho một thành viên cấu trúc |
class[0].age = 20 |
Gán một giá trị nguyên cho một thành viên cấu trúc |
printf("%s", class[0].name) |
Đọc và in một thành viên cấu trúc |
sortByGPA(class, 3) |
Sắp xếp mảng cấu trúc |
struct Student *classPtr = class |
Khai báo một con trỏ đến mảng cấu trúc |
classPtr->name |
Truy cập một thành viên cấu trúc thông qua con trỏ |
Credits: Image by storyset