Lập trình - Bài: Dữ liệu kiểu cấu trúc
Bạn đang xem 20 trang mẫu của tài liệu "Lập trình - Bài: 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:
- lap_trinh_bai_du_lieu_kieu_cau_truc.pdf
Nội dung text: Lập trình - Bài: Dữ liệu kiểu cấu trúc
- Trường Đại học Khoa học Tự nhiên Khoa Công nghệ thông tin Bộ môn Công nghệ phần mềm NHẬP MÔN 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 szMSSV[8]; // ‚0312078‛ . char szHoten[30]; // ‚H. P. Trang‛ . char szNTNS[9]; // ‚17/06/85‛ . char cGioiTinh; // ‘y’ . float fToan, fLy, fHoa; // 8.5 9.0 10.0 Truyền thông tin 1 SV cho hàm . void xuat(char* szMSSV, char* szHoten, char* szNTNS, char cGioiTinh, float fToan, float fLy, float fHoa); 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 SDiem2D { int m_nX; int m_nY; }; 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 SDiem2D { int m_nX; int m_nY; } diem2D1, diem2D2; 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 SDiem2D { int m_nX; int m_nY; }; struct SDiem2D diem2D1, diem2D2; // Trong C chuẩn 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 m_nX; int m_nY; } SDiem2D; struct SDiem2D diem2D1, diem2D2; 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 SDiem2D { int m_nX; int m_nY; } diem2D1 = {2912, 1706}, diem2D2; 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 SDiem2D { int m_nX; int m_nY; } diem2D1; printf(‚x = %d, y = %d‛, diem2D1.m_nX, diem2D1.m_nY); 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 SDiem2D { int m_nX, m_nY; } diem2D1 = {2912, 1706}, diem2D2; diem2D2 = diem2D1; diem2D2.m_nX = diem2D1.m_nX; diem2D2.m_nY = diem2D1.m_nY * 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 SDiem2D { int m_nX; int m_nY; }; struct SHinhChuNhat { struct SDiem2D m_diem2DTraiTren; struct SDiem2D m_diem2DPhaiDuoi; } hinhChuNhat1; hinhChuNhat1.m_diem2DTraiTren.m_nX = 2912; hinhChuNhat1.m_diem2DPhaiDuoi.m_nY = 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 SSinhVien { char m_szHoten[30]; float m_fToan, m_fLy, m_fHoa; } sinhVien1; strcpy(sinhVien1.m_szHoten, ‚Nguyen Van A‛); sinhVien1.m_fToan = 10; sinhVien1.m_fLy = 6.5; sinhVien1.m_fHoa = 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 SNguoi { char m_szHoten[30]; struct SNguoi *m_pNguoiCha, *m_pNguoiMe; }; struct SNut { int m_nKhoa; struct SNut *m_pNut; }; 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 SA { int m_nA; double m_nB; }; sizeof(A) = ??? struct SB1 struct SB2 { { int m_nA; int m_nA; int m_nB; double m_dC; double m_dC; int m_nB; }; }; sizeof(SB1) = ??? sizeof(SB2) = ??? 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 SA { double a; a a a a a a a a int b; int c; b b b b c c c c }; struct SB { b b b b đệm 4B int b; double a; a a a a a a a a int c; c c c c đệm 4B }; struct SC { 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 SDiem2D { float m_nX, m_nY; } diem2D1; float fTam; scanf(‚%f‛, &fTam); diem2D1.m_nX = fTam; 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 SDiem2D { int m_nX; int m_nY; }; SDiem2D arr1[20]; SDiem2D arr2[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 SDiem2D { int m_nX, m_nY; }; void xuat1(int x, int y) { }; void xuat2(SDiem2D diem2D) { }; void xuat3(SDiem2D &diem2D) { }; void xuat4(SDiem2D *diem2D) { }; 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 SMyStruct union UMyUnion { { 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ố (SPhanSo) . 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 (SDonThuc) . 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 (SDaThuc) . 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 (SDiem) . 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 (STamGiac) . 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 (SNgay) . 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