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 forrange()) 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 đến stop - 1.
  • range(start, stop, step): từ start, mỗi lần cách nhau step.

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âuDãy sốLệnh range()Giải thích
a1, 2, 3, ..., 50range(1, 51)Bắt đầu từ 1, dừng ở 51 nên số cuối là 50
b5, 6, 7, 8, 9, 10range(5, 11)Bắt đầu từ 5, dừng ở 11 nên số cuối là 10
c0, 1range(2) hoặc range(0, 2)Từ 0 đến 1 (dừng ở 2)
d10range(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:

  • k chạy từ 1 đến n (vì range(1, n+1)).
  • Nếu n % k == 0 (chia hết) thì k là ước số của n.
  • 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 đến n-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**3 là 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 while vớ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àngCột ACột B
1Chạy 20 vòng quanh sânChạy nhiều vòng trong 2 tiếng
2Làm 5 bài tậpLàm bài đến giờ ăn cơm thì dừng
3Lấy 15 xô nướcXách nước đến khi đầy thùng

Lời giải:

Tiêu chíCột ACột B
Việc lặp lạiChạy vòng / làm bài / xách nướcGiố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ặpBiết trước, đếm đượcKhô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 k vào S, rồi tăng k thêm 7.
  • Vòng lặp tiếp tục chừng nào k < 100 cò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ệnh while.

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é!

Chế độ đọc sách →