Thêm dữ liệu để thử hai đầu mút
Dùng lại `diem_gia.txt` ở L15 rồi thêm hai dòng `Hoa 6.0` và `Binh 8.0`. Yêu cầu tìm mọi tên có điểm trong khoảng từ 6.0 đến 8.0, **gồm cả** 6.0 và 8.0. Theo thứ tự tệp, kết quả phải là `Lan 8.0`, `Minh 7.5`, `Hoa 6.0`, `Binh 8.0`. Dữ liệu giả này chưa được sắp xếp.
Duyệt toàn tệp chưa sắp xếp
```python
def tra_khoang(ten_tep, thap, cao):
if thap > cao:
raise ValueError("Cận dưới phải không lớn hơn cận trên")
tim_thay = []
with open(ten_tep, "r", encoding="utf-8") as f:
for dong in f:
ten, diem_chu = dong.split()
diem = float(diem_chu)
if thap <= diem <= cao:
tim_thay.append((ten, diem))
return tim_thay
for ten, diem in tra_khoang("diem_gia.txt", 6.0, 8.0):
print(ten, diem)
```
Chạy sau khi bổ sung tệp sẽ in bốn dòng dự kiến. Điều kiện `thap <= diem <= cao` giữ cả hai đầu mút; vòng lặp không dừng ở lần khớp đầu vì cần **mọi** tên. Thử khoảng 9.5–10.0 sẽ cho danh sách rỗng, không in dòng nào. Nếu cận dưới lớn hơn cận trên, chương trình báo lỗi rõ ràng. Tệp vẫn phải đúng định dạng một tên một từ và một điểm số trên mỗi dòng.
Nếu điểm đã được sắp tăng
Nếu các cặp tên–điểm được sắp theo điểm tăng, có thể tìm vị trí đầu có điểm **≥ cận dưới** và vị trí đầu có điểm **> cận trên** bằng cách thu hẹp nửa dãy, rồi lấy các bản ghi giữa hai vị trí. Với tệp chưa sắp trong bài này, duyệt từng dòng là cách đơn giản và đúng. Dù sắp theo điểm, phải chuyển **cả cặp** (tên, điểm); chỉ sắp riêng điểm sẽ ghép sai người và điểm.
Bài luyện
Khoảng đóng từ 6.0 đến 8.0 nhận điểm nào?
5.9 nhỏ hơn cận dưới.
6.0 bằng cận dưới nên được nhận.
8.1 lớn hơn cận trên.
9.0 lớn hơn cận trên.
Lời giải
Điều kiện 6.0 ≤ điểm ≤ 8.0 gồm cả hai đầu mút, nên 6.0 thuộc khoảng.
Bài luyện
Vì sao chương trình tiếp tục duyệt sau khi gặp tên đầu tiên phù hợp?
Các dòng sau vẫn có thể phù hợp.
Tên đầu có thể đúng.
Dữ liệu mẫu chưa sắp.
Một lần duyệt đủ.
Lời giải
Dừng ở lần đầu sẽ bỏ sót các bản ghi phù hợp nằm sau.
Bài luyện
Nếu sắp theo điểm để tra khoảng, cần giữ điều gì?
Cặp tên–điểm phải đi cùng nhau.
Sắp riêng điểm làm lệch tên và điểm.
Tên không cần giống nhau.
Cần mọi bản ghi trong khoảng.
Lời giải
Khi đổi thứ tự theo điểm, phải chuyển cả cặp (tên, điểm).
Đang học