Giải Tin Học 10 trang 110
Lời giải chi tiết SGK Lớp 10 · Môn Tin Há»c · Trang 110–111
Nguon: Tin Hoc 10 - Ket Noi Tri Thuc Voi Cuoc Song (trang 110 – 111)
🔍 Kiến thức cần nhớ
- Lệnh while là lệnh lặp với số lần không biết trước. Số lần lặp phụ thuộc vào điều kiện của lệnh.
- Cú pháp:
while <điều kiện>:
- Vì while không biết trước số lần lặp nên phải chú ý điều kiện để tránh lặp vô hạn (điều kiện phải có lúc trở thành sai).
- Muốn dừng và thoát ngay khỏi vòng lặp while hoặc for, dùng lệnh break.
- Ba cấu trúc lập trình cơ bản của ngôn ngữ bậc cao:
- Cấu trúc tuần tự: các lệnh thực hiện lần lượt từ trên xuống.
- Cấu trúc rẽ nhánh: thể hiện bằng lệnh if.
- Cấu trúc lặp: thể hiện bằng lệnh for, while.
💡 Mẹo nhớ: Dùng for khi biết trước số lần lặp; dùng while khi số lần lặp phụ thuộc điều kiện.
⚙️ Bài tập
Câu 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.
Cơ chế hoạt động:
- Kiểm tra điều kiện.
- Nếu điều kiện đúng → thực hiện khối lệnh lặp, rồi quay lại bước 1.
- Nếu điều kiện sai → kết thúc vòng lặp.
Hệ quả quan trọng: 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.
⚠️ Lưu ý thi: Đây là điểm khác với một số ngôn ngữ có vòng lặp do...while (kiểm tra điều kiện SAU, nên chạy ít nhất 1 lần). Trong Python chỉ có while (kiểm tra trước), cần ghi nhớ rõ.
Câu 2
Đề bài: Viết đoạn chương trình tính tổng 2 + 4 + ... + 100 sử dụng lệnh while.
Cách 1 — Dùng while cộng dồn
S = 0
k = 2
while k <= 100:
S = S + k
k = k + 2
print("Tổng =", S)
Giải thích:
- Biến k bắt đầu từ 2, mỗi bước tăng 2 đơn vị (để được các số chẵn 2, 4, 6, ..., 100).
- Vòng lặp dừng khi k vượt quá 100.
- Mỗi bước cộng k vào tổng S.
Kết quả in ra: Tổng = 2550
Cách 2 — Dùng công thức tổng cấp số cộng (kiểm chứng)
Dãy 2 + 4 + ... + 100 có 50 số hạng, là cấp số cộng số đầu 2, số cuối 100:
Tổng = (số đầu + số cuối) × số số hạng ÷ 2 = (2 + 100) × 50 ÷ 2 = 102 × 25 = 2550
💡 Mẹo nhớ: Để lặp qua các số chẵn, cho biến đếm tăng 2 mỗi bước (k = k + 2).
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.
k = 0
while k < 100:
k = k + 1
print(k, end = " ")
Giải thích:
- k bắt đầu từ 0; mỗi bước lặp tăng k lên 1 rồi in ra.
- Tham số
end = " "giúp in các số trên cùng một hàng, cách nhau bởi dấu cách (thay vì xuống dòng). - Vòng lặp dừng khi k = 100, nên in được đủ 1, 2, ..., 100.
Kết quả: 1 2 3 4 5 ... 99 100
Thực hành — Nhiệm vụ 2
Đề bài: Viết chương trình in ra 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.
i = 0
k = 65 # bắt đầu từ số thứ tự của chữ cái A
while k <= 90:
i = i + 1
if i % 10 == 0:
print(chr(k)) # chữ cái cuối hàng: in xong xuống dòng
else:
print(chr(k), end = " ") # các chữ cái khác: in trên cùng một hàng
k = k + 1
Giải thích:
- Trong bảng mã ASCII, chữ A có mã 65, ..., chữ Z có mã 90. Lệnh
chr(k)trả về kí tự ứng với mã k. - Biến i đếm số chữ đã in. Khi i là bội của 10 (i % 10 == 0), tức đã đủ 10 chữ trên một hàng → dùng
print(chr(k))để in rồi xuống dòng. - Các trường hợp còn lại in trên cùng một hàng nhờ
end = " ". - Vì A→Z có 26 chữ: 10 + 10 + 6 → đúng ba hàng theo yêu cầu.
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
💡 Mẹo nhớ: Dùng phép chia lấy dư i % n == 0 để xuống dòng sau mỗi n phần tử — đây là kỹ thuật in dữ liệu theo bảng/hàng cột rất hay dùng.
Luyện tập — Câu 1
Đề bài: Cho dãy số 1, 4, 7, 10, .... Tìm phần tử lớn nhất của dãy nhưng nhỏ hơn 100.
Nhận xét: Dãy có quy luật mỗi số cách nhau 3 đơn vị (cấp số cộng số đầu 1, công sai 3): 1, 4, 7, 10, ...
Cách 1 — Dùng while sinh dần các phần tử
k = 1
while k < 100:
k = k + 3
# Khi thoát: k đã >= 100, nên lùi lại một bước
print("Phần tử lớn nhất nhỏ hơn 100 là:", k - 3)
Giải thích: Vòng lặp tăng k thêm 3 đến khi k không còn nhỏ hơn 100. Lúc thoát k đã vượt qua, nên phần tử lớn nhất còn nhỏ hơn 100 là k - 3.
Cách 2 — Lưu lại phần tử hợp lệ cuối cùng
k = 1
max_pt = 1
while k < 100:
max_pt = k
k = k + 3
print("Phần tử lớn nhất nhỏ hơn 100 là:", max_pt)
Giải thích: Mỗi khi k còn thỏa điều kiện (< 100), ta ghi nhớ nó vào max_pt. Khi vòng lặp kết thúc, max_pt chính là phần tử lớn nhất nhỏ hơn 100.
Kết quả: dãy 1, 4, 7, ..., 97, 100, ... → phần tử lớn nhất nhỏ hơn 100 là 97.
Luyện tập — Câu 2
Đề bài: Viết chương trình đếm trong dãy 100 số tự nhiên đầu tiên có bao nhiêu số thỏa mãn điều kiện: hoặc chia hết cho 5 hoặc chia cho 3 dư 1.
Lưu ý cách hiểu: "100 số tự nhiên đầu tiên" xét các số từ 1 đến 100.
Cách 1 — Dùng while và biến đếm
dem = 0
k = 1
while k <= 100:
if k % 5 == 0 or k % 3 == 1:
dem = dem + 1
k = k + 1
print("Số lượng số thỏa mãn:", dem)
Giải thích:
k % 5 == 0: k chia hết cho 5.k % 3 == 1: k chia cho 3 dư 1.- Toán tử or (hoặc): chỉ cần thỏa một trong hai điều kiện là được đếm.
Cách 2 — Dùng for cho gọn
dem = 0
for k in range(1, 101):
if k % 5 == 0 or k % 3 == 1:
dem = dem + 1
print("Số lượng số thỏa mãn:", dem)
Kiểm chứng số lượng:
- Số chia hết cho 5 trong 1..100: có 20 số (5, 10, ..., 100).
- Số chia 3 dư 1 trong 1..100: 1, 4, 7, ..., 100 → có 34 số.
- Số vừa chia hết cho 5 vừa chia 3 dư 1 (bị đếm trùng): 10, 25, 40, 55, 70, 85, 100 → có 7 số.
- Theo nguyên lý bao hàm – loại trừ: 20 + 34 − 7 = 47.
Kết quả in ra: 47
⚠️ Lưu ý thi: Khi dùng "hoặc" (or), một số có thể thỏa cả hai điều kiện. Lệnh if chỉ đếm số đó một lần, nên không lo đếm trùng — nhưng khi kiểm chứng bằng tay thì phải trừ phần giao.
Vận dụng
Đề bài: Viết chương trình in các số tự nhiên từ 1 đến 100 ra màn hình thành 10 hàng, mỗi hàng 10 số, dạng:
1 2 3 ... 10
11 12 .... 20
.............
91 92 ..... 100
Cách 1 — Dùng while và đếm xuống dòng sau mỗi 10 số
k = 0
while k < 100:
k = k + 1
if k % 10 == 0:
print(k) # số cuối hàng: in xong xuống dòng
else:
print(k, end = " ") # in trên cùng một hàng
Giải thích:
- Mỗi khi k là bội của 10 (k % 10 == 0), tức đủ 10 số một hàng → in rồi xuống dòng.
- Các số khác in trên cùng hàng nhờ
end = " ".
Cách 2 — Dùng hai vòng for lồng nhau
for hang in range(10): # 10 hàng
for cot in range(10): # mỗi hàng 10 số
so = hang * 10 + cot + 1
print(so, end = " ")
print() # hết một hàng thì xuống dòng
Giải thích:
- Vòng ngoài chạy 10 hàng, vòng trong in 10 số mỗi hàng.
- Số cần in ở hàng
hang, cộtcotđược tính theo công thứchang * 10 + cot + 1. - Lệnh
print()trống sau vòng trong dùng để xuống dòng kết thúc mỗi hàng.
Kết quả:
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
💡 Mẹo nhớ: Bài này cùng dạng với Nhiệm vụ 2 — đều dùng % 10 == 0 để ngắt dòng. Ghi nhớ một mẫu là giải được cả nhóm bài "in dữ liệu theo hàng".
🎯 Ghi nhớ: - while kiểm tra điều kiện trước, có thể không chạy lần nào nếu điều kiện ban đầu sai. - Luôn cập nhật biến điều kiện trong vòng while để tránh lặp vô hạn. - Dùng% n == 0để in dữ liệu thành hàng/cột; dùng toán tửor,andđể kết hợp nhiều điều kiện trong lệnh if. - Ba cấu trúc lập trình cơ bản: tuần tự, rẽ nhánh, lặp.
