Mục lục
Trong lập trình không riêng gì với ngôn ngữ java, khi chúng ta có một tập dữ liệu input cần xử lý chẳng hạn như tìm kiếm, rút trích, bóc tách dữ liệu từ input hoặc đơn giảm là lặp đi lặp lại một công việc gì đó N lần.
Để giải quyết vấn đề trên chúng ta cần sử dụng đến kỹ thuật gọi là vòng lặp. Trong java cung cấp cho chúng ta 3 cách để thực thi vòng lặp: for, while và do – while. Trước tiên chúng ta sẽ tìm hiểu vòng lặp for trước nhé.
Cú pháp vòng lặp for
for (khởi tạo; điều kiện; tăng/giảm) { // code block inside for }
Ôi, nhìn cú pháp có vẽ khó hiểu, chúng ta sẽ lấy một ví dụ cụ thể nào. Mình sẽ xuất ra màn hình console từ 1 đến 3.
public class Main { public static void main(String[] args) { for(int i = 1; i <= 3; i++) { System.out.println("value is " + i); } } }
Output:
value is 1
value is 2
value is 3
Giải thích:
- Lần lặp đầu tiên: Khởi tạo biến i = 1 => so sánh biến i <= 3 ta được giá trị true => thực hiện code bên trong vòng lặp ta được Value is 1 => i++ ta được i = 2.
- Lần lặp thứ 2: i = 2 => so sánh i <= 3 ta được true => thực hiện code bên trong vòng lặp ta được Value is 2 => i++ ta được i = 3.
- Lần lặp thứ 3: i = 3 => so sánh i <= 3 true => thực hiện code bên trong vòng lặp được Value is 3 => i++ ta được i = 4.
- Lần lặp thứ 4: i = 4 so sánh i <= 3 được false => thoát khỏi vòng lặp.
Sơ đồ thực hiện của vòng lặp forr
Vòng lặp vô hạn
Đây là một điểm hết sức lưu ý. Khi các code mà không để ý dẫn đến việc chạy vòng lặp vô hạn, bạn sẽ ngồi chờ mòn mỏi mà không hiểu tại sao ứng dụng của mình lại chạy mãi mà không thấy dừng. Cho đến khi tràn bộ nhớ thì nó sẽ quăng ra lỗi. Ở đây mình xin phép không chạy demo vì nó hại máy lắm =))))
Bạn có thể chạy vòng lặp vô hạn bằng các cách sau
Cách 1: Có chủ ý
for ( ; ; ) { // code block }
Cách 2: code lụi =)
public class Main { public static void main(String[] args) { for(int i = 0; i >=0; i++) { System.out.println("value is " + i); } } }
Các bạn thấy, điều kiện dừng vòng for mình viết sẽ luôn đúng (i bắt đầu từ 0 mà sau mỗi lần lặp cứ tăng lên 1 thì lúc nào mà chẳng >= 0) cho nên sẽ không bao giờ nó thoát khỏi vòng lặp đâu.
Vòng lặp for – each trong java
Mình xin gọi vòng lặp for truyền thống là: (for (khởi tạo; điều kiện; tăng/giảm) được mình dưới thiệu ở trên.
Khi chúng ta làm việc với các tập dữ liệu trong java như array, list etc. Nếu như cầu của chúng ta chỉ là duyệt qua tập dữ liệu mà không cần quan đến vị trí đang được duyệt thì việc khởi tạo biến đếm, kiểm tra điều kiện, cập nhập biến đếm là không cần thiết đôi lúc còn làm cho chúng ta bị lỗi dẫn đến vòng lặp vô hạn.
Để giải quyết vấn đề trên, chúng ta có một cách tiếp cận mới, đó là for-each giúp chúng ta duyệt tập dữ liệu mà không thao tác phiền phức như vòng lặp for truyền thống.
Cú pháp
for(<kiểu dữ liệu của tập dữ liệu> item : tập dữ liệu) { // code block }
Ví dụ
public class Main { public static void main(String[] args) { int[] arr = {1, 3, 5}; for(int item : arr) { System.out.println(item); } } }
Output:
1
3
5
Nên Sử dụng for-each hay for truyền thống?
Như mình đã nêu những điểm lợi của for – each thì nhiều bạn nghĩ rằng for truyền thống nên bỏ đi. =) um. Mình có nói rõ là nếu như các bạn chỉ muốn duyệt thì dùng for – each là tốt.
Thế nên tuỳ vào trường hợp mà sử dụng các bạn nhé chứ không phải lúc nào cũng for – each được đâu.
Bài tập thực hành
Sử dụng vòng lặp for để hoàn thành các bài tập sau:
1, Viết chương trình tính tổng các số nguyên từ 1 đến 10.
2, Viết chương trình tìm một số nguyên a trong mảng arr cho trước. a được nhập vào từ bàn phím. Xuất ra màn hình vị trí của a trong mảng nếu tìm thấy, ngược lại là “khong tim thay”.
3, Cho một mảng số nguyên arr, viết chương trình java xuất ra giá trị đảo ngược mảng, ví dụ arr[] = {1, 2, 3, 4, 5} => output 5, 4, 3, 2, 1.
4, Viết chương trình in dãy số fibonacci của n, với n là số nguyên nhập vào từ bàn phím.
Bài tham khảo
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); /* 1, Viết chương trình tính tổng các số nguyên từ 1 đến 10. */ int sum = 0; for(int i = 1; i <= 10; i++) { sum += i; } System.out.println("Tong 1 den 10: " + sum); /* 2, Viết chương trình tìm một số nguyên a trong mảng arr cho trước. a được nhập vào từ bàn phím. */ int arr[] = {1, 2, 4, 6, 7, 8, 9}; int a = 4; for (int i = 0; i < arr.length; i++) { if (arr[i] == a) { System.out.println("Vi tri: " + i); break; } } /* 3, Cho một mảng số nguyên arr, viết chương trình java đảo ngược mảng, ví dụ arr[] = {1, 2, 3, 4, 5} => output {5, 4, 3, 2, 1}. */ int[] arr3 = {1, 2, 3, 4, 5}; for (int i = arr3.length - 1; i >= 0; i--) { System.out.print(arr3[i] + " "); } /* 4, Viết chương trình in dãy số fibonacci của n, với n là số nguyên nhập vào từ bàn phím. */ System.out.print("Nhap n: "); int fb = scanner.nextInt(); int f1 = 0, f2 = 1; System.out.print(f1 + " "); System.out.print(f2 + " "); for (int i = 2; i <= fb; i++) { int newf = f1 + f2; System.out.print(newf + " "); f1 = f2; f2 = newf; } } }