Lưu đồ Nassi–Shneiderman

**Lưu đồ Nassi&ndash;Shneiderman (NSD)** trong lập trình máy tính là một biểu diễn hình ảnh thể hiện một lập trình cấu trúc. Lưu đồ này được phát triển vào năm 1972 bởi Isaac Nassi và học trò của ông, Ben Shneiderman. Lưu đồ này còn được gọi là **lưu đồ cấu trúc**, bởi vì nó thể hiện cấu trúc của chương trình.

## Tổng quan
Theo thiết kế từ trên xuống dưới, vấn đề được chia ra thành nhiều vấn đề nhỏ hơn, cho đến khi chỉ còn những câu lệnh đơn giản và những kiến trúc dòng điều khiển tồn tại. Lưu đồ Nassi&ndash;Shneiderman phản ánh kiểu phân tách từ trên xuống dưới này một cách trực tiếp, bằng cách dùng những hình hộp lồng nhau để thể hiện những vấn đề nhỏ hơn. Nhất quán với lý thuyết của lập trình cấu trúc, Lưu đồ Nassi&ndash;Shneiderman không có cách nào để thể hiện câu lệnh GOTO.

Lưu đồ Nassi&ndash;Shneiderman rất ít khi được dùng cho lập trình chính thức. Độ trừu tượng của nó rất gần với mã lệnh của một chương trình cấu trúc và sẽ phải vẽ lại toàn bộ lưu đồ nếu muốn chỉnh sửa. Tuy nhiên, lưu đồ Nassi&ndash;Shneiderman có thể hữu ích khi dùng trong giai đoạn phác thảo và những thiết kế cấp cao.

Lưu đồ Nassi&ndash;Shneiderman rất tương đồng (gần như hoàn toàn) với lưu đồ truyền thống. Tất cả những gì có thể thể hiện trên lưu đồ Nassi&ndash;Shneiderman đều có thể thể hiện trên lưu đồ truyền thống và ngược lại. Một số ngoại lệ có thể kể đến câu lệnh goto và hai câu lệnh "break", "continue" trong vòng lặp của ngôn ngữ lập trình C.

## Lưu đồ
**Khối xử lý:** khối xử lý thể hiện những bước đơn giản nhất và không yêu cầu phân tích. Khi gặp một khối xử lý, hành động bên trong khối đó được thực hiện và ta chuyển đến khối tiếp theo.

**Khối rẽ nhánh:** có hai lọaị khối rẽ nhánh. Loại một là loại đúng/sai hoặc có/không đơn giản, cung cấp cho chương trình hai hướng lựa chọn trên cơ sở điều kiện có được thỏa mãn hay không. Những khối này có thể sử dụng như những vòng lặp, bắt chương trình thực hiện một công việc cho đến khi điều kiện được thỏa mãn.

Loại khối rẽ nhánh thứ hai là loại khối rẽ nhánh nhiều lựa chọn. Loại này được dùng khi chương trình cần đến trường hợp lựa chọn. Khối này thường chứa một câu hỏi hoặc lựa chọn. Sau đó nó cung cấp cho chương trình một chuỗi những lựa chọn, thường đi kèm với những khối xử lý con để tiết kiệm diện tích.

**Vòng lặp thử:** khối này cho phép chương trình lặp lại một hoặc nhiều công việc cho đến khi điều kiện liên quan được thỏa mãn. Những khối xử lý bao quanh bởi mỗi vòng lặp là các khối con với thanh bên chạy từ điều kiện ra ngoài.

Có hai loại vòng lặp thử chính, vòng thử trước và vòng thử sau. Sự khác biệt duy nhất giữa hai loại này là thứ tự các bước được thực hiện trong vòng lặp.
Trong vòng lặp thử trước, khi chương trình bắt gặp vòng lặp thử, nó sẽ kiểm tra xem điều kiện đã được thỏa mãn chưa. Nếu điều kiện chưa thỏa mãn thì thực hiện các công việc trong vòng lặp sau đó quay lại, kiểm tra lại điều kiện. Nếu điều kiện chưa thỏa mãn thì thực hiện lại các công việc. Cứ như vậy cho đến khi điều kiện được thỏa mãn, chương trình sẽ bỏ qua các bước xử lý và chuyển đến khối tiếp theo.

Vòng lặp thử sau đảo lôn thứ tự lại, các công việc được thực hiện trước khi điều kiện được kiểm tra. Vòng lặp thử sau cho phép các công việc được thực hiện ít nhất một lần trước khi điều kiện được kiểm tra lần đầu tiên.

## Tài liệu đã xuất bản
* Nassi, I.; Shneiderman, B.: *[http://www.cs.umd.edu/hcil/members/bshneiderman/nsd/1973.pdf Flowchart techniques for structured programming]*, SIGPLAN Notices XII, August 1973.

## Tham khảo

## Các đường link liên kết

*''A short history of structured flowcharts (Nassi&ndash;Shneiderman Diagrams)'', by Ben Shneiderman

### Phần mềm
*Atego's BlueRiverX32  – Nassi&ndash;Shneiderman development environment for C and C++
*Structorizer – Nassi&ndash;Shneiderman diagram-editor for Linux, Mac OS X & Microsoft Windows, released under the GNU General Public License
*Struktograaf – Nassi&ndash;Shneiderman diagram-editor for Microsoft Windows, proprietary application (Dutch website)