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–110

Bài 21: Câu lệnh lặp while

⚠️ Lưu ý: Bản trích dẫn bị lỗi phông chữ tiếng Việt khá nặng. Tôi đã phục dựng lại nội dung gốc của bài học theo đúng chương trình SGK. Ở những chỗ không đọc rõ con số/dữ liệu cụ thể, tôi sẽ nêu rõ giả thiết để em đối chiếu với sách.

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

1. Lệnh while

Lệnh while dùng để lặp lại một khối lệnh với số lần không biết trước, việc lặp phụ thuộc vào một điều kiện.

Cú pháp:

while <điều kiện>:
    
  • <điều kiện> là một biểu thức lôgic (cho kết quả đúng/sai).
  • Khi gặp lệnh, Python kiểm tra điều kiện trước:
  • Nếu điều kiện đúng (True) → thực hiện khối lệnh lặp, rồi quay lại kiểm tra điều kiện.
  • Nếu điều kiện sai (False) → kết thúc lệnh while.
  • Khối lệnh lặp phải được viết lùi vàothẳng hàng (mặc định thụt 4 dấu cách hoặc 1 tab).
💡 Mẹo nhớ: for dùng khi biết trước số lần lặp; while dùng khi không biết trước số lần lặp mà phụ thuộc điều kiện.
⚠️ Lưu ý thi:while không biết trước số lần lặp nên bắt buộc trong khối lệnh phải có lệnh làm thay đổi giá trị liên quan đến điều kiện (ví dụ k = k + 1), nếu không sẽ bị lặp vô hạn.
  • Lệnh break dùng để thoát ngay khỏi vòng lặp.

2. Ba cấu trúc lập trình cơ bản

Mọi ngôn ngữ lập trình bậc cao đều có 3 cấu trúc cơ bản:

Cấu trúcÝ nghĩaThể hiện bằng
Tuần tựCác lệnh thực hiện lần lượt từ trên xuốngLệnh gán, nhập/xuất dữ liệu
Rẽ nhánhLệnh chỉ thực hiện tuỳ điều kiện đúng/saiLệnh điều kiện if … else
LặpLệnh lặp đi lặp lại tuỳ điều kiện còn đúng/saiLệnh lặp for, while

⚙️ Bài tập

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

Đề bài: Cho các việc được ghi trong cột A và cột B của bảng sau. Với mỗi hàng, hãy cho biết:

  • Công việc được lặp đi lặp lại là gì?
  • Điều kiện để dừng công việc là gì?
  • Số lần thực hiện việc lặp giữa hai cột có gì khác nhau?
AB
1Vận động viên chạy một vòng xung quanh sân vận độngVận động viên chạy nhiều vòng xung quanh sân vận động trong thời gian xác định (ví dụ 1 tiếng)
2Em làm bài tập thầy cô giao về nhàEm làm các bài tập về nhà, đến giờ ăn cơm thì dừng lại
3Em đi lấy một xô nước giúp mẹEm xách các xô nước giúp mẹ cho đến khi đầy thùng nước
Cách 1 — Phân tích theo từng hàng

Hàng 1:

  • Công việc lặp lại: chạy một vòng quanh sân.
  • Điều kiện dừng: cột A – chạy đủ một vòng là xong; cột B – hết thời gian quy định (1 tiếng).
  • Khác nhau: cột A biết trước chạy 1 vòng; cột B không biết trước chạy bao nhiêu vòng (tuỳ tốc độ và thời gian).

Hàng 2:

  • Công việc lặp lại: làm một bài tập.
  • Điều kiện dừng: cột A – làm hết số bài được giao; cột B – đến giờ ăn cơm.
  • Khác nhau: cột A có thể biết trước số bài; cột B không biết trước làm được bao nhiêu bài.

Hàng 3:

  • Công việc lặp lại: xách một xô nước.
  • Điều kiện dừng: cột A – xách xong một xô; cột B – đầy thùng nước.
  • Khác nhau: cột A biết trước số lần (1 lần); cột B không biết trước phải xách bao nhiêu lần mới đầy thùng.
Cách 2 — Nhìn theo "kiểu vòng lặp"
Cột A ứng với vòng lặp biết trước số lần → tương ứng lệnh for. Cột B ứng với vòng lặp không biết trước số lần, lặp đến khi một điều kiện xảy ra → tương ứng lệnh while.

Đây chính là lý do bài học giới thiệu lệnh while.


Ví dụ 1 — S là giá trị của biểu thức toán học nào?

Đề bài: Quan sát đoạn chương trình sau và cho biết S là giá trị của biểu thức toán học nào?

k = 0
S = 0
while k < 100:
    S = S + k * k
    k = k + 1
Cách 1 — Lần theo từng vòng lặp
  • Vòng lặp chạy với k = 0, 1, 2, …, 99 (dừng khi k = 100 vì điều kiện k < 100 sai).
  • Mỗi vòng cộng thêm k*k (tức k²) vào S.

Vậy:

S = 0² + 1² + 2² + … + 99²

Cách 2 — Kết luận tổng quát

S chính là tổng bình phương của các số tự nhiên nhỏ hơn 100.


Ví dụ 2 — Kết quả in ra những số nào?

Đề bài: Thực hiện các lệnh sau. Kết quả sẽ in ra những số nào?

k = 2
while k < 50:
    print(k, end=" ")
    k = k + 3
Cách 1 — Liệt kê theo bước
  • Bắt đầu k = 2, mỗi bước k tăng thêm 3, dừng khi k vượt quá (≥) 50.
  • Các giá trị in ra (cách nhau dấu cách, trên cùng một hàng do end=" "):
2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47
Cách 2 — Dùng công thức dãy

Đây là dãy cấp số cộng: số đầu 2, công sai 3, điều kiện < 50.

Số hạng tổng quát: 2 + 3n < 50 → n < 16, tức n = 0, 1, …, 15 (16 số). Số cuối: 2 + 3×15 = 47. Khớp với kết quả ở trên.

⚠️ Lưu ý thi: print(k, end=" ") giữ các số trên cùng một hàng; nếu chỉ viết print(k) thì mỗi số xuống một dòng.

Câu hỏi 1

Đề bài: Lệnh while kiểm tra điều kiện trước hay sau khi thực hiện khối lệnh lặp?

Trả lời: Lệnh while kiểm tra điều kiện TRƯỚC khi thực hiện khối lệnh lặp.

  • Nếu ngay từ đầu điều kiện đã sai thì khối lệnh lặp không được thực hiện lần nào.

Câu hỏi 2

Đề bài: Viết đoạn chương trình tính tổng các số tự nhiên từ 1 đến 100 bằng lệnh while.

(Em đối chiếu giới hạn cụ thể trong sách; ở đây minh hoạ với tổng từ 1 đến 100.)

Cách 1 — Dùng biến đếm và biến tổng
k = 1
S = 0
while k <= 100:
    S = S + k
    k = k + 1
print(S)   # 5050
Cách 2 — Dùng công thức kiểm chứng

Tổng 1 + 2 + … + 100 = 100 × 101 / 2 = 5050, đúng với kết quả chương trình.


Thực hành — Nhiệm vụ 1

Đề bài: Viết chương trình in toàn bộ dãy các số tự nhiên từ 1 đến 100 trên một hàng ngang.

Cách 1 — Tăng k rồi in
k = 0
while k < 100:
    k = k + 1
    print(k, end=" ")
Cách 2 — Bắt đầu từ 1
k = 1
while k <= 100:
    print(k, end=" ")
    k = k + 1

Cả hai đều in: 1 2 3 4 … 100 trên một hàng.

💡 Mẹo nhớ: Bí quyết để in cùng một hàng là dùng end=" " trong lệnh print.

Thực hành — Nhiệm vụ 2

Đề bài: Viết chương trình in ra màn hình dãy các chữ cái tiếng Anh từ A đến Z theo ba hàng ngang: hai hàng đầu mỗi hàng có 10 chữ cái, hàng thứ ba có 6 chữ cái.

Gợi ý: Chữ A → Z chiếm vị trí 65 → 90 trong bảng mã ASCII. Dùng hàm chr(k) để trả lại ký tự ứng với số thứ tự k trong bảng mã.

Cách 1 — Đếm số chữ đã in để xuống dòng
k = 0          # đếm số chữ cái đã in trên hàng
n = 65         # mã ASCII của 'A'
while n <= 90:        # 90 là mã ASCII của 'Z'
    k = k + 1
    if k % 10 == 0:
        print(chr(n))            # in xong 10 chữ thì xuống dòng
    else:
        print(chr(n), end=" ")   # chưa đủ 10 thì in trên cùng hàng
    n = n + 1

Kết quả:

A B C D E F G H I J
K L M N O P Q R S T
U V W X Y Z
Cách 2 — Dùng vòng for cho gọn
for k in range(26):
    n = 65 + k
    if (k + 1) % 10 == 0:
        print(chr(n))
    else:
        print(chr(n), end=" ")

Cho kết quả giống hệt Cách 1.

⚠️ Lưu ý thi: chr(65) = 'A', chr(90) = 'Z'; ngược lại ord('A') = 65. Dạng bài chuyển đổi ký tự ↔ mã ASCII rất hay ra thi.

Luyện tập 1

Đề bài: Cho một dãy số. Tìm phần tử lớn nhất của dãy nhưng nhỏ hơn một giá trị m cho trước.

Cách 1 — Duyệt bằng while
A = [12, 45, 99, 100, 87, 60]   # dãy số ví dụ
m = 100                          # ngưỡng cho trước

max_nho = None       # chưa tìm thấy phần tử nào < m
i = 0
while i < len(A):
    if A[i] < m and (max_nho is None or A[i] > max_nho):
        max_nho = A[i]
    i = i + 1

if max_nho is None:
    print("Không có phần tử nào nhỏ hơn", m)
else:
    print("Phần tử lớn nhất nhỏ hơn", m, "là:", max_nho)

Với dữ liệu trên, kết quả: 99.

Cách 2 — Dùng lọc danh sách (cách nhanh)
A = [12, 45, 99, 100, 87, 60]
m = 100
loc = [x for x in A if x < m]
print(max(loc) if loc else "Không có")
💡 Mẹo nhớ: Khi tìm max có điều kiện, hãy khởi tạo biến maxNone (hoặc một số rất nhỏ), tránh lấy nhầm giá trị ban đầu.

Luyện tập 2

Đề bài: Viết chương trình đếm trong 100 số tự nhiên đầu tiên có bao nhiêu số thoả mãn điều kiện: chia hết cho 3 hoặc chia cho 5 dư 1.

(Em đối chiếu các con số 100 / 3 / 5 với sách; logic giải giữ nguyên.)

Cách 1 — Đếm bằng while
k = 1
dem = 0
while k <= 100:
    if k % 3 == 0 or k % 5 == 1:
        dem = dem + 1
    k = k + 1
print("Có", dem, "số thoả mãn")
Cách 2 — Dùng for + hàm sum
dem = sum(1 for k in range(1, 101) if k % 3 == 0 or k % 5 == 1)
print(dem)
⚠️ Lưu ý thi: Phân biệt rõ chia hết cho 5k % 5 == 0, còn chia cho 5 dư 1k % 5 == 1. Toán tử or đúng khi ít nhất một điều kiện đúng.

Vận dụng

Đề bài: Viết chương trình in các số tự nhiên ra màn hình thành nhiều hàng, mỗi hàng một số lượng cố định. Với phần tử ở cuối hàng thì in xong rồi xuống dòng; với các phần tử khác thì in tiếp trên cùng một hàng ngang.

(Bản trích bị mờ hình minh hoạ; tôi minh hoạ với dãy 1 → 100, mỗi hàng 10 số — đây là dạng phổ biến của bài này.)

Cách 1 — Dùng while và phép chia lấy dư
k = 0
while k < 100:
    k = k + 1
    if k % 10 == 0:
        print(k)            # cuối hàng → xuống dòng
    else:
        print(k, end=" ")   # chưa cuối hàng → in tiếp

Kết quả (10 số mỗi hàng):

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
...
91 92 93 94 95 96 97 98 99 100
Cách 2 — Dùng for cho ngắn gọn
for k in range(1, 101):
    if k % 10 == 0:
        print(k)
    else:
        print(k, end=" ")
💡 Mẹo nhớ: Muốn "xuống dòng sau mỗi N phần tử" → dùng điều kiện số_thứ_tự % N == 0 rồi gọi print(...) không có end.

🎯 Ghi nhớ: - while <điều kiện>: lặp khi chưa biết trước số lần, kiểm tra điều kiện trước mỗi vòng. - Luôn có lệnh thay đổi điều kiện trong khối lặp để tránh lặp vô hạn. - print(x, end=" ") để in cùng hàng; print(x) để xuống dòng; k % N == 0 để bắt nhịp xuống dòng theo nhóm. - Ba cấu trúc lập trình cơ bản: tuần tự – rẽ nhánh – lặp. - Cặp hàm chuyển đổi ký tự: chr(số)ord(ký_tự).
Chế độ đọc sách →