Một tệp chứa đủ ba trường của mỗi hàng
Tạo tệp `mua_hang_gia.txt` trong thư mục thực hành:
```text
But 5000 3
Vo 12000 1
Thuoc 8000 2
Tay 4000 3
```
Đây là **giá và số lượng giả định**, không phải giá thị trường. Mỗi dòng có đúng một tên một từ, đơn giá nguyên không âm và số lượng nguyên dương. Thành tiền lần lượt là 15000, 12000, 16000, 12000 đơn vị. Cần in tên và thành tiền theo thứ tự tăng: `Vo 12000`, `Tay 12000`, `But 15000`, `Thuoc 16000`. Hai hàng cùng thành tiền giữ thứ tự ban đầu trong cách nổi bọt ở dưới.
Đổi chỗ cả bản ghi khi tích sai thứ tự
```python
def thanh_tien(hang):
return hang[1] * hang[2]
def sap_theo_tien_tang(a):
n = len(a)
for i in range(n - 1):
for j in range(n - 1 - i):
if thanh_tien(a[j]) > thanh_tien(a[j + 1]):
a[j], a[j + 1] = a[j + 1], a[j]
hang_hoa = []
with open("mua_hang_gia.txt", "r", encoding="utf-8") as f:
for dong in f:
ten, gia_chu, luong_chu = dong.split()
gia, luong = int(gia_chu), int(luong_chu)
if gia < 0 or luong <= 0:
raise ValueError("Đơn giá không âm, số lượng dương")
hang_hoa.append((ten, gia, luong))
sap_theo_tien_tang(hang_hoa)
for hang in hang_hoa:
print(hang[0], thanh_tien(hang))
```
Chương trình in bốn dòng theo thứ tự dự kiến. Mỗi `hang` là bộ ba `(tên, đơn giá, số lượng)`; khi đổi chỗ, cả bộ ba đi cùng nhau nên tên không lệch khỏi giá/số lượng. So sánh bằng dấu `>` nên hai hàng có thành tiền bằng nhau không đổi chỗ; `Vo` vẫn đứng trước `Tay`. Nếu dòng thiếu trường, có tên gồm dấu cách, giá không chuyển được thành số hoặc số lượng không hợp lệ, chương trình báo lỗi để sửa tệp. Tệp rỗng không in dòng nào.
Bài luyện
Với hàng `But 5000 3`, thành tiền giả định là bao nhiêu?
Cần nhân, không cộng.
5000 × 3 = 15000.
8000 là đơn giá của hàng khác.
3 là số lượng.
Lời giải
Đơn giá 5000 nhân số lượng 3 được thành tiền 15000 đơn vị.
Bài luyện
Khi nổi bọt theo thành tiền, vì sao phải đổi chỗ cả bộ ba `(tên, giá, lượng)`?
Ba trường cùng tạo một bản ghi.
Chương trình không dùng điểm.
Không có thao tác xóa.
Tiêu chí là tích giá × lượng, không phải tên.
Lời giải
Nếu chỉ đổi giá hoặc lượng, tên sẽ bị ghép với dữ liệu của hàng khác. Đổi toàn bộ bản ghi giữ quan hệ đúng.
Bài luyện
`Vo` và `Tay` cùng thành tiền 12000. Trong hàm mẫu, thứ tự hai hàng sau sắp là gì?
Hàm không so tên.
Dấu > không đổi cặp có thành tiền bằng nhau.
Không xóa hàng.
Không xóa hàng.
Lời giải
Khi hai thành tiền bằng nhau, điều kiện đổi chỗ sai. Nổi bọt mẫu giữ thứ tự ban đầu của hai hàng: Vo trước Tay.
Đang học