Bỏ qua điều hướng, tới nội dung chính
Học C
Bài 7.414 phút đọc

Lưu đồ

Sau bài này bạn sẽ làm được

  • Nhận diện và dùng đúng sáu ký hiệu lưu đồ chuẩn
  • Vẽ lưu đồ cho rẽ nhánh và cho vòng lặp
  • Chuyển lưu đồ thành mã C
  • Biết khi nào lưu đồ không còn phù hợp

Lưu đồ diễn đạt thuật toán bằng hình vẽ. Nó mạnh ở chỗ cho thấy luồng điều khiển bằng trực giác, và yếu ở chỗ không mở rộng được cho chương trình lớn. Bài này dạy dùng nó đúng chỗ.

#Sáu ký hiệu chuẩn

Bộ ký hiệu này có từ chuẩn ISO 5807 và được dùng thống nhất trên toàn thế giới.

#Ba cấu trúc cơ bản

Mọi thuật toán, dù phức tạp tới đâu, đều ghép từ đúng ba cấu trúc này. Đó là kết quả của định lý về lập trình có cấu trúc, và cũng là lý do C chỉ cần if, while và câu lệnh tuần tự là đủ diễn đạt mọi thứ.

Cấu trúc 1: tuần tự

Các bước nối tiếp nhau, không rẽ nhánh, không lặp lại. Vẽ bằng một dãy hình chữ nhật nối bằng mũi tên đi xuống.

Bắt đầu -> Nhập a, b -> s = a + b -> In s -> Kết thúc

Cấu trúc 2: rẽ nhánh

Chuỗi else if vẽ thành chuỗi hình thoi nối tiếp nhau, mỗi cái có nhánh đúng đi sang phải.

Điểm quan trọng: các nhánh đúng đi sang phải rồi gặp lại nhau ở một điểm chung phía dưới. Trong lưu đồ đầy đủ, mọi nhánh phải hội tụ về một luồng duy nhất trước khi tới ô kết thúc.

Cấu trúc 3: lặp

Vòng lặp là một đường quay ngược. Vị trí ô điều kiện quyết định đó là while hay do while.

#Quy tắc vẽ

Quy tắcVì sao
Luồng chính đi từ trên xuống dướiNgười đọc quen đọc theo chiều đó, giống như đọc mã nguồn
Đúng một ô bắt đầu và một ô kết thúcNhiều lối ra làm người đọc khó chắc chắn thuật toán dừng ở đâu
Mọi mũi tên phải có đíchMũi tên cụt nghĩa là thuật toán chưa hoàn chỉnh
Mỗi hình thoi có đúng hai đường ra, đều có nhãnKhông có nhãn thì người đọc phải đoán
Mỗi ô chỉ chứa một việcÔ chứa nhiều việc thì mất tác dụng của việc vẽ hình
Tránh đường cắt nhauĐường cắt nhau làm rối. Dùng điểm nối nếu buộc phải nhảy xa
Ô chứa quá nhiều việc
┌────────────────────────────────────┐
│ Đọc file, phân tích, tính tổng,    │
│ sắp xếp rồi in ra màn hình         │
└────────────────────────────────────┘

Vẽ như vậy thì lưu đồ không nói thêm được gì
so với việc viết một câu văn.
Mỗi ô một việc
┌──────────────┐   ┌──────────────┐   ┌──────────────┐
│  Đọc file    │──▶│  Phân tích   │──▶│  Tính tổng   │
└──────────────┘   └──────────────┘   └──────────────┘

                   ┌──────────────┐   ┌───────▼──────┐
                   │  In kết quả  │◀──│   Sắp xếp    │
                   └──────────────┘   └──────────────┘

Từ lưu đồ sang mã C

Việc chuyển đổi gần như máy móc nếu lưu đồ được vẽ đúng quy tắc.

Trên lưu đồTrong mã C
Hình bầu dục đầuMở thân hàm main
Hình bình hành vàofgets kèm strtol
Hình bình hành raprintf
Hình chữ nhậtMột câu lệnh gán hoặc một lời gọi hàm
Hình thoi có hai nhánh khác nhauif else
Hình thoi có một nhánh quay ngược lênwhile
Hình thoi ở cuối có nhánh quay ngược lêndo while
Hình bầu dục cuốireturn 0 rồi đóng hàm

#Giới hạn của lưu đồ

Lưu đồ rất hữu ích khi học, nhưng trong công việc thật nó ít được dùng để mô tả toàn bộ chương trình. Có lý do rõ ràng.

Tình huốngLưu đồ có hợp khôngGhi chú
Một hàm dưới 30 dòngRất hợpVẽ nhanh, nhìn ra ngay luồng điều khiển
Máy trạng tháiRất hợpĐây là chỗ lưu đồ mạnh nhất, xem Chương 29
Giải thích cho người không biết lập trìnhRất hợpAi cũng đọc được hình vẽ
Chương trình vài trăm dòngKhông hợpLưu đồ trải dài nhiều trang, khó hơn đọc mã
Đệ quyKhông hợpLưu đồ không diễn đạt được lời gọi lồng nhau
Con trỏ và cấu trúc dữ liệuKhông hợpDùng sơ đồ ô nhớ thay thế, xem Chương 12

Tự làm thử

  1. Vẽ lưu đồ cho thuật toán kiểm tra một số chẵn hay lẻ, đủ cả ô bắt đầu và ô kết thúc.
  2. Vẽ lưu đồ cho thuật toán Euclid, chú ý vị trí ô điều kiện và đường quay ngược.
  3. Vẽ lưu đồ cho bài toán tìm giá trị lớn nhất trong mảng, rồi chuyển nó thành mã C.
  4. Cho một lưu đồ do bạn cùng lớp vẽ, viết mã C tương ứng mà không hỏi thêm gì. Nếu phải hỏi thì lưu đồ đó chưa đủ rõ.
  5. Thử vẽ lưu đồ cho một hàm đệ quy tính giai thừa, và giải thích vì sao lưu đồ không diễn đạt được đầy đủ.

Trình chấm điểm tự động sẽ được bổ sung ở giai đoạn sau. Hiện tại bạn tự chạy thử trên máy.

Tóm tắt

  • Sáu ký hiệu chuẩn: bầu dục, bình hành, chữ nhật, hình thoi, mũi tên, điểm nối.
  • Hình thoi luôn có đúng hai đường ra, và cả hai đều phải ghi nhãn đúng hoặc sai.
  • Mọi thuật toán ghép từ ba cấu trúc: tuần tự, rẽ nhánh và lặp.
  • Vòng lặp for vẽ thành while với ô khởi tạo đặt trước và ô cập nhật đặt cuối thân.
  • Lưu đồ hợp với hàm nhỏ và máy trạng thái, không hợp với chương trình lớn hay đệ quy.
  • Trong thực tế mã giả được dùng nhiều hơn vì gọn hơn và đưa vào kho mã nguồn được.