Bài giảng Nhập môn lập trình - Dữ liệu kiểu cấu trúc - Đặng Bình Phương

Tóm tắt Bài giảng Nhập môn lập trình - Dữ liệu kiểu cấu trúc - Đặng Bình Phương: ...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; VC & BB 13 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 Dữ liệu kiểu cấu trúc struct SDiem2D { int m_nX; i...eneration  Structure Alignment  Canh biên cho 1 cấu trúc Dữ liệu kiểu cấu trúc #pragma pack(push, 1) struct MYSTRUCT { }; #pragma pack(pop) VC & BB 19 #pragma pack Ví dụ: không có #pragma pack (1) Dữ liệu kiểu cấu trúc struct SA { double a; int b; int c; }; ... }; VC & BB 24 0 1 2 3 4 So sánh struct và union Ví dụ Dữ liệu kiểu cấu trúc struct SMyStruct { char c; int n; } s; s.c = 1; s.n = 2; union UMyUnion { char c; int n; } u; u.c = 1; u.n = 2; 01 02 00 00 00 c n c n 0 1 2 3 01 2 00 00 00 ...

pdf33 trang | Chia sẻ: havih72 | Lượt xem: 340 | Lượt tải: 0download
Nội dung tài liệu Bài giảng Nhập môn lập trình - Dữ liệu kiểu cấu trúc - Đặng Bình Phương, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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 
1 
ThS. Đặng Bình Phương 
dbphuong@fit.hcmus.edu.vn 
NHẬP MÔN LẬP TRÌNH 
DỮ LIỆU KIỂU CẤU TRÚC 
VC 
& 
BB 
2 
Nội dung 
Dữ liệu kiểu cấu trúc 
Khái niệm kiểu cấu trúc (struct) 1 
Khai báo & truy xuất kiểu cấu trúc 2 
Kiểu dữ liệu hợp nhất (union) 3 
Bài tập 4 
VC 
& 
BB 
3 
Đặ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 
VC 
& 
BB 
4 
Đặ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 
VC 
& 
BB 
5 
Đặ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 
VC 
& 
BB 
6 
Khai báo kiểu cấu trúc 
Cú pháp 
Ví dụ 
Dữ liệu kiểu cấu trúc 
struct 
{ 
 ; 
 ; 
}; 
struct SDiem2D 
{ 
 int m_nX; 
 int m_nY; 
}; 
VC 
& 
BB 
7 
Khai báo biến cấu trúc 
Cú pháp tường minh 
Ví dụ 
Dữ liệu kiểu cấu trúc 
struct 
{ 
 ; 
 ; 
} , ; 
struct SDiem2D 
{ 
 int m_nX; 
 int m_nY; 
} diem2D1, diem2D2; 
VC 
& 
BB 
8 
Khai báo biến cấu trúc 
Cú pháp không tường minh 
Ví dụ 
Dữ liệu kiểu cấu trúc 
struct 
{ 
 ; 
 ; 
}; 
struct ; 
struct SDiem2D 
{ 
 int m_nX; 
 int m_nY; 
}; 
struct SDiem2D diem2D1, diem2D2; // Trong C chuẩn 
VC 
& 
BB 
9 
Sử dụng typedef 
Cú pháp 
Ví dụ 
Dữ liệu kiểu cấu trúc 
typedef struct 
{ 
 ; 
 ; 
} ; 
 ; 
typedef struct 
{ 
 int m_nX; 
 int m_nY; 
} SDiem2D; 
struct SDiem2D diem2D1, diem2D2; 
VC 
& 
BB 
10 
Khởi tạo cho biến cấu trúc 
Cú pháp tường minh 
Ví dụ 
Dữ liệu kiểu cấu trúc 
struct 
{ 
 ; 
 ; 
} = {,,}; 
struct SDiem2D 
{ 
 int m_nX; 
 int m_nY; 
} diem2D1 = {2912, 1706}, diem2D2; 
VC 
& 
BB 
11 
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ụ 
Dữ liệu kiểu cấu trúc 
. 
struct SDiem2D 
{ 
 int m_nX; 
 int m_nY; 
} diem2D1; 
printf(‚x = %d, y = %d‛, diem2D1.m_nX, diem2D1.m_nY); 
VC 
& 
BB 
12 
Gán dữ liệu kiểu cấu trúc 
Có 2 cách 
Ví dụ 
Dữ liệu kiểu cấu trúc 
 = ; 
. = ; 
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; 
VC 
& 
BB 
13 
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 
Dữ liệu kiểu cấu trú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; 
VC 
& 
BB 
14 
Cấu trúc phức tạp 
Thành phần của cấu trúc là mảng 
Dữ liệu kiểu cấu trúc 
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; 
VC 
& 
BB 
15 
Cấu trúc phức tạp 
Cấu trúc đệ quy (tự trỏ) 
Dữ liệu kiểu cấu trúc 
struct SNguoi 
{ 
 char m_szHoten[30]; 
 struct SNguoi *m_pNguoiCha, *m_pNguoiMe; 
}; 
struct SNut 
{ 
 int m_nKhoa; 
 struct SNut *m_pNut; 
}; 
VC 
& 
BB 
16 
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 
Dữ liệu kiểu cấu trúc 
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 
VC 
& 
BB 
17 
Kích thước của struct 
Ví dụ 
Dữ liệu kiểu cấu trúc 
struct SA 
{ 
 int m_nA; 
 double m_nB; 
}; 
sizeof(A) = ??? 
struct SB1 
{ 
 int m_nA; 
 int m_nB; 
 double m_dC; 
}; 
sizeof(SB1) = ??? 
struct SB2 
{ 
 int m_nA; 
 double m_dC; 
 int m_nB; 
}; 
sizeof(SB2) = ??? 
VC 
& 
BB 
18 
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 
Dữ liệu kiểu cấu trúc 
#pragma pack(push, 1) 
struct MYSTRUCT {  }; 
#pragma pack(pop) 
VC 
& 
BB 
19 
#pragma pack 
Ví dụ: không có #pragma pack (1) 
Dữ liệu kiểu cấu trúc 
struct SA { 
 double a; 
 int b; 
 int c; 
}; 
struct SB { 
 int b; 
 double a; 
 int c; 
}; 
struct SC { 
 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 
VC 
& 
BB 
20 
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. 
Dữ liệu kiểu cấu trúc 
struct SDiem2D { float m_nX, m_nY; } diem2D1; 
float fTam; 
scanf(‚%f‛, &fTam); diem2D1.m_nX = fTam; 
VC 
& 
BB 
21 
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, ) 
Dữ liệu kiểu cấu trúc 
struct SDiem2D 
{ 
 int m_nX; 
 int m_nY; 
}; 
SDiem2D arr1[20]; 
SDiem2D arr2[10] = {{3, 2}, {4, 4}, {2, 7}}; 
VC 
& 
BB 
22 
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ụ 
Dữ liệu kiểu cấu trúc 
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) {  }; 
VC 
& 
BB 
23 
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 
Dữ liệu kiểu cấu trúc 
union 
{ 
 ; 
 ; 
}; 
VC 
& 
BB 
24 
0 1 2 3 4   
So sánh struct và union 
Ví dụ 
Dữ liệu kiểu cấu trúc 
struct SMyStruct 
{ 
 char c; 
 int n; 
} s; 
s.c = 1; s.n = 2; 
union UMyUnion 
{ 
 char c; 
 int n; 
} u; 
u.c = 1; u.n = 2; 
01 02 00 00 00 
c n 
c 
n 
0 1 2 3    
01 2 00 00 00 
VC 
& 
BB 
25 
Ví dụ 
struct trong union 
Dữ liệu kiểu cấu trúc 
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‛}; 
VC 
& 
BB 
26 
Ví dụ 
union trong struct 
Dữ liệu kiểu cấu trúc 
struct generic_tag 
{ 
 char type; 
 union 
 { 
 char c; 
 int i; 
 float f; 
 } share_tag; 
}; 
VC 
& 
BB 
27 
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 
VC 
& 
BB 
28 
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 
VC 
& 
BB 
29 
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 
VC 
& 
BB 
30 
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 
VC 
& 
BB 
31 
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 
VC 
& 
BB 
32 
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 
VC 
& 
BB 
33 
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 

File đính kèm:

  • pdfbai_giang_nhap_mon_lap_trinh_du_lieu_kieu_cau_truc_dang_binh.pdf