Thực hiện các thao tác lặp đi lặp lại nhiều lần dựa vào các điều kiện nhất định.

1. Mục tiêu

  • Trình bày được ý nghĩa của vòng lặp
  • Trình bày được cú pháp của vòng lặp for
  • Sử dụng được vòng lặp for
  • Trình bày được cú pháp của vòng lặp while
  • Sử dụng được vòng lặp while
  • Trình bày được cú pháp của vòng lặp do-while
  • Sử dụng được vòng lặp do-while
  • Sử dụng được vòng lặp lồng nhau
  • Lựa chọn được vòng lặp phù hợp trong từng tình huống cụ thể

>> Xem thêm: TÀI LIỆU LẬP TRÌNH CĂN BẢN – ĐƠN GIẢN, DỄ HỌC!

2. Giới thiệu

Vòng lặp là dạng cấu trúc cho phép tự động thực hiện một khối lệnh lặp đi lặp lại nhiều lần dựa vào một điều kiện cho trước. Vòng lặp giúp cho lập trình viên viết được các mã nguồn ngắn gọn hơn so với việc phải viết lặp lại những dòng mã tương tự nhau.

Chẳng hạn, trong thực tế chúng ta có thể sử dụng vòng lặp để hiển thị danh sách khách hàng trong một ứng dụng bán hàng trực tuyến; hoặc hiển thị danh sách bạn bè trong một ứng dụng mạng xã hội; hoặc để tạo hiệu ứng chuyển động của nhân vật trong một trò chơi; hoặc để sao chép một file lớn từ nơi này sang nơi khác, v.v.

Chương này sẽ trình bày các dạng vòng lặp được sử dụng phổ biến và cách để nhận diện và lựa chọn được vòng lặp phù hợp với tình huống thực tế.

Hoàn thành chương này, chúng ta có thể tạo được các ứng dụng mà trong đó có nhiều thao tác được tự động thực thi lặp lại nhiều lần.

3. Câu lệnh lặp

Tại chương trước chúng ta đã tìm hiểu về các câu lệnh điều kiện. Đặc trưng của các câu lệnh này là dựa trên một điều kiện cho trước, luồng thực thi của chương trình sẽ rẽ nhánh sang các khối lệnh khác nhau.

Điều gì xảy ra nếu như khi một điều kiện cho trước là true, chương trình thay vì thực thi một khối lệnh mới thì lại “quay về thực thi lại một khối lệnh trước đó”, như trong hai lưu đồ sau đây?

Hình: Thực hiện tác vụ và đánh giá điều kiện, rồi quay lại thực hiện tác vụ.

Hình: Đánh giá điều kiện và thực hiện tác vụ, rồi quay lại đánh giá điều kiện.

Trong cả 2 lưu đồ trên, chừng nào “điều kiện nào đó” của chúng ta còn “đúng” thì “tác vụ nào đó” của chúng ta sẽ còn được thực thi lại mãi. Chúng ta gọi đây là phép lặp.

Nhờ có phép lặp, chúng ta có khả năng cho thực thi một khối mã nhiều lần mà không cần phải viết lại, giúp chương trình ngắn hơn, dễ đọc hơn, và quan trọng nhất, “rõ ý” hơn.

4. Câu lệnh lặp while

Câu lệnh lặp while chính là câu lệnh được mô tả bởi lưu đồ thứ hai ở trên, cú pháp của câu lệnh này như sau:

1.	while (loop-continuation-condition) {
2.	    // statement(s)
3.	}

Trong cú pháp trên, loop-continuation-condition là một biểu thức có giá trị boolean. Quá trình thực thi sẽ bắt đầu bằng việc tính toán và đánh giá biểu thức loop-continuation-condition (điều kiện tiếp diễn vòng lặp). Nếu biểu thức điều kiện có giá trị là true, các câu lệnh trong thân vòng lặp sẽ được thực thi. Sau khi các câu lệnh trong thân vòng lặp thực thi xong, quá trình đánh giá sẽ được thực hiện lại, và thân vòng lặp sẽ được thực thi hết lần này đến lần khác chừng nào loop-continuation-condition vẫn còn true. Do đó câu lệnh này mới có tên như hiện tại (while trong tiếng Anh nghĩa là “chừng nào”).

Sau đây là một ví dụ:

1.	let password = prompt("Mời bạn nhập mật khẩu:");
2.	while (password != "vung oi mo ra") {
3.	   password = prompt("Không đúng! Mời bạn nhập lại mật khẩu:");
4.	}

Đoạn mã trên sẽ hỏi lại mật khẩu chừng nào người dùng vẫn còn chưa nhập đúng mật khẩu là “vung oi mo ra”.

Hãy thử tự trả lời câu hỏi sau: “Chuyện gì xảy ra nếu người dùng nhập mật khẩu đúng ngay từ lần đầu tiên?”

Lặp vô hạn

Lặp vô hạn là trường hợp xảy ra khi biểu thức điều kiện luôn luôn trả về giá trị true. Chẳng hạn, các vòng lặp sau đây đều thực thi vô hạn:

1.	while(true) {
2.	}

 Hoặc

1.	while(1) {
2.	}

 5. Câu lệnh lặp do-while

Ứng với biểu đồ đầu tiên trong đoạn giới thiệu là câu lệnh lặp do-while, nó có cấu trúc như sau:

1.	do {
2.	    // statement(s)
3.	} while (loop-continuation-condition); 

Để ý rằng câu lệnh do-while kết thúc không phải bởi dấu ngoặc móc, do đó theo quy ước chúng ta đặt dấu chấm phẩy (;) để kết thúc câu lệnh.

Cấu trúc và cách thực thi của câu lệnh do-while rất giống với câu lệnh while, ngoại trừ cách bắt đầu vòng lặp đầu tiên. Trong khi lệnh while tính toán và đánh giá biểu thức điều kiện trước rồi mới bắt đầu khối lệnh trong thân, thì lệnh do-while thực thi khối lệnh trong thân trước, sau đó mới tiến hành tính toán và đánh giá. Hệ quả của việc này là thân câu lệnh chắc chắn được thực thi ít nhất một lần, dù cho biểu thức điều kiện là đúng hay sai.

Về mặt lý thuyết, mọi trường hợp cần dùng tới câu lệnh while thì chúng ta đều có thể chuyển đổi sang sử dụng câu lệnh do-while và ngược lại. Tuy nhiên thực tế cho thấy với mỗi trường hợp, thường có một vòng lặp giúp chúng ta viết mã đẹp hơn trường hợp còn lại. Chẳng hạn, nếu không có nhu cầu đặc biệt, đoạn chương trình bảo mật hang đá ở trên có thể được viết lại như sau:

1.	let password;
2.	do {
3.	   password = prompt("Mời bạn nhập lại mật khẩu:");
4.	} while (password != "vung oi mo ra");

6. Câu lệnh lặp for

Ngoài whiledo-while, câu lệnh for cũng là một câu lệnh lặp hay được sử dụng.

Cú pháp:

1.	for (initial-action; loop-continuation-condition; action-after-each-iteration) {
2.	    // statement(s);
3.	}

Câu lệnh forđược cấu tạo từ một thân vòng lặp – nơi chứa những câu lệnh cần lặp, đi kèm với đó là 3 cấu hình được mô tả giữa cặp dấu ngoặc tròn, 3 cấu hình này được phân cách bởi hai dấu chấm phẩy (;). Cả ba cấu hình đều có thể để trống. Chúng mang những ý nghĩa khác nhau.

  • Initial-action (hành động khởi tạo): Câu lệnh này sẽ được thực thi một lần duy nhất. Nếu để trống initial-action thì tương đương với không thực thi bất kỳ khởi tạo nào.
  • loop-continuation-condition: Là một biểu thức điều kiện. Biểu thức này sẽ được tính toán để quyết định xem thân vòng lặp có được thực thi hay không. Nếu biểu thức trả về giá trị true thì thân vòng lặp sẽ được thực thi, còn nếu trả về false thì thân vòng lặp sẽ được bỏ qua (hay nói cách khác là vòng lặp được kết thúc). Nếu bỏ trống, trình thực thi sẽ sử dụng giá trị true để thay thế.
  • statement(s): Là khối lệnh sẽ được thực thi trong mỗi lần lặp.
  • action-after-each-iteration (câu lệnh thực thi sau mỗi lần lặp): Câu lệnh này sẽ được thực thi sau mỗi lần thực thi vòng lặp. Bỏ trống action-after-each-iteration tương đương với không thực thi bất kỳ lệnh kết thúc nào.

Luồng thực thi của vòng lặp for

Mô tả sau đây sẽ liệt kê các bước thực thi của một vòng lặp for.

Các bước:

  1. Các câu lệnh initial-action được thực thi
  2. Biểu thức điều kiện được đánh giá. Nếu điều kiện đúng thì khối lệnh bên trong thân vòng lặp được thực thi. Nếu điều kiện sai thì vòng lặp kết thúc
  3. Khối lệnh bên trong thân vòng lặp được thực thi
  4. Các câu lệnh action-after-each-iteration được thực thi
  5. Bắt đầu vòng lặp mới từ bước 2 – 3 – 4.

Ví dụ 1:

Chúng ta viết đoạn mã in 10 ký tự bằng câu lệnh for như sau:

1.	let dot = prompt("Mời bạn nhập ký tự:");
2.	let line = "";
3.	for (let count = 1; count <= 10 ; count++) {
4.	    line += dot;
5.	}
6.	console.log(line);

Giải thích

Trong đoạn mã trên, dòng số 3 là nơi khai báo vòng lặp for, dòng số 4 là thân vòng lặp.

Biểu thức let count = 1 là hành động khởi tạo.

Biểu thức count <= 10 là biểu thức điều kiện.

Biểu thức count++ là biểu thức được thực thi sau mỗi vòng lặp.

Ví dụ 2:

Trong ví dụ sau, chúng ta sẽ sử dụng một vòng lặp for để hiển thị bảng tính nhân của số 5.

Kết quả:

Xem tiếp >> Chuong 4 Cau lenh lap long nhau

Có thể bạn quan tâm>> Cam nang lap trinh can ban danh cho nguoi moi bat dau