So sánh for và foreach trong types năm 2024

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Vòng lặp for-each trong java dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên like và share để ủng hộ Kteam và tác giả nhé!

So sánh for và foreach trong types năm 2024


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Vòng lặp for

Cú pháp

Vòng lặp for thường được sử dụng khi ta biết hoặc tính toán được số lần thực thi khối lệnh. Khối lệnh trong thân của vòng lặp for được thực thi cho đến khi điều kiện được đề ra là sai.

Cú pháp của vòng lặp for như sau:

for(khởi_tạo_biến_đếm; điều_kiện; thay_đổi_biến_đếm) {

// khối_lệnh

}

, trong đó,

khởi_tạo_biến_đếm: Là một biểu thức mà sẽ thiết lập giá trị khởi tạo cho biến đếm, đó là biến điều khiển vòng lặp for. Phần này của vòng lặp for sẽ được thực hiện đầu tiên.

điều_kiện: Là một biểu thức boolean để kiểm tra giá trị của biến điều khiển vòng lặp có thỏa mãn điều kiện đề ra hay không. Nếu điều_kiện là đúng thì khối_lệnh tiếp tục được thực thi, ngược lại thì dừng vòng lặp.

thay_đổi_biến_đếm: Bao gồm câu lệnh để thay đổi giá trị của biến đếm trong mỗi lần lặp. Thông thường trong câu lệnh dùng các toán tử tăng giảm như ++, --, hoặc các phép toán gán rút gọn như +=, -=. Không có dấu chấm phẩy (;) ở phía cuối của câu lệnh tăng giảm. Tất cả có ba phần khai báo được phân cách nhau bằng dấu (;).

Quy cách thực thi

Hình sau thể hiện luồng thực thi của vòng lặp for.

So sánh for và foreach trong types năm 2024

Như thể hiện, việc thực thi vòng lặp for bắt đầu với phần khởi tạo (initialization), nói chung phần khởi tạo là một biểu thức dùng để thiết lập giá trị cho biến điều khiển vòng lặp và biến này đóng vai trò như một biến đếm. Biểu thức khởi tạo được thực thi chỉ một lần duy nhất khi vòng lặp bắt đầu được thực thi. Tiếp theo, biểu thức điều kiện (condition) được thực hiện và kiểm tra xem biến điều khiển vòng lặp có thỏa mãn với giá trị đề ra hay không, nếu thỏa mãn thì thực hiện khối lệnh (statements), ngược lại thì thoát khỏi vòng lặp for.

Đoạn mã 1 sau thể hiện việc sử dụng vòng lặp for để hiển thị phép nhân với 10 của từng số từ 1 đến 5.

Đoạn mã 1:

namespace Demo1 { internal class demo1 {

static void Main(string[] args)  
{  
  int num, product;
  //Vòng lặp for bao gồm 3 thành phần  
  for (num = 1; num <= 5; num++)  
  {  
    product = num * 10; ;
    Console.WriteLine("{0} * 10 = {1}", num, product);
  } //Chuyển điều khiển quay lại vòng lặp for mỗi khi lặp xong  
}  
} }

Phân tích: Trong phần khởi tạo, biến num được khởi tạo là 1. Câu lệnh điều kiện num <= 5 sẽ đảm bảo rằng vòng lặp được thực thi trừng nào num còn nhỏ hơn hoặc bằng 5. Câu lệnh tăng, num++ sẽ tăng giá trị của num lên 1 sau mỗi lần lặp. Cuối cùng, vòng lặp kết thúc khi điều kiện trở thành sai, tức là khi biến num có giá trị bằng 6.

Output của đoạn mã 1 như sau:

1 * 10 = 10 2 * 10 = 20 3 * 10 = 30 4 * 10 = 40 5 * 10 = 50

Phạm vi của biến điều khiển trong vòng lặp for

Phần lớn các biến điều khiển chỉ được dùng trong vòng lặp for và không được sử dụng ở những nơi khác trong chương trình. Do vậy, ta có thể giới hạn phạm vi của nó bằng cách khai báo nó ngay khi khởi tạo giá trị cho nó.

Đoạn mã 2 viết lại vòng lặp for ở đoạn mã 1 trong đó khai báo biến đếm bên trong vòng lặp for.

Đoạn mã 2:

for (int num = 1; num <= 5; num++) {

//khối_lệnh

}

Sử dụng toán tử dấu phẩy trong vòng lặp for

Vòng lặp for có thể được mở rộng để cho phép có nhiều hơn một biểu thức khởi tạo hoặc biểu thức tăng/giảm bằng cách dùng toán tử (,) để phân cách các biểu thức này. Khi đó việc thực thi các biểu thức sẽ tuân theo thứ tự thực hiện từ trái sang phải. Thứ tự thực hiện này là quan trọng trong trường hợp giá trị của biểu thức thứ hai phụ thuộc vào giá trị tính toán được ở biểu thức thứ nhất.

Đoạn mã 3 cho thấy việc sử dụng vòng lặp để in ra một bảng tính cộng hai biến sử dụng toán tử (,).

Đoạn mã 3:

namespace Demo1 { internal class demo1 {

static void Main(string[] args)  
{  
  int i, j;
  int max = 10; _/* Phần khởi tạo và phần tăng/giảm chứa đựng nhiều hơn một câu lệnh */_
  for (i = 0, j = max; i <= max; i++, j--)  
  {  
    Console.WriteLine("{0} + {1} = {2}", i, j, i + j);  
  }  
}  
} }

Phân tích đoạn mã: 3 biến i, j, và max có kiểu nguyên int được khai báo, trong đó biến max ban đầu được gán trá trị là 10. Ở phần khởi tạo của vòng lặp for, i được gán giá trị 0 và j được gán giá trị của max (tức là 10), bạn thấy hai câu lệnh gán này phân cách nhau bằng dấu phẩy (,). Ở phần điều kiện ta có i <= max, tức là vòng lặp for sẽ được thực thi trừng nào giá trị chứa trong biến i còn nhỏ hơn hoặc bằng giá trị chứa trong biến max. Ở phần thứ 3 của vòng lặp for có hai câu lệnh là i++ và j--, điều này có nghĩa sau mỗi lần lặp thì giá trị trong biến i sẽ tằng 1 đơn vị và biến j sẽ giảm 1 đơn vị. Như vậy thì tổng giá trị chứa trong hai biến i và j sẽ luôn bằng nhau và bằng max sau mỗi lần lặp.

Kết quả của đoạn mã trên như sau:

0 + 10 = 10 1 + 9 = 10 2 + 8 = 10 3 + 7 = 10 4 + 6 = 10 5 + 5 = 10 6 + 4 = 10 7 + 3 = 10 8 + 2 = 10 9 + 1 = 10 10 + 0 = 10

Các dạng khác nhau của vòng lặp for

Cấu trúc của vòng lặp for làm cho nó trở lên mạnh mẽ và linh hoạt, cả ba thành phần của vòng lặp for không nhất thiết cứ phải được khai báo và sử dụng chỉ bên trong nó, nghĩa là bạn có thể bỏ qua hoặc để trống bất kỳ phần nào của vòng lặp for.

Đoạn mã 4 dưới đây thể hiện việc sử dụng vòng lặp for nhưng không có phần khởi tạo.

Đoạn mã 4:

namespace Demo1 { internal class demo1 {
static void Main(string[] args)  
{  
  /* Biến đếm num được khai báo và khởi tạo ở ngoài vòng lặp for */  
  int num = 1;
  /* Biến bool flag được khởi tạo là false */  
  bool flag = false;
  /*  
  • Vòng lặp for được thực thi với giá trị ban đầu của biến num là 1 và lặp
  • trong khi giá trị của biến flag là not true
       */  
      for (; !flag; num++)  
      {  
        Console.WriteLine("Value of num: " + num);  
        if (num == 5)  
        {  
          flag = true;  
        }  
      } //Kết thúc vòng lặp for  
    }  
    
    } } Vòng lặp for ở trên sẽ được thực thi cho đến khi flag được đặt là true. Kết quả của đoạn mã là như sau:

Value of num: 1 Value of num: 2 Value of num: 3 Value of num: 4 Value of num: 5

Vòng lặp for không xác định

Nếu tất cả ba biểu thức đều trống, thì sẽ dẫn đến một vòng lặp for không xác định, lý do là bởi vì không có điều kiện để kiểm soát vòng lặp.

Đoạn mã 5 thể hiện vòng lặp for không xác định.

Đoạn mã 5:

.....

for( ; ; ) {

System.out.println(“This will go on and on”);

}

.....

Đoạn mã sẽ in ra 'This will go on and on' cho đến khi vòng lặp được ngắt bằng tay. Câu lệnh break có thể được sử dụng để ngắt vòng lặp. Vòng lặp không giới hạn làm cho chương trình chạy trong thời gian dài dẫn đến việc tiêu thụ tất cả các nguồn lực và dừng hệ thống. Vì thế, trong chương trình ta cần phải tránh những vòng lặp dạng như vậy.

Khi giá trị nhập vào của chương trình không được biết trước, thì ta có thể sử dụng loại vòng lặp không xác định trong chương trình, trong đó nó sẽ chờ cho đến khi người dùng nhập liệu. Vì vậy, khi người dùng nhập liệu, thì hệ thống sẽ xử lý đầu vào, sau đó lại bắt đầu thực thi vòng lặp vô hạn.

Một số ví dụ khác

In ra các số từ 1 đến 10

namespace Demo1 { internal class demo1 {

static void Main(string[] args)  
{  
  for (int i = 1; i <= 10; i++)  
  {  
    Console.WriteLine(i);  
  }  
}  
} }

In ra các số từ 10 đến 1

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Demo1 { internal class demo1 {

static void Main(string[] args)  
{  
  for (int i = 10; i >=1; i--)  
  {  
    Console.WriteLine(i);  
  }  
}  
} }

In ra các số từ 1 đến 10 cách nhau 2 đơn vị

namespace Demo1 { internal class demo1 {

static void Main(string[] args)  
{  
  for (int i = 1; i <=10; i += 2)  
  {  
    Console.WriteLine(i);  
  }  
}  
} }

In ra các số từ 1 đến 10 chia hết cho 3

namespace Demo1 { internal class demo1 {

static void Main(string[] args)  
{  
  for (int i = 1; i <=10; i++)  
  {  
    if (i % 3 == 0)  
      Console.WriteLine(i);  
  }  
}  
} }

Tính tổng các số từ 1 đến 10

namespace Demo1 { internal class demo1 {

static void Main(string[] args)  
{  
  int sum = 0;  
  for (int i = 1; i <=10; i++)  
  {  
    sum += i;  
  }  
  Console.WriteLine("Sum = " + sum);  
}  
} }

Tính tích các số từ 1 đến 5

namespace Demo1 { internal class demo1 {

static void Main(string[] args)  
{  
  int mul = 1;  
  for (int i = 1; i <=5; i++)  
  {  
    mul *= i;  
  }  
  Console.WriteLine("Multiply = " + mul);  
}  
} }

Vòng lặp foreach

Vòng lặp foreach tiến được thiết kế để truy xuất hoặc lặp thông qua tập hợp các đối tượng như mảng thông thường, ArrayList, ... Những lớp này được sử dụng để lưu các đối tượng.

Cú pháp sử dụng vòng lặp foreach như sau:

Cú pháp:

foreach (type var in collection) {

// khối_lệnh

}

trong đó,

namespace Demo1 { internal class demo1 {

static void Main(string[] args)  
{  
  int i, j;
  int max = 10; _/* Phần khởi tạo và phần tăng/giảm chứa đựng nhiều hơn một câu lệnh */_
  for (i = 0, j = max; i <= max; i++, j--)  
  {  
    Console.WriteLine("{0} + {1} = {2}", i, j, i + j);  
  }  
}  
} }

0: là kiểu của tập hợp (collection).

namespace Demo1 { internal class demo1 {

static void Main(string[] args)  
{  
  int i, j;
  int max = 10; _/* Phần khởi tạo và phần tăng/giảm chứa đựng nhiều hơn một câu lệnh */_
  for (i = 0, j = max; i <= max; i++, j--)  
  {  
    Console.WriteLine("{0} + {1} = {2}", i, j, i + j);  
  }  
}  
} }

1: là biến lặp dùng để lưu từng phần tử của tập hợp qua mỗi lần lặp. Vòng lặp foreach sẽ lặp từ phần tử đầu đến phần tử cuối của tập hợp, mỗi lần lặp sẽ lấy một phần tử lưu vào biến var.

Sau khi lấy xong phần tử cuối của tập hợp thì vòng lặp sẽ kết thúc.

Đoạn mã 6 sau đây sử dụng vòng lặp for thường để nhập liệu cho mảng chuỗi str và dùng vòng lặp foreach để in ra các phần tử của mảng chuỗi đó.

Đoạn mã 6:

namespace Demo1 { internal class demo1 {

static void Main(string[] args)  
{  
  string[] str = new string[5];
  Console.WriteLine("Input strings:");  
  for (int i = 0; i < str.Length; i++)  
  {  
    Console.Write("String {0}: ", i + 1);
    str[i] = Console.ReadLine();  
  }
  Console.WriteLine("After inputting, we get:");  
  foreach (string s in str)  
  {  
    Console.WriteLine(s);  
  }  
}  
} }

Output của đoạn mã trên như sau:

Input strings: String 1: Alex String 2: Victoria String 3: John String 4: Ana String 5: Ronaldo After inputting, we get: Alex Victoria John Ana Ronaldo

So sánh giữa các loại vòng lặp

Lựa chọn vòng lặp nào vào lập trình là dựa trên thực tế hoặc kinh nghiệm lập trình của bạn. Bảng dưới đây sẽ so sánh các loại vòng lặp với nhau, giúp bạn hiểu rõ hơn về chúng.