1.Truy cập vào các thành phần trong struct

Khi định nghĩa một cấu trúc, ta hoàn toàn có thể truy cập vào các phần tử mà cấu trúc đó bao gồm.

Các phần tử của cấu trúc được truy cập thông qua việc sử dụng toán tử chấm “.”

Toán tử (.) còn được gọi là toán tử thành viên – membership.

Cú pháp:

<Tên biến cấu trúc>.<tên thành phần>

Trong đó:

  • Tên biến cấu trúc đã được đặt và gán cụ thể trong hàm main
  • Tên thành phần được định nghĩa ban đầu ở cấu trúc

Ví dụ dưới đây, tôi cần lấy và hiển thị ra mã, tên và điểm của sinh viên NguyenVanA tôi sẽ sử dụng:

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;
int main(){
    //Khoi tao sinh vien NguyenVanA
    SV NguyenVanA = {1,"NguyenVanA",10.0};
    //Hien thi thong tin sinh vien
    printf("Ma sinh vien: %d", NguyenVanA.MaSinhVien);
    printf("\nTen sinh vien: %s", NguyenVanA.TenSinhVien);
    printf("\nDiem sinh vien: %f", NguyenVanA.DiemSinhVien);
}
Ma sinh vien: 1

Ten sinh vien: NguyenVanA

Diem sinh vien: 10.000000

Ta hoàn toàn có thể thay đổi giá trị của một thành phần nào đó của sinh viên NguyenVanA thông qua toán tử gán. Ví dụ tôi sẽ thay đổi mã sinh viên NguyenVanA từ số 1 thành số 2.

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;
int main(){
    //Khoi tao sinh vien NguyenVanA
    SV NguyenVanA = {1,"NguyenVanA",10.0};
    //Hien thi ma sinh vien duoc gan ban dau
    printf("Ma sinh vien ban dau: %d", NguyenVanA.MaSinhVien);
    //Gan ma sinh vien moi cho sinh vien NguyenVanA
    NguyenVanA.MaSinhVien = 2;
    //Hien thi ma sinh vien moi
    printf("\nMa sinh vien sau khi thay doi: %d", NguyenVanA.MaSinhVien);
}
Ma sinh vien ban dau: 1

Ma sinh vien sau khi thay doi: 2

Tương tự, ta có thể truy cập vào tên sinh viên, điểm sinh viên có trong struct để thực hiện việc gán giá trị hoặc lấy giá trị thông qua toán tử chấm (.)

2.Câu lệnh gán struct

Có thể sử dụng câu lệnh gán đơn giản để gán giá trị của một biến cấu trúc cho một biến khác có cùng kiểu.

Ví dụ, nếu hai biến s1 và s2 là các biến cấu trúc có cùng kiểu, thì câu lệnh s1 = s2 là hợp lệ.

Chú ý: Khi thực hiện phép gán, thông tin của biến bên trái (s1) sẽ được thay đổi bằng biến bên phải (s2).

Xét ví dụ với struct sinh viên:

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;
int main(){
    //Khoi tao sinh vien NguyenVanA va NguyenVanB
    SV NguyenVanA = {1,"NguyenVanA",10.0};
    SV NguyenVanB = {2, "NguyenVanB", 5.0};
    
    //thong tin NguyenVanA ban dau
    printf("THONG TIN NGUYEN VAN A BAN DAU \n");
    printf("%d \n", NguyenVanA.MaSinhVien);
    printf("%s \n", NguyenVanA.TenSinhVien);
    printf("%f", NguyenVanA.DiemSinhVien);
    
    //gan NguyenVanA = NguyenVanB
    NguyenVanA = NguyenVanB;

    //thong tin NguyenVanA sau khi gan bang NguyenVanB
    printf("\n \n");
    printf("THONG TIN NGUYEN VAN A SAU KHI GAN BANG NGUYEN VAN B \n");
    printf("%d \n", NguyenVanA.MaSinhVien);
    printf("%s \n", NguyenVanA.TenSinhVien);
    printf("%f", NguyenVanA.DiemSinhVien);
}
THONG TIN NGUYEN VAN A BAN DAU

1

NguyenVanA

10.000000

THONG TIN NGUYEN VAN A SAU KHI GAN BANG NGUYEN VAN B

2

NguyenVanB

5.000000

Trong một số trường hợp, nếu không thể sự dụng việc gán trực tiếp s1 = s2 thì ta có thể sử dụng hàm memcpy (&s2, &s1, sizeof(struct name)); hàm này thuộc thư viện string.h nên cần nhập thư viện #include <string.h>

#include <string.h>

Làm lại với ví dụ trên ta chỉ cần thay câu lệnh:

NguyenVanA = NguyenVanB;

Thay thế bằng câu lệnh:

memcpy(&NguyenVanA, &NguyenVanB,sizeof(SV));

Kết quả thu được giống với kết quả trên!

3.Struct lồng trong struct

Một cấu trúc có thể lồng trong một cấu trúc khác. Tuy nhiên, một cấu trúc không thể lồng trong chính nó.

Ví dụ với struct sinh viên ở trên, tôi sẽ thêm một cấu trúc có tên là date và chứa các thành phần ngày, tháng, năm mang kiểu int

Sau đó, ở trong struct sinh viên tôi thêm thành phần ngày sinh có kiểu là date:

struct date{
    int ngay;
    int thang;
    int nam;
};
typedef date DATE;
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
    DATE NgaySinh;
};

Việc truy cập cấu trúc này cũng tương tự như truy cập các cấu trúc khác, tuy nhiên để truy cập vào thành phần ngày sinh, ta cần truy cập đến các thành phần như ngày, tháng, năm ở trong cấu trúc DATE

Ví dụ:

NguyenVanA.NgaySinh.ngay;
NguyenVanA.NgaySinh.thang;
NguyenVanA.NgaySinh.nam;

4.Nhập dữ liệu cho struct

Cũng giống như mảng (hay bất kỳ kiểu khác), ta hoàn toàn có thể thêm các giá trị từ người dùng nhập từ bàn phím vào struct.

Ví dụ dưới đây, tôi có sinh viên NguyenVanA mang kiểu struct sinh viên, tôi sẽ dùng câu lệnh nhập scanf hoặc gets để thực hiện nhập các giá trị vào các thành phần có trong struct.

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;
int main(){
    //khoi tao sinh vien NguyenVanA
    SV NguyenVanA; 
    //nhap ma
    printf("Nhap ma: ");
    scanf("%d",&NguyenVanA.MaSinhVien);
    //nhap ten
    printf("Nhap ten: ");
    fflush(stdin);
    gets(NguyenVanA.TenSinhVien);
    //nhap diem
    printf("Nhap diem: ");
    scanf("%f", &NguyenVanA.DiemSinhVien);
}
Nhap ma: 1

Nhap ten: NguyenVanA

Nhap diem: 10

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

5.Hiển thị dữ liệu có trong struct

Sau khi các dữ liệu đã được đưa vào trong struct ta hoàn toàn có thể hiển thị xem dữ liệu đó là những gì. Bằng cách truy cập vào thành phần cần kiểm tra dữ liệu và sử dụng câu lệnh printf để xuất ra màn hình:

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;
int main(){
    //khoi tao sinh vien NguyenVanA
    SV NguyenVanA; 
    //nhap ma
    printf("Nhap ma: ");
    scanf("%d",&NguyenVanA.MaSinhVien);
    //nhap ten
    printf("Nhap ten: ");
    fflush(stdin);
    gets(NguyenVanA.TenSinhVien);
    //nhap diem
    printf("Nhap diem: ");
    scanf("%f", &NguyenVanA.DiemSinhVien);
    
    //hien thi thong tin sinh vien vua nhap
    printf("Thong tin sinh vien \n");
    printf("Ma Sinh Vien: %d", NguyenVanA.MaSinhVien);
    printf("\nTen Sinh Vien: %s", NguyenVanA.TenSinhVien);
    printf("\nDiem Sinh Vien: %f", NguyenVanA.DiemSinhVien);
}
Nhap ma: 1

Nhap ten: NguyenVanA

Nhap diem: 10

Thong tin sinh vien

Ma Sinh Vien: 1

Ten Sinh Vien: NguyenVanA

Diem Sinh Vien: 10.000000