Giải Tin Học 10 trang 126
Lời giải chi tiết SGK Lớp 10 · Môn Tin Há»c · Trang 126–127
Nguon: Tin Hoc 10 - Ket Noi Tri Thuc Voi Cuoc Song (trang 126 – 127)
🔍 Kiến thức cần nhớ
Python có hai lệnh đặc biệt để xử lí xâu kí tự:
Lệnh split() — tách xâu thành danh sách
- Tách một xâu thành các từ và đưa vào một danh sách.
- Kí tự tách mặc định là dấu cách, nhưng có thể thay bằng kí tự khác.
- Cú pháp:
.split( )
Ví dụ:
s = "Tiên học lễ hậu học văn"
s.split() # ['Tiên', 'học', 'lễ', 'hậu', 'học', 'văn']
s = "0,1,2,3,4"
s.split(",") # ['0', '1', '2', '3', '4']
Lệnh join() — nối danh sách thành xâu
- Tác dụng ngược với split(): nối các phần tử (là xâu) của một danh sách thành một xâu.
- Cú pháp:
"".join( )
Ví dụ:
A = ['Tiên', 'học', 'lễ', 'hậu', 'học', 'văn']
" ".join(A) # 'Tiên học lễ hậu học văn'
B = ['0', '1', '2', '3', '4', '5', '6', '10']
",".join(B) # '0,1,2,3,4,5,6,10'
💡 Mẹo nhớ: - split = "chia nhỏ" → từ một xâu ra nhiều phần tử (danh sách). - join = "gộp lại" → từ nhiều phần tử (danh sách) thành một xâu. - Kí tự nối nằm trước dấu chấm:"-".join(ds), còn kí tự tách nằm trong ngoặc:xau.split("-").
⚠️ Lưu ý thi: Phần tử trong danh sách dùng cho join() phải là xâu. Nếu là số (như[1, 2, 3]) sẽ báo lỗi. Khi đó cần chuyển sang xâu trước, ví dụ",".join(str(x) for x in [1,2,3]).
⚙️ Bài tập
Câu hỏi (biểu tượng "?") — trang 125
Đề bài: Cho xâu kí tự: "gà,vịt,chó,lợn,ngựa,cá". Em hãy trình bày cách làm để xoá các dấu "," và thay thế bằng dấu " " trong xâu này.
Cách 1 — Dùng split() rồi join()
Ý tưởng: tách xâu tại mỗi dấu phẩy thành danh sách các từ, sau đó nối lại bằng dấu cách.
s = "gà,vịt,chó,lợn,ngựa,cá"
ds = s.split(",") # ['gà', 'vịt', 'chó', 'lợn', 'ngựa', 'cá']
kq = " ".join(ds) # 'gà vịt chó lợn ngựa cá'
print(kq)
Kết quả: gà vịt chó lợn ngựa cá
Cách 2 — Dùng lệnh replace()
Python có lệnh replace( thay mọi lần xuất hiện của kí tự cũ bằng kí tự mới — ngắn gọn hơn.
s = "gà,vịt,chó,lợn,ngựa,cá"
kq = s.replace(",", " ")
print(kq)
Kết quả: gà vịt chó lợn ngựa cá
💡 Mẹo nhớ: Khi chỉ cần đổi một kí tự này thành kí tự khác,replace()là nhanh nhất. Khi cần xử lí từng từ riêng lẻ (đếm, sắp xếp, biến đổi), nên dùngsplit().
⚙️ THỰC HÀNH — Một số bài toán liên quan đến xâu kí tự
Nhiệm vụ 1 — Nhập nhiều số nguyên, đếm và in hàng ngang
Đề bài: Viết chương trình nhập nhiều số nguyên từ bàn phím, các số cách nhau bởi dấu cách. Khi nhập xong thông báo số lượng các số đã nhập và in các số này thành hàng ngang.
Phân tích chương trình (theo hướng dẫn SGK):
s = input("Nhập các số nguyên cách nhau bởi dấu cách: ")
sline = s.split() # tách xâu thành danh sách các xâu số
n = len(sline) # đếm số lượng phần tử
nline = [] # danh sách lưu các số nguyên
for x in sline:
nline.append(int(x)) # chuyển từng phần tử (xâu) thành số nguyên
print("Bạn đã nhập", n, "số.")
for k in nline:
print(k, end = " ") # in từng số, cách nhau bởi dấu cách, trên cùng một hàng
Giải thích các bước:
s.split()tách xâu nhập vào (ví dụ"3 5 7 9") thành['3', '5', '7', '9'].len(sline)đếm được 4 phần tử → n = 4.- Vòng lặp
for x in slinechuyển mỗi xâu thành số nguyên bằngint(x)rồi thêm vàonline. print(k, end = " ")dùngend = " "để các số in trên cùng một dòng, cách nhau bởi dấu cách (mặc địnhprintxuống dòng sau mỗi lần in).
Ví dụ chạy với 3 5 7 9:
Bạn đã nhập 4 số.
3 5 7 9
⚠️ Lưu ý thi: Mặc địnhprint()tự xuống dòng. Muốn in nhiều giá trị trên một hàng ngang phải thêm tham sốend = " "(hoặcend = "").
Nhiệm vụ 2 — Chuẩn hoá khoảng cách giữa các từ
Đề bài: Viết chương trình nhập một xâu kí tự có thể có nhiều dấu cách giữa các từ. Sau đó chỉnh sửa xâu sao cho giữa các từ chỉ còn một dấu cách. In xâu kết quả ra màn hình.
Phân tích chương trình:
s = input("Nhập đoạn văn bản: \n")
sline = s.split() # tách thành danh sách các từ (tự bỏ mọi dấu cách thừa)
skq = " ".join(sline) # nối lại, mỗi từ cách nhau đúng một dấu cách
print(skq)
Giải thích bước mấu chốt: Khi gọi split() không có tham số, Python tự động bỏ qua mọi dấu cách thừa (kể cả dấu cách đầu, cuối, hay nhiều dấu cách liên tiếp) và chỉ giữ lại các từ. Sau đó " ".join() nối các từ lại, mỗi cặp từ đúng một dấu cách.
Ví dụ: nhập " Học tốt Tin học " → kết quả: Học tốt Tin học
💡 Mẹo nhớ: Mẫu " ".join(s.split()) là cách "làm sạch" khoảng trắng kinh điển, hay gặp trong xử lí văn bản.
Nhiệm vụ 3 — Tách họ đệm và tên, in thành hai cột
Đề bài: Viết chương trình nhập số tự nhiên n, rồi nhập họ tên của n học sinh. Sau đó in ra danh sách tên học sinh theo hai cột, cột 1 là tên, cột 2 là họ đệm.
Phân tích chương trình:
n = int(input("Nhập số học sinh trong lớp: "))
ten = [] # danh sách lưu tên
hodem = [] # danh sách lưu họ đệm
for i in range(n):
s = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
sline = s.split() # tách họ tên thành danh sách các từ
m = len(sline) - 1 # chỉ số của phần tử cuối (chính là tên)
ten.append(sline[m]) # phần tử cuối là TÊN
del sline[m] # xoá tên khỏi danh sách
hodem.append(" ".join(sline)) # phần còn lại nối thành HỌ ĐỆM
print("Danh sách học sinh:")
for i in range(n):
print(ten[i], hodem[i])
Giải thích logic tách họ tên:
- Trong tiếng Việt, tên là từ cuối cùng của họ tên đầy đủ, còn lại là họ đệm.
m = len(sline) - 1→ chỉ số phần tử cuối (vì danh sách đánh số từ 0).sline[m]là tên → thêm vàoten.del sline[m]xoá tên, phần còn lại là họ đệm →" ".join(sline)nối lại thành xâu.
Ví dụ nhập Nguyễn Văn An:
sline = ['Nguyễn', 'Văn', 'An'], m = 2- ten ←
'An'; sau khi xoá:['Nguyễn', 'Văn']→ hodem ←'Nguyễn Văn'
Kết quả in: An Nguyễn Văn
⚠️ Lưu ý thi: Chỉ số phần tử cuối của danh sách dài k là k - 1, không phải k. Lỗi quên trừ 1 là lỗi rất phổ biến và gây "list index out of range".
⚙️ LUYỆN TẬP
Câu 1
Đề bài: Viết chương trình nhập nhiều số (số nguyên hoặc số thực) từ bàn phím, các số cách nhau bởi dấu cách. Sau đó in ra màn hình tổng các số đã nhập.
Cách 1 — Dùng vòng lặp cộng dồn
s = input("Nhập các số cách nhau bởi dấu cách: ")
sline = s.split()
tong = 0
for x in sline:
tong = tong + float(x) # dùng float để nhận cả số nguyên lẫn số thực
print("Tổng các số đã nhập là:", tong)
Giải thích: Dùng float(x) thay vì int(x) để chương trình chấp nhận cả số nguyên và số thực (số nguyên như 5 vẫn chuyển được thành 5.0). Biến tong khởi tạo bằng 0 rồi cộng dồn từng số.
Ví dụ nhập 2.5 3 4.5 → Tổng các số đã nhập là: 10.0
Cách 2 — Dùng hàm sum() gọn hơn
s = input("Nhập các số cách nhau bởi dấu cách: ")
ds = [float(x) for x in s.split()] # danh sách các số
print("Tổng các số đã nhập là:", sum(ds))
Giải thích: [float(x) for x in s.split()] là cú pháp list comprehension, tạo nhanh danh sách các số. Hàm có sẵn sum() tính tổng mọi phần tử trong danh sách.
💡 Mẹo nhớ: sum() chỉ cộng được danh sách số (int/float), không cộng được danh sách xâu. Phải chuyển sang số trước.
Câu 2
Đề bài: Viết chương trình nhập họ tên đầy đủ của người dùng, sau đó in thông báo tên và họ đệm của người đó.
s = input("Nhập họ tên đầy đủ của bạn: ")
sline = s.split()
ten = sline[len(sline) - 1] # phần tử cuối là tên
del sline[len(sline) - 1] # xoá tên khỏi danh sách
hodem = " ".join(sline) # phần còn lại là họ đệm
print("Tên của bạn là:", ten)
print("Họ đệm của bạn là:", hodem)
Giải thích: Tương tự logic Nhiệm vụ 3 nhưng chỉ làm cho một người. Phần tử cuối của danh sách là tên, phần còn lại nối bằng dấu cách thành họ đệm.
Ví dụ nhập Trần Thị Hồng Nhung:
Tên của bạn là: Nhung
Họ đệm của bạn là: Trần Thị Hồng
⚠️ Lưu ý thi: Có thể viết gọn lấy phần tử cuối bằng chỉ số âm: sline[-1] chính là phần tử cuối cùng. Đây là đặc trưng rất hay của Python.
⚙️ VẬN DỤNG
Câu 1
Đề bài: Viết chương trình nhập hai số tự nhiên từ bàn phím, cách nhau bởi dấu cách và đưa ra kết quả là ƯCLN của hai số này.
🔍 Kiến thức: ƯCLN (ước chung lớn nhất) là số lớn nhất chia hết cho cả hai số. Dùng thuật toán Euclid: lặp lại phép lấy số dư cho tới khi số dư bằng 0.
Cách 1 — Thuật toán Euclid bằng phép trừ liên tiếp
s = input("Nhập hai số tự nhiên cách nhau bởi dấu cách: ")
sline = s.split()
a = int(sline[0])
b = int(sline[1])
while a != b: # khi a, b chưa bằng nhau
if a > b:
a = a - b
else:
b = b - a
print("ƯCLN của hai số là:", a)
Giải thích: Dựa trên tính chất ƯCLN(a, b) = ƯCLN(a − b, b). Liên tục lấy số lớn trừ số nhỏ cho tới khi a = b, lúc đó a chính là ƯCLN.
Cách 2 — Thuật toán Euclid bằng phép chia lấy dư (nhanh hơn)
s = input("Nhập hai số tự nhiên cách nhau bởi dấu cách: ")
a, b = s.split()
a = int(a)
b = int(b)
while b != 0:
a, b = b, a % b # gán đồng thời: a nhận b, b nhận phần dư a chia b
print("ƯCLN của hai số là:", a)
Giải thích: ƯCLN(a, b) = ƯCLN(b, a mod b). Khi số dư bằng 0, a là kết quả. Phép gán đồng thời a, b = b, a % b đổi giá trị hai biến cùng lúc — rất gọn.
Ví dụ nhập 12 18 → ƯCLN của hai số là: 6
💡 Mẹo nhớ: Cách dùng phép chia lấy dư nhanh hơn nhiều so với phép trừ, đặc biệt với số lớn. Đây là cách chuẩn nên dùng.
Câu 2
Đề bài: Viết chương trình nhập số tự nhiên n rồi nhập n họ tên học sinh. Sau đó yêu cầu nhập một tên và thông báo số bạn có cùng tên đó trong lớp.
🔍 Kiến thức: "Tên" là từ cuối cùng trong họ tên đầy đủ (như Nhiệm vụ 3). Ta lưu tên của tất cả học sinh vào một danh sách rồi đếm số lần xuất hiện của tên cần tìm.
Cách 1 — Dùng vòng lặp đếm
n = int(input("Nhập số học sinh trong lớp: "))
ten = []
for i in range(n):
s = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
sline = s.split()
ten.append(sline[-1]) # lấy tên (phần tử cuối)
t = input("Nhập tên cần tìm: ")
dem = 0
for x in ten:
if x == t:
dem = dem + 1
print("Có", dem, "bạn có cùng tên", t, "trong lớp.")
Giải thích:
- Vòng lặp đầu nhập n họ tên, mỗi lần lấy phần tử cuối
sline[-1](chính là tên) thêm vào danh sáchten. - Vòng lặp sau duyệt danh sách
ten, mỗi khi gặp tên trùng với tên cần tìm thì tăng biến đếmdem.
Cách 2 — Dùng phương thức count() có sẵn
n = int(input("Nhập số học sinh trong lớp: "))
ten = []
for i in range(n):
s = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
ten.append(s.split()[-1])
t = input("Nhập tên cần tìm: ")
print("Có", ten.count(t), "bạn có cùng tên", t, "trong lớp.")
Giải thích: Danh sách có sẵn phương thức count( đếm số lần một giá trị xuất hiện — thay được hoàn toàn vòng lặp đếm thủ công.
Ví dụ với lớp gồm Lê Văn An, Trần Thị Mai, Nguyễn Văn An, tìm tên An → Có 2 bạn có cùng tên An trong lớp.
⚠️ Lưu ý thi: Khi so sánh tên, máy phân biệt chữ hoa và chữ thường ("An"khác"an"). Nếu muốn so sánh không phân biệt, có thể đưa cả hai về cùng dạng bằng.lower()trước khi so sánh.
🎯 Ghi nhớ: - split() tách xâu → danh sách; join() nối danh sách → xâu. Hai lệnh này ngược nhau. - Mẫu" ".join(s.split())dùng để chuẩn hoá khoảng trắng trong văn bản. - "Tên" trong họ tên là từ cuối — lấy bằngsline[-1]; phần còn lại là họ đệm. - Để in hàng ngang dùngprint(x, end = " "). - ƯCLN giải nhanh bằng thuật toán Euclid với phép chia lấy dư:a, b = b, a % b. - Tận dụng hàm/phương thức có sẵn (sum(),count(), chỉ số âm[-1]) để code ngắn gọn, ít lỗi.
