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:

while (logical expression)
{
    statement
}

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 expressionupdate 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 whilefor 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 whiledo:

Đ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 NamebtnDisplay và thuộc tính TextDisplay. Đoạn mã cho button sẽ hiển thị kết quả trên TextBoxNametxtDisplay:


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:

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ả.

Học C# và WPF >