Bài giảng Kĩ thuật lập trình - Chương 18: Dữ liệu kiểu cấu trúc - Đặng Bình Phương
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kĩ thuật lập trình - Chương 18: Dữ liệu kiểu cấu trúc - Đặng Bình Phương", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_ki_thuat_lap_trinh_chuong_18_du_lieu_kieu_cau_truc.ppt
Nội dung text: Bài giảng Kĩ thuật lập trình - Chương 18: Dữ liệu kiểu cấu trúc - Đặng Bình Phương
- Bộ môn Công nghệ phần mềm Khoa Công nghệ thông tin Trường Đại học Khoa học Tự nhiên KỸ THUẬT LẬP TRÌNH ThS. Đặng Bình Phương dbphuong@fit.hcmus.edu.vn DỮ LIỆU KIỂU CẤU TRÚC 1
- & VC BB Nội dung 1 Khái niệm kiểu cấu trúc (struct) 2 Khai báo & truy xuất kiểu cấu trúc 3 Kiểu dữ liệu hợp nhất (union) 4 Bài tập Dữ liệu kiểu cấu trúc 2
- & VC BB Đặt vấn đề ❖Thông tin 1 SV ▪ MSSV: kiểu chuỗi ▪ Tên SV: kiểu chuỗi ▪ NTNS: kiểu chuỗi ▪ Phái: kiểu ký tự ▪ Điểm Toán, Lý, Hóa: kiểu số thực ❖Yêu cầu ▪ Lưu thông tin n SV? ▪ Truyền thông tin n SV vào hàm? Dữ liệu kiểu cấu trúc 3
- & VC BB Đặt vấn đề ❖Khai báo các biến để lưu trữ 1 SV ▪ char mssv[8]; // “0012078” ▪ char hoten[30]; // “Nguyen Van A” ▪ char ntns[9]; // “29/12/82” ▪ char phai; // ‘n’ ▪ float toan, ly, hoa;// 8.5 9.0 10.0 ❖Truyền thông tin 1 SV cho hàm ▪ void xuat(char *mssv, char *hoten, char *ntns, char phai, float toan, float ly, float hoa); Dữ liệu kiểu cấu trúc 4
- & VC BB Đặt vấn đề ❖Nhận xét ▪ Đặt tên biến khó khăn và khó quản lý ▪ Truyền tham số cho hàm quá nhiều ▪ Tìm kiếm, sắp xếp, sao chép, khó khăn ▪ Tốn nhiều bộ nhớ ▪ ❖Ý tưởng ▪ Gom những thông tin của cùng 1 SV thành một kiểu dữ liệu mới => Kiểu struct Dữ liệu kiểu cấu trúc 5
- & VC BB Khai báo kiểu cấu trúc ❖Cú pháp struct { ; ; }; ❖Ví dụ struct DIEM { int x; int y; }; Dữ liệu kiểu cấu trúc 6
- & VC BB Khai báo biến cấu trúc ❖Cú pháp tường minh struct { ; ; } , ; ❖Ví dụ struct DIEM { int x; int y; } diem1, diem2; Dữ liệu kiểu cấu trúc 7
- & VC BB Khai báo biến cấu trúc ❖Cú pháp không tường minh struct { ; ; }; struct ; ❖Ví dụ struct DIEM { int x; int y; }; struct DIEM diem1, diem2;// C++ có thể bỏ struct Dữ liệu kiểu cấu trúc 8
- & VC BB Sử dụng typedef ❖Cú pháp typedef struct { ; ; } ; ; ❖Ví dụ typedef struct { int x; int y; } DIEM; struct DIEM diem1, diem2; Dữ liệu kiểu cấu trúc 9
- & VC BB Khởi tạo cho biến cấu trúc ❖Cú pháp tường minh struct { ; ; } = { , , }; ❖Ví dụ struct DIEM { int x; int y; } diem1 = {2912, 1706}, diem2; Dữ liệu kiểu cấu trúc 10
- & VC BB 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); Dữ liệu kiểu cấu trúc 11
- & VC BB 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; Dữ liệu kiểu cấu trúc 12
- & VC BB 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; Dữ liệu kiểu cấu trúc 13
- & VC BB 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; Dữ liệu kiểu cấu trúc 14
- & VC BB 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; }; Dữ liệu kiểu cấu trúc 15
- & VC BB 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 Dữ liệu kiểu cấu trúc 16
- & VC BB Kích thước của struct ❖Ví dụ struct A { int a; double b; }; sizeof(A) = ??? struct B1 struct B2 { { int a; int a; int b; double c; double c; int b; }; }; sizeof(B1) = ??? sizeof(B2) = ??? Dữ liệu kiểu cấu trúc 17
- & VC BB 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) Dữ liệu kiểu cấu trúc 18
- & VC BB #pragma pack ❖Ví dụ: không có #pragma pack (1) struct A { double a; a a a a a a a a int b; int c; b b b b c c c c }; struct B { int b; b b b b đệm 4B double a; a a a a a a a a int c; }; c c c c đệm 4B struct C { int b; b b b b c c c c int c; double a; a a a a a a a a }; Dữ liệu kiểu cấu trúc 19
- & VC BB 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. struct DIEM { float x, y;} d1; float temp; scanf(“%f”, &temp); d1.x = temp; Dữ liệu kiểu cấu trúc 20
- & VC BB 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}}; Dữ liệu kiểu cấu trúc 21
- & VC BB 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) { }; Dữ liệu kiểu cấu trúc 22
- & VC BB Hợp nhất – 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 { ; ; }; Dữ liệu kiểu cấu trúc 23
- & VC BB So sánh struct và union ❖Ví dụ struct MYSTRUCT union MYUNION { { char c; char c; int n; int n; } s; } u; s.c = 1; s.n = 2; u.c = 1; u.n = 2; 0 1 2 3 4 0 1 2 3 01 02 00 00 00 0102 00 00 00 c n c n Dữ liệu kiểu cấu trúc 24
- & VC BB Ví dụ ❖struct trong union union date_tag { char full_date[9]; struct { char month[2]; char break_value1; char day[2]; char break_value2; char year[2]; } part_date_tag; } date = {“29/12/82”}; Dữ liệu kiểu cấu trúc 25
- & VC BB Ví dụ ❖union trong struct struct generic_tag { char type; union { char c; int i; float f; } share_tag; }; Dữ liệu kiểu cấu trúc 26
- & VC BB Bài tập ❖Phân số ▪ Khai báo kiểu dữ liệu phân số (PHANSO) ▪ Nhập/Xuất phân số ▪ Rút gọn phân số ▪ Tính tổng, hiệu, tích, thương hai phân số ▪ Kiểm tra phân số tối giản ▪ Quy đồng hai phân số ▪ Kiểm tra phân số âm hay dương ▪ So sánh hai phân số Dữ liệu kiểu cấu trúc 27
- & VC BB Bài tập ❖Đơn thức ▪ Khai báo kiểu dữ liệu đơn thức (DONTHUC) ▪ Nhập/Xuất đơn thức ▪ Tính tích, thương hai đơn thức ▪ Tính đạo hàm cấp 1 của đơn thức ▪ Tính đạo hàm cấp k của đơn thức ▪ Tính giá trị đơn thức tại x = x0 Dữ liệu kiểu cấu trúc 28
- & VC BB Bài tập ❖Đa thức ▪ Khai báo kiểu dữ liệu đa thức (DATHUC) ▪ Nhập/Xuất đa thức ▪ Tính tổng, hiệu, tích hai đa thức ▪ Tính đạo hàm cấp 1 của đa thức ▪ Tính đạo hàm cấp k của đa thức ▪ Tính giá trị đơn thức tại x = x0 Dữ liệu kiểu cấu trúc 29
- & VC BB Bài tập ❖Điểm trong mặt phẳng Oxy ▪ Khai báo kiểu dữ liệu điểm (DIEM) ▪ Nhập/Xuất tọa độ điểm ▪ Tính khoảng cách giữa hai điểm ▪ Tìm điểm đối xứng qua gốc toạ độ/trục Ox/Oy ▪ Kiểm tra điểm thuộc phần tư nào? ❖Tam giác ▪ Khai báo kiểu dữ lịêu tam giác (TAMGIAC) ▪ Nhập/Xuất tam giác ▪ Tính chu vi, diện tích tam giác Dữ liệu kiểu cấu trúc 30
- & VC BB Bài tập ❖Ngày ▪ Khai báo kiểu dữ liệu ngày (NGAY) ▪ Nhập/Xuất ngày (ngày, tháng, năm) ▪ Kiểm tra năm nhuận ▪ Tính số thứ tự ngày trong năm ▪ Tính số thứ tự ngày kể từ ngày 1/1/1 ▪ Tìm ngày trước đó, sau đó k ngày ▪ Tính khoảng cách giữa hai ngày ▪ So sánh hai ngày Dữ liệu kiểu cấu trúc 31
- & VC BB Bài tập ❖Mảng phân số ▪ Nhập/Xuất n phân số ▪ Rút gọn mọi phân số ▪ Đếm số lượng phân số âm/dương trong mảng ▪ Tìm phân số dương đầu tiên trong mảng ▪ Tìm phân số nhỏ nhất/lớn nhất trong mảng ▪ Sắp xếp mảng tăng dần/giảm dần Dữ liệu kiểu cấu trúc 32
- & VC BB Bài tập ❖Mảng điểm ▪ Nhập/Xuất n điểm ▪ Đếm số lượng điểm có hoành độ dương ▪ Đếm số lượng điểm không trùng với các điểm khác trong mảng ▪ Tìm điểm có hoành độ lớn nhất/nhỏ nhất ▪ Tìm điểm gần gốc tọa độ nhất Dữ liệu kiểu cấu trúc 33