Bài 7: Kiểu Cấu Trúc, Kiểu Liệt Kê

1040
  • Khai báo và sử dụng kiểu cấu trúc (structure)
  • Truyền biến kiểu cấu trúc vào hàm
  • Khai báo và sử dụng kiểu liệt kê (enumeration)

Kiểu Cấu Trúc

Định nghĩa biến kiểu cấu trúc

  • Ví dụ :

  • Struct: được dùng để định nghĩa một kiểu dữ liệu mới, card là tên của kiểu dữ liệu
  • Kiểu card – gồm có hai thành phần dữ liệu
  • Sau định nghĩa này, card được dùng để khai báo các biến của kiểu cấu trúc

Khai báo biến kiểu cấu trúc

  • Khai báo biến sau khi đã định nghĩa kiểu cấu trúc

  • Khai báo biến đồng thời với định nghĩa kiểu cấu trúc

  • Khai báo và khởi tạo cho biến cấu trúc

  • Chú ý:
    • Trong một cấu trúc, không được khai báo biến có kiểu cấu trúc là chính nó ngoại trừ biến con trỏ.

Truy xuất các phần tử của cấu trúc

  • Sử dụng “.” để truy xuất các thành phần của biến cấu trúc

  • Sử dụng “->” để truy xuất các thành phần của con trỏ cấu trúc

  • myCardPtr ->suit tương đương với ( *myCardPtr ).suit

Ví dụ : 

Gán các biến có cùng kiểu cấu trúc

  • 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”, “Nguyen Van A”, 9, 9, 8, {4, 5, 1992}};
  • Khi đó ta có các dữ liệu ban đầu của sv1 là:
MSV: ABC
hoten: Nguyen Van A
toan: 9
tin: 9
anh: 8
ngày sinh: 4/5/1992.

Mảng cấu trúc

Biểu diễn 50 sinh viên của 1 lớp học có kiểu cấu trúc như trên  :

Kết quả :

Nhap du lieu cho sinh vien thu 1:
MSV: DTC1
Ho ten: Pham Thi B
Diem TB: 9.2
Ngay sinh: 21/01/1993
Nhap du lieu cho sinh vien thu 2:
MSV: DTC2
Ho ten: Nguyen Van A
Diem TB: 9.2
Ngay sinh: 31/12/1992
MSV Họ Tên Điểm Trung Bình Ngày sinh
DTC1 Pham Thi B 9.2 21/01/1993
DTC2 Nguyen Van A 9.2 31/12/1992

Con trỏ cấu trúc

Truy cập các thành phần cấu trúc
Để truy cập để lấy dữ liệu các thành phần của con trỏ cấu trúc ta có 3 cách sau:

  • Cách 1: CNPMK10A[i].diemTB;
  • Cách 2: (*(CNPMK10A+i)).diemTB;
  • Cách 3: (CNPMK10A+i) ->diemTB;

Cả 3 cách trên đều truy cập tới DTB.

Để lấy địa chỉ ta cũng có 2 cách:

  • Cách 1: &CNPMK10A[i].DTB;
  • Cách 2: &(CNPMK10A+i)->diemTB

Kiểu Liệt Kê  Enumeration

  • Kiểu dữ liệu liệt kê dùng để tạo ra các kiểu dữ liệu chứa một cái gì đó hơi đặc biệt một chút, không phải kiểu số hay kiểu kí tự hoặc các hằng true và false. Dạng thức của nó như sau:

  • Lưu ý: giữa các giá trị trong enum được cách bằng dấu phẩy (,) chứ không phải là dấu chấm phải (;) đâu nhé. Không cẩn thận là chẳng biết đâu mà debug đâu Để minh họa mình cho 1 ví dụ minh họa, thông thường ví dụ cổ điển là tạo kiểu enum chứa các giá trị các ngày trong tuần

  • Bây giờ tôi muốn sử dụng nó thì sao nhỉ, còn chờ gì nữa, hãy làm tương tự như kiểu struct như thế này này:

/* tạo 3 biến HomQua, HomNay,NgayMai kiểu enum NgayTrongTuan
NgayTrongTuan HomQua,HomNay,NgayMai; */

  • Nãy giờ xem ví dụ, các bạn có để ý điều gì không nhỉ,à, thấy rồi, kiểu enum đơn giản là 1 tập hợp các const (hằng số),nó sẽ thay thế những hằng số vô hồn (2,3,..,8) bằng những chữ cái dễ nhớ.
    Thay vì ta ghi:
  • #define ThuHai 2
    #define ThuBa 3
  • thì ta có thể dùng kiểu enum như trên. Để hiểu hơn, chúng ta chơi thêm 1 ví dụ nữa nhé:

Chú ý rằng chúng ta không sử dụng bất kì một kiểu dữ liệu cơ bản nào trong phần khai báo. Chúng ta đã tạo ra một kiểu dữ liệu mới mà không dựa trên bất kì kiểu dữ liệu nào có sẵn: kiểu color, những giá trị có thể của kiểu color được viết trong cặp ngoặc nhọn {}
Trên thực tế kiểu dữ liệu liệt kê được dịch là một số nguyên và các giá trị của nó là các hằng số nguyên được chỉ định. Nếu điều này không đựoc chỉ định, giá trị nguyên tương đương với phần tử đầu tiên là 0 và các giá trị tiếp theo cứ thế tăng lên 1, Vì vậy, trong kiểu dữ liệu color mà chúng ta định nghĩa ở trên, white tương đương với 0, blue tương đương với 1, green tương đương với 2 và cứ tiếp tục như thế.
Nếu chúng ta chỉ định một giá trị nguyên cho một giá trị nào đó của kiểu dữ liệu liệt kê thì các giá trị tiếp theo sẽ là các giá trị nguyên tiếp theo.

Xem ngay phần 2 : Kiểu File trong C

BÌNH LUẬN

Please enter your comment!
Please enter your name here