C5-13 · Tìm lỗi: trung bình ba bài kiểm tra

Xem dạng PDF

Gửi bài giải

Điểm: 1,00
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Tác giả:
Nguồn bài:
Sách "Lập trình cơ sở với Python"
Dạng bài
Ngôn ngữ cho phép
Python

Đề

Đề 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 return kết quả, không print; 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 6 vẫn ra 7.17, nhưng 7 7 7 in 7.0 thay vì 7.00: round là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: (**)


Đang tải...