Nhập vào các số thực cho đến khi gặp 0 đưa ra giá trị lớn nhất trong các số vừa nhập Java

Được chỉnh sửa ngày 30/10/2020.

Chào mừng các bạn đến với bài học Java số 9, bài học về các câu lệnh lặp trong Java. Bài học này nằm trong chuỗi bài học lập trình ngôn ngữ Java của Yellow Code Books.

Bài trước chúng ta đã làm quen với phần một của các Câu Lệnh Điều Khiển Luồng (Control Flow), đó là các Câu Lệnh Điều Kiện (hay Câu Lệnh Rẽ Nhánh). Bài hôm nay chúng ta đi tiếp phần còn lại đó là các Câu Lệnh Lặp.

Lặp (tiếng Anh gọi là Loop) trong lập trình là một hành động lặp đi lặp lại một khối lệnh nào đó khi mà một điều kiện nào đó còn thỏa (thỏa – hay còn hiểu là kết quả của biểu thức đó là true). Nếu như với các Câu Lệnh Điều Kiện giúp bạn rẽ nhánh các dòng code, thì các Câu Lệnh Lặp bài này lại giúp bạn lặp lại các dòng code nào đó.

Mình ví dụ có một yêu cầu bắt bạn in ra màn hình 1000 con số từ 1 đến 1000, chẳng lẽ bạn lại gọi 1000 lần câu lệnh System.out.println()?

Ví dụ thực tế hơn, nếu như có yêu cầu muốn bạn in ra tên tất cả sinh viên của trường bạn (giả sử bạn đã biết câu lệnh đọc một thông tin sinh viên lên từ cơ sở dữ liệu), chẳng lẽ bạn lại viết code đọc dữ liệu của từng sinh viên và in ra màn hình?

Các ví dụ trên cho chúng ta thấy khái niệm thực tế rõ ràng và sự cần thiết khi sử dụng đến các Câu Lệnh Lặp trong bài hôm nay.

Chúng ta có 3 loại câu lệnh lặp cần làm rõ trong bài hôm nay, đó là: whiledo while và for.

while

Cú pháp cho câu lệnh while như sau.

while (điều_kiện_lặp) { các_câu_lệnh; }

Cú pháp của câu lệnh while khá đơn giản, ban đầu chương trình sẽ kiểm tra điều_kiện_lặp, nếu điều kiện này trả về kết quả true, thì các_câu_lệnh sẽ được thực thi, rồi sau đó chương trình sẽ lại kiểm tra điều_kiện_lặp. Vòng lặp while chỉ được kết thúc khi điều_kiện_lặp trả về kết quả false.

Ví dụ.

int i = 0; while (i < 10) { System.out.println("Hello!"); i++; }

Bạn thấy ví dụ trên đây phải khởi tạo biến i (người ta gọi đây là biến đếm, vì đây là biến dùng để điều khiển số lần lặp của vòng while). Bắt đầu vào while, bạn thấy điều_kiện_lặp được đưa ra là nếu biến i còn nhỏ hơn 10 thì các_câu_lệnh bên trong được thực hiện, ở ví dụ này chỉ là hàm in ra màn hình câu chào “Hello!”. Bạn chú ý một điều, trong thân hàm while bạn luôn phải thay đổi giá trị của biến đếm, trong ví dụ này i++; giúp tăng biến đếm lên 1 đơn vị, để sao cho đến một lúc nào đó điều_kiện_lặp phải bị phá vỡ, trường hợp này là i bằng 10, thì hàm while mới kết thúc.

Nếu lấy can đảm bỏ dòng i++; ở ví dụ trên đi rồi chạy lại, bạn sẽ thấy dòng in ra màn hình được gọi mãi mãi, người ta gọi trường hợp này là lặp vô tận.

Bạn thử áp dụng vòng lặp while để thực hiện yêu cầu sau: hãy in ra console tổng các số chẵn từ dãy số nguyên có độ lớn từ 1 đến 10.

Lưu ý kiểm tra một số chẵn bằng cách thực hiện phép chia dư số đó với 2, nếu kết quả phép chia dư là 0 thì đó là số chẵn.

Bạn hãy thử code, rồi so sánh với kết quả sau nhé.

int i = 1; int sumEven = 0; while (i <= 10) { if (i % 2 == 0) sumEven += i; i++; } System.out.println("Sum: " + sumEven);

Hãy dùng vòng lặp while để tìm ra các số nguyên tố trong dãy số nguyên từ 1 đến 100 và in chúng ra console.

Lưu ý số nguyên tố là các số chỉ chia hết cho 1 và chính nó. Ví dụ như số 23571113,…

Bạn hãy thử code trước rồi so sánh với kết quả sau nhé.

int number = 1; // Các số tăng dần từ 1 đến 100 để kiểm tra while (number <= 100) { int count = 0; // Đếm số lượng số mà number chia hết, luôn phải khởi tạo là 0 int j = 1; // Biến chạy từ 1 đến number để kiểm tra while (j <= number) { if (number % j == 0) { // Tìm thấy một số mà number chia hết, tăng biến đếm lên 1 để đếm count++; } j++; // Nhớ dòng này } if (count == 2) { // Nếu count là 2, tức là số đó chỉ chia hết cho 2 số là 1 và chính nó System.out.println(number); } number++; // Nhớ tăng number để kiểm tra số tiếp theo }

do while

Cú pháp cho câu lệnh do while như sau.

do { các_câu_lệnh; } while (điều_kiện_lặp);

Bạn có để ý thấy là cú pháp do while khác với while chỗ nào không? Đó là nếu với while, hệ thống phải kiểm tra điều_kiện_lặp trước, nếu thỏa thì mới thực hiện các_câu_lệnh. Còn với do while, hệ thống sẽ thực hiện các_câu_lệnh trước rồi mới kiểm tra điều_kiện_lặp xem có cần thực hiện việc lặp lại hay không.

Như vậy với do while thì các_câu_lệnh được thực hiện ít nhất 1 lần, còn với while thì các_câu_lệnh có thể sẽ không được thực hiện bao giờ nếu điều_kiện_lặp không thỏa.

do while sẽ ít khi được dùng hơn là while. Bạn không cần phải xem ví dụ cho do while, hãy bắt tay vào thử vài bài tập như sau.

Bạn hãy in ra console thông báo kêu người dùng nhập vào một con số từ console, rồi sau đó cho biết các thứ trong tuần tương ứng. Với 1 thì in ra “Monday”,… 7 in ra “Sunday”. Chương trình sẽ hỏi người dùng nhập số hoài cho đến khi họ nhập vào một số không phải giá trị từ 1 đến 7.

Code tham khảo như sau.

Scanner scanner = new Scanner(System.in); int getNumber = 0; do { System.out.print("Enter a number: "); getNumber = scanner.nextInt(); switch (getNumber) { case 1: System.out.println("Monday"); break; case 2: System.out.println("Tuesday"); break; case 3: System.out.println("Wednesday"); break; case 4: System.out.println("Thursday"); break; case 5: System.out.println("Friday"); break; case 6: System.out.println("Saturday"); break; case 7: System.out.println("Sunday"); break; default: System.out.println("Invalid number!"); break; } } while (getNumber >= 1 && getNumber <= 7);

for

Cú pháp cho câu lệnh for như sau.

for (khởi_tạo_biến_đếm; điều_kiện_lặp; điều_chỉnh_biến_đếm) { các_câu_lệnh; }

Câu lệnh for sẽ lặp các_câu_lệnh bên trong nó dựa trên việc kiểm tra 3 thành phần truyền vào, các thành phần này được phân cách bởi các dấu ;. Trong đó.

khởi_tạo_biến_đếm cũng giống như bạn khai báo biến và khởi tạo (gán cho nó một giá trị) mà bạn đã học ở bài 4. biến_đếm này sẽ là căn cứ để chương trình lặp lại dòng code của bạn bao nhiêu lần.
điều_kiện_lặp là điều kiện đặt ra cho vòng lặp kiểm tra xem có nên lặp tiếp một vòng các_câu_lệnh nữa hay không.
điều_chỉnh_biến_đếm giúp thay đổi giá trị của biến_đếm mỗi khi các_câu_lệnh được thực hiện xong một lần lặp, tại sao? Vì cũng giống như các câu lệnh lặp trên đây, nếu không có việc điều chỉnh lại biến đếm, thì các biến đếm sẽ không bao giờ bị thay đổi giá trị, và điều_kiện_lặp sẽ luôn luôn trả về cùng một giá trị, và vì vậy vòng lặp có thể sẽ bị lặp vô tận, hoặc sẽ không thực hiện bất kỳ lần lặp nào.

Bạn sẽ hiểu thêm câu lệnh for qua ví dụ sau đây.

for (int i = 0; i < 10; i++) { System.out.println("Hello!"); }

Ví dụ trên rất đơn giản, khởi_tạo_biến_đếm là khai báo và khởi tạo cho biến i giá trị ban đầu là 0. điều_kiện_lặp sẽ lặp hoài khi mà biến i còn nhỏ hơn 10. điều_chỉnh_biến_đếm sẽ tăng i lên 1 đơn vị sau khi thực hiện các_câu_lệnh. các_câu_lệnh trong vòng for này chỉ là hàm in ra console dòng chữ “Hello!”. Vậy bạn thử nghĩ xem có bao nhiêu dòng “Hello!” được in ra màn hình ở ví dụ trên?

Bạn hãy viết lại Bài Thực Hành Số 1 trên kia bằng vòng lặp for nhé.

int sumEven = 0; for(int i = 1; i <= 10; i++) { if (i % 2 == 0) sumEven += i; } System.out.println("Sum: " + sumEven);

Bạn có thể thấy là với for chúng ta có thể khai báo biến đếm i vào trong vòng lặp và khởi tạo cho nó trong đó, khác với while phải khởi tạo bên ngoài. Và việc tăng biến i lên được để ở thành phần thứ 3 của vòng forchứ không nằm trong thân hàm như với while nữa.

Bạn hãy viết lại Bài Thực Hành Số 2 trên kia bằng vòng lặp for nhé.

for (int number = 1; number <= 100; number++) { int count = 0; // Đếm số lượng số mà number chia hết, luôn phải khởi tạo là 0 for(int j = 1; j <= number; j++) { if (number % j == 0) { // Tìm thấy một số mà number chia hết, tăng biến đếm lên 1 để đếm count++; } } if (count == 2) { // Nếu count là 2, tức là số đó chỉ chia hết cho 2 số là 1 và chính nó System.out.println(number); } }

for Và Một Vài Mở Rộng

Đa số các bạn sẽ gặp khó khăn khi bước đầu làm quen với for, mình cũng vậy, từ lúc bắt đầu biết đến for cho đến một thời gian về sau mình mới xài tốt for, trước đó mình thường dùng while thay cho forwhile dễ tiếp cận và dễ nhớ hơn, nhưng như bạn thấy while lại chiếm nhiều dòng code hơn, cái nào cũng có giá của nó 🙂

Mục mở rộng này dành cho bạn nào đã am hiểu về for rồi và muốn xem thêm for có sức mạnh nào khác không nhé.

Thứ nhất, mặc dù for được thiết kế để truyền vào 3 thành phần, nhưng bạn vẫn có thể khuyết một thành phần. Chẳng hạn code dưới đây khuyết điều_chỉnh_biến_đếm, khi đó bạn có quyền điều khiển biến đếm bên trong thân hàm for.

for (int i = 1; i <= 10;) { System.out.println("Hello!"); i++; }

Tiếp theo, bạn có thể khuyết cả 2 thành phần nào đó, và bạn có quyền điều khiển sự khiếm khuyết này thông qua các điều khiển bên trong và ngoài for. Như ví dụ sau.

int i = 1; for (; i <= 10;) { System.out.println("Hello!"); i++; }

Dã man hơn, bạn có thể khuyết luôn 3 thành phần, người ta hay dùng kiểu vòng for này để lặp vô tận, dùng cho một số tình huống không xác định rõ khi nào cần dừng vòng lặp, lặp sẽ chạy đến điều kiện nào đó cần dừng thì có các hàm “nhảy” ra khỏi vòng lặp mà chúng ta sẽ cùng làm quen ở bài kế tiếp. Bạn hãy xem ví dụ về for vô tận này ở code bên dưới. Và nhớ, đừng thử vòng for vô tận này ở nhà nha.

for (;;) { System.out.println("Please don't try at home"); }

Bạn vừa cùng mình đi qua phần còn lại trong tổng thể Câu Lệnh Điều Khiển Luồng, đó là các Câu Lệnh Lặp. Bạn sẽ được nói đến một ý nhỏ liên quan đến các câu lệnh này, đó là các lệnh dùng để thoát khỏi vòng lặp trong khi điều kiện lặp vẫn còn, sẽ rất hữu ích trong nhiều trường hợp thực tế.

Cảm ơn bạn đã đọc các bài viết của Yellow Code Books. Bạn hãy ủng hộ blog bằng cách:
– Đánh giá 5 sao ở mỗi bài viết nếu thấy thích.
– Comment bên dưới mỗi bài viết nếu có thắc mắc.
– Để lại địa chỉ email của bạn ở thanh bên phải để nhận được thông báo sớm nhất khi có bài viết mới.
– Chia sẻ các bài viết của Yellow Code Books đến nhiều người khác.
– Ủng hộ blog theo hướng dẫn ở thanh bên phải để blog ngày càng phát triển hơn.

Bài Kế Tiếp

Bạn sẽ làm quen với các câu lệnh “nhảy”, chúng là return, breakcontinue.

← Java Bài 8: Block & Scope & Các Câu Lệnh Điều Kiện

Java Bài 10: Các Câu Lệnh “Nhảy” Trong Vòng Lặp →