Nhập môn Tư duy Lập trình/Lưu đồ có cấu trúc — ký hiệu, cách đọc, và chỗ nó bất lực
19/31
Bài 19 / 31~13 phútTừ đề bài tới thuật toánMiễn phí lượt xem

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 ATMTrên lưu đồ
Bạn đứng trước máy, cắm thẻ vào kheBắ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ảnXử 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 laihai cạnh ra từ hình thoi, một cạnh quay lui khi sai
💡 Cách nhớ

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.

Bốn ký hiệu lưu đồ xếp ngang: hình bầu dục ghi Bắt đầu Kết thúc, hình bình hành ghi Vào Ra, hình chữ nhật ghi Xử lý, hình thoi ghi Quyết định; dưới mỗi hình là chú thích tên hình và công dụng, cuối cùng là câu chốt hình thoi chính là if của module trước và cạnh quay ngược lên trên chính là vòng lặp

Ký hiệuHìnhDùng cho
Bắt đầu / Kết thúcbầu dụcmở và đóng lưu đồ
Vào / Rabình hànhđọc dữ liệu vào, in kết quả ra
Xử lýchữ nhậttính, gán, đổi giá trị
Quyết địnhthoimộ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.

Lưu đồ: hình bầu dục Bắt đầu, xuống hình bình hành đọc một số gọi là n, xuống hộp i gán 1 chú thích khởi tạo trước vòng lặp, xuống hình thoi hỏi i nhỏ hơn hoặc bằng 5, nhánh sai đi sang phải tới hình bầu dục Kết thúc, nhánh đúng đi xuống hình bình hành in ra n nhân i, tiếp tục xuống hộp nhấn màu xanh i gán i cộng 1 chú thích thiếu dòng này là chạy mãi, rồi một mũi tên chạy vòng bên trái quay ngược lên hình thoi điều kiện

🖊️ Thử đoán

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.

Kết quả

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.

Đối chiếu

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.

Hai hộp màu cam cạnh nhau: hộp trái ghi Gọi lại chính nó, hộp giải bài nhỏ hơn lại chứa nguyên cả lưu đồ này bên trong nên hình lồng hình không bao giờ đóng lại được; hộp phải ghi Hình dạng của dữ liệu, danh sách trong danh sách bảng trong bảng, lưu đồ vẽ được bước làm gì chứ không vẽ được dữ liệu trông như nào; hai mũi tên cùng đổ xuống hộp xanh lá ghi gặp hai chỗ này thì bỏ bút vẽ, quay về bảng trace và câu văn, đúng công cụ cho đúng việ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

📚 Đào sâu — vì sao khoá này chọn lư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

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 while luô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

Tự kiểm tra
0/6 câu đã trả lời
  1. Q1
    Vì 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?
  2. Q2
    if/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?
  3. Q3
    Cạ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?
  4. Q4
    Trong 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?
  5. Q5
    Vì sao lưu đồ không vẽ được một bước gọi lại chính nó (đệ quy)?
  6. Q6
    Cho 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

Đặt 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

Bài tiếp theo

Phân rã — chia tới khi mỗi bước gõ được ngay