Bài 20: Câu lệnh lặp for – Lý thuyết | Tin học 10

Sơ đồ khối lệnh lặp for

I. Lý thuyết trọng tâm

1. Câu lệnh lặp for

a) Khái niệm cấu trúc lặp

Trong lập trình, nhiều công việc cần thực hiện lặp đi lặp lại nhiều lần. Ví dụ: tính tổng 0 + 1 + 2 + … + 9 cần cộng dồn 10 lần, đếm ước số cần kiểm tra lần lượt từng số. Thay vì viết hàng chục dòng lệnh giống nhau, ta dùng câu lệnh lặp để viết gọn.

for là lệnh lặp với số lần lặp biết trước, số lần lặp được xác định bởi vùng giá trị của lệnh range().

b) Cú pháp

for <biến> in range(n):
    <khối lệnh>

Cách hoạt động:

  • range(n) tạo ra vùng giá trị gồm n số: 0, 1, 2, …, n − 1.
  • Ở mỗi vòng lặp, <biến> được gán lần lượt từng giá trị trong vùng đó.
  • Sau mỗi lần gán, Python thực hiện <khối lệnh> bên trong.
  • Khi <biến> đã nhận hết các giá trị → kết thúc vòng lặp.
Sơ đồ khối lệnh lặp for
Sơ đồ khối lệnh lặp for

Ví dụ minh họa: Tính tổng 0 + 1 + … + 9:

>>> S = 0
>>> for k in range(10):
        S = S + k
>>> print(S)
45

Giải thích: range(10) tạo vùng {0, 1, 2, …, 9}. Biến k lần lượt nhận các giá trị này, mỗi lần cộng dồn vào S. Sau 10 vòng lặp, S = 0 + 1 + 2 + … + 9 = 45.

Quy tắc cú pháp: Giống lệnh if, khối lệnh bên trong for phải viết sau dấu :thụt lề (1 Tab hoặc 4 dấu cách).

Câu hỏi kiểm tra nhanh (SGK): Với giá trị n cho trước, so sánh giá trị S trong đoạn chương trình sau với tổng $1 + 2 + … + n$:

S = 0
for k in range(1, n+1):
    S = S + k

range(1, n+1) tạo vùng {1, 2, …, n}. Biến k chạy từ 1 đến n, cộng dồn vào S. Kết quả: S = 1 + 2 + … + n, đúng bằng tổng cần tính.

2. Lệnh range()

Lệnh range() tạo ra vùng giá trị (dãy các số nguyên liên tiếp) dùng cho vòng lặp for. Có hai dạng chính:

Dạng Cú pháp Vùng giá trị Số phần tử
1 tham số range(stop) Từ 0 đến stop − 1 stop phần tử
2 tham số range(start, stop) Từ start đến stop − 1 stop − start phần tử

Các ví dụ cụ thể:

Lệnh Vùng giá trị Ghi chú
range(10) 0, 1, 2, …, 9 10 phần tử
range(n) 0, 1, 2, …, n − 1 n phần tử
range(1, n+1) 1, 2, 3, …, n n phần tử
range(0, 99) 0, 1, 2, …, 98 99 phần tử
range(3, 10) 3, 4, 5, 6, 7, 8, 9 7 phần tử
range(100, 1) (vùng rỗng) start > stop − 1 → không có phần tử

Quy tắc quan trọng: Giá trị stop không bao giờ nằm trong vùng giá trị. Vùng luôn kết thúc tại stop − 1. Nếu start ≥ stop → vùng rỗng (vòng lặp không thực hiện).

Câu hỏi kiểm tra nhanh (SGK): Biểu diễn các dãy sau bằng range():

Dãy số Lệnh range()
a) 1, 2, 3, …, 50 range(1, 51)
b) 5, 6, 7, 8, 9, 10 range(5, 11)
c) 0, 1 range(2) hoặc range(0, 2)
d) 10 range(10, 11)

Lưu ý bổ sung: Tham số end = " " trong lệnh print() cho phép in nhiều giá trị trên cùng một dòng, cách nhau bằng dấu cách (thay vì xuống dòng sau mỗi lần in).

>>> for k in range(3, 10):
        print(k, end = " ")
3 4 5 6 7 8 9

II. Phương pháp giải các dạng bài tập

Dạng 1: Biểu diễn dãy số bằng lệnh range()

Phương pháp:

  • Xác định giá trị đầu (start) và giá trị cuối của dãy.
  • Đặt stop = giá trị cuối + 1 (vì range không bao gồm stop).
  • Nếu dãy bắt đầu từ 0 → chỉ cần range(stop).
  • Nếu dãy bắt đầu từ số khác 0 → dùng range(start, stop).

Bài tập mẫu: (đã giải ở phần lý thuyết — câu hỏi kiểm tra nhanh SGK)

Dạng 2: Truy vết vòng lặp for (xác định kết quả chương trình)

Phương pháp:

  • Bước 1: Xác định vùng giá trị của range() → biến lặp nhận những giá trị nào.
  • Bước 2: Lập bảng truy vết: mỗi dòng ứng với một vòng lặp, ghi lại giá trị biến lặp và các biến liên quan sau mỗi vòng.
  • Bước 3: Xác định kết quả cuối cùng khi vòng lặp kết thúc.

Bài tập mẫu (SGK – Luyện tập, bài 1): Đoạn chương trình sau in ra kết quả gì?

n = int(input("Nhập số tự nhiên n:"))
S = 0
for k in range(n+1):
    S = S + k
print(S*S)

Lời giải: Giả sử nhập n = 4.

range(n+1) = range(5) → vùng {0, 1, 2, 3, 4}.

Vòng lặp k S = S + k S sau vòng lặp
1 0 0 + 0 0
2 1 0 + 1 1
3 2 1 + 2 3
4 3 3 + 3 6
5 4 6 + 4 10

Sau vòng lặp: S = 0 + 1 + 2 + 3 + 4 = 10.

In ra S*S = $10^2$ = 100.

Tổng quát: Chương trình tính S = 0 + 1 + 2 + … + n, rồi in ra $S^2$. Với n nhập vào, kết quả là $(0 + 1 + 2 + … + n)^2$.

Dạng 3: Viết chương trình tính tổng bằng vòng lặp for

Phương pháp:

  • Bước 1: Khởi tạo biến tổng S = 0.
  • Bước 2: Xác định vùng giá trị phù hợp cho range().
  • Bước 3: Trong vòng lặp, cộng dồn từng phần tử vào S: S = S + <biểu thức>.
  • Bước 4: In kết quả sau vòng lặp.

Mẫu chung tính tổng:

S = 0
for k in range(start, stop):
    S = S + f(k)   # f(k) là biểu thức cần cộng
print(S)

Bài tập mẫu (SGK – Ví dụ 1): Tính tổng các số tự nhiên chẵn nhỏ hơn n (n = 10).

n = 10
S = 0
for k in range(n):
    if k % 2 == 0:
        S = S + k
print(S)

Giải thích: range(10) → k chạy từ 0 đến 9. Chỉ cộng k vào S khi k chẵn (k % 2 == 0). Kết quả: 0 + 2 + 4 + 6 + 8 = 20.

Dạng 4: Viết chương trình đếm bằng vòng lặp for

Phương pháp:

  • Bước 1: Khởi tạo biến đếm count = 0 (hoặc C = 0).
  • Bước 2: Xác định vùng giá trị cho range().
  • Bước 3: Trong vòng lặp, kiểm tra điều kiện. Nếu thỏa mãn → tăng biến đếm: count = count + 1.
  • Bước 4: In kết quả sau vòng lặp.

Mẫu chung đếm:

count = 0
for k in range(start, stop):
    if <điều kiện>:
        count = count + 1
print(count)

Bài tập mẫu (SGK – Ví dụ 2): Đếm số các số nguyên nhỏ hơn n (n = 20) và là bội của 3.

n = 20
C = 0
for k in range(n):
    if k % 3 == 0:
        C = C + 1
print(C)

Giải thích: range(20) → k chạy từ 0 đến 19. Các số chia hết cho 3: 0, 3, 6, 9, 12, 15, 18 → 7 số. Kết quả: 7.

Dạng 5: Viết chương trình tìm và in ước số

Phương pháp:

  • Ước số của n là số k thỏa mãn n % k == 0.
  • Duyệt k từ 1 đến n: dùng range(1, n+1).
  • Ước số thực sự: k < n và n % k == 0 → dùng range(1, n).
  • Muốn in trên cùng một dòng → dùng print(k, end = " ").

Bài tập mẫu (SGK – Thực hành, nhiệm vụ 1): Nhập n, in ra dãy ước số của n trên một dòng.

n = int(input("Nhập số tự nhiên n: "))
for k in range(1, n+1):
    if n % k == 0:
        print(k, end = " ")

Ví dụ: Nhập n = 10 → In ra: 1 2 5 10

Dạng 6: Viết chương trình tính tích bằng vòng lặp for

Phương pháp:

  • Tương tự tính tổng, nhưng:
    • Khởi tạo biến tích P = 1 (không phải 0, vì nhân với 0 sẽ luôn bằng 0).
    • Trong vòng lặp: P = P * <biểu thức>.

Mẫu chung tính tích:

P = 1
for k in range(start, stop):
    P = P * k
print(P)

Bài tập mẫu (SGK – Luyện tập, bài 2): Viết đoạn chương trình tính tích $1 \times 2 \times 3 \times … \times n$ (n! — giai thừa).

n = int(input("Nhập số tự nhiên n: "))
P = 1
for k in range(1, n+1):
    P = P * k
print(P)

Giải thích: range(1, n+1) → k chạy từ 1 đến n. Mỗi vòng nhân dồn k vào P. Kết quả: $P = 1 \times 2 \times 3 \times … \times n = n!$

III. Sơ đồ tư duy

1. Lệnh lặp for

  • 1.1. Lặp với số lần biết trước
  • 1.2. Cú pháp: for <biến> in range(n): <khối lệnh>
  • 1.3. Biến lặp nhận lần lượt từng giá trị trong vùng range()
  • 1.4. Khối lệnh viết sau dấu :, thụt lề

2. Lệnh range()

  • 2.1. range(stop): vùng từ 0 đến stop − 1
  • 2.2. range(start, stop): vùng từ start đến stop − 1
  • 2.3. Giá trị stop không nằm trong vùng
  • 2.4. start ≥ stop → vùng rỗng

3. Các mẫu lập trình cơ bản

  • 3.1. Tính tổng: khởi tạo S = 0, cộng dồn S = S + ...
  • 3.2. Tính tích: khởi tạo P = 1, nhân dồn P = P * ...
  • 3.3. Đếm: khởi tạo count = 0, tăng count = count + 1

4. Kĩ thuật bổ trợ

  • 4.1. print(k, end = " "): in trên cùng một dòng
  • 4.2. Kết hợp if bên trong for để lọc điều kiện

IV. Sai lầm thường gặp

Sai lầm Đính chính
Nghĩ range(10) tạo dãy từ 1 đến 10 range(10) tạo dãy từ 0 đến 9 (10 phần tử). Muốn 1 đến 10 phải viết range(1, 11).
Nghĩ range(1, 50) bao gồm số 50 range(1, 50) kết thúc tại 49. Giá trị stop không bao giờ nằm trong vùng. Muốn bao gồm 50 → range(1, 51).
Khởi tạo biến tích bằng 0: P = 0 rồi nhân dồn Nhân với 0 luôn cho 0! Biến tích phải khởi tạo bằng 1: P = 1.
Quên thụt lề khối lệnh bên trong for Tương tự lệnh if, khối lệnh trong for phải thụt lề. Thiếu → IndentationError.
Nhầm range(n) với range(1, n) khi tính tổng 1 + 2 + … + n range(n) bắt đầu từ 0, range(1, n) bắt đầu từ 1 nhưng kết thúc tại n−1. Muốn tổng 1 đến n → dùng range(1, n+1).
Dùng range(1, n) để tìm tất cả ước của n (thiếu n) range(1, n) chỉ duyệt đến n−1, bỏ qua n. Muốn tìm tất cả ước kể cả n → dùng range(1, n+1). Muốn tìm ước thực sự (không tính n) → range(1, n) là đúng.
Quên dấu : sau for ... in range(n) Bắt buộc có dấu hai chấm: for k in range(n):. Thiếu → SyntaxError.
Thầy Phạm Thành Danh

Thầy Phạm Thành Danh

(Người kiểm duyệt, ra đề)

Chức vụ: Trưởng ban biên soạn môn Tin Học THPT

Trình độ: Cử nhân Sư phạm Tin học, Chứng chỉ hạng II, Chứng chỉ Tin học, Ngoại ngữ B1

Kinh nghiệm: 8+ năm kinh nghiệm tại Trường THPT Thuận Hóa