Giải Tin Học 10 trang 150
Lời giải chi tiết SGK Lớp 10 · Môn Tin Há»c · Trang 150–151
Mục tiêu bài học
Sau bài này em sẽ:
- Thực hành viết chương trình đơn giản bằng ngôn ngữ Python.
- Thực hành các bước gỡ rối (debug) chương trình: thiết lập điểm dừng và chạy theo từng lệnh.
Nhiệm vụ 1: Kiểm tra số nguyên tố và phân tích thừa số nguyên tố
Đề bài
Viết chương trình nhập từ bàn phím số tự nhiên n, kiểm tra n có phải là số nguyên tố hay không. Nếu n là hợp số thì in ra kết quả phân tích n thành tích các thừa số nguyên tố. Chú ý: số 1 không là nguyên tố và cũng không là hợp số.
Ý tưởng (Hướng dẫn)
Dùng danh sách NT để lưu các thừa số nguyên tố của n:
| Trường hợp | Kết quả |
|---|---|
n = 1 | Danh sách NT rỗng → thông báo không là số nguyên tố |
n > 1 và len(NT) == 1 | n là số nguyên tố |
n > 1 và len(NT) > 1 | n là hợp số, in dạng $n = p_1 \times p_2 \times ... \times p_k$ |
Chương trình mẫu phantichnt.py
# Nhập số tự nhiên từ bàn phím và kiểm tra n có phải là số nguyên tố hay không.
# Nếu n = 1 thì thông báo n không phải là số nguyên tố.
# Nếu n là hợp số thì in ra phân tích n thành tích các thừa số nguyên tố.
n = int(input("Nhập số tự nhiên n: "))
m = n
k = 2
NT = []
while m > 1:
while m % k != 0:
k = k + 1
NT.append(k)
m = m // k
count = len(NT)
if count == 0:
print(n, "không là số nguyên tố")
elif count == 1:
print(n, "là số nguyên tố")
else:
print(n, "là hợp số")
print(n, "=", end=" ")
for i in range(count):
if i < count - 1:
print(NT[i], "x", end=" ")
else:
print(NT[i])
Giải thích từng bước
m = n: dùng biến phụmđể xử lý, giữ nguyênnđể in kết quả.k = 2: bắt đầu thử chia từ số nguyên tố nhỏ nhất.- Vòng
while m > 1: lặp đến khimrút gọn về 1. - Vòng
while m % k != 0: k = k + 1: tăngkđến khi tìm được ước nhỏ nhất củam. Ước nhỏ nhất luôn là số nguyên tố. NT.append(k): thêm thừa số đó vào danh sách.m = m // k: chiamcho thừa số vừa tìm để tiếp tục phân tích.count = len(NT): đếm số thừa số tìm được.count == 0→n = 1→ không nguyên tố, không hợp số.count == 1→ chỉ có một thừa số →nchính là số nguyên tố.count > 1→ có nhiều thừa số →nlà hợp số, in khai triển.
Mẹo hiểu nhanh: Khi vòng lặp chỉ tìm được đúng 1 thừa số (là chính n), nghĩa là n không chia hết cho số nào nhỏ hơn → đó là số nguyên tố.
Phần gỡ rối (Debug) – Trang 150
Cách thiết lập điểm dừng
Đặt một điểm dừng (breakpoint) tại dòng 20 – ngay trước lệnh m = m // k. Vì sao chọn vị trí này? Vì sau khi k (ước nguyên tố tiếp theo) được tìm thấy và thêm vào NT, ta muốn quan sát giá trị các biến n, m, k xem có đúng theo thuật toán không, trước khi m bị thay đổi.
Khi chạy:
- Chương trình dừng lại trước dòng có điểm dừng (dòng được tô màu/đánh dấu).
- Nhấn nút ▶ (Continue) để chạy tiếp đến lần dừng kế tiếp.
- Trong cửa sổ Variable, em quan sát được các biến (ví dụ:
k = 5,m = 25,n = 100).
Bảng theo dõi giá trị trung gian với n = 100
| k | m | n | NT | Kết thúc |
|---|---|---|---|---|
| 2 | 100 | 100 | [2] | |
| 2 | 50 | 100 | [2, 2] | |
| 5 | 25 | 100 | [2, 2, 5] | |
| 5 | 5 | 100 | [2, 2, 5, 5] | |
| Thông báo: 100 = 2 × 2 × 5 × 5 |
Đọc bảng: Mỗi lần dừng, m giảm dần (100 → 50 → 25 → 5 → 1), còn NT được bổ sung dần. Cuối cùng m = 1 nên vòng lặp kết thúc, kết quả: $100 = 2 \times 2 \times 5 \times 5$. Việc lập bảng giúp em kiểm tra thuật toán chạy đúng từng bước.
Nhiệm vụ 2: Giải phương trình bậc hai
Đề bài
Viết chương trình nhập từ bàn phím ba số thực a, b, c và tìm nghiệm của phương trình bậc hai:
$$ax^2 + bx + c = 0$$
Chương trình cần xét đầy đủ các trường hợp xảy ra.
Phân tích các trường hợp (Hướng dẫn)
Trang sách dừng ở phần dẫn nhập. Thầy hệ thống đầy đủ các trường hợp cần xét để em làm tiếp:
Trường hợp 1: a = 0 (không còn là phương trình bậc hai, trở thành bx + c = 0)
- Nếu
b = 0vàc = 0: phương trình vô số nghiệm. - Nếu
b = 0vàc ≠ 0: phương trình vô nghiệm. - Nếu
b ≠ 0: phương trình có một nghiệm $x = -\dfrac{c}{b}$.
Trường hợp 2: a ≠ 0 (phương trình bậc hai thực sự), tính $\Delta = b^2 - 4ac$:
- $\Delta < 0$: vô nghiệm (thực).
- $\Delta = 0$: nghiệm kép $x = -\dfrac{b}{2a}$.
- $\Delta > 0$: hai nghiệm phân biệt $x_{1,2} = \dfrac{-b \pm \sqrt{\Delta}}{2a}$.
Chương trình tham khảo
# Giải phương trình bậc hai ax^2 + bx + c = 0
a = float(input("Nhập a: "))
b = float(input("Nhập b: "))
c = float(input("Nhập c: "))
if a == 0:
if b == 0:
if c == 0:
print("Phương trình vô số nghiệm")
else:
print("Phương trình vô nghiệm")
else:
print("Phương trình có nghiệm x =", -c / b)
else:
delta = b * b - 4 * a * c
if delta < 0:
print("Phương trình vô nghiệm")
elif delta == 0:
print("Phương trình có nghiệm kép x =", -b / (2 * a))
else:
x1 = (-b + delta ** 0.5) / (2 * a)
x2 = (-b - delta ** 0.5) / (2 * a)
print("Phương trình có hai nghiệm:")
print("x1 =", x1)
print("x2 =", x2)
Giải thích: Mấu chốt là phải kiểm tra a == 0 trước, vì nếu a = 0 thì công thức $\Delta$ và chia 2a sẽ không còn ý nghĩa (chia cho 0). Đây chính là lý do đề nhắc "cần xét đầy đủ các trường hợp".
Tóm lại, bài này luyện cho em hai kỹ năng: viết chương trình có nhiều nhánh điều kiện (if/elif/else) và biết dùng debug để theo dõi biến từng bước. Nếu em muốn thầy giải thích thêm về cách dùng công cụ debug cụ thể trong một phần mềm (như IDLE hay PyCharm), cứ nói nhé.
