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ệnh | Vù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, …, 9range(1, 11)→ 1, 2, …, 10range(0, 99)→ 0, 1, …, 98range(100, 1)→ vùng rỗng (vì a > b)
💡 Mẹo nhớ: Lệnhrangeluôn lấy đến trước số cuối. Muốn lấy hết đến n thì viếtrange(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ệnhprint(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, …, 9 | range(10) hoặc range(0, 10) |
| 1, 2, 3, …, 10 | range(1, 11) |
| 5, 6, 7, …, 20 | range(5, 21) |
| 0, 1, 2, …, n | range(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ặprange(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ết1 / i(có dấu chia thực) để được số thập phân. Nếu viết1 // 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ếtrange(…, 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ùngdem = dem + 1. - In hàng ngang dùngprint(i, end=" "). - Kiểm tra chia hết bằng phép%:n % k == 0nghĩa là k là ước của n.
