Mini challenge — từ đề tới lưu đồ hoàn chỉnh
Một đề chưa gặp, không giảng gì trước. Bóc ba ô, giải tay ba ca, phân rã, vẽ lưu đồ, soi ca biên — rồi mới mở lời giải mẫu ra đối chiếu.
Làm sai bài này ở lần thử đầu là chuyện bình thường — nó không nói lên gì về việc bạn có hợp làm nghề này hay không. Đây là lần đầu tiên bạn tự chạy cả sáu khâu một mình, không ai đứng cạnh nhắc bước tiếp theo.
Bài này không dạy gì mới. Sáu bài vừa rồi đã đưa đủ công cụ: bóc đề, giải tay, vẽ lưu đồ, phân rã, tách hàm, soi ca biên. Đến lượt bạn cầm cả sáu lên cùng lúc, trên một đề chưa từng gặp.
1. Đề bài
Một cửa hàng ghi lại số tiền của từng hoá đơn trong ngày. Tính tổng doanh thu, nhưng chỉ tính các hoá đơn từ 50000 trở lên.
Đúng hai câu, và cả hai đều cần đọc kỹ. Trước khi lật sang mục sau, lấy giấy ra.
2. Lấy giấy — làm sáu khâu
Chạy đúng sáu khâu module này đã dạy, theo thứ tự — đừng nhảy sang vẽ lưu đồ khi khâu 1 và 2 chưa xong trên giấy:
- Bóc ba ô. Input là gì — kiểu dữ liệu, và ràng buộc của nó (một hoá đơn có thể âm không? danh sách hoá đơn có thể rỗng không?). Xử lý làm việc gì. Output là gì — đúng một con số hay nhiều số.
- Giải tay ba ca cụ thể. Tự chọn ba danh sách hoá đơn khác nhau, tính tổng bằng tay cho từng danh sách. Bắt buộc dựng ít nhất một danh sách có một hoá đơn đúng bằng 50000.
- Phân rã tới mức gõ được ngay. Từ ba ca vừa giải, tách quy trình thành các bước — mỗi bước phải nhỏ tới mức gõ thành code ngay, không cần nghĩ thêm.
- Vẽ lưu đồ bằng đúng bốn ký hiệu. Bầu dục, bình hành, chữ nhật, thoi — không hình nào khác.
- Cân nhắc tách một hàm. Nhóm bước "hoá đơn này có được tính không" có xứng đáng có tên riêng không? Nếu có, hàm đó nhận vào gì, trả ra gì — gợi ý
la_hoa_don_lon(tien). - Soi ca biên. Danh sách rỗng thì lời giải trả ra gì? Nếu mọi hoá đơn đều dưới ngưỡng thì sao? Và ca dễ sai nhất: một hoá đơn đúng bằng ngưỡng thì tính hay bỏ?
Làm xong cả sáu, bạn có trong tay: ba ô viết trên giấy, ba ca đã giải tay, một lưu đồ, một quyết định về hàm, và câu trả lời cho ba ca biên. Có đủ ngần đó rồi mới mở mục 3 hoặc mục 4.
3. Gợi ý
Chỉ mở phần này nếu bạn đã thử cả sáu khâu và đang kẹt ở một khâu cụ thể. Đây là câu hỏi định hướng, không phải đáp án.
- Một hoá đơn có thể mang giá trị âm không? Danh sách hoá đơn có thể rỗng không? Cả hai câu đều thuộc về ô ràng buộc, không phải ô xử lý.
- Trong ba ca bạn giải tay, đã có ca nào chứa hoá đơn đúng bằng 50000 chưa? Chưa có thì quay lại giải thêm ca đó trước khi sang khâu 3.
- "Duyệt qua từng hoá đơn" và "quyết định có cộng hoá đơn đó vào tổng hay không" — đó là một bước hay hai bước tách biệt trong lưu đồ?
- Khối gán
tongvề 0 nên nằm ở đâu so với hình thoi hỏi "còn hoá đơn chưa xét" — trước, bên trong, hay sau vòng lặp? - Nhóm bước "hoá đơn này có được tính không" luôn trả lời bằng đúng hoặc sai. Một hàm trả về
True/Falsecó gọi thẳng tên được ý đó không? - Khi danh sách rỗng, thân vòng lặp có chạy lần nào không? Nếu không chạy lần nào,
tonggiữ nguyên giá trị nào nó được gán lúc khởi tạo?
4. Đối chiếu
Chỉ mở phần này sau khi bạn đã làm xong cả sáu khâu trên giấy.
Ba ô, đối chiếu nhanh: input là danh sách số tiền hoá đơn (mỗi hoá đơn là một số không âm, danh sách có thể rỗng). Xử lý là duyệt từng hoá đơn, cộng dồn vào tong chỉ khi hoá đơn đó từ 50000 trở lên. Output là một số duy nhất — tổng doanh thu đã lọc.
Ba ca giải tay:
| Ca | Danh sách hoá đơn | Tổng doanh thu |
|---|---|---|
| Ca thường | [42000, 68000, 95000] | 163000 |
| Ca ngưỡng — quan trọng nhất | [50000, 20000] | 50000 |
| Ca toàn bộ dưới ngưỡng | [10000, 25000, 49000] | 0 |
Ca thứ hai là ca hay bị làm sai nhất. "Từ 50000 trở lên" không chặt, nên hoá đơn đúng 50000 ĐƯỢC tính, không bị loại. Nếu bạn tính ra 20000 cho ca này, bạn đã đọc đề như thể nó viết "trên 50000" chứ không phải "từ 50000 trở lên".
Lưu đồ mẫu:

Hai chỗ trên lưu đồ này người mới hay bỏ sót:
- Nhánh "sai" của hình thoi thứ hai KHÔNG làm gì cả — nó không cộng, không rẽ đi đâu khác, chỉ quay thẳng về hình thoi thứ nhất để xét hoá đơn kế tiếp. Nhánh không làm gì vẫn phải vẽ ra, không được bỏ vì "có gì đâu mà vẽ".
- Khối
tong = 0nằm TRƯỚC hình thoi thứ nhất, ngoài vòng lặp. Đặt nó vào trong vòng lặp là lỗi đặt lại tổng về 0 mỗi lượt — đúng lỗi bài 6 — Ca biên đã cảnh báo.
Code khớp với lưu đồ:
def la_hoa_don_lon(tien):
return tien >= 50000
hoa_don = [42000, 68000, 95000]
tong = 0
for tien in hoa_don:
if la_hoa_don_lon(tien):
tong = tong + tien
print(tong)
Output thật:
163000
Ba ca biên, nhắc lại:
- Danh sách rỗng: vòng lặp không chạy lần nào,
tonggiữ nguyên 0. Đây là câu trả lời ĐÚNG, không phải dấu hiệu chương trình hỏng. - Mọi hoá đơn đều dưới ngưỡng: cùng lý do,
tongkhông được cộng lần nào, kết quả là 0 — cũng đúng, không phải lỗi. - Hoá đơn đúng bằng 50000: được tính, vì đề dùng "từ 50000 trở lên", không phải "trên 50000".
5. Phần hai — đổi một chữ, đổi cả kết quả
Đề đổi lại: tính tổng doanh thu, nhưng chỉ tính các hoá đơn trên 50000. Chỉ khác đúng một chữ so với đề gốc — "trên" thay cho "từ... trở lên" — nhưng chữ đó lật hẳn một ca biên.
Tự trả lời trước khi kéo xuống bài tập: lời giải ở mục 4 phải đổi đúng mấy chỗ để khớp đề mới? Và với danh sách [50000, 20000], tong bây giờ in ra bao nhiêu?
Sắp lại các dòng dưới đây cho khớp đề mới:
Đưa từng dòng vào khung lời giải rồi xếp cho đúng thứ tự và đúng thụt lề. Kho có thể chứa dòng thừa.
Kho dòng (6)
tong = tong + tienprint(tong)if tien >= 50000:if tien > 50000:for tien in hoa_don:tong = 0
Lời giải của bạn (0/5)
Chưa có dòng nào. Bấm “Đưa vào” ở trên.
Gợi ý: Bốn dòng còn lại không đổi so với bản gốc. Dòng nào đang kiểm tra ngưỡng 50000?
Xong bài tập, so lại con số bạn vừa tính cho danh sách [50000, 20000] với con số ở ca ngưỡng của mục 4. Hai con số đó lệch nhau đúng bằng giá trị của hoá đơn nằm sát ngưỡng.
6. Điều bạn vừa làm được
Bạn vừa chạy trọn sáu khâu module này dạy, trên một đề chưa từng thấy:
- Bóc ba ô từ một đoạn văn xuôi hai câu.
- Giải tay ba ca, và tìm đúng ca hiểm nhất — ca chạm ngưỡng.
- Phân rã quy trình tới mức mỗi bước gõ được ngay.
- Vẽ một lưu đồ đúng bốn ký hiệu, kể cả nhánh không làm gì.
- Cân nhắc và đặt tên cho một hàm.
- Soi ba ca biên trước khi chạy dòng code nào.
Quy trình này không gắn với Python. Đổi "hoá đơn" thành một đối tượng khác, đổi Python thành Java, sáu khâu trên không đổi một chữ nào — thứ đổi chỉ là cú pháp gõ ra ở bước cuối cùng.
Bài tiếp theo: Tổng kết module — bạn đã có một quy trình lặp lại được
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên