Giải Tin Học 10 trang 108
Lời giải chi tiết SGK Lớp 10 · Môn Tin Há»c · Trang 108–109
Chào các em! Hai trang này nằm cuối Bài 20 (lệnh for và range()) và mở đầu Bài 21 (lệnh while). Cô sẽ giải kỹ từng phần nhé.
Phần lý thuyết: Lệnh range()
Cú pháp range(start, stop) trả lại vùng giá trị gồm các số nguyên liên tiếp từ start đến stop - 1 (tức là không lấy stop).
Ngoài ra còn các dạng:
range(stop): từ 0 đếnstop - 1.range(start, stop, step): từstart, mỗi lần cách nhaustep.
Câu hỏi: Biểu diễn các dãy bằng lệnh range()
Đề: Hãy biểu diễn các dãy sau đây bằng lệnh range().
| Câu | Dãy số | Lệnh range() | Giải thích |
|---|---|---|---|
| a | 1, 2, 3, ..., 50 | range(1, 51) | Bắt đầu từ 1, dừng ở 51 nên số cuối là 50 |
| b | 5, 6, 7, 8, 9, 10 | range(5, 11) | Bắt đầu từ 5, dừng ở 11 nên số cuối là 10 |
| c | 0, 1 | range(2) hoặc range(0, 2) | Từ 0 đến 1 (dừng ở 2) |
| d | 10 | range(10, 11) | Chỉ một số 10, dừng ở 11 |
Lưu ý ở câu c: vì range mặc định bắt đầu từ 0 nên viết gọn range(2) là được.
THỰC HÀNH: Lệnh lặp for và range()
Nhiệm vụ 1: In ra các ước số của n
Đề: Nhập số tự nhiên n, in ra dãy các ước số của n theo chiều ngang. Ví dụ n = 10 thì in ra: 1, 2, 5, 10.
n = int(input("Nhập số tự nhiên n: "))
for k in range(1, n+1):
if n % k == 0:
print(k, end = " ")
Giải thích:
kchạy từ 1 đếnn(vìrange(1, n+1)).- Nếu
n % k == 0(chia hết) thìklà ước số củan. end = " "giúp in các số trên cùng một hàng, cách nhau bởi dấu cách.
Với n = 10: k lần lượt là 1, 2, 5, 10 chia hết cho 10 nên được in ra.
Nhiệm vụ 2: Đếm số ước số thực sự của n
Đề: Nhập n, đếm số ướ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.
n = int(input("Nhập số tự nhiên n: "))
count = 0
for k in range(1, n):
if n % k == 0:
count = count + 1
print(count)
Giải thích:
- Khác Nhiệm vụ 1 ở chỗ
range(1, n)chỉ chạy đếnn-1, tức là không tính chính sốn. - Biến
countđếm số ước số thỏa mãn.
Với n = 10: các ước thực sự là 1, 2, 5 → count = 3.
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:
- Vòng lặp
range(n+1)cho k chạy từ 0 đến n. - S là tổng: $S = 0 + 1 + 2 + ... + n = \dfrac{n(n+1)}{2}$.
- Chương trình in ra $S^2 = \left(\dfrac{n(n+1)}{2}\right)^2$.
Ví dụ n = 3: $S = 0+1+2+3 = 6$, in ra $6^2 = 36$.
Vậy chương trình in ra bình phương của tổng các số từ 0 đến n.
Bài 2: Viết đoạn chương trình tính tích 1 × 2 × 3 × ... × n
Đây chính là tính n giai thừa (n!).
n = int(input("Nhập số tự nhiên n: "))
tich = 1
for k in range(1, n+1):
tich = tich * k
print(tich)
Giải thích:
- Khởi tạo
tich = 1(vì là phép nhân, không dùng 0). - Nhân dồn lần lượt với k từ 1 đến n.
Ví dụ n = 4: tích = 1×2×3×4 = 24.
VẬN DỤNG
Bài 1: Tính tổng $S = 1 + \dfrac{1}{2} + ... + \dfrac{1}{n}$
n = int(input("Nhập số tự nhiên n: "))
S = 0
for k in range(1, n+1):
S = S + 1/k
print(S)
Giải thích:
- k chạy từ 1 đến n, mỗi lần cộng thêm $\dfrac{1}{k}$.
- Chú ý dùng
1/k(phép chia thực) để kết quả là số thập phân.
Bài 2: Tính tổng $S = 1^3 + 2^3 + ... + n^3$
n = int(input("Nhập số tự nhiên n: "))
S = 0
for k in range(1, n+1):
S = S + k**3
print(S)
Giải thích:
k**3là k mũ 3 trong Python.- Cộng dồn các lập phương từ 1 đến n.
Ví dụ n = 3: $S = 1 + 8 + 27 = 36$.
Sau bài này em sẽ:
- Biết và thực hành giải các bài toán dùng lệnh lặp
whilevới số lần lặp không biết trước. - Biết ba cấu trúc lập trình cơ bản: tuần tự, rẽ nhánh, lặp.
Khởi động: So sánh cột A và cột B
Đề: Cho các việc ghi trong cột A và cột B. Với mỗi hàng, cho biết công việc lặp lại là gì? Điều kiện để dừng là gì? Số lần thực hiện việc lặp giữa hai cột có gì khác nhau?
| Hàng | Cột A | Cột B |
|---|---|---|
| 1 | Chạy 20 vòng quanh sân | Chạy nhiều vòng trong 2 tiếng |
| 2 | Làm 5 bài tập | Làm bài đến giờ ăn cơm thì dừng |
| 3 | Lấy 15 xô nước | Xách nước đến khi đầy thùng |
Lời giải:
| Tiêu chí | Cột A | Cột B |
|---|---|---|
| Việc lặp lại | Chạy vòng / làm bài / xách nước | Giống cột A |
| Điều kiện dừng | Đủ số lần định sẵn (20 vòng, 5 bài, 15 xô) | Một điều kiện chưa biết trước (hết 2 tiếng, đến giờ ăn, đầy thùng) |
| Số lần lặp | Biết trước, đếm được | Không biết trước |
Điểm khác nhau cốt lõi:
- Cột A: số lần lặp biết trước → dùng lệnh
for. - Cột B: số lần lặp không biết trước, phụ thuộc một điều kiện → dùng lệnh
while.
1. LỆNH WHILE
Hoạt động 1: Làm quen với lệnh lặp while
Đề: Quan sát đoạn chương trình sau, giải thích kết quả in ra.
>>> S = 0
>>> k = 1
>>> while k < 100:
S = S + k
k = k + 7
>>> print(S)
750
Lời giải từng bước:
- Ban đầu
S = 0,k = 1. - Mỗi vòng lặp: cộng
kvàoS, rồi tăngkthêm 7. - Vòng lặp tiếp tục chừng nào
k < 100còn đúng.
Các giá trị k được cộng vào: 1, 8, 15, 22, ..., 99 (mỗi số hơn số trước 7 đơn vị).
Khi k = 99 + 7 = 106 ≥ 100 thì vòng lặp dừng.
Vậy $S = 1 + 8 + 15 + ... + 99$. Đây là cấp số cộng với số hạng đầu 1, công sai 7, số hạng cuối 99.
- Số số hạng: $(99 - 1)/7 + 1 = 15$.
- $S = \dfrac{(1 + 99) \times 15}{2} = \dfrac{100 \times 15}{2} = 750$. ✓
Ghi nhớ về lệnh while
Lệnh lặp while thực hiện khối lệnh với số lần lặp không biết trước. Khối lệnh được thực hiện cho đến khi <điều kiện> bằng False.
Cú pháp:
while <điều kiện>:
Lưu ý:
- Sau dấu ":", khối lệnh lặp cần viết lùi vào và thẳng hàng (1 tab hoặc 4 dấu cách).
<điều kiện>là biểu thức lôgic. Python kiểm tra điều kiện: nếu đúng thì thực hiện khối lệnh, nếu sai thì kết thúc lệnhwhile.
Sơ đồ khối (Hình 21.1): kiểm tra điều kiện → nếu Đúng thì chạy khối lệnh rồi quay lại kiểm tra; nếu Sai thì thoát.
Trong Hoạt động 1, lệnh lặp dừng khi k ≥ 100, và S = 1 + 8 + 15 + ... + 99.
Tóm lại hai trang này giúp các em chốt lại lệnh for + range() qua một loạt bài tập, rồi bước sang lệnh while dành cho các bài toán mà số lần lặp chưa biết trước. Mấu chốt phân biệt: biết trước số lần → for, không biết trước (phụ thuộc điều kiện) → while. Em cần thêm ví dụ về while thì nói cô nhé!
