Kĩ thuật lập trình - Chương 2: Kiểu dữ liệu có cấu trúc

Khái niệm Khai báo Cách truy xuất thành phần bên trong cấu trúc Xử lý cấu trúc đơn Xử lý mảng có cấu trúc Bài tập

pdf41 trang | Chia sẻ: thuychi16 | Lượt xem: 692 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Kĩ thuật lập trình - Chương 2: Kiểu dữ liệu có cấu trúc, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
VÕ QUANG HOÀNG KHANG Email: vqhkhang@gmail.com CHƯƠNG 2. KIỂU DỮ LIỆU CÓ CẤU TRÚC #2 NỘI DUNG Khái niệm Khai báo Cách truy xuất thành phần bên trong cấu trúc Xử lý cấu trúc đơn Xử lý mảng có cấu trúc Bài tập #3 KHÁI NIỆM Kiểu dữ liệu có cấu trúc là kiểu dữ liệu do lập trình viên tự định nghĩa bằng cách gom nhóm các kiểu dữ liệu cơ bản có sẵn trong C thành một kiểu dữ liệu phức hợp gồm nhiều thành phần: Khai báo struct tên_struct { khai báo các thuộc tính; }; typedef struct tên_struct TênKDL; #4 KHÁI NIỆM Ví dụ khai báo kiểu dữ liệu lưu thông tin của ngày: struct ttDate { char thu[10]; int ngay; int thang; int nam; }; typedef struct ttDate Date; #5 TRUY CẬP CÁC THUỘC TÍNH CẤU TRÚC Biến kiểu cấu trúc TÊNKDL tên_biến; tên_biến.tên_thuộc_tính; Ví dụ Date x; x.ngay = 5; #6 TRUY CẬP CÁC THUỘC TÍNH CẤU TRÚC Biến con trỏ kiểu cấu trúc TÊNKDL *tên_biến_con_trỏ; tên_biến_con_trỏ -> tên_thuộc_tính; Ví dụ: Date *x ; x = (Date*) malloc(sizeof(Date)); x -> ngay = 5 ; #7 KHAI BÁO ĐỆ QUY struct tên_struct { khai báo các thuộc tính; struct tên_struct *tên_thuộc_tính_đệ_qui; }; #8 KHAI BÁO ĐỆ QUY Ví dụ: struct ttNode { int key; struct ttNode *pNext; }; #9 VÍ DỤ Viết chương trình nhập vào toạ độ hai điểm trong mặt phẳng và tính tổng hai toa ̣ độ này struct ttDiem { int x; int y; }; typedef struct ttDiem Diem; #10 VÍ DỤ void Nhap (Diem &d) { printf(“\nNhap vao toa do diem\n”); printf(“Hoanh do : “); scanf(“%d”, &d. x); printf(“Tung do : ”) scanf(“%d”, &d.y); } #11 VÍ DỤ void Xuat (Diem d) { printf(“\nToa do diem : (%d, %d)”, d.x, d.y); } Diem Tong (Diem d1, Diem d2) { Diem temp; temp.x = d1.x + d2.x ; temp.y = d1.y + d2.y ; return temp; } #12 VÍ DỤ int main () { Diem A , B, AB; //khai bao 3 diem A, B, AB; Nhap (A); Xuat (A); Nhap (B); Xuat (B); printf(“\n Tong cua hai diem vua nhap la : ”); AB = Tong (A, B); Xuat (AB); return 0; } #13 BÀI TẬP 1 Viết chương trình nhập vào thông tin của một sinh viên gồm: Mã số sinh viên Họ và tên Điểm giữa kỳ (GK) Điểm thực hành (TH) Điểm lý thuyết (LT) Điểm tổng kết Tính điểm tổng kết môn theo công thức: GK*10%+TH*30%+LT*60% #14 BÀI TẬP 2 Sử dụng kiểu dữ liệu có cấu trúc để khai báo và viết chương trình (theo phương pháp thủ tục hàm) gồm các chức năng sau: 1. Nhập vào 2 phân số 2. Tính tổng và tích hai phân số (kết quả phải là phân số tối giản) 3. Xuất kết quả ra màn hình #15 BÀI TẬP 3 Viết chương trình nhập vào 2 thời gian t1 và t2 (thông tin thời gian gồm: giờ, phút và giây); tính khoảng cách giữa t1 và t2 (đơn vị tính bằng giây) #16 MẢNG CẤU TRÚC Cách khai báo tương tự như mảng một chiều (Kiểu dữ liệu bây giờ là kiểu dữ liệu có cấu trúc). Cách truy cập phần tử trong mảng cũng như truy cập trên mảng một chiều. Nhưng do từng phần tử có kiểu cấu trúc nên phải chỉ định rõ cần lấy thành phần nào, tức là phải truy cập đến thành phần cuối cùng có kiểu là dữ liệu cơ bản #17 NGUYÊN TẮC LẬP TRÌNH TRÊN MẢNG CẤU TRÚC Do kiểu dữ liệu có cấu trúc thường chứa rất nhiều thành phần nên khi viết chương trình loại này ta cần lưu ý: Xây dựng hàm xử ý cho một kiểu cấu trúc. Muốn xử lý cho mảng cấu trúc, ta gọi lại hàm xử lý cho một kiểu cấu trúc đã được xây dựng bằng cách dùng vòng lặp. 17 #18 VÍ DỤ Viết hàm nhập vào mảng các phân số typedef struct ttPhanSo { int tu, mau; }PhanSo; #19 VÍ DỤ void NhapPS(PhanSo &ps) { printf("Nhap tu so: "); scanf("%d ”, , &ps.tu); printf("\nNhap mau so: “); scanf(“%d”, &ps.mau); } #20 VÍ DỤ void NhapMangPS(PHANSO dsps[], int n) { for(int i=0; i<n; i++) { printf(”\nNhap vao phan so thu %d: “, i+1); NhapPS(dsps[i]); } } #21 BÀI TẬP 4 4.1. Viết chương trình nhập vào mảng các phân số, cho biết phân số có giá trị lớn nhất trong mảng 4.2. Viết chương trình nhập vào danh sách các mặt hàng, in ra mặt hàng có xuất xứ “VietNam”, biết thông tin mặt hàng gồm: - Mã mặt hàng - Tên mặt hàng - Đơn giá - Xuất xứ VÕ QUANG HOÀNG KHANG Email: vqhkhang@gmail.com CHƯƠNG 2(tt). KIỂU DỮ LIỆU CÓ CẤU TRÚC #23 MỘT SỐ LƯU Ý Khởi tạo cho biến cấu trúc Truy xuất thành phần bên trong cấu trúc Gán dữ liệu kiểu cấu trúc Cấu trúc lồng nhau Kích thước của struct Bài tập #24 KHỞI TẠO CHO BIẾN CẤU TRÚC Cú pháp khai báo Ví dụ struct { ; ; } = {,,}; struct DIEM { int x; int y; } diem1 = {2912, 1706}, diem2; #25 TRUY XUẤT DỮ LIỆU KIỂU CẤU TRÚC Đặc điểm Không thể truy xuất trực tiếp  Thông qua toán tử thành phần cấu trúc . hay còn gọi là toán tử chấm (dot operation) Ví dụ . struct DIEM { int x; int y; } diem1; printf(“x = %d, y = %d”, diem1.x, diem1.y); #26 GÁN DỮ LIỆU KIỂU CẤU TRÚC Có 2 cách Ví dụ = ; . = ; struct DIEM { int x, y; } diem1 = {2912, 1706}, diem2; diem2 = diem1; diem2.x = diem1.x; diem2.y = diem1.y * 2; #27 CẤU TRÚC PHỨC TẠP Thành phần của cấu trúc là cấu trúc khác struct DIEM { int x; int y; }; struct HINHCHUNHAT { struct DIEM traitren; struct DIEM phaiduoi; } hcn1; hcn1.traitren.x = 2912; hcn1.traitren.y = 1706; #28 CẤU TRÚC PHỨC TẠP Thành phần của cấu trúc là mảng struct SINHVIEN { char hoten[30]; float toan, ly, hoa; } sv1; strcpy(sv1.hoten, “Nguyen Van A”); sv1.toan = 10; sv1.ly = 6.5; sv1.hoa = 9; #29 CẤU TRÚC PHỨC TẠP Cấu trúc đệ quy (tự trỏ) struct PERSON { char hoten[30]; struct PERSON *father, *mother; }; struct NODE { int value; struct NODE *pNext; }; #30 CẤU TRÚC PHỨC TẠP Thành phần của cấu trúc có kích thước theo bit struct bit_fields { int bit_0 : 1; int bit_1_to_4 : 4; int bit_5 : 1; int bit_6_to_15 : 10; }; 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 #31 KÍCH THƯỚC CỦA STRUCT Ví dụ struct A { int a; double b; }; sizeof(A) = ??? struct B1 { int a; int b; double c; }; sizeof(B1) = ??? struct B2 { int a; double c; int b; }; sizeof(B2) = ??? #32 Chỉ thị #pragma pack Chỉ thị #pragma pack (n)  n = 1, 2, 4, 8, 16 (byte) Biên lớn nhất của các thành phần trong struct BC n mặc định là 1 VC++ n mặc định là 8  Project settings  Compile Option C/C++  Code Generation  Structure Alignment Canh biên cho 1 cấu trúc #pragma pack(push, 1) struct MYSTRUCT { }; #pragma pack(pop) #33 #pragma pack Ví dụ: không có #pragma pack (1) struct A { double a; int b; int c; }; struct B { int b; double a; int c; }; struct C { int b; int c; double a; }; a a a a a a a a b b b b c c c c b b b b đệm 4B a a a a a a a a c c c c đệm 4B b b b b c c c c a a a a a a a a #34 CÁC LƯU Ý VỀ CẤU TRÚC Lưu ý Kiểu cấu trúc được định nghĩa để làm khuôn dạng còn biến cấu trúc được khai báo để sử dụng khuôn dạng đã định nghĩa.  Trong C++, có thể bỏ từ khóa struct khi khai báo biến (hoặc sử dụng typedef) Khi nhập các biến kiểu số thực trong cấu trúc phải nhập thông qua một biến trung gian. NMLT - Cấu trúc struct DIEM { float x, y;} d1; float temp; scanf(“%f”, &temp); d1.x = temp; #35 MẢNG CẤU TRÚC Mảng cấu trúc  Tương tự như mảng với kiểu dữ liệu cơ sở (char, int, float, ) struct DIEM { int x; int y; }; DIEM mang1[20]; DIEM mang2[10] = {{3, 2}, {4, 4}, {2, 7}}; #36 TRUYỀN CẤU TRÚC CHO HÀM Truyền cấu trúc cho hàm Giống như truyền kiểu dữ liệu cơ sở  Tham trị (không thay đổi sau khi kết thúc hàm)  Tham chiếu Con trỏ Ví dụ struct DIEM { int x, y; }; void xuat1(int x, int y) { }; void xuat2(DIEM diem) { }; void xuat3(DIEM &diem) { }; void xuat4(DIEM *diem) { }; #37 KIỂU UNION Khái niệm Được khai báo và sử dụng như cấu trúc Các thành phần của union có chung địa chỉ đầu (nằm chồng lên nhau trong bộ nhớ) Khai báo union { ; ; }; #38 0 1 2 3 4 SO SÁNH STRUCT VÀ UNION Ví dụ struct MYSTRUCT { char c; int n; } s; s.c = 1; s.n = 2; union MYUNION { char c; int n; } u; u.c = 1; u.n = 2; 01 02 00 00 00 c n c n 0 1 2 3 012 00 00 00 #39 Ví dụ struct trong union union date_tag { char full_date[9]; struct part_date_tag { char month[2]; char break_value1; char day[2]; char break_value2; char year[2]; }; } date = {“29/12/89”}; #40 Ví dụ union trong struct struct generic_tag { char type; union share_tag { char c; int i; float f; }; }; #41 Q&A
Tài liệu liên quan