C5-13 · Tìm lỗi: trung bình ba bài kiểm tra
Xem dạng PDFĐề
Đề như bài C2-13, lần này lỗi nằm ở hàm: một dòng chứa ba điểm (số thực); in điểm trung bình với 2 chữ số thập phân. Với dữ liệu 7 8.5 6, kết quả đúng là 7.17.
Chương trình sau in một dòng rồi bị Runtime Error:
def trung_binh(a, b, c):
tb = (a + b + c) / 3
print(round(tb, 2))
x, y, z = input().split()
ket_qua = trung_binh(float(x), float(y), float(z))
print(f"{ket_qua:.2f}")
Hãy giải thích vì sao, sửa theo câu cần nhớ ở mục 5.3.2 — "hàm lo tính, chương trình chính lo nhập và in" — rồi nộp bản đã sửa. Bài nộp được chấm như một bài bình thường theo đề dưới đây.
Dữ liệu vào
Một dòng chứa ba điểm ~a~, ~b~, ~c~ (số thực), cách nhau một dấu cách.
Kết quả
Một dòng: điểm trung bình ~\dfrac{a + b + c}{3}~, in đúng 2 chữ số thập phân (kể cả khi là số nguyên: 7.00).
Ràng buộc
- ~0 \le a, b, c \le 10~; mỗi điểm có tối đa 2 chữ số thập phân, có thể viết dạng số nguyên (
7).
Ví dụ
Dữ liệu vào:
7 8.5 6
Kết quả:
7.17
Giải thích ví dụ
~(7 + 8{,}5 + 6) / 3 = 21{,}5 / 3 = 7{,}1666\ldots~, làm tròn 2 chữ số thập phân là 7.17.
Chương trình lỗi chạy như sau: lời gọi trung_binh(7.0, 8.5, 6.0) in 7.17 ngay trong hàm, rồi chạy hết thân mà không gặp return nên trả về None (mục 5.3.2). Biến ket_qua nhận None, và dòng print(f"{ket_qua:.2f}") dừng với
TypeError: unsupported format string passed to NoneType.__format__
Vì vậy màn hình có một dòng 7.17 rồi chương trình bị Runtime Error. Chữ NoneType trong thông báo lỗi gần như luôn có nghĩa: một hàm đã in thay vì trả về.
Ghi chú
- Cách sửa đúng tinh thần chương: hàm
returnkết quả, khôngprint; chương trình chính in bằng:.2f. - Chỉ xóa dòng in ở chương trình chính (giữ
print(round(tb, 2))trong hàm) thì7 8.5 6vẫn ra7.17, nhưng7 7 7in7.0thay vì7.00:roundlàm tròn chứ không định dạng số chữ số in ra. Hệ thống có test như vậy. - Hệ thống chỉ so kết quả in ra; phần "giải thích vì sao" là phần giảng viên kiểm khi chấm tay.
- Bản sửa để hàm
print(f"{tb:.2f}")còn chương trình chính chỉ gọi hàm thì vẫn in đúng kết quả nên máy chấm cho Accepted, nhưng không đạt yêu cầu khi chấm tay: đề yêu cầu hàm lo tính và trả về, chương trình chính lo in.
Nguồn trong sách: Bài C5-13, mục 5.10, giáo trình "Lập trình cơ sở với Python" — TS. Nguyễn Quốc Long · Mức: (**)