Giải Tin Học 10 trang 105

Lời giải chi tiết SGK Lớp 10 · Môn Tin Học · Trang 105–108

Bài 20: Câu lệnh lặp FOR

🔍 Kiến thức cần nhớ

1. Cấu trúc lặp

Khi cần thực hiện một công việc lặp đi lặp lại nhiều lần, ta dùng cấu trúc lặp. Trong Python, lệnh for dùng cho trường hợp biết trước số lần lặp.

Cú pháp:

for  in :
    

Mỗi vòng lặp, biến i lần lượt nhận một giá trị trong vùng giá trị, rồi thực hiện khối lệnh tương ứng.

2. Lệnh range()

Lệnh range() tạo ra một vùng giá trị gồm các số nguyên liên tiếp:

Dạng lệnhVùng giá trị
range(n)từ 0 đến n − 1 (gồm n số)
range(a, b)từ a đến b − 1

Ví dụ:

  • range(10) → 0, 1, 2, …, 9
  • range(1, 11) → 1, 2, …, 10
  • range(0, 99) → 0, 1, …, 98
  • range(100, 1) → vùng rỗng (vì a > b)
💡 Mẹo nhớ: Lệnh range luôn lấy đến trước số cuối. Muốn lấy hết đến n thì viết range(n + 1).
⚠️ Lưu ý thi: Để in các giá trị trên cùng một hàng ngang, dùng tham số end=" " trong lệnh print, ví dụ: print(i, end=" ").

⚙️ Bài tập

Hoạt động 1 — Làm quen với lệnh lặp for

Đề bài: Thực hiện đoạn chương trình sau và cho biết tổng S có giá trị bao nhiêu? Giải thích kết quả.

>>> S = 0
>>> for i in range(10):
        S = S + i
>>> S
45
Cách 1 — Lần theo từng vòng lặp

range(10) trả về vùng giá trị gồm 10 số: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Biến i lần lượt nhận từng giá trị đó, mỗi lần lại cộng thêm vào S:

S = 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45

Cách 2 — Dùng công thức tổng dãy số

Đây là tổng các số tự nhiên liên tiếp từ 0 đến 9. Áp dụng công thức:

S = 0 + 1 + 2 + … + 9 = (9 × 10) / 2 = 45

💡 Mẹo nhớ: Tổng 1 + 2 + … + n = n(n + 1)/2.

Ví dụ 1 (trong bài) — Tổng các số chẵn nhỏ hơn n

Đề bài: Tính tổng các số tự nhiên chẵn nhỏ hơn n, với n = 10.

n = 10
S = 0
for i in range(n):
    if i % 2 == 0:      # i là số chẵn
        S = S + i
print(S)
Cách 1 — Theo vòng lặp

range(10) cho i chạy từ 0 đến 9. Điều kiện i % 2 == 0 chỉ chọn ra các số chẵn: 0, 2, 4, 6, 8.

S = 0 + 2 + 4 + 6 + 8 = 20

Cách 2 — Tính nhanh

Các số chẵn từ 0 đến 8 là 0, 2, 4, 6, 8 (gồm 5 số). Tổng = (0 + 8) × 5 / 2 = 20.


Ví dụ 2 (trong bài) — Đếm số là bội của 3

Đề bài: Đếm các số nguyên nhỏ hơn n (n = 20) và là bội của 3.

n = 20
S = 0
for i in range(n):
    if i % 3 == 0:      # i là bội của 3
        S = S + 1
print(S)
Cách 1 — Liệt kê

i chạy từ 0 đến 19. Các số chia hết cho 3: 0, 3, 6, 9, 12, 15, 18 → đếm được 7 số.

Cách 2 — Suy luận nhanh

Số bội của 3 trong khoảng [0; 19] là phần nguyên của 19/3 cộng thêm số 0, tức 6 + 1 = 7.

⚠️ Lưu ý thi: Phân biệt rõ S = S + i (cộng dồn giá trị) và S = S + 1 (đếm số lượng).

Hoạt động 2 — Tìm hiểu vùng giá trị của range()

Đề bài: Quan sát và so sánh kết quả hai lệnh sau để hiểu vùng giá trị do range() tạo ra.

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

>>> for i in range(0, 15):
        print(i, end=" ")
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Cách 1 — Phân tích
  • range(3, 10): lấy các số nguyên từ 3 đến 9 (đến trước 10) → 3 4 5 6 7 8 9.
  • range(0, 15): lấy các số nguyên từ 0 đến 14 (đến trước 15) → 0 1 … 14.

Kết luận: range(a, b) cho vùng giá trị từ a đến b − 1.


Câu hỏi — Biểu diễn các dãy bằng lệnh range()

Đề bài: Hãy biểu diễn các dãy a, b, c, d bằng lệnh range().

⚠️ Phần văn bản gốc bị lỗi hiển thị nên các dãy số cụ thể không đọc được. Dưới đây là phương pháp tổng quát kèm các dạng dãy thường gặp để em áp dụng đúng cho từng câu.
Cách 1 — Phương pháp chung

Với một dãy số nguyên liên tiếp bắt đầu từ a, kết thúc ở b, ta viết range(a, b + 1) (vì range lấy đến trước số cuối).

Áp dụng cho các dạng phổ biến:

Dãy sốLệnh range
0, 1, 2, …, 9range(10) hoặc range(0, 10)
1, 2, 3, …, 10range(1, 11)
5, 6, 7, …, 20range(5, 21)
0, 1, 2, …, nrange(n + 1)
💡 Mẹo nhớ: Số cuối trong dãy = đối số thứ hai − 1. Nên muốn dãy kết thúc ở k, viết range(…, k + 1).

⚙️ Thực hành

Nhiệm vụ 1 — In các ước số của n

Đề bài: Nhập số tự nhiên n từ bàn phím và in ra dãy các ước số của n theo hàng ngang. Ví dụ n = 12 → in ra: 1 2 3 4 6 12.

Cách 1 — Theo hướng dẫn SGK

Ước số của n là các số k thỏa mãn n % k == 0. Cho k chạy từ 1 đến n.

n = int(input("Nhập số tự nhiên n: "))
for k in range(1, n + 1):
    if n % k == 0:          # k là ước của n
        print(k, end=" ")

Với n = 12: các k chia hết được 12 là 1, 2, 3, 4, 6, 12 → in ra 1 2 3 4 6 12.

Cách 2 — Tối ưu (chỉ duyệt đến √n)

Cách trên chạy đủ kết quả nhưng với n lớn sẽ chậm. Có thể chỉ duyệt đến √n rồi lấy thêm ước "cặp đôi" n // k, tuy nhiên kết quả sẽ không in theo thứ tự tăng dần. Với chương trình lớp 10, Cách 1 là phù hợp và dễ hiểu nhất.


Nhiệm vụ 2 — Đếm ước số thực sự của n

Đề bài: Nhập số tự nhiên n và đếm số các ước số thực sự của n. Ước số thực sự là số tự nhiên k < n và là ước của n.

Cách 1 — Dùng biến đếm

So với Nhiệm vụ 1, ta cho k chạy từ 1 đến n − 1 (không tính chính n) và dùng một biến đếm.

n = int(input("Nhập số tự nhiên n: "))
dem = 0
for k in range(1, n):
    if n % k == 0:          # k là ước thực sự của n
        dem = dem + 1
print(dem)

Với n = 12: ước thực sự là 1, 2, 3, 4, 6 → dem = 5.

⚠️ Lưu ý thi: Điểm khác biệt mấu chốt là vùng lặp range(1, n) thay vì range(1, n + 1), để loại bỏ chính số n.

⚙️ Luyện tập

Câu 1

Đề bài: Đoạn chương trình sau in ra kết quả gì?

n = int(input("Nhập n: "))
S = 0
for i in range(n + 1):
    S = S + i
print(S)
Cách 1 — Theo vòng lặp

range(n + 1) cho i chạy từ 0 đến n. Chương trình cộng dồn:

S = 0 + 1 + 2 + … + n

Vậy chương trình in ra tổng các số tự nhiên từ 0 đến n.

Ví dụ n = 5: S = 0 + 1 + 2 + 3 + 4 + 5 = 15.

Cách 2 — Công thức

S = n(n + 1)/2. Với n = 5 → 5 × 6 / 2 = 15 (khớp kết quả trên).


Câu 2

Đề bài: Viết đoạn chương trình tính tích 1 × 2 × 3 × … × n với n nhập từ bàn phím.

Cách 1 — Dùng vòng lặp tính tích

Lưu ý: biến tích phải khởi tạo bằng 1 (không phải 0, vì nhân với 0 sẽ ra 0).

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

Với n = 4: P = 1 × 2 × 3 × 4 = 24.

Cách 2 — Nhận xét

Đây chính là giai thừa n! (n factorial). Vòng lặp cho i chạy từ 1 đến n và nhân dồn vào P.

💡 Mẹo nhớ: Bài tính tổng → khởi tạo S = 0; bài tính tích → khởi tạo P = 1.

⚙️ Vận dụng

Câu 1

Đề bài: Nhập số tự nhiên n và in ra kết quả: S = 1 + 1/2 + 1/3 + … + 1/n.

Cách 1 — Cộng dồn phân số
n = int(input("Nhập số tự nhiên n: "))
S = 0
for i in range(1, n + 1):
    S = S + 1 / i
print(S)

Với n = 3: S = 1 + 1/2 + 1/3 = 1.8333…

⚠️ Lưu ý thi: Phải viết 1 / i (có dấu chia thực) để được số thập phân. Nếu viết 1 // i (chia lấy nguyên) thì kết quả sẽ sai.
Cách 2 — Định dạng kết quả gọn hơn

Có thể làm tròn để hiển thị đẹp:

n = int(input("Nhập số tự nhiên n: "))
S = 0
for i in range(1, n + 1):
    S = S + 1 / i
print(round(S, 4))

Câu 2

Đề bài: Nhập số tự nhiên n và in ra kết quả là một tổng.

⚠️ Phần biểu thức của tổng trong văn bản gốc bị lỗi hiển thị, không đọc được đầy đủ. Dưới đây là khung chương trình tổng quát em có thể chỉnh lại số hạng cho đúng đề.
Cách 1 — Mẫu chương trình tính tổng theo i
n = int(input("Nhập số tự nhiên n: "))
S = 0
for i in range(1, n + 1):
    S = S +      # ví dụ: i, hoặc i*i, hoặc 1/(i*i)...
print(S)

Chỉ cần thay bằng quy luật của tổng trong đề:

  • Tổng S = 1² + 2² + … + n² → dùng S = S + i * i
  • Tổng S = 1 + 1/2² + 1/3² + … + 1/n² → dùng S = S + 1 / (i * i)
Cách 2 — Nhận diện quy luật

Mọi bài "tính tổng theo n" đều theo cùng một khuôn: khởi tạo S = 0, cho i chạy qua vùng giá trị, mỗi vòng cộng thêm số hạng thứ i. Em chỉ cần xác định số hạng tổng quát theo i là viết được chương trình.


🎯 Ghi nhớ: - for … in range(…) dùng khi biết trước số lần lặp. - range(n) → 0 đến n−1; range(a, b) → a đến b−1. Muốn lấy đến k thì viết range(…, k+1). - Bài tổng khởi tạo S = 0; bài tích khởi tạo P = 1; bài đếm dùng dem = dem + 1. - In hàng ngang dùng print(i, end=" "). - Kiểm tra chia hết bằng phép %: n % k == 0 nghĩa là k là ước của n.
Chế độ đọc sách →