Tệp mẫu và quy ước dữ liệu
Tạo tệp `diem_gia.txt` trong cùng thư mục chạy chương trình với ba dòng:
```text
Lan 8.0
Minh 7.5
Vy 9.0
```
Đây là tên, điểm giả; mỗi dòng có đúng hai phần cách nhau bởi khoảng trắng, tên gồm một từ và điểm từ 0 đến 10. Trong bài này mỗi tên là duy nhất. Nếu cần họ tên có dấu cách hoặc nhiều người trùng tên, phải đổi định dạng tệp và yêu cầu tra cứu; không thể mặc nhiên tách thành đúng hai phần.
Đọc dữ liệu và dò lần lượt
```python
def doc_diem(ten_tep):
ket_qua = []
with open(ten_tep, "r", encoding="utf-8") as f:
for dong in f:
ten, diem_chu = dong.split()
ket_qua.append((ten, float(diem_chu)))
return ket_qua
def tra_ten(du_lieu, ten_can_tim):
for ten, diem in du_lieu:
if ten == ten_can_tim:
return diem
return None
du_lieu = doc_diem("diem_gia.txt")
for ten in ["Minh", "An"]:
diem = tra_ten(du_lieu, ten)
if diem is None:
print(ten, "không có trong tệp")
else:
print(ten, diem)
```
Kết quả là `Minh 7.5` rồi `An không có trong tệp`. Vòng `for` kiểm từng bản ghi theo thứ tự tệp; tên và điểm nằm cùng một cặp nên không bị lệch. `None` báo không thấy, khác điểm `0.0` vẫn hợp lệ. Nếu đổi một dòng thành `Minh bảy`, `float(...)` báo lỗi: sửa dữ liệu tệp, không tự gán điểm 0. Nếu thiếu tệp, kiểm tên tệp và thư mục chạy.
Thử trường hợp điểm 0
Thêm dòng `Hoa 0` vào tệp, rồi tìm `Hoa`. Kết quả phải là `Hoa 0.0`. Phép thử này phát hiện cách viết sai `if not diem:`: điều kiện ấy nhầm điểm 0 với không tìm thấy.
Bài luyện
Với dòng `Minh 7.5`, sau `ten, diem_chu = dong.split()`, biến `diem_chu` là gì?
split tạo chuỗi; cần float để chuyển điểm.
Chỉ sau float mới thành số thực.
Không tự làm tròn xuống 7.
Dấu chấm là phần của chuỗi số.
Lời giải
split tách dòng thành hai chuỗi. float(diem_chu) mới chuyển chuỗi "7.5" thành số 7.5.
Bài luyện
Tại sao bài dùng `if diem is None` để báo không tìm thấy?
Phân biệt giá trị điểm với kết quả vắng mặt.
Điểm dưới 5 vẫn là số.
float(0) là 0.0.
Chuỗi tên so sánh được bằng ==.
Lời giải
Hàm trả điểm khi khớp và None khi hết dữ liệu. Kiểm is None không nhầm điểm 0.0 thành vắng mặt.
Bài luyện
Tệp chưa sắp xếp có thể dùng cách nào để tra một tên theo chương trình mẫu?
Duyệt từ đầu đến khi khớp hoặc hết tệp.
Nhị phân cần trật tự thích hợp.
Một dòng không đại diện toàn tệp.
Các điểm độc lập.
Lời giải
Dữ liệu không được sắp theo tên, nên chương trình lần lượt kiểm từng bản ghi.
Đang học