TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH

Nhập môn lập trình Vòng lặp TS. Ngô Hữu Dũng

Câu lệnh for

Initialization

Increment/ Decrement

True

Condition

Statement(s)

False

// Syntax of for for (Initialization; Condition; Increment/Decrement) {

Statement(s); . . .

}

Nhập môn lập trình - Vòng lặp

2

Vòng lặp for  Thực hiện các lệnh lặp đi lặp lại

 Bước 1: Bắt đầu vòng lặp – Initialization  Bước 2: Kiểm tra điều kiện lặp – Condition

 Nếu điều kiện đúng sang Bước 3  Nếu điều kiện sai sang Bước 6

 Bước 3: Thực hiện câu lệnh – Statement(s)  Bước 4: Lệnh tăng/giảm – Increment/Decrement

 Để thay đổi điều kiện lặp

 Bước 5: Trở lại bước 2  Bước 6: Kết thúc vòng lặp

3

Nhập môn lập trình - Vòng lặp

i = 0

i++

True

Print i

i < 6

False

Ví dụ minh hoạ  Xuất ra màn hình các số từ 0 đến 5  Khởi đầu  i = 0  Điều kiện  i < 6  Kết thúc  i >= 6  Bước nhảy

 i++  Lệnh

printf("%d\n", i);

 Xuất i

1. for (i = 0; i < 6; i++) 2. { 3. 4. }

4

Nhập môn lập trình - Vòng lặp

How’s it work? – For loop

i = 0

i++

True

i < 6

Print i

False

0 1 2 3 4 5

printf("%d\n", i);

i

0123456

1. for (i = 0; i < 6; i++) 2. { 3. 4. }

5

Nhập môn lập trình - Vòng lặp

Initialization – Khởi đầu

 Phần khởi đầu có thể khuyết 1. // Xuất từ 9 đến 0 2. i = 9; 3. for ( ; i >= 0; i--) printf("%d\n", i); 4.

 Phần khởi đầu có thể gồm nhiều phép gán

 Cách nhau bởi dấu phẩy 1. // Xuất từ 9 đến 0 2. for (i = 0, j = 9 ; i <= j; j--) 3.

printf("%d\n", j);

6

Nhập môn lập trình - Vòng lặp

Condition – Điều kiện

 Phần điều kiện có thể khuyết 1. // Xuất từ 0 đến 9 2. for ( i = 0; ; i++) 3. { 4.

if (i >= 10)

5.

break;

// Thoát vòng lặp

printf("%d\n", i);

6. 7. }

8. // Xuất từ 0 đến 9 9. for ( i = 0; i < 10; i++) printf("%d\n", i); 10.

7

Nhập môn lập trình - Vòng lặp

printf("%d\n", i); i++;

Increment/Decrement – Tăng/Giảm  Phần tăng giảm có thể khuyết 1. // Xuất từ 0 đến 9 2. for ( i = 0; i < 10; ) 3. { 4. 5. 6. }  Phần tăng/giảm có thể có nhiều phép toán

 Cánh nhau bởi dấu phẩy

printf("%d + %d = ", i, j);

1. // 0 + 9 = 1 + 8 = 2 + 7 = … = 9. 2. for ( i = 0, j = 9; i < j; i++, j--) 3. { 4. 5. } 6. printf("%d.\n ", i+j);

8

Nhập môn lập trình - Vòng lặp

for ( j = 1; j <= 10; j++)

printf("%d x %d = %d\n", i, j, i*j);

printf("-----------\n");

Nested loop – Vòng lặp lồng nhau  Vòng lặp có thể được lồng trong vòng lặp 1. // Bảng cửu chương 2. for ( i = 1; i < 10; i++) 3. { 4. 5. 6. 7. } 8. //1 x 1 = 1 9. //1 x 2 = 2 10. //... 11. //1 x 10 = 10 12. //----------- 13. //2 x 1 = 2 14. //...

9

Nhập môn lập trình - Vòng lặp

break vs. continue

 Lệnh break làm kết thúc vòng lặp  Lệnh continue bỏ qua lần lặp hiện tại và tiếp tục lặp 1. // Xuất số chẵn từ 0 đến 9 2. for ( i = 0; ; i++) 3. { 4.

5.

if (i == 10) break;

// Kết thúc vòng lặp

6.

if (i % 2) // i lẻ

7.

continue; // Không xuất số lẻ

printf("%d, ", i);

8. 9. }

Nhập môn lập trình - Vòng lặp

10

Lỗi thường gặp 1. // Dấu phẩy !? 2. for ( i = 0, i < 10, i++) printf("%d, ", i); 3.

4. // Dấu chấm phẩy !? 5. for ( i = 0; i < 10; i++); printf("%d, ", i); 6.

7. // Thiếu thành phần !? 8. for ( i = 0; i < 10) 9.

printf("%d, ", i++);

10.// Lặp vô hạn: i luôn luôn < 10 !? 11.for ( i = 0; i < 10; i--) printf("%d, ", i); 12.

Nhập môn lập trình - Vòng lặp

11

Bài tập vận dụng

 Viết vòng lặp dùng lệnh for xuất ra màn hình:

1. Các số nguyên từ 1 đến 10 2. Các số nguyên từ 20 đến 11 3. Các số nguyên từ 1 đến n, với n > 0 nhập từ bàn phím 4. Các số nguyên có hai chữ số 5. Các số chẵn có ba chữ số 6. Các số lẻ từ a đến a+10, với a nhập từ bàn phím 7. Các số nguyên dương là bội của 3 và nhỏ hơn 100 8. Các số nguyên dương là bội của 3 và 5 9. Các cặp số nguyên dương có tổng là 10

1. Ví dụ: 1 + 9 = 10, 2 + 8 = 10, …

12

Nhập môn lập trình - Vòng lặp

Hướng dẫn – Xuất dãy số liên tục

1. /* Cần xác định điểm bắt đầu? điểm

kết thúc? điều kiện? bước nhảy? câu lệnh? */

2. // Ví dụ: Xuất từ a đến b (a < b) 3. for ( i = a; i <= b; i++) printf("%d, ", i); 4.

5. // Ví dụ: Xuất từ b đến a (a < b) 6. for ( i = b; i >= a; i--) printf("%d, ", i); 7.

Nhập môn lập trình - Vòng lặp

13

Hướng dẫn – Xuất dãy số có điều kiện

1. /* Xuất các số thoả mãn điều kiện

nào đó */

2. for(khởi đầu; điều kiện; bước nhảy) 3.

if (điều kiện)

4.

printf("%d, ", i);

5. // Ví dụ: Xuất số chẵn có 2 chữ số 6. for ( i = 10; i <= 99; i++) 7.

if (i%2 == 0)

8.

printf("%d, ", i);

Nhập môn lập trình - Vòng lặp

14

True

Câu lệnh while // Syntax of while while (Condition) {

Condition

Statement(s)

Statement(s); . . .

False

}

 Bước 1: Kiểm tra điều kiện – Condition

 Nếu điều kiện đúng sang Bước 2  Nếu điều kiện sai sang Bước 4

 Bước 2: Thực hiện lệnh – Statement(s)  Bước 3: Sang Bước 1  Bước 4: Kết thúc vòng lặp

15

Nhập môn lập trình - Vòng lặp

Initialization

printf("%d\n", i); i++;

Condition

Ví dụ minh hoạ 1. // Xuất các số từ 0 đến 5 2. i = 0; 3. while(i < 6) 4. { 5. 6. 7. }

Statement

Increment/Decrement

printf("%d\n", i);

8. // Lệnh for tương tự 9. for (i = 0; i < 6; i++) 10.{ 11. 12.}

16

Nhập môn lập trình - Vòng lặp

Condition – Điều kiện

 Phần điều kiện có thể là biến, biểu thức hoặc hằng số

 0: false  #0: true

1. // Ví dụ: Xuất các số từ 9 đến 1 2. i = 9; 3. while(i) 4. { 5.

printf("%d\n", i); i--;

6. 7. }

17

Nhập môn lập trình - Vòng lặp

j = 1; while (j <= 10) {

printf("%d x %d = %d\n", i, j, i*j); j++;

} printf("-----------\n"); i++;

Nested loop – Vòng lặp lồng nhau  Vòng lặp có thể được lồng trong vòng lặp 1. // Ví dụ: Bảng cửu chương 2. i = 1; 3. while (i < 10) 4. { 5. 6. 7. 8. 9. 10. 11. 12. 13. }

18

Nhập môn lập trình - Vòng lặp

break vs. continue  Lệnh break làm kết thúc vòng lặp  Lệnh continue bỏ qua lần lặp hiện tại và tiếp tục lặp

// Luôn đúng

if (i == 10) break; if (i % 2)

// Kết thúc vòng lặp // i lẻ continue; // Không xuất số lẻ

printf("%d, ", i); i++;

1. //Ví dụ: Xuất số chẵn từ 0 đến 9 2. i = 0; 3. while(1) 4. { 5. 6. 7. 8. 9. 10. 11.}

Nhập môn lập trình - Vòng lặp

19

Lỗi thường gặp 1. // Dấu chấm phẩy !? 2. i = 0; 3. while (i < 10); 4.

printf("%d, ", i++);

5. // Lặp vô hạn !? 6. i = 0; 7. while (i < 10) 8.

printf("%d, ", i);

9. // Thiếu điều kiện !? 10.while ()

Nhập môn lập trình - Vòng lặp

20

Bài tập vận dụng

 Viết vòng lặp dùng lệnh while xuất ra màn hình:

1. Các số nguyên từ 1 đến 10 2. Các số nguyên từ 20 đến 11 3. Các số nguyên từ 1 đến n, với n > 0 nhập từ bàn phím 4. Các số nguyên có hai chữ số 5. Các số chẵn có ba chữ số 6. Các số lẻ từ a đến a+10, với a > 0 nhập từ bàn phím 7. Các số nguyên dương là bội của 3 và nhỏ hơn 100 8. Các số nguyên dương là bội của 3 và 5 9. Các cặp số nguyên dương có tổng là 10

21

Nhập môn lập trình - Vòng lặp

Câu lệnh do..while // Syntax of do..while do{

True

Condition

Statement(s)

Statement(s); . . .

}while (Condition);

False

 Bước 1: Thực hiện lệnh – Statement(s)  Bước 2: Kiểm tra điều kiện – Condition

 Nếu điều kiện đúng sang Bước 1  Nếu điều kiện sai sang Bước 3

 Bước 3: Kết thúc vòng lặp

22

Nhập môn lập trình - Vòng lặp

Initialization

Condition

printf("%d\n", i); i++;

Ví dụ minh hoạ 1. // Xuất các số từ 0 đến 5 2. i = 0; 3. do{ 4. 5. 6. }while(i < 6);

Statement

Increment/Decrement

printf("%d\n", i);

7. // Lệnh for tương tự 8. for (i = 0; i < 6; i++) 9. { 10. 11.}

Khác nhau? Do..while thực hiện Lệnh trước rồi kiểm tra sau.

23

Nhập môn lập trình - Vòng lặp

Condition – Điều kiện

 Phần điều kiện có thể là biến, biểu thức hoặc hằng số

 0: false  #0: true

1. // Ví dụ: Nhập số nguyên dương 2. // Kiểm tra điều kiện nhập 3. do{ 4.

printf("Nhap mot so nguyen duong: "); scanf("%d", &i);

5. 6. }while(i<=0);

24

Nhập môn lập trình - Vòng lặp

Nested loop – Vòng lặp lồng nhau

 Vòng lặp có thể được lồng trong vòng lặp 1. // Ví dụ: Bảng cửu chương 2. i = 1; 3. do{ 4.

5.

j = 1; do{

6.

7.

printf("%d x %d = %d\n", i, j, i*j); j++;

8.

9.

}while(j <= 10); printf("-----------\n"); i++;

10. 11. }while (i < 10);

25

Nhập môn lập trình - Vòng lặp

i++;

i++;

Lỗi thường gặp 1. // Thiếu chấm phẩy !? 2. do{ 3. 4. }while (i < 10) 5. 6. // Lặp vô hạn !? 7. i = 0; 8. do{ 9. 10.}while (i > 0);

11.// Thiếu điều kiện !? 12.do{i++;}while ();

Nhập môn lập trình - Vòng lặp

26

Bài tập vận dụng

 Viết vòng lặp dùng lệnh do while xuất ra màn hình:

1. Các số nguyên từ 1 đến 10 2. Các số nguyên từ 20 đến 11 3. Các số nguyên từ 1 đến n, với n > 0 nhập từ bàn phím 4. Các số nguyên có hai chữ số 5. Các số chẵn có ba chữ số 6. Các số lẻ từ a đến a+10, với a > 0 nhập từ bàn phím 7. Các số nguyên dương là bội của 3 và nhỏ hơn 100 8. Các số nguyên dương là bội của 3 và 5 9. Các cặp số nguyên dương có tổng là 10

27

Nhập môn lập trình - Vòng lặp

Bài tập 4.1 – Tính toán  Viết vòng lặp thực hiện:

4. 4 =

+

+ +

5. 5 = 1 +

+ +

7. 2 = 1 .

. … .

1. 1 = 1 + 2 + 3 + + 2. 2 = 1 + 2 + 3 + + + 3. 3 = 1 + … + + + 6. 1 = 1 . 2 . 3 . … .

8. 3 =

.

9. 4 = 1 .

. … .

10. = 1 +

+ +

. . +

. . … . . ..

..…

Nhập môn lập trình - Vòng lặp

28

Hướng dẫn 4.1 – Tính tổng

1. tong = 0; 2. for(khởi đầu; điều kiện; bước nhảy) 3.

tong = tong + ??;

tong = tong + i;

4. // Ví dụ tính tong = 4+5+6+7 5. tong = 0; 6. for ( i = 4; i <= 7; i++) 7. { 8. 9. }

Nhập môn lập trình - Vòng lặp

29

Hướng dẫn 4.1 – Tính tích

1. tich = 1; 2. for(khởi đầu; điều kiện; bước nhảy) 3.

tich = tich * ??;

tich = tich * i;

4. // Ví dụ tính tich = 2x3x4x6 5. tich = 1; 6. for ( i = 2; i <= 6; i++) 7. { 8. 9. }

Nhập môn lập trình - Vòng lặp

30

tuSo = ?? mauSo = ?? tong += (float)tuSo/mauSo;

Hướng dẫn 4.1 – Tổng các thương số 1. tong = 0; 2. for(khởi đầu; điều kiện; bước nhảy) 3. { 4. 5. 6. 7. }

. … . . .

tuSo = i; mauSo = 2*i+1; tong += (float)tuSo/mauSo;

8. // Ví dụ tính: tong = 9. tong = 0; 10. for(i = 1; i<=n; i++) 11. { 12. 13. 14. 15. }

Nhập môn lập trình - Vòng lặp

31

Bài tập 4.2 – Tính toán có điều kiện

 Viết vòng lặp thực hiện, với n nguyên dương:

1. Liệt kê các số chẵn nhỏ hơn n 2. Tính tổng các số lẻ nhỏ hơn n 3. Đếm số các số lẻ nhỏ hơn n 4. Tính tích các số chẵn nhỏ hơn n 5. Tính trung bình cộng các số chẵn nhỏ hơn n 6. Liệt kê tất cả ước số của n 7. Tính tổng các ước số của n 8. Đếm số lượng ước số của n 9. Tính tích các ước số của n 10. Tính trung bình cộng các ước số của n

Nhập môn lập trình - Vòng lặp

32

if (điều kiện)

printf(...);

Hướng dẫn 4.2 – Liệt kê có điều kiện 1. for(khởi đầu; điều kiện; bước nhảy) 2. { 3. 4. 5. }

if (n%i == 0)

printf("%d ", i);

6. // Ví dụ: Liệt kê các ước của n 7. for(i = 1; i<=n; i++) 8. { 9. 10. 11.}

Nhập môn lập trình - Vòng lặp

33

if (điều kiện)

dem++;

Hướng dẫn 4.2 – Đếm có điều kiện 1. dem = 0; 2. for(khởi đầu; điều kiện; bước nhảy) 3. { 4. 5. 6. }

if (n%i == 0) dem++;

7. // Ví dụ: Đếm các ước số của n 8. dem = 0; 9. for(i = 1; i<=n; i++) 10.{ 11. 12. 13.}

Nhập môn lập trình - Vòng lặp

34

if (điều kiện) tong += ??;

Hướng dẫn 4.2 – Tính tổng có điều kiện 1. tong = 0; 2. for(khởi đầu; điều kiện; bước nhảy) 3. { 4. 5. 6. }

if (n%i == 0) tong += i;

7. // Ví dụ: Tổng các ước số của n 8. tong = 0; 9. for(i = 1; i<=n; i++) 10.{ 11. 12. 13.}

Nhập môn lập trình - Vòng lặp

35

Bài tập 4.3 – Kiểm tra số

Nhập một số nguyên dương n (n > 0), hãy cho biết n a. Có phải là số đối xứng? Ví dụ: 121, 12321, … Tìm số đảo ngược, kiểm tra số đảo và số gốc b. Có phải là số chính phương? Ví dụ: 4, 9, 16, …

Là số có căn bậc hai là số nguyên

c. Có phải là số nguyên tố? Ví dụ: 2, 3, 5, 7, …

Là số có 2 ước số: Đếm số ước số, kiểm tra số ước số d. Có phải là số hoàn hảo? Ví dụ 6, 28, 496, 8128…

Là số có tổng các ước số nhỏ hơn nó bằng chính nó

e. Có phải là số thuộc dãy Fibonacci? Ví dụ: 1, 2, 3, 5, 8, 13…

Số tiếp theo bằng tổng của hai số trước đó

Nhập môn lập trình - Vòng lặp

36

Hướng dẫn 4.3.a – Số đối xứng? 1. // Khai báo các biến... 2. 3.

printf("Nhap so nguyen duong: "); scanf("%d", &n);

// Tính số đảo ngược i = n; soDao = 0; while (i > 0){

donVi = i % 10; soDao = soDao*10 + donVi; i = i / 10;

4. 5. 6. 7. 8. 9. 10. }

// Kiểm tra số đối xứng if (soDao == n)

printf("%d la so đoi xung", n);

else

Nhập môn lập trình - Vòng lặp

printf("%d la so khong doi xung", n);

11. 12. 13. 14. 15. 37

Hướng dẫn 4.3.b – Số chính phương?

17./*Số chính phương là số có căn bậc hai là số

nguyên, ví dụ 9 = 3*3 */

// Tìm căn bậc hai của n i = 1; while(i*i

i++;

18. 19. 20. 21. 22. 23. }

// Kiểm tra số chính phương if (i*i == n)

printf("%d la so chinh phuong", n);

else

Nhập môn lập trình - Vòng lặp

38

24. 25. 26. 27. 28. printf("%d khong la so chinh phuong", n);

Hướng dẫn 4.3.c – Số nguyên tố?

29./*Số nguyên tố là số có hai ước số là 1 và chính

nó, ví dụ số 2, 3, 5, 7… */

// Đếm số ước số soUoc = 0; for (i = 1; i <= n; i++)

if (n % i == 0)

30. 31. 32. 33. 34. 35. souoc++;

// Kiểm tra số nguyên tố if (souoc == 2)

printf("%d la so nguyen to", n);

else

Nhập môn lập trình - Vòng lặp

39

36. 37. 38. 39. 40. printf("%d khong la so nguyen to", n);

Hướng dẫn 4.3.d – Số hoàn hảo?

41./*Số hoàn hảo là số có tổng các ước số nhỏ hơn nó

bằng chính nó, ví dụ số 6 = 1 + 2 + 3 */

// Tính tổng các ước số nhỏ hơn n tong = 0; for (i = 1; i < n; i++)

if (n % i == 0)

42. 43. 44. 45. 46. tong += i;

// Kiểm tra số hoàn hảo if (n == tong)

printf("%d la so hoan hao", n);

else

Nhập môn lập trình - Vòng lặp

40

47. 48. 49. 50. 51. printf("%d khong la so hoan hao", n);

Hướng dẫn 4.3.e – Số thuộc dãy Fibonacci?

52./*Dãy số Fibonacci có tính chất số sau bằng tổng của hai số trước đó, ví dụ: 1, 1, 2, 3, 5, 8… */

// Tìm số Fibonacci f1 = 0; f2 = 1; f3 = f2 + f1; while (f3 < n){

f1 = f2; f2 = f3; f3 = f2 + f1;

53. 54. 55. 56. 57. 58. 59. 60. }

// Kiểm tra số Fibonacci if (f3 == n)

printf("%d la so Fibonacci", n);

else

Nhập môn lập trình - Vòng lặp

41

61. 62. 63. 64. 65. printf("%d khong la so Fibonacci", n);

Bài tập 4.4 – Kiểm tra và Tính tổng

Nhập một số nguyên dương n. Tính: a) Tổng các số nguyên dương nhỏ hơn n chia hết cho 3 nhưng

không chia hết cho 2.

b) Tổng các số đối xứng nhỏ hơn n. c) Tổng các số chính phương nhỏ hơn n. d) Tổng các số nguyên tố nhỏ hơn n. e) Tổng các số hoàn hảo nhỏ hơn n. f) Tổng các số Fibonacci nhỏ hơn n.

Nhập môn lập trình - Vòng lặp

42

Hướng dẫn 4.4 – Kiểm tra và tính tổng

1. 2. // Cho tổng ban đầu bằng 0 tong = 0;

// Duyệt các số nhỏ hơn n for ( i = 1; i < n; i++) {

// Kiểm tra i

// Nếu i thoả mãn điều kiện thì cộng if (i thoả điều kiện) tong += i;

Nhập môn lập trình - Vòng lặp

43

3. 4. 5. 6. 7. 8. 9. 10. 11. }

Bài tập 4.5 – Chữ số

Nhập một số nguyên dương n, hãy cho biết: a) Chữ số lớn nhất và nhỏ nhất?

Lần lượt tìm các chữ số, tìm max và min

b) Các chữ số có tăng dần không?

Kiểm tra thoả điều kiện chữ số trước luôn nhỏ hơn chữ số sau

c) Tổng các chữ số?

Lần lượt tìm các chữ số, tính tổng

Nhập môn lập trình - Vòng lặp

44

Hướng dẫn 4.5.a – Chữ số min max?

// Đặt giá trị ban đầu cho min, max min = n % 10; max = min; 1. 2. 3.

i = n / 10; 4.

// Tìm chữ số lớn nhất, nhỏ nhất while (i>0) {

donVi = i % 10; i = i / 10; if (donVi < min) min = donVi; if (donVi > max) max = donVi;

Nhập môn lập trình - Vòng lặp

45

} printf("Chu so nho nhat %d\n", min); printf("Chu so lon nhat %d\n", max); 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

Hướng dẫn 4.5.b – Chữ số tăng dần?

15. tangDan = 1;

donVi = n % 10; i = n / 10; while(i>0) {

if(i%10 >= donVi) tangDan = 0; donVi = i % 10; i /= 10;

16. 17. 18. 19. 20. 21. 22. 23. 24. }

if (tangDan)

printf("Cac chu so tang dan");

else

Nhập môn lập trình - Vòng lặp

46

25. 26. 27. 28. printf("Cac chu so khong tan dan");