Java Bài 9: Câu Lệnh Lặp

Posted by

Được chỉnh sửa ngày 4/9/2017.

Chào mừng các bạn đã quay trở lại với bài học Java số 9 trong chuỗi bài học về 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.

Khái Niệm 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.

Các Câu Lệnh Lặp

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ài Thực Hành Số 1

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);

Bài Thực Hành Số 2

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ố 2, 3, 5, 7, 11, 13,…

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ài Thực Hành Số 3

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ài Thực Hành Số 4

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 for chứ không nằm trong thân hàm như với while nữa.

Bài Thực Hành Số 5

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

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 đánh giá 5 sao nếu thấy thích bài viết, hãy comment bên dưới nếu có thắc mắc, hãy để lại địa chỉ email của bạn để nhận được thông báo mới nhất khi có bài viết mới, và nhớ chia sẻ các bài viết của Yellow Code Books đến nhiều người khác nữa nhé.

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.

Advertisements
Rating: 5.0/5. From 7 votes.
Please wait...

7 comments

    1. Haha, bạn nên kiếm thêm các bài thực hành khác, như các bài tập từ các lớp đào tạo Java nào đó, điều này bạn có thể search trên mạng, để nâng cao “tay nghề” Java của mình. Từ từ bạn sẽ nhớ và vận dụng tốt hơn các dòng code của bạn.

  1. ———– ~*~ Code 1 ~*~ ———–

    TAG POS=1 TYPE=A ATTR=TXT:Open
    WAIT SECONDS=60
    if SEARCH TEXT=”Captcha”)
    {
    iimPlay(“CODE:PROMPT “Please manually do the CAPTCHA and click CONTINUE on the script”)
    }

    >> Bạn giúp mình code
    TAG POS=1 TYPE=A ATTR=TXT:Open ( Lặp lại 5 lần )

    WAIT SECONDS=60 | 30 | 15 | 10 | 5 ( nếu có TXT: 60 | 30 | 15 | 10 | 5 code thế nào để tự tìm, nếu không có thì bỏ qua )

    if SEARCH TEXT=”Captcha”) ( Nếu tìm thấy dòng TXT: captcha | recaptcha)
    {
    iimPlay(“CODE:PROMPT “Please manually do the CAPTCHA and click CONTINUE on the script”)

    ( Thì báo “Please manually do the CAPTCHA and click CONTINUE on the script” để mình biêt ( CHÈN PAUSE hoặc WAIT SECONDS=10 để có thời gian nhập captcha) >< NẾU KHÔNG BỎ QUA CHẠY LUÔN KHÔNG DỪNG LẠI Ở DÒNG "Please manually do the CAPTCHA and click CONTINUE on the script"
    }

    ———– ~*~ Code 2 ~*~ ———–

    Nếu captcha có hình ví dụ chọn câu trả lời đúng

    URL GOTO=http://www.traffboost.net/websites

    TAG POS=1 TYPE=A ATTR=TXT:100
    TAG POS=1 TYPE=A ATTR=TXT:100VIP
    TAG POS=1 TYPE=A ATTR=TXT:91
    TAG POS=1 TYPE=A ATTR=TXT:91VIP
    TAG POS=1 TYPE=A ATTR=TXT:90

    ( Chọn 100|…30|20|10)

    WAIT SECONDS=40|30|20|10|5

    SEARCH HÌNH ẢNH ĐÚNG:

    TAG POS=1 TYPE=IMG ATTR=SRC:http://www.traffboost.net/website/identifier/106577062
    TAG POS=1 TYPE=IMG ATTR=SRC:/website/identifier/106577089

    LIST câu trả lời ( tự chọn dựa theo hình ở phần SEARCH ):

    TAG POS=1 TYPE=A ATTR=TXT:Date
    TAG POS=1 TYPE=A ATTR=TXT:Download
    TAG POS=1 TYPE=A ATTR=TXT:Edit

    WAIT SECONDS=10

    TAG POS=1 TYPE=BUTTON ATTR=TXT:Next ( 10 LẦN HIỆN CAPTCHA – TRẢ LỜI – NEXT CHẠY TIẾP)

    ==============

    Mấy dấu { ( có tác dụng gì thế? Cách nào để auto mấy dấu này không hay đánh bằng tay ^^
    Tab để lùi dòng, lùi dòng để phân biệt câu lệnh hay có tác dụng lệnh chính phụ

    phpDesigner 8 thấy họ ghi nhập sai lệnh thì báo cho mình biết mà mình nhập sai chẳng thấy báo gì cả.

    Thank you!

  2. Bạn ơi, xin lỗi vì mình không thể trả lời câu hỏi của bạn nha. Thứ nhất vì mình cũng chưa hiểu bạn hỏi gì, thêm nữa cũng có thể kiến thức này nằm ngoài chuyên môn của mình.

    Mình có gợi ý sau. Với các câu hỏi lập trình, nếu bạn muốn có cộng đồng trả lời nhanh gọn lẹ chính xác. Hãy vào các forum hỏi đáp:
    – Bạn có thể vào https://stackoverflow.com/ để hỏi. Dĩ nhiên link này bạn nên hỏi bằng tiếng Anh. Có rất nhiều pro trên đó sẵn sàng giúp bạn.
    – Hoặc bạn cũng có thể hỏi trên https://viblo.asia/discussion bằng tiếng Việt. Cũng sẽ hi vọng bạn được giải đáp sớm.

    Chúc bạn thành công.

  3. Ở bài thực hành 1 của while, mình ko hiểu syntax sumEven += i;

    Mình không hiểu mấy bữa nay nên giờ đăng hỏi, tự nhiên lúc gõ câu hỏi lại hiểu ra hay sao ấy?

    Có phải có nghĩa là sumEven tăng lên 1 lượng bằng i ?

    lúc tự code mình gõ sumEven = sumEven + i;

    1. Cám ơn bạn nha, đúng là sumEven += i; chính là sumEven = sumEvent + i; rồi đó. Nhờ comment của bạn mà mình biết mình bị sót ý này trong bài học số 5 rồi, mình sẽ bổ sung ngay.

  4. Thank Admin rất nhiều.

    Bạn viết rất cẩn thận và đầy tâm huyết với các bài hướng dẫn cho bạn đọc.

    Chúc bạn nhiều năng lượng để có nhiều bài viết hơn cho cộng đồng.

Gửi phản hồi