Bài giảng Nhập môn lập trình - Chủ đề 6: Dữ liệu kiểu cấu trúc

pdf 33 trang phuongnguyen 7550
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:

  • pdfbai_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

  1. NHẬP MÔN LẬP TRÌNH DỮ LIỆU KIỂU CẤU TRÚC 1
  2. 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
  3. Đặ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
  4. Đặ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
  5. Đặ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
  6. 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
  7. 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
  8. 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
  9. Sử dụng typedef ™Cú pháp typedef struct { ; ; } ; ; ™Ví dụ Dữ liệukiểucấu trúc 9
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. #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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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