Mục lục bài họcĐang ở d07-b3
File handling, exceptions and the ethics of computing
Serial, sequential and random access files
A serial file stores records in the order they arrive — fine for a transaction log, useless for finding one record quickly. A sequential file keeps records in key order, so it can be searched more efficiently and merged. A random access (direct) file computes a record's position from its key using a hashing algorithm, giving near-instant access — the method used when a single record must be retrieved on demand.
Hashing and collisions
A hashing algorithm converts a key into an address. Two keys can hash to the same address — a collision — resolved by placing the record in the next free slot (open addressing) or by chaining records at that address. A good hash spreads records evenly; a poor one produces long chains and destroys the speed advantage.
File operations
Open for read, write or append; read or write a record; close. Forgetting to close a file risks losing data still sitting in the buffer, and opening for write rather than append silently destroys the existing contents.
Exception handling
A run-time error such as a missing file, a division by zero or invalid input should be caught, not allowed to crash the program: TRY … EXCEPT … FINALLY. The FINALLY block runs whether or not an error occurred, which is where files get closed. Catching every exception and doing nothing is worse than not catching it — the program then fails silently with corrupt data.
Ethics and ownership
Copyright protects the expression of a program; licences (proprietary, free, open source) define what users may do. Professional codes of conduct require competence, honesty about limitations, protection of client data, and refusing work beyond one's ability. The exam also asks about the ethics of automated decisions — who is accountable when software trained on biased data refuses someone a loan.
Tệp tuần tự, tệp có thứ tự và tệp truy cập trực tiếp
Tệp tuần tự lưu bản ghi theo đúng thứ tự chúng đến — hợp cho nhật ký giao dịch, vô dụng khi cần tìm nhanh một bản ghi. Tệp có thứ tự giữ bản ghi theo thứ tự khoá, nên tìm kiếm hiệu quả hơn và trộn được với tệp khác. Tệp truy cập trực tiếp tính vị trí của bản ghi từ khoá bằng một thuật toán băm, cho truy cập gần như tức thì — đây là cách dùng khi phải lấy ra một bản ghi bất kỳ theo yêu cầu.
Băm và va chạm
Thuật toán băm biến khoá thành một địa chỉ. Hai khoá có thể băm ra cùng một địa chỉ — gọi là va chạm — xử lý bằng cách đặt bản ghi vào ô trống kế tiếp (địa chỉ mở) hoặc nối các bản ghi thành chuỗi tại địa chỉ đó. Hàm băm tốt rải bản ghi đều; hàm băm kém tạo ra những chuỗi dài và triệt tiêu chính lợi thế tốc độ.
Các thao tác tệp
Mở để đọc, để ghi hoặc để ghi thêm; đọc hoặc ghi một bản ghi; đóng. Quên đóng tệp có nguy cơ mất dữ liệu còn nằm trong bộ đệm, và mở ở chế độ GHI thay vì GHI THÊM sẽ xoá sạch nội dung cũ mà không báo gì.
Bắt lỗi thời gian chạy
Lỗi lúc chạy như thiếu tệp, chia cho $0$ hay dữ liệu nhập sai phải được bắt chứ không để chương trình treo: TRY … EXCEPT … FINALLY. Khối FINALLY chạy dù có lỗi hay không, và đó là nơi đóng tệp. Bắt mọi ngoại lệ rồi không làm gì còn tệ hơn là không bắt — chương trình khi đó hỏng trong im lặng và để lại dữ liệu sai.
Đạo đức và quyền sở hữu
Bản quyền bảo hộ cách thể hiện của một chương trình; các loại giấy phép (độc quyền, phần mềm tự do, mã nguồn mở) quy định người dùng được làm gì. Quy tắc đạo đức nghề nghiệp đòi hỏi năng lực chuyên môn, trung thực về giới hạn của mình, bảo vệ dữ liệu khách hàng, và từ chối công việc vượt quá khả năng. Đề thi còn hỏi về đạo đức của quyết định tự động — ai chịu trách nhiệm khi một phần mềm huấn luyện trên dữ liệu thiên lệch từ chối cho ai đó vay tiền.
Một tệp truy cập trực tiếp có $11$ ô nhớ, đánh số $0$–$10$. Hàm băm là địa chỉ = mã sinh viên MOD 11.
(a) Xác định địa chỉ cho các mã: $4123$, $2085$, $7016$, $3096$.
(b) Viết mã giả đọc một bản ghi có bắt lỗi.
(a) Tính từng địa chỉ.
$4123 \bmod 11$: $11\times374=4114$, dư $9$ ⇒ ô 9
$2085 \bmod 11$: $11\times189=2079$, dư $6$ ⇒ ô 6
$7016 \bmod 11$: $11\times637=7007$, dư $9$ ⇒ ô 9 — VA CHẠM
$3096 \bmod 11$: $11\times281=3091$, dư $5$ ⇒ ô 5
Xử lý va chạm bằng địa chỉ mở: $7016$ được đặt vào ô trống kế tiếp là ô 10.
Hệ quả khi tìm kiếm: muốn tìm $7016$, chương trình băm ra ô $9$, thấy đó là $4123$ chứ không phải khoá cần tìm, nên phải dò tiếp ô $10$. Nếu có nhiều va chạm, chuỗi dò dài ra và truy cập ‘tức thì’ dần trở thành tìm tuần tự — đó là lý do hàm băm phải rải đều và bảng không nên quá đầy.
(b) Mã giả đọc bản ghi có bắt lỗi.
TRY
OPENFILE "SinhVien.dat" FOR RANDOM
INPUT MaSV
DiaChi ← MaSV MOD 11
SEEK "SinhVien.dat", DiaChi
GETRECORD "SinhVien.dat", BanGhi
IF BanGhi.Ma <> MaSV THEN
OUTPUT "Không tìm thấy tại địa chỉ băm — dò tiếp"
ELSE
OUTPUT BanGhi.HoTen
ENDIF
EXCEPT FileNotFound
OUTPUT "Không mở được tệp dữ liệu"
EXCEPT InvalidInput
OUTPUT "Mã sinh viên phải là số nguyên"
FINALLY
CLOSEFILE "SinhVien.dat"
ENDTRY
Ba chi tiết ăn điểm. Thứ nhất, có hai khối EXCEPT riêng với thông báo khác nhau — bắt gộp mọi lỗi vào một khối rồi in ‘có lỗi’ thì người dùng không biết phải làm gì. Thứ hai, CLOSEFILE nằm trong FINALLY nên tệp luôn được đóng dù có lỗi hay không. Thứ ba, chương trình vẫn kiểm khoá của bản ghi đọc được, vì địa chỉ băm đúng không bảo đảm đó là bản ghi cần tìm.
EXCEPT riêng cho từng loại và FINALLY để đóng tệp. Và nhớ phần đạo đức nghề nghiệp cùng trách nhiệm với quyết định tự động.Đọc xong rồi — làm thử ngay
Bài tập của chương Recursion, OOP and File Handling gồm 14 câu trắc nghiệm và 3 đề tự luận. Đáp án hiện ngay khi chọn, miễn phí.