Bài giảng Lập trình nâng cao: Bài 10+11+12 Kiểu cấu trúc (struct) và kiểu hợp nhất (union) cung cấp cho người học những kiến thức như: Các kiểu dữ liệu tự tạo; Cấu trúc (struct); Khai báo; Phép toán; Trường bit; Kích cỡ của struct; Bài tập struct; Hợp nhất (union); Liệt kê (enum); Cấu trúc tự trỏ và danh sách
LẬP TRÌNH NÂNG CAO Bài 10+11+12: Kiểu cấu trúc (struct) kiểu hợp (union) TRƯƠNG XUÂN NAM Nội dung Các kiểu liệu tự tạo Cấu trúc (struct) 4 Khai báo Phép tốn Trường bit Kích cỡ struct Bài tập struct Hợp (union) Liệt kê (enum) Cấu trúc tự trỏ danh sách Bài tập Trương Xuân Nam - Khoa CNTT Phần Các kiểu liệu tự tạo Trương Xuân Nam - Khoa CNTT Các kiểu liệu tự tạo ▪ Kiểu liệu: quy định loại liệu ghi biến ▪ Có tính quy ước, liệu ghi dạng byte / bit ▪ Xác định cách thức xử lý giá trị tham gia tính tốn ▪ Các ngơn ngữ lập trình cung cấp số kiểu liệu (số nguyên, số thực, logic,…) ▪ Cũng kiểu liệu thường dùng sống ▪ Cuộc sống có nhiều kiểu liệu phức tạp hơn: ▪ ▪ ▪ ▪ ▪ Phân số: tử số (số thực) + mẫu số (số thực) Số phức: phần thực (số thực) + phần ảo (số thực x i) Ngày: ngày (số nguyên) + tháng (số nguyên) + năm (số nguyên) Giờ: (số nguyên) + phút (số nguyên) + giây (số nguyên) +… Thời gian: Ngày + Giờ Trương Xuân Nam - Khoa CNTT Tự tạo kiểu liệu ▪ Các kiểu liệu phức tạp thường tổ hợp từ loại từ loại tổ hợp đơn giản ▪ Khơng ngơn ngữ lập trình cung cấp loại liệu cần thiết cho nhu cầu thực tiễn ▪ C/C++ cung cấp chế cho phép lập trình viên tự tạo kiểu liệu ▪ ▪ ▪ ▪ Cấu trúc (struct) Hợp (union) Liệt kê (enum) Lớp (class) ▪ Chúng ta thực tế sử dụng nhiều kiểu liệu tự tạo (string, vector,…) Trương Xuân Nam - Khoa CNTT Phần Cấu trúc (struct) Trương Xuân Nam - Khoa CNTT Đặt vấn đề: xét toán cụ thể ▪ Quản lý liệu thời gian (ngày tháng năm) ▪ Cách làm thông thường: biến lưu ngày, tháng, năm ▪ Mỗi có liệu ngày tháng cần khai báo thêm ▪ Truyền thông tin vào hàm? Dùng tham số ▪ Trả kết từ hàm? Không làm ▪ Nhận xét ▪ Đặt tên biến nhập nhằng, khó quản lý, phải có quy tắc riêng ▪ Truyền tham số cho hàm dài dịng ▪ Tìm kiếm, xếp, chép,… khó khăn ▪ Giải pháp C/C++: Gom thông tin tạo thành kiểu liệu Dữ liệu kiểu cấu trúc Khai báo struct ▪ Cú pháp sử dụng struct: struct { }; ▪ Sau khao báo struct, ta có kiểu liệu mới, trùng tên với struct ▪ Ví dụ: struct ThoiGian { int ngay, thang, nam; }; ThoiGian homnay; homnay.ngay = 3; homnay.thang = 4; homnay.nam = 2021; // kiểu liệu ThoiGian // thành phần // // // // biến kiểu ThoiGian thành phần ngày = thành phần tháng = thành phần năm = 2021 TRƯƠNG XUÂN NAM Khai báo struct // khai báo kiểu ĐIỂM biến struct DIEM { int x; int y; } diem1, diem2; // khai báo biến riêng rẽ struct DIEM diem3, diem4; // khai báo biến C++ bỏ struct DIEM diem5, diem6; TRƯƠNG XUÂN NAM Khai báo struct // khai báo kiểu gián tiếp typedef typedef struct { int x; int y; } POINT; // khai báo biến với định kiểu typedef struct POINT p1, p2; // khai báo khởi trị struct POINT { int x; int y; } p3 = { 123, 456 }, p4; TRƯƠNG XUÂN NAM 10 Liệt kê (enum) ▪ Kiểu liệt kê tập hợp số nguyên đặt tên ▪ Cú pháp: enum { }; ▪ Ví dụ: // kiểu Ngày, liệt kê ngày tuần // giá trị số trình dịch tự chọn enum Ngay { chunhat, thu2, thu3, thu4, thu5, thu6, thu7 }; // kiểu Giới tính, liệt kê giới tính khai báo // xác định vài giá trị // số KhongKhaiBao tự động chọn enum GioiTinh { Nam = 1, Nu = 2, KhongKhaiBao }; // kiểu Bài tập, liệt kê loại tập giao enum BaiTap { mot_tiet, giua_ky, cuoi_ky, do_an }; TRƯƠNG XUÂN NAM 30 Liệt kê (enum) ▪ Thay dùng kiểu liệt kê, lập trình viên tự định nghĩa số ▪ Nhưng kiểu liệt kê gom số có mối quan hệ thành nhóm, giúp viết mã sáng, dễ hiểu hơn, ▪ Ví dụ: GioiTinh abc = Nam; switch (abc) { case Nam: cout số phần tử danh sách void insertNode(Node * & head, string value, int n) { Node **ptr = &head; while (n > 0) { if (nullptr == *ptr) break; ptr = &((*ptr)->next); n ; } *ptr = createNode(value, *ptr); } TRƯƠNG XUÂN NAM 40 Cấu trúc tự trỏ: ứng dụng vào danh sách (list) // xóa giá trị thứ n danh sách // khơng làm n > số phần tử danh sách void deleteNode(Node * & head, int n) { if (nullptr == head) return; Node **ptr = &head; for (int i = 0; i < n; i++) { ptr = &((*ptr)->next); if (nullptr == *ptr) return; } Node * c = *ptr; *ptr = c->next; delete c; } TRƯƠNG XUÂN NAM 41 Phần Bài tập TRƯƠNG XUÂN NAM 42 Bài tập phần struct union TRƯƠNG XUÂN NAM 43 Bài tập phần danh sách liên kết: viết hàm TRƯƠNG XUÂN NAM 44 ... &((*ptr )-> next); if (nullptr == *ptr) return; } Node * c = *ptr; *ptr = c->next; delete c; } TRƯƠNG XUÂN NAM 41 Phần Bài tập TRƯƠNG XUÂN NAM 42 Bài tập phần struct union TRƯƠNG XUÂN NAM 43 Bài tập... Borland C++ mặc định TRƯƠNG XUÂN NAM 17 Phần Bài tập struct TRƯƠNG XUÂN NAM 18 Hãy tự tạo vài kiểu liệu TRƯƠNG XUÂN NAM 19 Bài tập ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ Dữ liệu kiểu cấu trúc Bài tập ▪ ▪ ▪ ▪ ▪ ▪ ▪... Trường bit Kích cỡ struct Bài tập struct Hợp (union) Liệt kê (enum) Cấu trúc tự trỏ danh sách Bài tập Trương Xuân Nam - Khoa CNTT Phần Các kiểu liệu tự tạo Trương Xuân Nam - Khoa CNTT Các kiểu liệu