Bài giảng Nhập môn lập trình - Chủ đề 6: Dữ liệu kiểu cấu trúc
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Nhập môn lập trình - Chủ đề 6: Dữ liệu kiểu cấu trúc", để 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_nhap_mon_lap_trinh_chu_de_6_du_lieu_kieu_cau_truc.pdf
Nội dung text: Bài giảng Nhập môn lập trình - Chủ đề 6: Dữ liệu kiểu cấu trúc
- NHẬP MÔN LẬP TRÌNH DỮ LIỆU KIỂU CẤU TRÚC 1
- Nội dung 1 Khái niệmkiểucấu trúc (struct) 2 Khai báo & truy xuấtkiểucấutrúc 3 Kiểudữ liệuhợpnhất (union) 4 Bài tập Dữ liệukiểucấu trúc 2
- Đặtvấn đề Thông tin 1 SV MSSV : kiểuchuỗi Tên SV : kiểuchuỗi NTNS : kiểuchuỗi Phái : kiểukýtự Điểm Toán, Lý, Hóa : kiểusố 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ệukiểucấu trúc 3
- Đặtvấn đề Khai báo các biến để lưu trữ 1 SV char mssv[7]; // “0012078” char hoten[30]; // “Nguyen Van A” char ntns[8]; // “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ệukiểucấu trúc 4
- Đặtvấn đề Nhậnxét Đặttênbiếnkhókhăn và khó quảnlý Truyềnthamsố cho hàm quá nhiều Tìm kiếm, sắpxếp, sao chép, khó khăn Tốn nhiềubộ nhớ Ý tưởng Gom những thông tin của cùng 1 SV thành mộtkiểudữ liệumới => Kiểu struct Dữ liệukiểucấu trúc 5
- Khai báo kiểucấutrúc Cú pháp struct { ; ; }; Ví dụ struct DIEM { int x; int y; }; Dữ liệukiểucấu trúc 6
- Khai báo biếncấutrúc Cú pháp tường minh struct { ; ; } , ; Ví dụ struct DIEM { int x; int y; } diem1, diem2; Dữ liệukiểucấu trúc 7
- Khai báo biếncấutrú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ệukiểucấu trúc 8
- Sử dụng typedef Cú pháp typedef struct { ; ; } ; ; Ví dụ Dữ liệukiểucấu trúc 9
- Khởitạochobiếncấutrúc Cú pháp tường minh struct { ; ; } = { , , }; Ví dụ struct DIEM { int x; int y; } diem1 = {2912, 1706}, diem2; Dữ liệukiểucấu trúc 10
- Truy xuấtdữ liệukiểucấutrúc Đặc điểm Không thể truy xuấttrựctiếp Thông qua toán tử thành phầncấutrúc. hay còn gọilà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ệukiểucấu trúc 11
- Gán dữ liệukiểucấutrú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ệukiểucấu trúc 12
- Cấutrúcphứctạp Thành phầncủacấutrúclàcấutrúckhá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ệukiểucấu trúc 13
- Cấutrúcphứctạp Thành phầncủacấutrúclà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ệukiểucấu trúc 14
- Cấutrúcphứctạp Cấutrúcđệ quy (tự trỏ) struct PERSON { char hoten[30]; struct PERSON *father, *mother; }; struct NODE { int value; struct NODE *pNext; }; Dữ liệukiểucấu trúc 15
- Cấutrúcphứctạp Thành phầncủacấutrúccókíchthướ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ệukiểucấu trúc 16
- 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ệukiểucấu trúc 17
- Chỉ thị #pragma pack Chỉ thị #pragma pack (n) n = 1, 2, 4, 8, 16 (byte) Biên lớnnhấtcủacácthànhphầ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ấutrúc #pragma pack(push, 1) struct MYSTRUCT { }; #pragma pack(pop) Dữ liệukiểucấu trúc 18
- #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ệukiểucấu trúc 19
- Các lưu ý về cấutrúc Lưu ý Kiểu cấutrúcđược định nghĩa để làm khuôn dạng còn biến cấutrú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ặcsử dụng typedef) Khi nhậpcácbiếnkiểusố thực trong cấutrúc phảinhập thông qua mộtbiến trung gian. struct DIEM { float x, y;} d1; float temp; scanf(“%f”, &temp); d1.x = temp; Dữ liệukiểucấu trúc 20
- Mảng cấutrúc Mảng cấutrúc Tương tự như mảng vớikiểudữ liệucơ sở (char, int, float, ) struct DIEM { int x; int y; }; DIEM mang1[20]; DIEM mang2[10] = {{3, 2}, {4, 4}, {2, 7}}; Dữ liệukiểucấu trúc 21
- Truyềncấutrúcchohàm Truyềncấutrúcchohàm Giống như truyềnkiểudữ liệucơ sở •Thamtrị (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ệukiểucấu trúc 22
- Hợpnhất – union Khái niệm Được khai báo và sử dụng như cấutrúc Các thành phầncủa union có chung địa chỉ đầu (nằmchồng lên nhau trong bộ nhớ) Khai báo union { ; ; }; Dữ liệukiểucấu trúc 23
- 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; 01234 0123 01 02 00 00 00 0102 00 00 00 c n c n Dữ liệukiểucấu trúc 24
- 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ệukiểucấu trúc 25
- Ví dụ union trong struct struct generic_tag { char type; union { char c; int i; float f; } share_tag; }; Dữ liệukiểucấu trúc 26
- Bài tập Phân số Khai báo kiểudữ liệuphânsố (PHANSO) Nhập/Xuấtphânsố Rút gọnphânsố Tính tổng, hiệu, tích, thương hai phân số Kiểmtraphânsố tốigiản Quy đồng hai phân số Kiểmtraphânsố âm hay dương So sánh hai phân số Dữ liệukiểucấu trúc 27
- Bài tập Đơn thức Khai báo kiểudữ 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ấp1 của đơn thức Tính đạo hàm cấpk của đơn thức Tính giá trịđơn thứctạix = x0 Dữ liệukiểucấu trúc 28
- Bài tập Đathức Khai báo kiểudữ 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ấp1 của đa thức Tính đạo hàm cấpk của đa thức Tính giá trịđơn thứctạix = x0 Dữ liệukiểucấu trúc 29
- Bài tập Điểmtrongmặtphẳng Oxy Khai báo kiểudữ liệu điểm (DIEM) Nhập/Xuấttọa độ điểm Tính khoảng cách giữahaiđiểm Tìm điểm đối xứng qua gốctoạđộ/trụcOx/Oy Kiểmtrađiểmthuộcphầntư nào? Tam giác Khai báo kiểudữ 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ệukiểucấu trúc 30
- Bài tập Ngày Khai báo kiểudữ liệu ngày (NGAY) Nhập/Xuất ngày (ngày, tháng, năm) Kiểmtrană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ữahaingày So sánh hai ngày Dữ liệukiểucấu trúc 31
- Bài tập Mảng phân số Nhập/Xuấtn phânsố Rút gọnmọiphânsố Đếmsố 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ớnnhấttrongmảng Sắpxếpmảng tăng dần/giảmdần Dữ liệukiểucấu trúc 32
- Bài tập Mảng điểm Nhập/Xuấtn điểm Đếmsố lượng điểmcóhoànhđộ dương Đếmsố lượng điểm không trùng vớicácđiểm khác trong mảng Tìm điểmcóhoànhđộ lớnnhất/nhỏ nhất Tìm điểmgầngốctọa độ nhất Dữ liệukiểucấu trúc 33