Mục từ này đã đạt chất lượng ở mức sản phẩm bước đầu của Đề án Biên soạn Bách khoa toàn thư Việt Nam giai đoạn 1
Lập trình cấu trúc

Lập trình cấu trúc (tiếng Anh Structured Programming) là phương pháp lập trình trong đó các câu lệnh của chương trình được ghép nối theo 3 cấu trúc điều khiển: tuần tự (ghép nối kế tiếp nhau), rẽ nhánh (lựa chọn) và lặp, làm cơ sở để tổ chức chương trình thành các khối và chương trình con. Đây cũng là phương pháp lập trình phổ biến, được hỗ trợ trong các ngôn ngữ lập trình như C, C++, Java, C#, PHP, Ruby, Perl, Pascal.

Với phương pháp lập trình cấu trúc, chương trình được hình thành từ các khối và các chương trình con được kết nối với nhau theo các cấu trúc điều khiển.

Cấu trúc điều khiển[sửa]

Cấu trúc điều khiển gồm cấu trúc tuần tự, lựa chọn, lặp.

Cấu trúc tuần tự: các lệnh được thực hiện lần lượt theo thứ tự. Khi lệnh thứ n hoàn thành thì lệnh thứ n+1 sẽ được thực thi. Thông thường, các lệnh được viết liên tiếp theo thứ tự thực thi, không cần sử dụng từ khóa đặc biệt để thể hiện cấu trúc này. Ví dụ:

Lệnh_thứ_1;

Lệnh_thứ_2;

Lệnh_thứ_i;

Cấu trúc rẽ nhánh (lựa chọn): cho phép chọn một hoặc một số lệnh mã nguồn được thực thi tùy thuộc vào điều kiện thực thi tương ứng. Thông thường điều kiện thực thi được thể hiện dưới dạng phép toán so sánh hoặc kiểm tra biểu thức logic. Cấu trúc lựa chọn được thể hiện thông qua cụm từ khóa if … then … else … endif. Tùy thuộc ngôn ngữ lập trình cụ thể, từ khóa và quy tắc viết có thể thay đổi chút ít. Ví dụ:

If (tuoi >=18) then

printf ("Người trưởng thành");

else

printf ("Trẻ em hoặc vị thành niên");

endif;

Cấu trúc lặp: cho phép một hoặc một số lệnh mã nguồn được thực thi một số lần cho tới khi đạt một điều kiện nào đó hoặc tất cả các phần tử của cấu trúc đã được xét. Cấu trúc lặp được thể hiện thông qua cụm từ khóa while, do … while, repeat … until, do… util, for. Tùy thuộc ngôn ngữ lập trình cụ thể, từ khóa và quy tắc viết có thể thay đổi.

Ví dụ, ngữ nghĩa các cấu trúc lặp trong ngôn ngữ C:

Khi biểu_thức_điều_kiện còn đúng, tiếp tục thực hiện các_lệnh;

while (biểu_thức_điều_kiện) {

các_lệnh

}

Thực hiện lặp các_lệnh với số lần lặp xác định, tương ứng với các giá trị của biến lặp được khởi tạo, mỗi lần giá trị biến lặp được thay đổi theo bước_nhảy cho đến khi điều_kiện_lặp không thỏa mãn:

for (khởi_tạo_biến_lặp; điều_kiện_lặp; bước_nhảy) {

các_lệnh

}

Ví dụ,

printf ("Giá trị của i là: ");

for (int i = 1; i<=10; i++)

printf ("%d ", i);

sẽ in ra trên màn hình máy tính nội dung:

Giá trị của i là: 1 2 3 4 5 6 7 8 9 10

Chương trình con[sửa]

Chương trình con là 1 tập các lệnh được đóng gói thành một đơn vị chương trình nhằm thực hiện một chức năng, nhiệm vụ cụ thể. Tùy thuộc ngôn ngữ lập trình, các chương trình con có thể phân loại thành hàm, thủ tục, phương thức, … với cú pháp định nghĩa khác nhau. Chương trình con được đặt tên và thường có các tham số vào, các tham số ra. Khi cần, người lập trình sẽ gọi chương trình con bằng cách chỉ ra tên chương trình con cùng với danh sách các tham số vào, ra phù hợp. Chương trình con có thể gọi đến chính nó cho đến khi điều kiện dừng được thỏa mãn. Chương trình con được viết như vậy được gọi là chương trình đệ quy.

Ví dụ, chương trình con tim_so_lon_hon trong ngôn ngữ C nhằm xác định số lớn nhất của 2 số nguyên:

int tim_so_lon_hon (int x, int y) {

if (x > y) return x;

else return y; }

Chương trình chính sau đây sẽ thực hiện nhập 2 số nguyên và in ra số lớn hơn trong 2 số:

  1. include <stdio. h>
  1. include <conio. h>

int main () {

int a, b;

printf ("\n Nhap vao 2 so a, b");

scanf ("%d%d", &a, &b);

printf ("\n So lon la %d", tim_so_lon_hon (a, b));

getch ();

return 0;

}

Cấu trúc khối[sửa]

Khối cho phép gộp và sau đó, sử dụng dãy các lệnh như một lệnh duy nhất. Mỗi ngôn ngữ lập trình dùng các cú pháp khác nhau để xác định các lệnh nằm trong một khối. Ví dụ, khối được đặt giữa BEGIN và END trong ngôn ngữ PASCAL, giữa 2 dấu ngoặc nhọn {và} trong ngôn ngữ C và nhiều ngôn ngữ khác. Ví dụ khối lệnh trong ngôn ngữ C:

{ Lệnh_thứ_1;

Lệnh_thứ_2;

Lệnh_thứ_n; }

Ưu điểm chính của lập trình cấu trúc:

  • Lập trình cấu trúc cho phép thiết kế chương trình theo tiếp cận làm mịn dần từng bước (từ trên xuống) giúp dễ đọc, dễ sửa lỗi và bảo trì mã nguồn.
  • Lập trình cấu trúc cho phép tái sử dụng lại mã nguồn: các đoạn mã nguồn trong chương trình có thể nhận biết, viết thành chương trình con để được sử dụng lại (ngay trong chương trình đó và chương trình khác).
  • Thời gian phát triển và chất lượng mã nguồn chương trình được cải thiện.

Nhược điểm lớn nhất của lập trình cấu trúc là hiệu quả thực thi bị giảm, do sử dụng nhiều bộ nhớ khi chương trình được chia thành quá nhiều chương trình con.

Thời kỳ đầu thiết kế ngôn ngữ lập trình như Fortran (ra đời năm 1954) và nhiều ngôn ngữ lập trình cấp thấp, lệnh GOTO cho phép máy tính điều khiển nhảy đến thực thi lệnh ở vị trí nào đó, không tuân thủ cơ chế thực hiện tuần tự. Lệnh GOTO được xem có hiệu quả, cho phép tạo ra các chương trình phức tạp và hiệu quả hơn. Tuy nhiên khi mã lệnh càng phức tạp thì các lệnh GOTO càng khó bảo trì, Edsger W. Dijkstra là người đầu tiên phát hiện ra sự phức tạp khi lệnh GOTO bị lạm dụng (năm 1968). Dijkstra cũng chỉ ra rằng với bất kỳ chương trình sử dụng câu lệnh GOTO nào cũng đều có thể tạo ra mã nguồn tương đương về chức năng, nhưng đơn giản hơn, mà chỉ sử dụng cấu trúc tuần tự, lặp và lựa chọn. Nhờ vậy, lập trình cấu trúc được ra đời. Các vấn đề về cách viết và phân tích chương trình có cấu trúc hợp lý được giải quyết vào cuối những năm 1960 và đầu những năm 1970 với sự đóng góp lớn của Dijkstra, Robert W. Floyd, Tony Hoare, Ole-Johan Dahl và David Gries. Mặc dù trong những năm 1970, 1980 có nhiều tranh luận về lệnh GOTO, cuối thế kỷ 20 gần như tất cả các nhà khoa học đều tin rằng việc học và áp dụng lập trình có cấu trúc rất hữu ích. Các ngôn ngữ lập trình cao cấp ban đầu chưa hỗ trợ lập trình cấu trúc (FORTRAN, COBOL và BASIC) nay đã bổ sung phiên bản lập trình có cấu trúc. Các ngôn ngữ lập trình hiện đại đều hỗ trợ lập trình cấu trúc, tuy nhiên cơ chế hỗ trợ cũng như cú pháp thay đổi tùy thuộc vào ngôn ngữ.

Trong các trường đại học, phương pháp lập trình có cấu trúc được giới thiệu, minh họa trong nội dung các môn học khác nhau, thông qua các ngôn ngữ như C, C++, java, python. Các ngôn ngữ này đều hỗ trợ lập trình cấu trúc. Với đặc điểm dễ hiểu, dễ viết và dễ bảo trì, lập trình cấu trúc luôn được giới thiệu đầu tiên khi sinh viên bắt đầu học làm quen với lập trình.

Tài liệu tham khảo[sửa]

  1. Larry D. Pyeatt, WilliamUghetta. Structured programming, Chapter 5, ARM 64-Bit Assembly Language. ScienceDirect, pages 113-153. ISBN: 978-0-12-819221-4, 2020.
  2. Edsger Dijkstra. "Go To Statement Considered harmful" (PDF). Communications of the ACM.11 (3): 147–148. doi: 10.1145/362929.362947, 1968.
  3. M. Gabbrielli, S. Martini, “Programming Languages: Principles and Paradigms”, Undergraduate Topics in Computer Science, DOI 10.1007/978-1-84882-914-5_11, © Springer-Verlag London Limited, 2010.
  4. O. J. Dahl, E. W. Dijkstra, C. A. R. Hoare Structured Programming, Academic Press, London, ISBN 0-12-200550-3, 1972.