Nhiệm vụ và dữ liệu thử
Tạo tệp `diem_mot_nguoi.py`. Dùng **điểm giả** `[8.0, 7.0, 9.0]` của một môn học, tính điểm trung bình, thấp nhất và cao nhất. Trong bài thử này, điểm hợp lệ nằm từ 0 đến 10 và cần **ít nhất hai** đầu điểm như nhiệm vụ SGK. Kết quả dự kiến là trung bình `8.0`, thấp nhất `7.0`, cao nhất `9.0`; chương trình không tính hệ số hay làm tròn theo quy chế đánh giá nào.
Duyệt một lần để cập nhật hai cực trị
```python
def thong_ke(diem):
if len(diem) < 2 or any(not 0 <= x <= 10 for x in diem):
raise ValueError("Cần ít nhất hai điểm trong khoảng 0–10")
tong = 0
thap_nhat = cao_nhat = diem[0]
for x in diem:
tong += x
if x < thap_nhat:
thap_nhat = x
if x > cao_nhat:
cao_nhat = x
return tong / len(diem), thap_nhat, cao_nhat
print(thong_ke([8.0, 7.0, 9.0]))
```
Chạy tệp bằng Python sẽ in `(8.0, 7.0, 9.0)`. Giá trị đầu tiên được dùng để khởi tạo cực trị vì nó thật sự thuộc dãy; mỗi lần duyệt, chỉ cập nhật khi gặp điểm nhỏ hơn hoặc lớn hơn. Thử đổi dữ liệu thành `[6.0, 6.0]` thì được `(6.0, 6.0, 6.0)`. Nếu thay bằng `[]`, `[8.0]` hay `[11.0, 7.0]`, chương trình báo `ValueError` trước khi truy cập `diem[0]` hoặc chia cho độ dài không phù hợp.
Khi chuyển sang nhập từ bàn phím, không coi chữ nhập sai là điểm 0; cần yêu cầu nhập lại.
Nhập điểm và sửa dữ liệu chưa hợp lệ
Đặt đoạn sau **sau định nghĩa hàm** `thong_ke` trong cùng tệp. Khi chạy, nhập các điểm cách nhau bằng dấu cách; nhập `8 7 9` sẽ nhận kết quả `(8.0, 7.0, 9.0)`.
```python
while True:
chuoi = input("Nhập ít nhất hai điểm: ")
try:
diem = [float(x) for x in chuoi.split()]
ket_qua = thong_ke(diem)
except ValueError as loi:
print("Nhập lại:", loi)
continue
print(ket_qua)
break
```
Thử nhập `8 a 9`: `float("a")` báo lỗi và chương trình hỏi lại. Thử nhập `8`: hàm báo thiếu đầu điểm. Chỉ khi chuyển được thành ít nhất hai số trong khoảng 0–10, vòng lặp mới kết thúc.
Bài luyện
Với điểm `[8.0, 7.0, 9.0]`, kết quả trung bình là bao nhiêu?
7.0 là điểm thấp nhất.
Tổng 24.0 chia ba đầu điểm bằng 8.0.
9.0 là điểm cao nhất.
24.0 là tổng, chưa chia số đầu điểm.
Lời giải
Ba điểm có tổng 8+7+9=24. Có ba đầu điểm, nên trung bình là 24/3=8.0.
Bài luyện
Vì sao chương trình gán `thap_nhat = cao_nhat = diem[0]` sau bước kiểm dữ liệu?
Mốc ban đầu thuộc dữ liệu cần thống kê.
Lệnh gán không xóa phần tử.
Các phần tử khác giữ nguyên giá trị.
Kiểm khoảng điểm vẫn cần làm riêng.
Lời giải
Khi danh sách đã có ít nhất hai số, diem[0] tồn tại. Dùng nó làm mốc rồi duyệt từng điểm để cập nhật cực trị.
Bài luyện
Dữ liệu nào bị hàm `thong_ke` từ chối theo điều kiện của bài thử?
Có hai điểm trong khoảng 0–10.
Hai đầu mút 0 và 10 đều hợp lệ.
Ba điểm đều trong khoảng.
11.0 nằm ngoài khoảng 0–10.
Lời giải
Hàm yêu cầu ít nhất hai điểm và mọi điểm thuộc khoảng đóng 0–10. Dãy có 11.0 vi phạm điều kiện thứ hai.
Đang học