1.Mảng chứa phần tử là struct trong C

Như chúng ta đã biết, mảng là tập hợp các phần tử có cùng kiểu với nhau. Các phần tử đó hoàn toàn có thể là kiểu dữ liệu struct.

Khai báo một mảng cấu trúc cũng giống như khai báo một mảng các kiểu cơ bản. Trong một mảng cấu trúc, mỗi phần tử của mảng đều có kiểu cấu trúc.

Ví dụ 1 mảng có kiểu sinh viên và lưu trữ 10 sinh viên, đầu tiên ta sẽ khai báo cấu trúc sinh viên trước và khai báo mảng có kiểu sinh viên bao gồm 10 phần tử ở trong hàm main:

Khai báo struct sinhvien bao gồm các trường Mã Sinh Viên, Tên Sinh Viên, Điểm Sinh Viên:

struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;

Khai báo mảng có kiểu sinhvien trong main:

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
//khai bao de dang voi tu khoa SV
typedef sinhvien SV;
int main(){
    //mang co kieu sinh vien gom 10 phan tu
    SV arr_sv[10];
}

Ta sẽ hình dung mảng SV arr_sv[10] như sau:

2.Nhập xuất dữ liệu cho mảng chứa struct

Ở trên, ta đã có một mảng chứa 10 phần tử là các struct có kiểu sinh viên. Tuy nhiên các thành phần trong struct sinh viên (Mã Sinh Viên, Tên Sinh Viên, Điểm Sinh Viên) đó hoàn toàn chưa có dữ liệu.

Để nhập dữ liệu vào mảng chứa struct, ta cần truy cập đến địa chỉ phần tử mảng và dùng toán tử chấm (.) để truy cập đến thành phần trong struct.

Ví dụ dưới đây, tôi sẽ dùng vòng lặp for để nhập N sinh viên sau đó hiển thị thông tin sinh viên ra màn hình như sau:

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;
int main(){
    //khai bao n sinh vien
    int n;
    printf("NHAP SO LUONG SINH VIEN: ");
    scanf("%d", &n);
    //mang co kieu sinh vien gom N phan tu
    SV arr_sv[n];
    //duyet cac phan tu trong mang
    for(int i = 0; i < n; i++){
        printf("\nNHAP THONG TIN SINH VIEN THU %d", i);
        //nhap ma sinh vien thu i
        printf("\nNHAP MA SINH VIEN: ");
        scanf("%d",&arr_sv[i].MaSinhVien);
        //nhap ten sinh vien thu i bang ham gets
        printf("NHAP TEN SINH VIEN: ");
        fflush(stdin);
        gets(arr_sv[i].TenSinhVien);
        //nhap diem sinh vien thu i
        printf("NHAP DIEM SINH VIEN: ");
        scanf("%f",&arr_sv[i].DiemSinhVien);
    }
    //hien thi thong tin sinh vien
    printf("\nDANH SACH SINH VIEN \n");
    //duyet cac phan tu trong mang
    for(int i =0; i < n; i++){
        //hien thi thong tin sinh vien thu i theo hang
        printf("%d\t %s\t %f\t \n", arr_sv[i].MaSinhVien,arr_sv[i].TenSinhVien,arr_sv[i].DiemSinhVien);
    }
}

Ở phần ví dụ trên tôi để số lượng sinh viên được nhập vào là N và sử dụng hàm scanf cho việc nhập dữ liệu số, hàm fflush(stdin) để xóa bộ nhớ đệm sau đó kết hợp với gets cho việc nhập dữ liệu chuỗi.

Viết lại chương trình một cách hoàn chỉnh:

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;
void nhap(SV arr_sv[], int n){
    //duyet cac phan tu trong mang
    for(int i = 0; i < n; i++){
        printf("\nNHAP THONG TIN SINH VIEN THU %d", i);
        //nhap ma sinh vien thu i
        printf("\nNHAP MA SINH VIEN: ");
        scanf("%d",&arr_sv[i].MaSinhVien);
        //nhap ten sinh vien thu i bang ham gets
        printf("NHAP TEN SINH VIEN: ");
        fflush(stdin);
        gets(arr_sv[i].TenSinhVien);
        //nhap diem sinh vien thu i
        printf("NHAP DIEM SINH VIEN: ");
        scanf("%f",&arr_sv[i].DiemSinhVien);
    }
}
void xuat(SV arr_sv[], int n){
    //hien thi thong tin sinh vien
    printf("\nDANH SACH SINH VIEN \n");
    //duyet cac phan tu trong mang
    for(int i =0; i < n; i++){
        //hien thi thong tin sinh vien thu i theo hang
        printf("%d\t %s\t %f\t \n", arr_sv[i].MaSinhVien,arr_sv[i].TenSinhVien,arr_sv[i].DiemSinhVien);
    }
}
int main(){
    //khai bao n sinh vien
    int n;
    printf("NHAP SO LUONG SINH VIEN: ");
    scanf("%d", &n);
    //mang co kieu sinh vien gom 10 phan tu
    SV arr_sv[n];
    nhap(arr_sv, n);
    xuat(arr_sv, n);
}

3.Khởi tạo mảng cấu trúc

Chúng ta hoàn toàn có thể khởi tạo một mảng có kiểu dữ liệu cấu trúc như, khởi tạo một mảng thông thường.

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;
int main(){
    //mang co kieu sinh vien gom 5 phan tu
    SV arr_sv[5] = {
        //ma, ten, diem
        {1,"NguyenVanA", 10},
        {2,"NguyenVanB", 5.5},
        {3,"NguyenVanC", 7},
        {4,"NguyenVanD", 8.2},
        {5,"NguyenVanA", 4.2},
    };
    //duyet 5 sinh vien co trong mang arr_sv
    for(int i =0; i < 5; i++){
        //hien thi thong tin sinh vien thu i theo hang
        printf("%d\t %s\t %f\t \n", arr_sv[i].MaSinhVien,arr_sv[i].TenSinhVien,arr_sv[i].DiemSinhVien);
    }
}
1 NguyenVanA 10.000000

2 NguyenVanB 5.500000

3 NguyenVanC 7.000000

4 NguyenVanD 8.200000

5 NguyenVanA 4.200000