5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Đi Hc Sư Phm Tp. H Chí Minh
CẤU TRÚC DỮ LIỆU 2
Chươ ng 01: SẮP XẾP NGOẠI
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
1/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Đề cươ ng môn học: CTDL2 • • • •
Chương 1: Sắp xếp ngoại Chương 2: Bảng băm (Hash Table) Chương 3: Cây 2-3-4, B – cây Chương 4:Cây Đỏ Đen (Red Black Tree)
CTDL2 – Lương Trn Hy Hin http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
2 2/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Giớ i thiệu • Mục tiêu: – Bài toán kinh điển: Sắp xếp và tìm kiếm – Đặc trưng của SX trên file: Bài toán trộn – TT tìm kiếm cơ bản: Tuần tự, nhị phân – TT s p cân xếp:bằng, Trộn trộn trực đa tiếp, trộn tự nhiên, trộn nđường pha – Đánh giá thuật toán
• Các nội dung chính:
– Thuật toán và cài đặt các phương pháp sắp xếp CTDL2 – Lương Trn Hy Hin
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
3 3/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Chươ ng 1: SẮP XẾP NGOẠI • Phương pháp trộn Run •• Phương pháp trộn trộn đa tự nhiên Phương pháp lối cân bằng • Phươn há tr n đa ha
CTDL2 – Lương Trn Hy Hin http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
4 4/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Các PP sắp xếp – Vấn đề??? Vì sao phải xây dựng thuật toán sắp xếp trên file? • Thao tác cơ bản trong SX là hoán vị • Thực hiện hoán vị trên cùng 1 file Tần
suất thao tác lên trên 1 vùng đĩa quá lớn Không an toàn. • SX ngoại không thích hợp với hoán vị Sử dụng phương pháp trộn. CTDL2 – Lương Trn Hy Hin http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
5 5/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Bài toán trộn • Cho trước 2 (hay nhiều) dãy đã sắp thứ tự: A[1], A[2], A[3], …, A[N] B[1], B[2], B[3], …, B[M]
• Kết hợp các dãy đã cho thành một dãy mới C được s p.
CTDL2 – Lương Trn Hy Hin http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
6 6/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Thuật toán trộn 1 – Trộn từ ng phần tử int nCurrA = 1; int nCurrB = 1; A[N+1] = MAX_VALUE; // phần tử lính canh B[M+1] = MAX_VALUE; // phần tử lính canh for (int nCurrC=1; nCurrC <= N+M; nCurrC++) if (A[nCurrA] < B[nCurrB]) { n urr = nCurrA++;
n urr ;
} else { C[nCurrC] nCurrB++;= B[nCurrB]; } CTDL2 – Lương Trn Hy Hin http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
7 7/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
T.toán trộn 2 – Trộn dãy phần tử đượ c sắp int nCurrA = 1; int nCurrB = 1; while (nCurrA <= N && nCurrB <= M) { if (A[nCurrA] C[nCurrC] < = B[nCurrB]) A[nCurrA]; else C[nCurrC] = B[nCurrB]; } // Xét phần tử còn lại của dãy A for ( ; nCurrA <= N; nCurrA++) { C[nCurrC] = A[nCurrA]; nCurrC++; } // Xét phần tử còn lại của dãy B for ( ; nCurrB <= M; nCurrB++) { C[nCurrC] = B[nCurrB]; nCurrC++; } CTDL2 – Lương Trn Hy Hin http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
8 8/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
1. Phươ ng pháp trộn trự c tiếp • Khái niệm: – Run là một dãy liên tiếp các phần tử được sắp thứ tự. Ví dụ: 2 4 7 12 55 là một Run.
–
.
Chẳng hạn Run ở ví dụ trên có chiều dài là 5.
CTDL2 – Lương Trn Hy Hin http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
9 9/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
1. Phươ ng pháp trộn trự c tiếp • Giải thuật: – Giải thuật sắp xếp tập tin bằng phương pháp trộn Run có thể tóm lược như sau: Input: f0 là tập tin cần sắp thứ tự upu là 2 tập p tin n trộn. c s p Gọi f1, :f2
Trong đó f0, f1, f2 có thể là các tập tin văn bản thường (text file) hay các tập tin nhị phân. CTDL2 – Lương Trn Hy Hin http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
10 10/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
1. Phươ ng pháp trộn trự c tiếp • Bước 1: – Giả sử các phần tử trên f0 là: 24 12 67 33 58 42 11 34 29 31 – Khởi tạo f1, f2 rỗng. – vào cf1, f2: n p n m= p n f1: 24 67 58 11 29
n
33 42 – f2: Trộn12f1,f2 vào34f031 f0: 12 24 33 67 42 58 11 34 29 31 CTDL2 – Lương Trn Hy Hin http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
11 11/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
1. Phươ ng pháp trộn trự c tiếp • Bước 2: – Phân bố m=2 *m = 2 phần tử từ f0 vào f1, f2 f0: 12 24 33 67 42 58 11 34 29 31 f1: 12 24 42 58 29 31 – Trộn f1, f2 thành f0: f0: 12 24 33 67 11 34 42 58 29 31
CTDL2 – Lương Trn Hy Hin http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
12 12/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
1. Phươ ng pháp trộn trự c tiếp • Bước 3: – Tương tự bước 2, phân bố m= 2 * m = 4 phần tử từ f0 vào f1, f2 f0: 12 24 33 67 11 34 42 58 29 31 f2: 11 34 42 58 – Trộn f1, f2 thành f0: f0: 11 12 24 33 34 42 58 67 29 31
CTDL2 – Lương Trn Hy Hin
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
13 13/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
1. Phươ ng pháp trộn trự c tiếp • Bước 4: Phân bố m=2 * m = 8 phần tử lần lượt từ f0 vào f1, f2. f1: 11 12 24 33 34 42 58 67 f2: 29 31 f0:34 42 58 67 – Tr 11 f1, 12 f2 24th 29 nh 31 33 f0: n
• Bước 5: Lặp lại tương tự các bước trên cho tới khi chiều dài m của run cần phân bố lớn hơn chiều dài n của f0 thì dừng. CTDL2 – Lương Trn Hy Hin
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
14 14/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Cài đặt thuật toán m=1 while (m < số phần tử của f0) { Chia[Distribute] m phần tử của f0 lần lượt cho f1, f2 Trộn[Merge] f1, f2 lần lượt vào f0 M=M*2
} CTDL2 – Lương Trn Hy Hin
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
15 15/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Đánh giá • Đánh giá: – Cần ít nhất N không gian trống trên đĩa để hoạt động. log N (vì mỗi lần xử lý 1 dãy tăng gấp 2) –– Số bước Mỗi bước: 2
• Distribute: Copy N lần • ,
– Tổng cộng:
• Copy: 2N * log2N • So sánh: N/2 * log2N
• Hạn chế:tận dụng được dữ liệu đã được sắp bộ phận – Không – Độ dài dãy con xử lý ở bước k <= 2k CTDL2 – Lương Trn Hy Hin
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
16 16/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
2. Phươ ng pháp trộn tự nhiên Giải thuật: • Trong phương pháp trộn ở mục 1, giải thuật chưa tận dụng được chiều dài cực đại của các Run trước khi phân bố chưa tối ưu. • Đặc điểm của PP trộn tự nhiên là tận dụng chiều dài “tự nhiên” của các Run ban đầu; nghĩa là thực hiện việc trộn các Run có độ dài cực đại với nhau cho tới khi dãy chỉ còn 1 Run duy nhất dãy đã được sắp. CTDL2 – Lương Trn Hy Hin
17
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
17/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
2. Phươ ng pháp trộn tự nhiên Giải thuật:
Trong khi số Run của F0 > 1 Phân bố F0 Trộn các Runvào củaF1,F1,F2F2theo vàocác F0.Run tự nhiên.
Hết trong khi - [Distribute] Chia xoay vòng dữ liệu của file F0 cho F1 và F2, mỗi lần 1 run cho đến khi file F0 hết nDemRunF0 = 0; - [Merge] từng cặp run của F1 và F2 tạo thành run mới Trộn trên F0 } while (nDemRunF0 > 1); CTDL2 – Lương Trn Hy Hin
18
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
18/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
2. Phươ ng pháp trộn tự nhiên • Ví dụ: F0: 1 2 9 8 7 6 5 • Bước 1: – F1: 1 2 9 7 5 – F2: 8 6 – F0: 1 2 8 9 6 7 5
• Bước 2:
– F1: 1 2 8 9 5 – F2: 6 7 – F0: 1 2 6 7 8 9 5 CTDL2 – Lương Trn Hy Hin
19
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
19/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
2. Phươ ng pháp trộn tự nhiên • Ví dụ(tt) • Bước 3:F0: 1 2 6 7 8 9 5 – F1: 1 2 6 7 8 9 – F2: 5 – F0: 1 2 5 6 7 8 9
• Bước 4: Dừng vì F0 chỉ có 1 Run.
CTDL2 – Lương Trn Hy Hin
20
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
20/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
3. Phươ ng pháp trộn đa lối cân bằng • Thuật toán sắp xếp ngoài cần 2 giai đoạn: Phân phối và trộn. – Giai đoạn nào làm thay đổi thứ tự? – Chi phí cho giai đoạn phân phối?
• Rút ra kết luận: – Thay vì thực hiện 2 giai đoạn, ta chỉ cần thực hiện 01 giai đoạn trộn. • Tiết kiệm ½ chi phí Copy. • Cần số lượng file trung gian gấp đôi. CTDL2 – Lương Trn Hy Hin
21
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
21/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
3. Phươ ng pháp trộn đa lối cân bằng • Chi phí sắp xếp ngoài tỉ lệ với số bước thực hiện: – Nếu mỗi bước cần N thao tác copy – Nếu dùng 2 file trung gian cần log2N bước cần N * log2N thao tác copy. – Để giảm số bước Phân bố số Run nhiều hơn 2 file trung gian. – log N thao tác copy. n
n
• Rút ra kết luận:
– Dùng nhiều file trung gian để giảm số bước. –– Tiết kiệm2*n thaofile táctrung copygian: bằng cách thực hiện 1 giai đoạn Sử dụng • n file nguồn • n file đích CTDL2 – Lương Trn Hy Hin
22
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
22/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
3. Phươ ng pháp trộn đa lối cân bằng Thuật toán:
• B1: Gọi tập nguồn S = {f1, f2, …, fn} Gọi tập đích D = {g1, g2, …, gn} Chia xoay vòng dữ liệu của file F0 cho các file thuộc tập nguồn, mỗi lần 1 Run cho tới khi F0 hết. S, thành tậptạo đích D. Run mới, mỗi lần ghi lên các file thuộc • B3: Nếu (số Run trên các file của D > 1) thì: Hoán lại vị vai – Quay B2 trò tập nguồn (S) và tập đích (D).
Ngược lại kết thúc thuật toán. CTDL2 – Lương Trn Hy Hin
23
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
23/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
3. Phươ ng pháp trộn đa lối cân bằng Ví dụ:
• fInput: U Q N M K I H F D C B, N=3 // Phân phối (lần 1) f1: Q UM f2: K FHBC f3: N I D // Trộn (lần 1) g : g2: I K M g3: D F H // Trộn (lần 2) f1: D F H I K M N Q U f2: B C f3: NULL // Trộn (lần 3) g1: B C D F H I K M N Q U g2: NULL g3:
CTDL2 – Lương Trn Hy Hin
24
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
24/67
5/12/2018
3. Phươ ng pháp trộn đa lối cân bằng CTDL2_CH01_SXNgoa i - slide pdf.c om
• Các ký hiệu: – – – – – – –
fInput: file dữ liệu gốc cần sắp xếp N: số phần tử trên file fInput n: số file trung gian trên mỗi tập nguồn/đích S: tập các file nguồn D: tập các file đích Sdd: tập các file nguồn đang còn run dở dang , tr
trộn – trình “Lượt”: là 1 quá trình trộn run từ nguồn đ đích, một “luợt” kết thúc khi mỗi file đích (trong tập D) nhận được 1 run – Drun: tập các file đích đã nhận được run trong “lượt” hiện hành
• Suy diễn:
– S –Str: tập các file nguồn đã hết (EOF) – Str –Sdd: tập các file nguồn chưa hết (!EOF), nhưng đã kết thúc run hiện tại – D – Drun: tập các file đích chưa nhận được run trong “lượt” hiện hành CTDL2 – Lương Trn Hy Hin
25
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
25/67
5/12/2018
3. Phươ ng pháp trộn đa lối cân bằng CTDL2_CH01_SXNgoa i - slide pdf.c om
Thuật
toán chi tiết:
[Bước 1] S = {f1, f2, … , fn} D = {g1, g2, … , gn} // Chia xoay vòng dữ liệu của fInput cho các file thuộc tập nguồn S i = 1; while (!feof(fInput)) { fi); Copy_1_Run(fInput, i = (i % n) + 1; } Str == S;{}; Drun nDemRun = 0; CTDL2 – Lương Trn Hy Hin
26
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
26/67
5/12/2018
3. Phươ ng pháp trộn đa lối cân bằng CTDL2_CH01_SXNgoa i - slide pdf.c om
[Bước 2] a. Sdd = Str b. Gọi dhh ∈ D –Drun là file đích hiện hành (sẽ được nhận run) c. Đọc các phần tử xfi, fi ∈ Sdd d. Gọi xf0 = MIN { xfi, fi ∈ Sdd} e. Copy xf0 lên dhh f. Nếu (file f0 hết) thì { Str = Str – {f0} dd = dd – Nếu (Str == {}) thì { // Xong quá trình trộn N đ D nDemRun++; Goto [Bước 3] } ngược lại Nếu (Sdd <> {}) thì Goto [Bước 2.d] ngược lại { // Sdd=={}: hết bộ run hiện hành nDemRun++; Drun = Drun + {dhh}; Nếu (Drun==D) thì Drun= {}; // Xong 1 “lượt” Goto [Bước 2.a] } CTDL2 – Lương Trn Hy Hin
27
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
27/67
5/12/2018
3. Phươ ng pháp trộn đa lối cân bằng CTDL2_CH01_SXNgoa i - slide pdf.c om
ngược lại { // File f0 chưa hết Nếu (!EOR(f0)) thì { Đọc phần tử kế xf0 từ file f0; Goto [Bước 2.d] } ngược lại { // Hết run hiện hành trên f0 dd – dd Nếu (Sdd <> {}) thì Goto [Bước 2.d] ngược lại { // Sdd=={}: hết bộ run hiện hành nDemRun++; Drun = Drun + {dhh}; Nếu (Drun==D) thì Drun= {}; // Xong 1 “lượt” Goto [Bước 2.a] } } // end of file f0 chưa hết CTDL2 – Lương Trn Hy Hin
28
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
28/67
5/12/2018
3. Phươ ng pháp trộn đa lối cân bằng CTDL2_CH01_SXNgoa i - slide pdf.c om
[Bước 3] Nếu (nDemRun == 1) thì Kết thúc thuật toán ngược lại {
Nếu (nDemRun < n) thì Str = Drun; // Không đủ n run Drun = {}; nDemRun = 0; “Hoán vị tập S, D” Goto [Bước 2]
} CTDL2 – Lương Trn Hy Hin
29
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
29/67
Trộn đa lối cân bằng
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Ví dụ: Cho dãy số sau 3 5 2 7 12 8 4 15 20 1 2 8 23 7 21 27 •
Nhập : f0 :3 5 2 7 12 8 4 15 20 1 2 8 23 7 21 27
•
Xuất : f0: 1 2 2 3 4 5 7 7 8 8 12 15 20 21 23 27
CTDL2 – Lương Trn Hy Hin
30
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
30/67
5/12/2018
Các bướ c tiến hành : chọn 6 file CTDL2_CH01_SXNgoa i - slide pdf.c om
3 5 2 7 12 8 4 15 20 1 2 8 23 7 21 27
Bướ c 0: đặt nh = 3 Bướ c 1: Phân phối các run luân phiên vào f[1], f[2], f[3] f1: 3 5 4 15 20 f2: 2 7 12 1 2 8 23 f3: 8 7 21 27 CTDL2 – Lương Trn Hy Hin
31
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
31/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Các bướ c tiến hành : chọn 6 file Bướ c 2: -Trộn các run của f[1], f[2], f[3] và luân phiên phân phối vào các file g[1], g[2], g[3] g1: 2 3 5 7 8 12 g2: 1 2 4 7 8 15 20 21 23 27 - Do số run sau khi trộn >1 nên tiếp tục trộn run từ g[1], g[2], g[3] vào ngượ c trở lại f[1], f[2], f[3] f1: 1 2 2 3 4 5 7 7 8 8 12 15 20 21 23 27 f2: f3: - Do số run trộn = 1 nên kết thúc thuật toán CTDL2 – Lương Trn Hy Hin
32
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
32/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Bướ c 1 3
5
2
7
12
8
4
15
20
1
2
8
23
7
21
27
f1 f2 f3
CTDL2 – Lương Trn Hy Hin
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
33
33/67
5/12/2018
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
CTDL2_CH01_SXNgoa i - slide pdf.c om
34/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
35/67
5/12/2018
4. Phươ ng pháp trộn đa pha CTDL2_CH01_SXNgoa i - slide pdf.c om
• Phương pháp trộn đa lối cân bằng các tập tin chưa được sử dụng một cách có hiệu quả bởi vì trong cùng một lần duyệt thì phân nửa số tập tin luôn luôn giữ vai trò trộn (nguồn) và phân phối (đích) Cải tiến: Thay đổi vai trò của các tập tin trong cùng một lần duyệt phương pháp trộn đa pha. CTDL2 – Lương Trn Hy Hin
36
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
36/67
5/12/2018
4. Phươ ng pháp trộn đa pha CTDL2_CH01_SXNgoa i - slide pdf.c om
Ta xét ví dụ sau với 3 tập tin f1, f2, f3 • Bước 1: Phân phối luân phiên các run ban đầu của f0 vào f1 và f2 • nếu Bước 2: Trộn cácrun run của f1, f2 vào f3 . Giải thuật kết thúc f3 chỉ có một • Bước 3: Chép nửa run của f3 vào f1 . nếu chỉ có run.của f2 vào f1. Lặp lại bước 2. • thúc Bước 5: f2 Chép nửamột số run Phương pháp này còn có nhược điểm là mất thời gian sao chép nửa số run của tập tin này vào tập tin kia. Việc sao chép có thể vớifn-1 Fn run củasốtập tin f1 này và fn-1 runloại củabỏtậpnếu tintaf2,bắt vớiđầu fn và là các liên tiếp trong dãy Fibonaci. CTDL2 – Lương Trn Hy Hin
37
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
37/67
5/12/2018
4. Phươ ng pháp trộn đa pha CTDL2_CH01_SXNgoa i - slide pdf.c om
• Ví dụ: Trường hợp n = 7, tổng số run ban đầu là 13 + 8 = 21 run Pharse 0
F1 1,1,1,1,1,1,1,1
F2 1,1,1,1,1
, , 2 3 45 6
5,5 5
3,3,3 3 13
F3 , , , , 2,2
8
21 CTDL2 – Lương Trn Hy Hin
Sort Merge2 Merge3 Merge4 Merge4 Merge6 38
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
38/67
5/12/2018
4. Phươ ng pháp trộn đa pha CTDL2_CH01_SXNgoa i - slide pdf.c om
• • • •
Phase 0: Phân phối các run ban đầu Phase 1: Trộn 8 run của f1 và f2 vào f3 Phase 2: Trộn 5 run của f1 và f3 vào f2 Phase 3: Tr n 3 run của f2 và f3 vào f1
• Phase 4: Trộn 2 run của f1 và f2 vào f3 • Phase 5: Trộn 1 run của f1 và f3 vào f2 • Phase 6: Trộn 1 run của f2 và f3 vào f1 CTDL2 – Lương Trn Hy Hin
39
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
39/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
ÔN TẬP XỬ L T P TIN VỚ I C++
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
40/67
5/12/2018
Cấu trúc
CTDL2_CH01_SXNgoa i - slide pdf.c om
CTDL2 – Lương Trn Hy Hin
41
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
41/67
5/12/2018
Nội dung
CTDL2_CH01_SXNgoa i - slide pdf.c om
1. Giới thiệu về tập tin 2. ofstream – –
.
output file stream Lớp làm nhiệu vụ ghi dữ liệu ra file
––
input file stream Lớp làm nhiệm vụ đọc dữ liệu từ file
4. Một số thao tác khác với tập tin 5. –fstream file stream –
Lớp làm cả nhiệm vụ đọc và ghi tập tin CTDL2 – Lương Trn Hy Hin
42
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
42/67
5/12/2018
1. C++ File I/O
CTDL2_CH01_SXNgoa i - slide pdf.c om
CTDL2 – Lương Trn Hy Hin
43
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
43/67
5/12/2018
1. Giớ i thiệu về tập tin
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Binary file được dùng để lưu trữ dữ liệu dạng cấu trúc có kích thước cố định – Khi ghi biến cấu trúc lên file sẽ ghi 1 khối có kích thước cố định, – Khi từkhối file ra trúc theođọc từng có biến kích cấu thước cố cũng định. đọc từ file
• Muốn lập trình với file cần phải biết dạng lưu trữ cũng như ý nghĩa của dữ liệu trong file. CTDL2 – Lương Trn Hy Hin
44
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
44/67
5/12/2018
1. Giớ i thiệu về tập tin
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Input file : file có dữ liệu sẽ được
truy cập để đưa vào biến • Output file: File sẽ chứa trị của biến khi trị của biến được ghi vào
CTDL2 – Lương Trn Hy Hin
45
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
45/67
5/12/2018
2. ofstream
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Khai báo và mở tập tin để ghi dữ liệu – ofstream
; ofstream (); –– Ví fout; dụ: ofstream fout.open(“data.dat”); hoặc ofstream fout(“data.dat”);
• Ghi dữ liệu chuẩn – Tương tự như cout int a; fout<
46
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
46/67
5/12/2018
2. ofstream
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Ghi dữ liệu dạng nhị phân – – – –
ostream& write(char* pch,int nCount); ostream& write(unsigned char* puch,int nCount); ostream& write(signed char* psch,int nCount); Giải thích tham số ,
,
.
• nCount: số byte cần ghi
• Thường dùng để ghi toàn bộ một struct hoặc một đối tượng ra file
• Đóng tập tin: sử dụng phương thức close(); CTDL2 – Lương Trn Hy Hin
47
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
47/67
5/12/2018
2. ofstream
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Ví dụ Ghi dữ liệu của 5 phần tử số nguyên liên tiếp ra file dạng nhị phân ---------------------------------------------------------
int a 10 a[0]=65;a[1]=66;a[2]=97;a[3]=99;a[4]=67; ofstream fout(“data.dat”); int n=5; fout.write((char*)a,n*sizeof (*a)); fout.close(); CTDL2 – Lương Trn Hy Hin
48
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
48/67
5/12/2018
3. ifstream
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Khai báo và mở tập tin để đọc dữ liệu – ifstream ; – ifstream (); – Ví dụ: ifstream fin; fin.open(“data.dat”); o c s ream n a a. a ;
• Đọc dữ liệu chuẩn – Tương tự như cin – >)> – Ví dụ: int a; fin>>a; CTDL2 – Lương Trn Hy Hin
49
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
49/67
5/12/2018
3. ifstream
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Đọc dữ liệu dạng nhị phân – istream& read(char* pch, int nCount); char* puch, nCount); –– istream& read(unsigned istream& read(signed char* psch, int int nCount);
• Giải thích tham số – pch,puch,psch: con tr đ n m ng k tự lưu dữ liệu. – nCount: số byte lớn nhất cần đọc
• Thường dùng để đọc một struct hoặc một từsử filedụng phương thức close(); • đối Đóngtượng tập tin: CTDL2 – Lương Trn Hy Hin
50
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
50/67
5/12/2018
3. ifstream
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Ví dụ Đọc dữ liệu của 5 phần tử số nguyên liên tiếp đã ghi dạng nhị phân -----------------------------------------------
ifstream fin(“data.dat”); int n=5; fin.read((char*)a,n*sizeof (*a)); fin.close(); CTDL2 – Lương Trn Hy Hin
51
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
51/67
5/12/2018
4. Một số thao tác khác vớ i tập tin CTDL2_CH01_SXNgoa i - slide pdf.c om
• Lấy vị trí hiện tại của con trỏ tập tin – Khi đọc • Dùng hàm tellg(); • Ví dụ: long pos=fin.tellg();
–
• Dùng hàm tellp(); • Ví dụ: long pos=fout.tellp();
CTDL2 – Lương Trn Hy Hin
52
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
52/67
5/12/2018
4. Một số thao tác khác vớ i tập tin CTDL2_CH01_SXNgoa i - slide pdf.c om
• Di chuyển con trỏ đến một vị trí trong tập tin đọc hàm seekg(long sobyte, ios::xx vtbd); – Khi • Dùng • Ví dụ: fin.seekg(0,ios::beg);
–
//về đầu tập tin
g • Dùng hàm seekp(long sobyte, ios::xx vtbd); • Ví dụ: fout.seekp(0,ios::end); //đến cuối tập tin
– Hằng số •• ios::beg: dichuyển chuyểntừ từvị đầu ios::cur: di trí tập hiệntin tại của con trỏ • ios::end: di chuyển từ cuối tập tin CTDL2 – Lương Trn Hy Hin
53
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
53/67
4. Một số thao tác khác vớ i tập tin 5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
long SizeOf(char *fileName) { long end,begin; ifstream myfile(fileName); = myfile.seekg(0, ios::end); end = myfile.tellg(); myfile.close(); return end-begin;
Tính kích thưc ca tp tin
}
CTDL2 – Lương Trn Hy Hin
54
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
54/67
5. fstream 5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Sử dụng đối tượng của lớp này có thể vừa đọc vừa ghi dữ liệu trong cùng một tập tin • is_open(): nếu không Trả mở.về true nếu đang mở, false • fstream f; f.open(“data.dat”,ios::in|ios::out|ios::binary); ios::in, ios::out, ios::app, ios::nocreate, … CTDL2 – Lương Trn Hy Hin
55
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
55/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Làm vi c vớ i file bằn C
56
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
56/67
Khai báo mở tập tin để đọc/ghi dữ liệu 5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
– Khai báo biến con trỏ tệp FILE* ;
– Mở tệp
File * fopen(const char *, const char *
– Ví dụ: FILE *f; f = fopen(“D:\\data.txt”,”r”); //mở tập tin để đọc dữ liệu. f = fopen(“D:\\data.txt”,”w”); //mở tập tin để ghi dữ liệu. CTDL2 – Lương Trn Hy Hin
57
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
57/67
Một số kiểu truy cập 5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Kiểu truy cập
Ý nghĩa
“r”
Mở một tập tin đã có để đọc theo kiểu VB
“w”
Mở một tập tin mới để ghi theo kiểu VB
“a”
Mở một tập tin mới để ghi bổ sung theo kiểu VB
“rb” “wb”
Mở một tập tin đã có để đọc theo kiểu nhị phân Mở một tập tin mới để ghi theo kiểu nhị phân
“ab”
Mở một tập tin mới để ghi bổ sung theo kiểu nhị phân
Lưu ý: Cn làm sch vùng đm trưc khi chuyn t đc sang ghi hoc t ghi sang đc. CTDL2 – Lương Trn Hy Hin
58
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
58/67
Một số hàm khác 5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Đóng file int fclose(FILE * f); • Đóng các file đang mở int fcloseall(void); • m sạc v ng m int fflush(FILE* f); • Kiểm tra cuối file feof (FILE *f) //trả gặpint cuối tệp, ngược lại trảvềvềgiá0. trị khác 0 nếu CTDL2 – Lương Trn Hy Hin
59
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
59/67
Các hàm nhập xuất ký tự 5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Ghi ký tự lên file int fputc(int ch, FILE *f) Hàm ghi lên file f một ký tự có mã bằng m = ch % 256 • Đọc ký tự từ file int fgetc(int ch, FILE *f)
CTDL2 – Lương Trn Hy Hin
60
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
60/67
Các hàm nhập xuất theo kiểu văn bản 5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Ghi dữ liệu theo khuôn dạng lên file int fprintf (FILE* f, const char * dk,… ) • Đọc dữ liệu từ file theo khuôn dạng int fscanf (FILE* f, const char * dk,… ) • Ghi một chuỗi ký tự lên file n pu s cons c ar s, • Đọc một dãy ký tự từ file char fgets(const char* s, int n, FILE *f) Việc đọc kết thúc khi: - Hoặc đã đọc n-1 ký tự - Hoặc gặp dấu xuống dòng - Hoặc kết thúc tệp. CTDL2 – Lương Trn Hy Hin
61
Ví dụ - hàm fprintf
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
61/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Chương trình tạo ra tệp văn bản text gồm 3 dòng với nội dung: Dong 1 Dong 2 ----------------------------------------------FILE *f; f =fopen(“D:\\text.txt”,”w”); for(int i=0; i<2; i++) fprintf(f,”Dong%2d\n”,i); fclose(f);
CTDL2 – Lương Trn Hy Hin
62
Ví dụ - hàm fscanf
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
62/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Giả sử có một dãy số nguyên ghi trên tệp array.sl, giữa 2 số có ít nhất 1 khoảng trống. ----------------------------------------------… int c; while(!feof(f)) { fscanf(f, “%d”, &c); printf(“%3d”,c); } … CTDL2 – Lương Trn Hy Hin
63
Ví dụ - hàm fputs
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
63/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Chương trình nhập một dòng ký tự từ bàn phím và ghi lên tệp “dongVB” ----------------------------------------------char s[256]; FILE *f; = “ . ”,” ” printf(“Nhap dong van ban: “); gets(s); fputs(d,f); fclose(f); CTDL2 – Lương Trn Hy Hin
64
Ví dụ - hàm fgets
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
64/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
Chương trình đọc các dòng ký tự trên tệp “dongVB” và in ra màn hình ---------------------------------------------… int i=0; char d[256]; while(!feof()) { i++; fgets(d, 256, f); }
printf(“Dong %d: %s”,i,d);
… CTDL2 – Lương Trn Hy Hin
65
Các hàm nhập xuất theo kiểu nhị phân
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
65/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
• Ghi một số nguyên (2byte) lên file int putw(int n, FILE *f) • Đọc một số nguyên (2byte) lên file int getw(FILE *f) • Ghi một số mẫu tin lên file int fwrite(void *ptr, int size, int n, FILE *f) • Đọc một số mẫu tin từ file int fread(void *ptr, int size, int n, FILE *f) ptr: con trỏ trỏ tới vùng nhớ chứa dữ liệu đọc được size: kích thước mẫu tin theo byte n: số mẫu tin cần đọc f: con trỏ tệp CTDL2 – Lương Trn Hy Hin
66
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
Câu hỏi và thảo luận
66/67
5/12/2018
CTDL2_CH01_SXNgoa i - slide pdf.c om
CTDL2 – Lương Trn Hy Hin
http://slide pdf.c om/re a de r/full/c tdl2ch01sxngoa i
67
67/67