Giải Tin Học 10 trang 136
Lời giải chi tiết SGK Lớp 10 · Môn Tin Há»c · Trang 136–137
Nguon: Tin Hoc 10 - Ket Noi Tri Thuc Voi Cuoc Song (trang 136 – 137)
Hai trang ảnh gồm phần cuối Bài 27 (mục Luyện tập, Vận dụng – trang 135) và phần đầu Bài 28: Phạm vi của biến (trang 136). Mình giải đầy đủ tất cả câu hỏi, bài tập theo thứ tự.
🔍 Kiến thức cần nhớ
Trước khi giải, ôn lại vài điểm quan trọng:
- Hàm (function): khối lệnh có tên, thực hiện một nhiệm vụ. Cú pháp định nghĩa:
```
def ten_ham(thamso1, thamso2, ...):
return
```
- input() luôn trả về một xâu kí tự. Muốn nhập số phải ép kiểu bằng
int()hoặcfloat(). - split() tách một xâu thành danh sách các từ dựa theo dấu phân cách. Mặc định tách theo dấu cách;
split(",")tách theo dấu phẩy. - s.upper() chuyển xâu sang chữ in HOA; s.lower() chuyển sang chữ in thường.
⚙️ Bài tập
LUYỆN TẬP
Câu 1
Đề bài: Thiết lập hàm power(a, b, c) với a, b, c là số nguyên. Hàm trả lại giá trị (a + b)^c.
Cách 1 — Dùng toán tử lũy thừa **
Trong Python, phép lũy thừa được viết bằng toán tử . Vậy (a + b)^c chính là (a + b) c.
def power(a, b, c):
return (a + b) ** c
# Kiểm tra
print(power(2, 3, 2)) # (2+3)^2 = 25
print(power(1, 1, 4)) # (1+1)^4 = 16
Cách 2 — Dùng hàm dựng sẵn pow()
Python có hàm pow(x, y) trả về x^y, cho kết quả tương tự.
def power(a, b, c):
return pow(a + b, c)
print(power(2, 3, 2)) # 25
💡 Mẹo nhớ: Trong Python lũy thừa viết là**chứ KHÔNG phải^. Dấu^trong Python là phép toán XOR trên bit, không phải lũy thừa.
Câu 2
Đề bài: Viết chương trình thực hiện: Nhập n số tự nhiên từ bàn phím, hai số cách nhau bởi dấu cách. Tính và in ra tổng của các số này.
Cách 1 — Tách xâu bằng split() rồi cộng dồn
Khi nhập "12 5 8 20" trên một dòng, ta dùng split() để tách thành danh sách các xâu, sau đó ép kiểu từng phần tử sang số nguyên và cộng vào biến tổng.
s = input("Nhập các số tự nhiên, cách nhau bởi dấu cách: ")
ds = s.split() # tách thành danh sách các xâu
tong = 0
for x in ds:
tong = tong + int(x) # ép kiểu rồi cộng dồn
print("Tổng của các số là:", tong)
Ví dụ chạy: nhập 12 5 8 20 → kết quả Tổng của các số là: 45.
Cách 2 — Kết hợp map() và sum() (ngắn gọn)
map(int, ...) áp dụng hàm int cho mọi phần tử của danh sách; sum() cộng tất cả lại.
s = input("Nhập các số tự nhiên, cách nhau bởi dấu cách: ")
tong = sum(map(int, s.split()))
print("Tổng của các số là:", tong)
⚠️ Lưu ý thi: Nhiều bạn quênint(x)nên chương trình nối xâu thay vì cộng số (vd "1" + "2" = "12"). Luôn nhớ ép kiểu sau khisplit().
VẬN DỤNG
Câu 1
Đề bài: Viết chương trình thực hiện: Nhập hai số tự nhiên từ bàn phím, hai số cách nhau bởi dấu phẩy, in ra ước chung lớn nhất (ƯCLN) của hai số.
Cách 1 — Thuật toán Euclid (trừ liên tiếp / chia lấy dư)
Thuật toán Euclid: ƯCLN(a, b) = ƯCLN(b, a mod b), lặp đến khi số dư bằng 0.
s = input("Nhập hai số tự nhiên, cách nhau bởi dấu phẩy: ")
ds = s.split(",") # tách theo dấu phẩy
a = int(ds[0])
b = int(ds[1])
# Tìm ƯCLN theo thuật toán Euclid
while b != 0:
a, b = b, a % b
print("ƯCLN của hai số là:", a)
Ví dụ: nhập 12,18 → tách được a = 12, b = 18 → ƯCLN = 6.
Cách 2 — Dùng hàm gcd() trong thư viện math
Python đã có sẵn hàm tính ƯCLN, dùng cho gọn.
from math import gcd
s = input("Nhập hai số tự nhiên, cách nhau bởi dấu phẩy: ")
a, b = map(int, s.split(","))
print("ƯCLN của hai số là:", gcd(a, b))
💡 Mẹo nhớ: Vòng lặpwhile b != 0: a, b = b, a % blà cách viết gọn kinh điển của thuật toán Euclid. Sau vòng lặp, ƯCLN nằm ở biếna.
⚠️ Lưu ý thi: Đề yêu cầu tách theo dấu phẩy nên phải dùng split(","), không để mặc định là dấu cách.
Câu 2
Đề bài: Thiết lập hàm change() có hai tham số là xâu ho_ten và số c. Hàm sẽ trả lại xâu kí tự ho_ten là chữ in hoa nếu c = 0. Nếu tham số c khác 0 thì hàm trả lại xâu ho_ten là chữ in thường.
Gợi ý: Sử dụng các phương thức s.upper() và s.lower() để chuyển đổi các kí tự của xâu s sang chữ in hoa và in thường.
Cách 1 — Dùng câu lệnh rẽ nhánh if … else
def change(ho_ten, c):
if c == 0:
return ho_ten.upper() # in HOA
else:
return ho_ten.lower() # in thường
# Kiểm tra
print(change("Nguyen Van An", 0)) # NGUYEN VAN AN
print(change("Nguyen Van An", 1)) # nguyen van an
Cách 2 — Dùng biểu thức điều kiện (ngắn gọn trên một dòng)
Python cho phép viết rẽ nhánh ngay trong câu lệnh return theo dạng A if điều_kiện else B.
def change(ho_ten, c):
return ho_ten.upper() if c == 0 else ho_ten.lower()
print(change("Tin Hoc 10", 0)) # TIN HOC 10
print(change("Tin Hoc 10", 5)) # tin hoc 10
⚠️ Lưu ý thi: Điều kiện làc == 0(so sánh hai dấu bằng), đừng nhầm vớic = 0(phép gán) — đây là lỗi cú pháp/logic rất hay gặp.
BÀI 28: PHẠM VI CỦA BIẾN
🔍 Kiến thức cần nhớ
Trọng tâm bài 28: phạm vi (scope) của biến — là vùng chương trình mà biến đó có hiệu lực (được nhận biết và sử dụng).
- Biến cục bộ (local): biến khai báo bên trong một hàm. Nó chỉ có tác dụng bên trong hàm đó. Bên ngoài hàm gọi đến sẽ báo lỗi
NameError. - Khi truyền tham số là biến bên ngoài, hàm làm việc trên "bản sao" — giá trị biến gốc bên ngoài không bị thay đổi sau khi gọi hàm.
⚙️ Câu hỏi khởi động
Câu 1
Đề bài: Một biến được định nghĩa trong chương trình chính (bên ngoài các hàm) thì sẽ được sử dụng như thế nào bên trong các hàm?
Trả lời:
Biến được định nghĩa ở chương trình chính (bên ngoài các hàm) là biến toàn cục. Bên trong một hàm:
- Nếu hàm chỉ đọc/truy cập giá trị của biến đó (không gán lại), thì hàm có thể sử dụng được giá trị của biến toàn cục.
- Nếu trong hàm có lệnh gán giá trị mới cho một tên trùng với biến toàn cục, Python sẽ tạo ra một biến cục bộ riêng trong hàm. Khi đó việc thay đổi này không ảnh hưởng đến biến toàn cục bên ngoài (muốn thay đổi biến toàn cục phải khai báo bằng từ khóa
global).
Câu 2
Đề bài: Một biến được khai báo bên trong một hàm thì có sử dụng được ở bên ngoài hàm đó hay không?
Trả lời:
Không. Biến khai báo bên trong một hàm là biến cục bộ, chỉ có hiệu lực và được nhận biết bên trong hàm đó. Khi hàm kết thúc, biến này cũng "biến mất". Nếu gọi đến nó ở chương trình chính (bên ngoài hàm) thì Python sẽ báo lỗi NameError: name '...' is not defined.
⚙️ Hoạt động 1 — Phạm vi của biến khi khai báo trong hàm
Đề bài: Quan sát các lệnh sau để tìm hiểu phạm vi có hiệu lực của biến khi khai báo bên trong một hàm.
>>> def func(a, b):
n = 10
a = a * 2
b = a + b
return a + b + n
>>> a = 1
>>> b = 2
>>> func(a, b)
16
>>> a, b
(1, 2)
>>> n
Traceback (most recent call last):
File "", line 1, in
n
NameError: name 'n' is not defined
Phân tích từng bước:
- Định nghĩa hàm
func(a, b): bên trong hàm có ba biến đang hoạt động làn,a,b. Khi gọi hàm,n = 10, cònavàbđược tính lại.
- Gán biến ngoài:
a = 1,b = 2(đây là các biến toàn cục, độc lập với tham số trong hàm).
- Gọi
func(a, b)tứcfunc(1, 2): trong hàm:
n = 10a = a 2 = 1 2 = 2b = a + b = 2 + 2 = 4return a + b + n = 2 + 4 + 10 = 16→ kết quả in ra 16.
- Kiểm tra
a, b: kết quả(1, 2). Dù trong hàma,bđã bị thay đổi, nhưng đó chỉ là các biến cục bộ của hàm. Hai biến toàn cụca,bbên ngoài vẫn giữ nguyên giá trị 1 và 2.
- Kiểm tra
n: báo lỗiNameError: name 'n' is not defined. Vìnchỉ được khai báo bên trong hàmfunc, nó là biến cục bộ nên không tồn tại ở chương trình chính.
Kết luận của Hoạt động:
Các biến được khai báo bên trong một hàm chỉ được sử dụng bên trong hàm đó. Chương trình chính không sử dụng được. Việc thay đổi giá trị các biến cục bộ trong hàm không làm thay đổi giá trị của biến cùng tên ở bên ngoài.
💡 Mẹo nhớ: "Sinh ra trong hàm thì chỉ sống trong hàm." Biến cục bộ ra đời khi hàm chạy và mất đi khi hàm kết thúc.
⚠️ Lưu ý thi: Câu hỏi rất hay gặp là tính giá trị in ra và giải thích vì sao biến ngoài không đổi. Nhớ: tham số truyền vào hàm là bản sao, hàm sửa bản sao chứ không sửa biến gốc (với kiểu số, xâu...).
🎯 Ghi nhớ: - Lũy thừa trong Python dùng;pow(x, y)cho kết quả tương tự. -split()tách theo dấu cách,split(",")tách theo dấu phẩy; nhớ ép kiểuint()sau khi tách. - Thuật toán Euclid:while b != 0: a, b = b, a % b, ƯCLN nằm ởa. -s.upper()→ in HOA,s.lower()→ in thường. - Biến cục bộ** (khai báo trong hàm) chỉ có hiệu lực trong hàm đó; thay đổi nó không ảnh hưởng biến cùng tên bên ngoài.
