Java - Chương 8

Vòng lặp trong Java

          Bên cạnh cấu trúc rẽ nhánh, lặp là một cấu trúc vô cùng quan trọng. Có lẽ các bạn hẳn đã từng quen với các cấu trúc lặp ở các ngôn ngữ lập trình khác, tuy nhiên hiểu cặn kẽ về nó, cũng như những trường hợp áp dụng của mỗi cấu trúc lặp thì có lẽ vẫn còn những điều cần bàn. Vì vậy trong phần dưới đây tác giả sẽ trình bày cặn kẽ các vấn đề liên quan.
1. Vòng lặp for
          Cấu trúc lặp for hay người ta còn gọi là cấu trúc lặp với số lần lặp xác định. Có tên gọi như vậy là vì khi viết đoạn chương trình có cấu trúc for ta hoàn toàn có thể xác định được là vòng lặp sẽ được thực hiện bao nhiêu lần.
Cú pháp:
          for(bieuthuc1;bieuthuc2;bieuthuc3)
          {
                   Khoilenh;
          }
          Trong đó    
          - Bieuthuc1 là biểu thức khởi tạo cho các biến điểu khiển (Ví dụ: i=0)
          - Bieuthuc2 là biểu thức dùng để kiểm tra điều kiện lặp (Ví dụ: i<100)
          - Bieuthuc3 là biểu thức thay đổi giá trị của biến điều khiển (Ví dụ: i++)
Hoạt động:
          - Khi gặp câu lệnh trên đầu tiên chương trình sẽ thực hiện Bieuthuc1 để khởi tạo giá trị cho các biến điều khiển.
          - Sau đó chương trình sẽ thực hiện Bieuthuc2 để kiểm tra điều kiện của vòng lặp. Nếu Bieuthuc2 đúng chương trình sẽ thực hiện Khoilenh.
          - Tiếp đó chương trình sẽ thực hiện Bieuthuc3 để thay đổi giá trị của biến điều khiển. Và tiếp tục thực hiện kiểm tra điều kiện lặp bằng bieuthuc2.
          - Nếu Bieuthuc2 đúng chương trình lại tiếp tục thực hiện quá trình trên cho đến khi Bieuthuc2 sai thì chương trình thoát khỏi vòng lặp for.
          Ví dụ 2.13. Chương trình sau tính tổng các số từ 1 đến 100 và in ra kết quả:
          public class Sum
          {
                   public static void main(String[] args)
                   {
                             int i,s;
                             s=0;
                             for(i=1;i<=100;i++)
                             {
                                      s=s+i;
                             }
                             System.out.println(“Tong cac so tu 1 den 100 la:” + s);
}
}
Chú ý:
­­­­­- Nếu Khoilenh chỉ là một lệnh thì ta có thể bỏ qua dấu đóng mở khối lệnh {…}. Như trong ví dụ trên ta có thể viết như sau:
                   for(i=1;i<=100;i++)
                             s=s+i;
          - Trong Bieuthuc1 của vòng for ta có thể vừa khai báo vừa khởi tạo giá trị cho các biến điểu khiển. Ví dụ đoạn chương trình trên có thể viết lại nhưa sau:
          public class Sum
          {
                   public static void main(String[] args)
                   {
                             int s=0;
                             for(int i=1;i<=100;i++)
                                      s=s+i;
                             System.out.println(“Tong cac so tu 1 den 100 la:” + s);
}
}
          - Nếu ngay từ đầu Bieuthuc2 đã sai thì khối lệnh sẽ không được thực hiện một lần nào. Ví dụ đoạn chương trình dưới đây sau khi kết thúc vòng lặp gí trị của S vẫn bằng không.
          public class Sum
          {
                   public static void main(String[] args)
                   {
                             int s=0;
                             for(int i=10;i<10;i++)
                                      s=s+i;
                             System.out.println(“Tong la:” + s);
}
}
- Nếu việc thay đổi giá trị của biến điều khiển trong Bieuthuc3 không có khả năng làm sai Bieuthuc2 thì chương trình sẽ treo. Ví dụ đoạn chương trình dưới đây sẽ treo.
          public class Sum
          {
                   public static void main(String[] args)
                   {
                             int s=0;
                             for(int i=10;i<100;i=i)
                                      s=s+i;
                             System.out.println(“Tong la:” + s);
}
}
Sau khi đã có đầy đủ kiến thức về các tình huống khác nhau đối với việc sử dụng vòng lặp for. Có lẽ rằng bạn cần thực hành thêm một số bài tập để có thể đạt được sử thành thạo hơn nữa. Ví dụ dưới đây cung cấp cho bạn một có hội như vậy.
Ví dụ 2.14. Viết chương trình nhập vào một số nguyên n. Kiểm tra xem n có phải là số nguyên tố không?
public class primeNumber
          {
                   public static void main(String[] args) throws Exception
                   {
                             char ch;
                             int n,i,kt;
                             String str = new String();
                             System.out.print(“Nhap n=”);
ch = (char)System.in.read();
                             while(ch!= ‘\n’ )
{
str = str+ ch;
                                      ch = (char)System.in.read();                                          
                             }       
                              n=Integer.parseInt(str);
                             kt=0; // Khởi tạo cho biến kiểm tra ban đầu bằng 0
                             for(i=2;i<n;i++)
                             {
                                      if(n%i==0)
                                                kt=1;
                             }
                             if(kt==0) // Nếu vẫn =0 thì n là nguyên tố
                                       System.out.println(n+ “ La so nguyen to”);
                             else
                                      System.out.println(n+ “ Khong la so nguyen to”);                 
}
2. Vòng lặp while
          Có lẽ là các bạn đã khá quen với vòng lặp while khi bạn thực hiện việc nhập liệu trên Java, tuy nhiên phần dưới đây sẽ cung cấp cho các bạn đầy đủ hơn những thông tin cấn thiết giúp cho bạn có thể sử dụng linh hoạt vòng lặp này.
          Vòng lặp while hay còn được gọi là vòng lặp không xác định. Có tên gọi như vậy là vì khi ta viết chương trình ta sẽ không thể biết được là vòng lặp sẽ được thực hiện chính xác bao nhiêu lần. Trong thực tế có rất nhiều các bài toán mà số lần thực hiện ta không thể biết trước chính xác được. Trong những trường hợp như vậy rõ ràng bạn không thể sử dụng vòng lặp for được. Lúc đó bạn hãy nghĩ đến vòng lặp while
Cú pháp:
          while(Bieuthuclogic)
          {
                   Khoilenh;
          }
Hoạt động:
          Hoạt động của vòng lặp while có thể mô tả ngắn gọn như sau:
          Khi gặp câu lệnh lặp while trên, đầu tiên chương trình sẽ thực hiện tính giá trị của bieuthuclogic để kiểm tra điều kiện lặp.
          - Nếu bieuthuclogic nhận giá trị đúng, chương trình sẽ thực hiện khối lệnh. Sau đó chương trình sẽ lại quay lại tính giá trị của bieuthuclogic.
          - Quá trình trên được lặp lại cho đến khi bieuthuclogic sai.
Chú y:
          - Bieuthuclogic có thể là sự kết hợp của nhiều bieuthuclogic (ví dụ: a<=b||b<=c,…)
          - Nếu khối lệnh chỉ là một lệnh thì không cần đến các dấu đóng, mở khối lệnh {…}
          - Tất cả các đoạn chương trình được viết bằng vòng lặp for đều có thể được thay thế bằng cách viết sử dụng vòng lặp while. Ví dụ đoạn chương trình tính tổng các số từ 1 đến 100 có thể được viết như sau:
          public class Sum
          {
                   public static void main(String[] args)
                   {
                             int s=0;
                             int i=0;
                             while(i<=100)
                             {
                                      i=i+1;
                                      s=s+i;
                             }
                             System.out.println(“Tong cac so tu 1 den 100 la” + s);
}
}
          - Nếu ngay từ đầu mà bieuthuclogic đã sai thì khối lệnh sẽ không được lặp lại một lần nào. Ví dụ dưới đây tổng s vẫn băng 0.
          public class Sum
          {
                   public static void main(String[] args)
                   {
                             int s=0;
                             int i=100;
                             while(i<100)
                             {
                                      i=i+1;
                                      s=s+i;
                             }
                             System.out.println(“Tong cac so tu 1 den 100 la” + s);
}
}
          - Trong thân của khối lệnh luôn phải chứa biều thức để làm thay đổi giá trị của bieuthuclogic. Trường hợp mà khối lệnh không chứa, hoặc chứa nhưng giá trị của bieuthuclogic luôn đúng thì chương trình sẽ treo. Ví dụ đoạn chương trình dưới đây sẽ treo.
          public class Sum
          {
                   public static void main(String[] args)
                   {
                             int s=0;
                             int i=0;
                             while(i<100)
                             {
                                      i=i;
                                      s=s+i;
                             }
                             System.out.println(“Tong cac so tu 1 den 100 la” + s);
}
}
          Vòng lặp while được sử dụng chủ yếu trong những trường hợp mà ta không thể biết được là chương trình sẽ được lặp lại bao nhiêu lận. Dưới đây là một ví dụ như thế.
          Ví dụ 2.15. Viết chương trình tìm số tự nhiên n nhỏ nhất thoả mãn:
                   S=1/1+1/2+...+1/n>100
          Trong bài toàn này ta biết rằng tổng S trên sẽ tằng dần và khi n tiến tới vô cùng thì S sẽ bằng vô cùng. Nhưng vấn đề đặt ra là n tăng đến bao nhiêu thì S>100. Rõ ràng là ta không thể nhẩm tính chính xác được. Vì vậy trong trường hợp này ta không thể áp dụng vòng for được. Ta nghĩ đến việc sử dụng vòng lặp while. Đoạn chương trình giải bài toán trên được viết như sau:
          public class FindNumber
          {
                   public static void main(String[] args)
                   {
                             int s=0;
                             int i=0;
                             while(s<=100)
                             {
                                      i=i+1;
                                      s=s+1/i;
                             }
                             System.out.println(“So tu nhien n nho nhat thoa man la” + i);
}

}

No comments :

Post a Comment