Tệp đầu vào và kết quả cần thấy
Tạo thư mục thực hành riêng; trong đó lưu tệp `so_luong_kho.txt` với bốn dòng:
```text
7
3
5
1
```
Mỗi dòng là số lượng giả của một mặt hàng, viết bằng **số nguyên không âm**. Lưu chương trình dưới tên `kho_b22.py` và chạy trong cùng thư mục. Đầu ra phải là `[1, 3, 5, 7]`. Tệp này chỉ có số lượng, chưa có tên mặt hàng; kết quả cho biết thứ tự các **số lượng**, chưa thể nói số nào thuộc tên hàng nào.
Đọc → sắp chèn → in
```python
def sap_chen_tang(a):
for i in range(1, len(a)):
gia_tri = a[i]
j = i - 1
while j >= 0 and a[j] > gia_tri:
a[j + 1] = a[j]
j -= 1
a[j + 1] = gia_tri
so_luong = []
with open("so_luong_kho.txt", "r", encoding="utf-8") as f:
for dong in f:
gia_tri = int(dong)
if gia_tri < 0:
raise ValueError("Số lượng phải không âm")
so_luong.append(gia_tri)
sap_chen_tang(so_luong)
print(so_luong)
```
Kết quả là `[1, 3, 5, 7]`. Chương trình đọc từng dòng chữ, chuyển sang `int` rồi mới so sánh theo giá trị số; hàm sắp sửa trực tiếp danh sách `so_luong`. Đổi một dòng thành chữ `ba` sẽ báo lỗi chuyển số; dòng âm bị từ chối theo quy ước đầu vào. Nếu báo không thấy tệp, kiểm tên tệp và thư mục chạy. Tệp rỗng cho danh sách rỗng `[]`, không gây lỗi chỉ số.
Bài luyện
Tệp gồm các dòng 7, 3, 5, 1. Sau sắp chèn tăng, danh sách là gì?
Các số theo thứ tự tăng.
Đây là thứ tự giảm.
3 và 5 còn sai thứ tự.
Đây là thứ tự ban đầu.
Lời giải
Chuyển từng dòng thành số nguyên được [7,3,5,1]; sắp tăng đưa 1,3,5,7 theo thứ tự.
Bài luyện
Vì sao phải dùng `int(dong)` trước khi sắp số lượng?
Chuỗi "10" và "2" không có thứ tự số như 10 và 2.
with quản lí việc đóng tệp.
Tệp không chứa tên.
Bài yêu cầu số lượng không âm.
Lời giải
Đọc tệp văn bản cho chuỗi. int chuyển chuỗi chữ số thành số nguyên để thuật toán so sánh theo độ lớn số lượng.
Bài luyện
Chỉ với tệp mỗi dòng là số lượng, chương trình có biết tên mặt hàng nào ứng với số 7 không?
Sau khi sắp, vị trí đã đổi; bản thân tệp không có tên.
Chỉ có bốn số lượng, thiếu thông tin ghép hàng.
Thuật toán chỉ đổi thứ tự số.
Mã hóa không thêm trường dữ liệu.
Lời giải
Tệp mẫu chỉ có số lượng. Muốn in tên theo số lượng, phải lưu tên cùng số lượng trong từng bản ghi và sắp cả bản ghi.
Đang học