Phân biệt điểm 0 với không làm bài
Bài vận dụng thứ hai dùng `Diemthi.inp`: mỗi dòng gồm số báo danh và **đúng ba** điểm nguyên, điểm từ 0 đến 20 hoặc `-1` nếu không làm bài. Tổng chỉ cộng điểm **không âm**; cộng `-1` như điểm âm sẽ sai. Dữ liệu mẫu SGK cho `C11 10 12 18` tổng 40, `A12 12 -1 15` tổng 27 và `B01 12 10 4` tổng 26; đây là ba dòng đầu ra theo thứ tự giảm. Giữ số báo danh ở kiểu chuỗi để không đổi định danh. Cần có ít nhất ba học sinh để ghi đúng ba dòng như yêu cầu.
Đọc, tính, sắp và ghi theo các mô-đun
```python
def doc_bai_thi(ten_tep):
ban_ghi = []
with open(ten_tep, encoding="utf-8") as f:
for so_dong, dong in enumerate(f, 1):
truong = dong.split()
if len(truong) != 4:
raise ValueError(f"Dòng {so_dong}: cần mã và 3 điểm")
diem = [int(x) for x in truong[1:]]
if any(x < -1 or x > 20 for x in diem):
raise ValueError(f"Dòng {so_dong}: điểm không hợp lệ")
ban_ghi.append((truong[0], diem))
return ban_ghi
def tinh_tong(diem):
return sum(x for x in diem if x >= 0)
def ba_ket_qua_cao_nhat(ban_ghi):
if len(ban_ghi) < 3:
raise ValueError("Cần ít nhất 3 học sinh")
ket_qua = [(ma, diem, tinh_tong(diem)) for ma, diem in ban_ghi]
ket_qua.sort(key=lambda hang: hang[2], reverse=True)
return ket_qua[:3]
def ghi_ba_ket_qua(ten_tep, ba_hang):
with open(ten_tep, "w", encoding="utf-8") as f:
for ma, diem, tong in ba_hang:
print(ma, *diem, tong, file=f)
ban_ghi = doc_bai_thi("Diemthi.inp")
ghi_ba_ket_qua("ketqua.out", ba_ket_qua_cao_nhat(ban_ghi))
```
Với tệp mẫu SGK gồm năm dòng `A12 12 -1 15`, `B123 9 14 -1`, `C11 10 12 18`, `A110 10 -1 -1`, `B01 12 10 4`, tệp kết quả có `C11 10 12 18 40`, `A12 12 -1 15 27`, `B01 12 10 4 26`. Các điểm `-1` vẫn được **ghi nguyên** để thấy bài nào chưa làm; chúng chỉ bị bỏ khi cộng tổng. Khi bằng tổng, cách sắp này giữ thứ tự xuất hiện trong tệp.
Bài luyện
Điểm `12 -1 15` cho tổng bao nhiêu?
Đây là kết quả nếu cộng -1 vào tổng.
12+15=27; -1 là dấu không làm bài.
Cộng nhầm giá trị.
Vẫn tính được hai bài đã làm.
Lời giải
Chỉ cộng điểm không âm: 12+15=27; -1 không là điểm thi.
Bài luyện
Vì sao cần sắp cả bản ghi gồm mã, ba điểm và tổng?
Đổi vị trí cả bản ghi không gây lệch dữ liệu.
Mã vẫn là chuỗi.
-1 chỉ biểu thị bài không làm.
Sắp không đổi giá trị tổng.
Lời giải
Nếu sắp riêng tổng, mã và ba điểm gốc sẽ không còn thuộc đúng học sinh.
Bài luyện
Với dữ liệu SGK, ba mã được ghi theo thứ tự nào?
Tổng tương ứng 40,27,26.
Không theo tổng giảm.
Đây là thứ tự tăng trong ba người.
B123 tổng 23, A110 tổng 10.
Lời giải
Tổng năm bạn lần lượt là 27,23,40,10,26; ba lớn nhất theo thứ tự là C11, A12, B01.
Đang học