Lưu đồ có cấu trúc — ký hiệu, cách đọc, và chỗ nó bất lực
Một ký pháp ghi lời giải không phụ thuộc ngôn ngữ nào, chỉ gồm bốn ký hiệu. Nhưng nó không vẽ được mọi thứ — biết trước hai chỗ nó bất lực.
TL;DR: Lưu đồ có cấu trúc chỉ dùng đúng bốn ký hiệu: bầu dục cho Bắt đầu/Kết thúc, bình hành cho Vào/Ra, chữ nhật cho Xử lý, thoi cho Quyết định. Hình thoi chính là if bạn đã học, luôn ra đúng hai cạnh; còn cạnh quay ngược lên trên là vòng lặp. Nhưng ký pháp này bất lực ở hai chỗ: nó không vẽ được một bước gọi lại chính nó, vì hình sẽ lồng vào chính nó mãi không đóng lại; và nó vẽ được bước làm gì chứ không vẽ được dữ liệu trông như nào. Gặp một trong hai chỗ đó, quay về bảng trace và câu văn.
Bạn vừa giải tay xong ba ca cụ thể ở bài trước, rồi rút ra một quy luật chung. Nhưng quy luật đó đang nằm trong đầu bạn, hoặc rải rác trên vài dòng nháp — người ngồi cạnh không đọc được, mà ba tuần nữa chính bạn cũng chưa chắc nhớ nổi mình đã nghĩ gì.
Bạn cần một cách ghi lại các bước sao cho ai nhìn vào cũng hiểu đúng thứ tự, đúng chỗ rẽ nhánh, mà không cần biết bạn định gõ bằng ngôn ngữ nào. Bài này giới thiệu lưu đồ có cấu trúc — bốn ký hiệu, hết — rồi chỉ thẳng hai chỗ nó bất lực.
1. Analogy — đứng trước cây ATM
Bạn đứng trước một cây ATM. Cắm thẻ vào khe, máy hỏi mã PIN, bạn gõ bốn số. Máy đối chiếu rồi hỏi đúng một câu: mã đúng và tài khoản đủ tiền hay không? Sai thì bắt gõ lại; đúng thì nhả tiền, in biên lai, xong. Bạn vừa đi qua đúng bốn kiểu bước, không hơn.
| Ở cây ATM | Trên lưu đồ |
|---|---|
| Bạn đứng trước máy, cắm thẻ vào khe | Bắt đầu — bầu dục |
| Máy hỏi mã PIN, bạn gõ bốn số | Vào — hình bình hành |
| Máy đối chiếu, trừ tiền trong tài khoản | Xử lý — hình chữ nhật |
| Máy hỏi "mã đúng, đủ tiền không" | Quyết định — hình thoi |
| Sai thì bắt gõ lại; đúng thì nhả tiền, in biên lai | hai cạnh ra từ hình thoi, một cạnh quay lui khi sai |
Bầu dục nằm ở đúng hai đầu lưu đồ, như hai đầu một con đường. Hình bình hành nghiêng như tờ biên lai đang trượt ra khỏi khe máy — dữ liệu đang đi vào hoặc đi ra. Hình chữ nhật vuông vắn là chỗ máy đang tính, còn hình thoi nhọn hai đầu là chỗ duy nhất bạn phải trả lời đúng hoặc sai.
2. Bốn ký hiệu — đúng bốn, hết
Lưu đồ có cấu trúc dùng một bộ ký hiệu đóng. Bất kỳ bước nào trong một lời giải, dù phức tạp tới đâu, cũng phải quy về một trong bốn hình dưới đây.

| Ký hiệu | Hình | Dùng cho |
|---|---|---|
| Bắt đầu / Kết thúc | bầu dục | mở và đóng lưu đồ |
| Vào / Ra | bình hành | đọc dữ liệu vào, in kết quả ra |
| Xử lý | chữ nhật | tính, gán, đổi giá trị |
| Quyết định | thoi | một câu hỏi đúng/sai, ra đúng hai cạnh |
Bộ bốn này không thiếu, cũng không được thêm. Các biến thể mở rộng theo ANSI còn có hình khác — lục giác cho bước chuẩn bị, chữ nhật hai vạch dọc cho lời gọi chương trình con — nhưng đó là ký hiệu của một hệ rộng hơn, mượn về bỏ vào bản vẽ của bạn thì người đọc sau không biết nó nghĩa là gì. Vòng lặp không cần hình riêng: chỉ là một hình thoi cộng thêm một cạnh quay lui, như bạn sẽ thấy ở mục 4.
3. Lưu đồ này in ra bao nhiêu?
Dưới đây là một lưu đồ hoàn chỉnh, dùng đúng bốn ký hiệu vừa học, giải bài toán: đọc một số n, rồi in ra n nhân lần lượt từng số từ 1 tới 5.

Cho n bằng 3. Tự lần theo từng mũi tên trong hình trên: máy in ra dãy số nào, theo đúng thứ tự, và in tất cả bao nhiêu dòng? Viết dãy số đó ra giấy trước khi mở phần dưới.
i bắt đầu bằng 1, hình thoi hỏi "i nhỏ hơn hoặc bằng 5" mỗi lần trước khi in:
ibằng 1: đúng, in3 nhân 1= 3.ibằng 2: đúng, in 6.ibằng 3: đúng, in 9.ibằng 4: đúng, in 12.ibằng 5: đúng, in 15.ibằng 6: sai, dừng, đi thẳng ra Kết thúc.
Dãy in ra là 3, 6, 9, 12, 15 — năm dòng. Hình thoi được hỏi tổng cộng sáu lần: năm lần đúng, một lần sai để dừng.
4. Ký pháp mới, cơ chế cũ
Lưu đồ là một ký pháp mới bạn vừa học. Nhưng thứ nó vẽ ra thì không mới chút nào.
Nhìn lại hình thoi ở lưu đồ trên: nó hỏi đúng một câu, ra đúng hoặc sai, rồi đi đúng một trong hai cạnh, đúng cơ chế if bạn đã học ở module trước.
Điều kiện là một biểu thức cho ra đúng hoặc sai, máy đi đúng một trong các nhánh, không nhánh nào khác được tính tới. Trên lưu đồ, đó là hình thoi ra đúng hai cạnh: một cạnh cho đúng, một cạnh cho sai.
Cạnh còn lại đáng chú ý là cạnh quay ngược lên trên, từ hộp "i = i + 1" chạy ngược lên hình thoi "i nhỏ hơn hoặc bằng 5" — một vòng lặp while. Hộp đó được tô đậm trong hình vì lý do rất thật: thiếu đúng dòng này, hình thoi mãi mãi hỏi lại cùng một i, và lưu đồ chạy mãi không bao giờ ra được nhánh sai.
Một vòng lặp có ba phần: khởi tạo, điều kiện, và cập nhật. Trên lưu đồ, phần cập nhật — bước làm cho điều kiện cuối cùng phải sai để vòng lặp dừng lại — nằm ngay trước cạnh quay lui, ngay trước khi hình thoi được hỏi lại lần nữa.
Viết lại đúng lưu đồ ở mục 3 bằng Python, ba phần đó hiện ra rõ ràng:
n = 3
i = 1
while i <= 5:
print(n * i)
i = i + 1
i = 1 là khởi tạo, i <= 5 là điều kiện — đúng cái hình thoi đang hỏi — và i = i + 1 là cập nhật, đứng ngay trước dòng lặp lại while, đúng y vị trí của nó trên lưu đồ. Ký hiệu đổi, cơ chế bên dưới vẫn vậy.
5. Tới lượt bạn
Đổi n của lưu đồ ở mục 3 từ 3 thành 4, giữ nguyên hình thoi "i nhỏ hơn hoặc bằng 5". Tự trace bằng tay, viết ra dãy số được in ra và bao nhiêu dòng — rồi mới đối chiếu.
Dãy in ra là 4, 8, 12, 16, 20 — vẫn năm dòng. Số dòng không đổi vì n không nằm trong điều kiện dừng: hình thoi vẫn hỏi về i, và i vẫn đi 1, 2, 3, 4, 5 rồi dừng ở 6. Đổi n chỉ đổi giá trị được in ở mỗi vòng, không đổi số vòng — nếu bạn ra bốn hoặc sáu dòng thì chỗ sai nằm ở lần hỏi cuối cùng của hình thoi.
6. Khi nào lưu đồ bó tay?
Bốn ký hiệu ở mục 2 vẽ được rất nhiều lời giải trong khoá này. Nhưng có đúng hai chỗ chúng bất lực.
Gọi lại chính nó. Giả sử lời giải cho "tính giai thừa của n" được định nghĩa bằng chính nó: giai thừa của n bằng n nhân giai thừa của (n trừ 1). Muốn vẽ hộp "giải giai thừa của n trừ 1", bạn phải vẽ nguyên cả cái lưu đồ đang vẽ dở vào bên trong chính hộp đó, rồi bên trong cái đó lại một bản sao nữa, không bao giờ dừng. Hình lồng hình, không bao giờ đóng lại được. (Cách gọi lại chính nó này tên là đệ quy — bạn sẽ gặp lại ở khoá thuật toán.)
Hình dạng của dữ liệu. Lưu đồ vẽ tốt bước làm gì: cộng, so sánh, lặp. Nhưng có bài toán khó nằm ở dữ liệu trông như nào — một danh sách lớp học, mỗi lớp lại là một danh sách học sinh, mỗi học sinh lại là một danh sách điểm. Không hình nào ở mục 2 vẽ được một cấu trúc lồng ba tầng như vậy; cố vẽ thì bản vẽ rối tới mức chính người vẽ cũng không đọc lại được.

Gặp một trong hai chỗ này, bỏ bút vẽ. Quay về bảng trace và câu văn thường — hai công cụ đó không bị giới hạn kiểu "hình lồng hình" hay "phải vẽ được hình dạng". Đúng công cụ cho đúng việc.
7. Bẫy thường gặp
❌ Nhầm 1: tự chế thêm hình. Thấy tài liệu khác có hình lục giác cho vòng lặp rồi mượn về, trộn vào bản vẽ của mình. ✅ Bốn hình ở mục 2, hết. Vòng lặp là một hình thoi cộng một cạnh quay lui, không phải một hình riêng.
❌ Nhầm 2: vẽ một hình thoi ba cạnh cho if/elif/else. Có ba nhánh thì vẽ luôn một hình thoi ba cạnh cho gọn. ✅ Hình thoi luôn đúng hai cạnh. if/elif/else là một chuỗi hình thoi nối tiếp — thoi thứ nhất ra sai mới tới thoi thứ hai được hỏi, đúng cơ chế "dừng ở câu hỏi đúng đầu tiên" đã học ở bài rẽ nhánh.
❌ Nhầm 3: bỏ qua cạnh "sai" vì tưởng nó không quan trọng. Nhánh sai của hình thoi ở mục 3 chỉ để thoát vòng lặp, không tính toán gì, nên có người bỏ hẳn cạnh đó ra khỏi bản vẽ cho gọn. ✅ Hình thoi phải có đủ hai cạnh đi ra, kể cả khi một nhánh chỉ để thoát. Thiếu cạnh "sai", người đọc không biết khi nào vòng lặp dừng lại.
8. 📚 Đào sâu
Chọn lưu đồ thay vì pseudocode không chỉ vì trực quan hơn — có nghiên cứu đo được. Một thí nghiệm năm 1989 của Scanlan so sánh lưu đồ với pseudocode: nhóm đọc lưu đồ tốn ít thời gian hơn, mắc ít lỗi hơn, tự tin hơn. Một thí nghiệm lặp lại năm 2022 bằng eye-tracking trên 114 người ra kết quả cùng chiều, ở cả ba mức độ phức tạp bài toán mà nhóm tác giả thử.
Nguồn:
9. Liên hệ các bài khác
- Bài 2 — Làm tay trước khi làm máy — lưu đồ ghi lại đúng quy luật bạn tìm ra bằng cách giải tay; chưa giải tay xong thì chưa có gì để vẽ.
- Bài 1 module 2 — Rẽ nhánh — vì sao hình thoi luôn ra đúng hai cạnh.
- Bài 3 module 2 — Vòng lặp while — vị trí phần cập nhật, ngay trước cạnh quay lui.
- Bài 4 — Phân rã — một lưu đồ nhiều bước được chia nhỏ tiếp bằng cây phân rã.
- Bài 6 — Ca biên — soi lại cơ chế lặp ở mục 3 tại các ca biên: điều kiện sai ngay từ đầu (vòng lặp không chạy lần nào), điều kiện chỉ đúng đúng một lần.
10. Tóm tắt
- Thấy ký hiệu lạ ở tài liệu khác (lục giác, chữ nhật hai vạch dọc) thì đó là hệ ký hiệu riêng của họ, đừng mượn vào bản vẽ của mình.
- Hình thoi luôn ra đúng hai cạnh; if/elif/else là một chuỗi hình thoi nối tiếp, không phải một hình thoi nhiều cạnh.
- Cạnh quay ngược lên trên là vòng lặp; phần cập nhật của
whileluôn đứng ngay trước cạnh đó. - Hai chỗ lưu đồ bất lực: gọi lại chính nó (hình lồng hình không đóng lại được), và dữ liệu lồng nhau (lưu đồ vẽ được bước làm gì, không vẽ được dữ liệu trông như nào) — gặp một trong hai thì quay về bảng trace và câu văn.
11. Tự kiểm tra
- Q1Vì sao lưu đồ có cấu trúc chỉ dùng đúng bốn ký hiệu, không được tự thêm hình thứ năm?
- Q2if/elif/else có ba nhánh trở lên. Vì sao không vẽ bằng một hình thoi ba cạnh cho gọn?
- Q3Cạnh quay ngược lên trên trên lưu đồ tương ứng với điều gì trong một vòng lặp while, và phần cập nhật nằm ở đâu?
- Q4Trong lưu đồ ở mục 3, nếu đổi hình thoi từ 'i nhỏ hơn hoặc bằng 5' thành 'i nhỏ hơn hoặc bằng 3' (n vẫn bằng 3), vòng lặp in ra bao nhiêu dòng, và giá trị cuối cùng là bao nhiêu?
- Q5Vì sao lưu đồ không vẽ được một bước gọi lại chính nó (đệ quy)?
- Q6Cho một danh sách lớp học, mỗi lớp là một danh sách học sinh, mỗi học sinh lại là một danh sách điểm. Vì sao đây là bài toán lưu đồ khó vẽ, và bạn nên chuyển sang công cụ nào?
Bài tiếp theo: Phân rã — chia tới khi mỗi bước gõ được ngay
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