12.2.1 Khái niệm
Cấu trúc (struct) là một dạng dữ liệu gồm nhiều thành phần khác kiểu. Mỗi thành phần được truy xuất bằng một định danh gọi là trường (field).
12.2.2 Khai báo
Kiểu dữ liệu cấu trúc được khai báo theo cú pháp như sau:
Cú pháp khai báo kiểu cấu trúc
struct <tên kiểu cấu trúc> {
<kiểu 1> <tên trường 1>; <kiểu 2> <tên trường 2>; …
<kiểu n> <tên trường n>; };
Ví dụ:
struct SinhVien {
char hoten[30]; float toan, ly, hoa; };
Khai báo biến cĩ thể dựa trên khai báo kiểu (khơng tường minh) như sau:
Cú pháp khai báo biến cấu trúc (khơng tường minh)
struct <tên kiểu cấu trúc> {
<kiểu 1> <tên trường 1>; <kiểu 2> <tên trường 2>; …
<kiểu n> <tên trường n>; };
Hoặc khai báo biến trực tiếp (tường minh) như sau:
Cú pháp khai báo biến cấu trúc (tường minh)
struct <tên kiểu cấu trúc> {
<kiểu 1> <tên trường 1>; <kiểu 2> <tên trường 2>; …
<kiểu n> <tên trường n>; } <tên biến cấu trúc>;
Ví dụ:
struct SinhVien {
char hoten[30]; float toan, ly, hoa;
} sv1, sv2, sv3; // Tuong minh
struct SinhVien sv4, sv5; // Khong tuong minh
Cách khai báo dạng tường minh cho ta dễ nhận thấy mối quan hệ giữa biến và trường. Tuy nhiên trong cấu trúc chương trình của C thường địi hỏi khai báo tham số bằng định danh kiểu nên việc khai báo tường minh như trên ít được sử dụng.
Để khởi tạo giá trị cho biến cấu trúc, ta sử dụng cách sau:
Cú pháp khai báo biến bản ghi (tường minh)
struct <tên kiểu cấu trúc> {
<kiểu 1> <tên trường 1>; <kiểu 2> <tên trường 2>; …
<kiểu n> <tên trường n>;
Ví dụ:
struct SinhVien {
char hoten[30]; float toan, ly, hoa;
} sv1 = {“Nguyen Van A”, 10, 7.5, 9}, sv2, td3;
12.2.3 Truy xuất dữ liệu kiểu bản ghi
Chúng ta khơng thể nhập xuất trực tiếp dữ liệu kiểu cấu trúc mà chỉ cĩ thể nhập xuất thơng qua các trường của cấu trúc đĩ.
Để truy xuất đến trường của cấu trúc ta sử dụng tốn tử chấm.
Cú pháp truy xuất đến các trường của cấu trúc
<tên biến cấu trúc>.<tên trường>
Ví dụ
struct SinhVien sv;
strcpy(sv.hoten, “Nguyen Van A”); sv.toan = 10;
sv.ly = 7.5; sv.hoa = 9;
printf(“Ho ten sinh vien: %s\n”, sv.hoten);
printf(“DTB: %.2f”, (sv.toan + sv.ly + sv.hoa)/3);
12.2.4 Gán dữ liệu kiểu bản ghi
Đối với 2 dữ liệu bản ghi cĩ cùng kiểu, chúng ta cĩ thể thực hiện phép gán theo các cách sau đây:
Thơng qua các trường (tường minh)
<biến cấu trúc đích>.<trường 1> :=
<biến cấu trúc nguồn>.<trường 1>; <biến cấu trúc đích>.<trường 2> :=
<biến cấu trúc nguồn>.<trường 2>; …
Sử dụng lệnh gán
<biến cấu trúc đích> = <biến cấu trúc nguồn>;
Ví dụ:
struct SinhVien {
char hoten[30]; float toan, ly, hoa;
} sv1 = {“Nguyen Van A”, 10, 7.5, 9}, sv2; sv2 = sv1; // Cach 1
strcpy(sv2.hoten, sv1.hoten); // Cach 2
sv2.toan = sv1.toan; sv2.ly = sv1.ly; sv2.hoa = sv1.hoa;