Trong bài này chúng ta sẽ tìm hiểu:
- Lệnh lặp while
- Lệnh lặp do
- Lệnh lặp for
- Lệnh lặp foreach
- Xem cách hoạt động của vòng lặp for trong Visual Studio
Trong lập trình, có những lệnh hay khối lệnh được lặp lại nhiều lần. Thay vì viết các lệnh hay khối lệnh này nhiều lần, chúng ta có thể dùng các lệnh lặp. C# hỗ trợ các lệnh lặp while, do, for, foreach.
Lệnh lặp while
Lệnh while sẽ lặp theo một điều kiện nào đó. Chừng nào biểu thức điều kiện logical expression còn đúng thì lệnh lặp sẽ vẫn thực thi lệnh (hay khối lệnh) statement. Cú pháp:
{
Flowchart
Ví dụ hiển thị các giá trị từ 0 đến 9:
int i = 0; while (i < 10) { Label1.Text += "The number is " + i.ToString(); i = i + 1; // hay i++; }
Sai lầm phổ biến của những người bắt đầu dùng while là quên dòng lệnh i = i + 1. Biến i trong ví dụ trên đóng vai trò như lính canh (sentinel) để giúp vòng lặp hữu hạn. Biến i còn gọi là sentinel variable.
Lệnh lặp for
Dùng để lặp theo một số lần xác định cho trước, ví dụ thực hiện lệnh xuất dòng chữ Hello 5 lần. Cú pháp:
for (initial expression; logical expression; update expression)
{
statement
}
initial expression, logical expression, update expression là còn gọi là các biểu thức điều khiển và chúng cách nhau bởi dấu chấp phẩy. initial expression là biểu thức khởi tạo giá trị để bắt đầu lặp, logical expression là biểu thức điều kiện để thực hiện lệnh (hay khối lệnh) statement, update expression là biểu thức cập nhật giá trị sau khi thực hiện statement, nếu logical expression vẫn còn true thì for sẽ tiếp tục thực thi statement.
Flowchart
Hiển thị các số từ 1 đến 10
for (loopCount = 1; loopCount <= 10; loopCount ++) { Label1.Text += loopCount.ToString() + " "; }
Hiển thị các số chẵn trong dãy số nguyên từ 0 đến 10
for (loopCount = 0; loopCount <= 10; loopCount = loopCount + 2) { Label1.Text += loopCount.ToString() + " "; }
Chúng ta có thể bỏ qua các thành phần initial expression, logical expression, update expression trong for, cụ thể, nếu chúng ta bỏ logical expression tức là chúng ta mặc định giá trị của nó là true thì vòng lặp for sẽ lặp vô hạn như ví dụ:
for (i = 0; ;i++) { Console.WriteLine("somebody stop me!"); }
Nếu chúng ta bỏ qua initial expression và update expression thì for sẽ trông như while như ví dụ sau:
int i = 0; for (; i < 10; ) { Console.WriteLine(i); i++; }
Có thể có nhiều biểu thức khởi tạo initial expression và nhiều biểu thức cập nhật update expression như ví dụ sau:
for (i = 0, j = 10; i <= j; i++, j--) { ... }
Chúng ta có thể khai báo một biến trong biểu thức initial expression với lưu ý:
– Không thể dùng biến này sau khi vòng lặp for kết thúc, ví dụ:
for (int i = 0; i < 10; i++) { ... } Console.WriteLine(i); // phát sinh lỗi
– Có thể khai báo trùng tên biến (trùng kiểu) cho các for khác nhau, ví dụ:
for (int i = 0; i < 10; i++) { ... } for (int i = 0; i < 20; i += 2) // okay { ... }
Lệnh lặp foreach
Dùng để lặp một khối lệnh cho mỗi phần tử trong mảng hay trong các đối tượng tập hợp khác như ArrayList, Generic, v.v. Lệnh foreach chỉ được dùng để duyệt và nhận thông tin từ các phần tử của một đối tượng tập hợp, không dùng trong các trường hợp thêm hay xoá các phần tử. Trong trường hợp muốn thêm hay xoá, dùng lệnh for sẽ hiệu quả hơn.
Cú pháp:
foreach (element in collection)
{
statement
}
Ví dụ về lệnh foreach:
int[] fibarray = new int[] { 0, 1, 1, 2, 3, 5, 8, 13 }; foreach (int element in fibarray) { System.Console.WriteLine(element); } System.Console.WriteLine();
Lệnh lặp do
Lệnh while và for kiểm tra biểu thức điều kiện đầu tiên để bắt đầu lặp, nghĩa là, nếu biểu thức điều kiện là false thì các lệnh trong vòng lặp sẽ không được thực hiện. Lệnh lặp do thì khác; biểu thức điều kiện sẽ được kiểm tra sau mỗi lần lặp nên các lệnh trong lệnh lặp do sẽ thực hiện ít nhất một lần. Cú pháp:
do
{
statement
} while (logical expression);
Flowchart
Xét ví dụ sau để phân biệt while và do:
Đoạn mã sau sẽ không thực thi vì i = 11 >10
int i = 11; while (i < 10) { Label1.Text += "The number is " + i.ToString(); i = i + 1; }
Đoạn mã sau sẽ thực thi và kết quả là The number is 11
int i = 11; do { Label1.Text += "The number is " + i.ToString(); i = i + 1; } while (i < 10);
Lệnh thoát vòng lặp
Có thể thoát khỏi vòng lặp while, do hay for bằng lệnh break. Ví dụ: vòng lặp sau sẽ thoát khi i = 5, tức là chỉ xuất các giá trị từ 1 đến 4
for (int i = 1; i <= 10; i++) { if (i == 5) { break; } Label1.Text += i.ToString() + " "; }
Có thể bỏ qua một lần lặp để chuyển qua lần lặp kế tiếp bằng lệnh continue. Ví dụ xuất từ 1 đến 10 nhưng bỏ số 5:
for (int i = 1; i <= 10; i++) { if (i == 5) { continue; } Label1.Text += i.ToString() + " "; }
Cách hoạt động của vòng lặp
Trong phần này chúng ta sẽ xem cách hoạt động của vòng lặp, cụ thể là vòng lặp for, trong Visual Studio. Giả sử chương trình gồm một form chứa một button có thuộc tính Name là btnDisplay và thuộc tính Text là Display. Đoạn mã cho button sẽ hiển thị kết quả trên TextBox có Name là txtDisplay:
for (int i = 1; i <= 5; i++) { txtDisplay.Text += i.ToString() + " "; }
Xem cách hoạt động của vòng lặp (ví dụ for)
Đặt con trỏ chuột đến trước từ for:
Nhấp chuột phải chọn Run To Cursor sẽ thực thi chương trình, nhấp vào button Display, chương trình sẽ dừng và xuất hiện mũi tên màu vàng trỏ vào dòng lệnh hiện tại:
Vào menu DEBUG chọn Windows chọn Locals:
Để ý biến i = 0.
Nhấp vào nút Step Into:
Kết quả for sẽ chuyển sang kiểm tra điều kiện:
và i = 1
Nhấp Step Into sẽ chuyển sang dòng lệnh kế tiếp, trong trường hợp này là dấu {:
Nhấp Step Into, sẽ thực hiện dòng lệnh trong for:
Nhấp Step Into:
Nhấp tiếp Step Into:
Tiếp tục Step Into:
Trong Locals, để ý i = 2:
Tương tự nhấn Step Into đến khi i = 6 trong cửa sổ Locals thì vòng lặp for dừng và xuất hiện kết quả.