Bộ điểm giả và yêu cầu
Tạo tệp `diem_gia_b22.txt` trong thư mục thực hành, với bốn dòng:
```text
7.0
9.0
6.5
9.0
```
Mỗi dòng là một điểm giả từ 0 đến 10. Lưu mã dưới tên `diem_b22.py` và chạy cùng thư mục. Chương trình cần in `[9.0, 9.0, 7.0, 6.5]`. Hai điểm 9.0 đều phải còn; tệp không có tên nên kết quả chỉ là dãy điểm, không là bảng xếp hạng người học.
Đọc điểm rồi chọn giá trị lớn nhất
```python
def sap_chon_giam(a):
n = len(a)
for i in range(n - 1):
i_lon_nhat = i
for j in range(i + 1, n):
if a[j] > a[i_lon_nhat]:
i_lon_nhat = j
if i_lon_nhat != i:
a[i], a[i_lon_nhat] = a[i_lon_nhat], a[i]
diem = []
with open("diem_gia_b22.txt", "r", encoding="utf-8") as f:
for dong in f:
gia_tri = float(dong)
if not 0 <= gia_tri <= 10:
raise ValueError("Điểm phải từ 0 đến 10")
diem.append(gia_tri)
sap_chon_giam(diem)
print(diem)
```
Kết quả là `[9.0, 9.0, 7.0, 6.5]`. Mỗi lượt chọn số **lớn nhất** của đoạn còn lại; dấu `>` khác bản sắp chọn tăng ở L19. `float` giữ được điểm lẻ như 6.5. Dòng chữ không chuyển được thành số sẽ báo lỗi; 11 hoặc -1 bị từ chối theo quy ước bài. Nếu tệp rỗng, hàm in `[]`; khi cần bảng điểm thật phải kiểm dữ liệu nguồn và quyền sử dụng riêng.
Bài luyện
Sắp chọn giảm dãy điểm `[7.0,9.0,6.5,9.0]` cho kết quả gì?
Đây là thứ tự tăng.
Hai điểm 9.0 đứng trước, rồi 7.0 và 6.5.
Bỏ mất một điểm 9.0.
Đây là dữ liệu ban đầu.
Lời giải
Sắp giảm đặt giá trị lớn ở trước: 9.0,9.0,7.0,6.5; thuật toán không xóa điểm trùng.
Bài luyện
Muốn sắp chọn giảm, trong vòng tìm giá trị cần dùng điều kiện nào?
Điều này tìm giá trị nhỏ nhất để sắp tăng.
Gặp giá trị lớn hơn thì cập nhật chỉ số lớn nhất.
j đang đi từ i+1 đến cuối.
Điểm 0 không quyết định thứ tự.
Lời giải
Ở mỗi lượt, i_lon_nhat phải trỏ đến điểm cao nhất trong phần chưa sắp; cập nhật khi a[j] lớn hơn điểm đang giữ.
Bài luyện
Nếu tệp có dòng `6.5`, dùng `int(dong)` sẽ ra sao?
int không nhận chuỗi có dấu chấm thập phân như "6.5".
int không làm tròn như vậy.
float("6.5") cho 6.5.
Lệnh int phải chuyển hoặc báo lỗi.
Lời giải
int("6.5") báo ValueError. Điểm có phần thập phân cần dùng float(dong) để nhận 6.5.
Đang học