----> Lời khuyên cho các bạn bắt đầu học lập trình: nếu có tham khảo code trên mạng thì các bạn nên xem nó và tự viết lại rồi tìm hiểu xem từng phần trong code ý nó có mục đích là gì chứ đừng nên copy và paste một cách máy móc mà mình chả hiểu được code ý nó viết gì.
Đối với mảng, chỉ có thể lưu nhiều thông tin có cùng kiểu dữ liệu. Nhưng với structure ta có thể lưu thông tin có nhiều kiểu dữ liệu khác nhau.
Như VD trên, để xây dựng 1 kiểu cấu trúc ta thực hiện theo cú pháp:
1 2 3 4 | struct tên _kiểu_cấu_trúc { Khai báo các thành phần của kiểu; }; |
Sau khi có kiểu cấu trúc rồi thì cái kiểu đó nó tương tự như 1 kiểu bình thường (int, float, char,…) và ta chỉ việc khai báo biến nữa là xong. Tuy nhiên khai báo biến thì cần có thêm từ khóa struct ở trước: trong C++ thì không cần.
struct tên_kiểu_cấu_trúc tên_biến_cấu trúc;
Ngoài ta chúng ta còn một số cách xây dựng kiểu cấu trúc và khai báo biến cấu trúc như sau:
1 2 3 4 | struct tên _kiểu_cấu_trúc { Khai báo các thành phần của kiểu; } danh sách các biến thuộc kiểu cấu trúc ; |
Hoặc
1 2 3 4 | struct { Khai báo các thành phần của kiểu; } danh sách các biến thuộc kiểu cấu trúc ; |
Với cách khai báo này, ta bắt buộc phải khai báo các biến cấu trúc ở ngay sau cấu trúc vì không có tên kiểu cấu trúc để cho ta khai báo ở các vị trí khác nữa.
Trong phần này ta cần đề cập đến 1 từ khóa quan trọng nữa, đó là typedef. Từ khóa này dùng để định nghĩa 1 kiểu dữ liệu mới.
1 2 3 4 5 | typedef struct sinhvien { char MSV[20]; // ma sinh vien char hoten[30]; // ho ten sinh vien double toan, tin, anh; // cac diem toan, tin, anh } kieuSinhVien; |
Khi này ta có kieuSinhVien là 1 kiểu dữ liệu (như int, double, …) và ta có thể khai báo các biến cấu trúc thông qua nó. Trong này có vài điều các bạn cần chú ý:
Ngoài ra ta còn có thể khai báo kiểu cấu trúc lồng nhau: VD như trong 1 sinh viên có ngày sinh, trong ngày sinh lại có ngày, tháng, năm sinh.
01 02 03 04 05 06 07 08 09 10 | struct ngaysinh { int ngay, thang, nam; }; typedef struct sinhvien { char MSV[20]; // ma sinh vien char hoten[30]; // ho ten sinh vien double toan, tin, anh; // cac diem toan, tin, anh struct ngaysinh ns; } kieuSinhVien; |
Hoặc ta khai báo ngay trong cấu trúc:
1 2 3 4 5 6 7 8 | typedef struct sinhvien { char MSV[20]; // ma sinh vien char hoten[30]; // ho ten sinh vien double toan, tin, anh; // cac diem toan, tin, anh struct ngaysinh { int ngay, thang, nam; } ns; } kieuSinhVien; |
Để truy nhập đến thành phần của cấu trúc ta sử dụng toán tử chấm (.).
Tên_cấu_trúc . tên_thành_phần;
Như VD trên ta truy cập như sau:
sv1.hoten; sv1.toan; // truy xuất tới họ tên, điểm toán
sv1.ns.ngay; sv1.ns.thang; // truy xuất tới ngày sinh và tháng sinh.
…
Khi đã truy xuất được tới các thành phần của cấu trúc thì mỗi thành phần đó là 1 biến bình thường và ta gán giá trị hoặc nhập xuất giá trị cho chúng như cách bình thường mà chúng ta vẫn làm.
Ngoài ra nếu thành phần nào đó dài dòng thì ta có thể tránh việc dài dòng này bằng cách sử dụng từ khóa define.
VD thay vì viết:
1 2 | sv1.ns.thang; sv1.ns.nam; |
Ta viết:
1 2 3 | #define p sv1.ns p.thang; p.nam; |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <stdio.h> #include <stdlib.h> struct sinhvien { char MSV[20]; // ma sinh vien char hoten[30]; // ho ten sinh vien double toan, tin, anh; // cac diem toan, tin, anh }; int main() { /* khai bao 2 bien sv1, sv2 va 1 mang struct sinhvien sv1, sv2, CNPMK10A[100]; printf("Nhap du lieu cho sv1:\n"); printf("MSV: "); fflush(stdin); gets(sv1.MSV); printf("Ho ten: "); fflush(stdin); gets(sv1.hoten); printf("Diem toan, tin, anh: "); fflush(stdin); scanf("%lf %lf %lf", &sv1.toan, &sv1.tin, &sv1.anh); sv2 = sv1; // gan gia tri cua sv1 cho sv2 printf("\n --------- Thong tin sinh vien -----\n"); printf("%-20s %-30s %-7s %-7s %-7s\n", "MSV", "Ho ten", "Toan", "Tin", "Anh"); printf("%-20s %-30s %-7.2lf %-7.2lf %-7.2lf\n", sv2.MSV, sv2.hoten, sv2.toan, sv2.tin, sv2.anh); return 0; } |
Sau khi gán sv2 = sv1 thì mọi thông tin của sv1 có thì sv2 cũng có.
Ngoài ra ta còn có thể gán giá trị khởi đầu cho cấu trúc.
struct sinhvien sv1 = {“ABC”, “Doan Trung Anh”, 9, 9, 8, {22, 9, 1997}};
Khi đó ta có các dữ liệu ban đầu của sv1 là:
1 2 3 4 5 6 | MSV: ABC hoten: Doan Trung Anh toan: 9 tin: 9 anh: 8 ngay sinh: 22/9/1997. |