Giải Tin Học 10 trang 124

Lời giải chi tiết SGK Lớp 10 · Môn Tin Học · Trang 124–127

Bài 25: Một số lệnh làm việc với xâu kí tự

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

1. Kiểm tra xâu con bằng toán tử in

Cú pháp:

 in 
  • Trả về True nếu là xâu con của
  • Trả về False nếu không phải

Ví dụ:

>>> "01" in "010110"
True
>>> "010" in "1101"
False

2. Lệnh find() – tìm vị trí xâu con

Cú pháp đơn giản:

.find()

Tìm vị trí xuất hiện đầu tiên của xâu con trong xâu mẹ, trả về chỉ số đó. Nếu không tìm thấy thì trả về -1.

Cú pháp đầy đủ:

.find(, start)

Tìm xâu con bắt đầu từ vị trí start.

💡 Mẹo nhớ: Vị trí (chỉ số) trong Python luôn bắt đầu từ 0. Ký tự đầu tiên ở vị trí 0, không phải 1.

3. Lệnh split() – tách xâu thành danh sách

Cú pháp:

.split()

Tách một xâu thành danh sách các từ. Mặc định ký tự tách là dấu cách, có thể thay bằng ký tự khác.

>>> "0,1,2,3".split(",")
['0', '1', '2', '3']

4. Lệnh join() – nối danh sách thành xâu

Cú pháp:

"".join()

Nối các phần tử (là xâu) của danh sách thành một xâu.

>>> ",".join(['0', '1', '2', '3'])
'0,1,2,3'
💡 Mẹo nhớ: split()join() là hai phép ngược nhau: split "cắt" xâu thành danh sách, join "dán" danh sách thành xâu.

⚙️ Bài tập

Câu hỏi trang 124

Đề bài: Cho xâu c = "Trường Sơn" và xâu p = "Bước chân trên dải Trường Sơn". Em hãy cho biết xâu c có là xâu con của xâu p không? Nếu có thì tìm vị trí của xâu c trong xâu p.

Cách 1 — Đếm vị trí thủ công

Ta đánh số từng ký tự của xâu p từ vị trí 0:

BưcchântrêndiTrưngSơn
012345678910111213141516171819202122232425262728

Ta thấy xâu "Trường Sơn" xuất hiện trong p, bắt đầu tại vị trí 19.

→ Xâu c xâu con của xâu p, vị trí xuất hiện là 19.

Cách 2 — Dùng Python kiểm tra
>>> c = "Trường Sơn"
>>> p = "Bước chân trên dải Trường Sơn"
>>> c in p
True
>>> p.find(c)
19

Kết quả True xác nhận c là xâu con, và find trả về 19 là vị trí cần tìm.


Câu hỏi trang 125

Đề bài:

  1. Biểu thức logic sau là đúng hay sai? >>> "010" in "001100"
  2. Lệnh sau trả lại giá trị gì? >>> "AB".find("AB", 4)
Cách 1 — Phân tích chi tiết

Ý 1: Xét xâu "001100" gồm các ký tự: 0, 0, 1, 1, 0, 0.

Liệt kê tất cả các xâu con liên tiếp có độ dài 3:

  • vị trí 0: "001"
  • vị trí 1: "011"
  • vị trí 2: "110"
  • vị trí 3: "100"

Không có xâu con nào bằng "010".

→ Biểu thức trả về False (sai).

Ý 2: Lệnh "AB".find("AB", 4) tìm xâu "AB" trong xâu "AB", bắt đầu từ vị trí 4.

Xâu "AB" chỉ có 2 ký tự (vị trí 0 và 1), nên vị trí 4 đã vượt quá độ dài xâu. Không thể tìm thấy.

→ Lệnh trả về -1.

⚠️ Lưu ý thi: find() luôn trả về -1 khi không tìm thấy, kể cả khi vị trí start vượt quá độ dài xâu. Đừng nhầm với giá trị 0 hay báo lỗi.
Cách 2 — Kiểm chứng bằng Python
>>> "010" in "001100"
False
>>> "AB".find("AB", 4)
-1

Câu hỏi trang 126

Đề 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 để xóa các dấu cách và thay thế bằng dấu "," trong xâu này.

Cách 1 — Dùng split() rồi join()
s = "gà vịt chó lợn ngựa cá"
A = s.split()        # tách theo dấu cách → ['gà','vịt','chó','lợn','ngựa','cá']
s = ",".join(A)      # nối lại bằng dấu phẩy
print(s)

Kết quả:

gà,vịt,chó,lợn,ngựa,cá
Cách 2 — Dùng lệnh replace()
s = "gà vịt chó lợn ngựa cá"
s = s.replace(" ", ",")
print(s)

Lệnh replace(" ", ",") thay mọi dấu cách bằng dấu phẩy, cho kết quả tương tự:

gà,vịt,chó,lợn,ngựa,cá
💡 Mẹo nhớ: Cách dùng split() + join() an toàn hơn khi xâu có nhiều dấu cách liên tiếp, vì split() tự động bỏ qua các dấu cách thừa. Còn replace() sẽ tạo ra nhiều dấu phẩy liên tiếp.

⚙️ Thực hành

Nhiệm vụ 1

Đề 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.

s = input("Nhập các số nguyên, cách nhau bởi dấu cách: ")
A = s.split()          # tách xâu thành danh sách các từ

B = []
for x in A:
    B.append(int(x))   # chuyển mỗi phần tử thành số nguyên

print("Số lượng các số đã nhập là:", len(B))

print("Các số đã nhập:", end=" ")
for x in B:
    print(x, end=" ")

Ví dụ chạy:

Nhập các số nguyên, cách nhau bởi dấu cách: 5 12 7 30 8
Số lượng các số đã nhập là: 5
Các số đã nhập: 5 12 7 30 8

Nhiệm vụ 2

Đề 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 kí tự đó sao cho giữa các từ chỉ có một dấu cách. In xâu kết quả ra màn hình.

s = input("Nhập một xâu kí tự: ")
A = s.split()          # tách thành các từ đơn, tự bỏ dấu cách thừa
s = " ".join(A)        # nối lại, mỗi từ cách nhau đúng một dấu cách
print(s)

Ví dụ chạy:

Nhập một xâu kí tự:   Học    lập   trình    Python
Học lập trình Python
💡 Mẹo nhớ: split() không tham số sẽ gộp mọi dấu cách liên tiếp thành một điểm tách, nên đây là cách gọn nhất để "làm sạch" dấu cách thừa.

Nhiệm vụ 3

Đề 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.

n = int(input("Nhập số học sinh: "))
ten = []
hodem = []

for i in range(n):
    hoten = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
    A = hoten.split()          # tách thành danh sách các từ
    k = len(A) - 1             # vị trí từ cuối cùng (là tên)
    ten.append(A[k])           # đưa tên vào danh sách ten
    del A[k]                   # xóa tên khỏi A, phần còn lại là họ đệm
    hodem.append(" ".join(A))  # nối phần còn lại thành họ đệm

print("Tên", "\t", "Họ đệm")
for i in range(n):
    print(ten[i], "\t", hodem[i])

Ví dụ chạy:

Nhập số học sinh: 2
Nhập họ tên học sinh thứ 1: Nguyễn Văn An
Nhập họ tên học sinh thứ 2: Trần Thị Bình
Tên 	 Họ đệm
An 	 Nguyễn Văn
Bình 	 Trần Thị
⚠️ Lưu ý thi: Trong họ tên Việt Nam, tên là từ cuối cùng, còn họ đệm là toàn bộ phần phía trước. Vì vậy ta lấy phần tử cuối A[len(A)-1] làm tên.

⚙️ Luyện tập

Bài 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.

s = input("Nhập các số, cách nhau bởi dấu cách: ")
A = s.split()

tong = 0
for x in A:
    tong = tong + float(x)   # dùng float để nhận cả số nguyên và số thực

print("Tổng các số đã nhập là:", tong)

Ví dụ chạy:

Nhập các số, cách nhau bởi dấu cách: 1.5 2 3.5 4
Tổng các số đã nhập là: 11.0
💡 Mẹo nhớ: Dùng float() thay vì int() để chương trình nhận được cả số nguyên lẫn số thực, vì số nguyên cũng là trường hợp đặc biệt của số thực.

Bài 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 đó.

hoten = input("Nhập họ tên đầy đủ: ")
A = hoten.split()

k = len(A) - 1
ten = A[k]              # từ cuối cùng là tên
del A[k]
hodem = " ".join(A)     # phần còn lại là họ đệm

print("Tên:", ten)
print("Họ đệm:", hodem)

Ví dụ chạy:

Nhập họ tên đầy đủ: Lê Hoàng Minh Châu
Tên: Châu
Họ đệm: Lê Hoàng Minh

⚙️ Vận dụng

Bài 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.

Cách 1 — Thuật toán Euclid (chia lấy dư)
s = input("Nhập hai số tự nhiên, cách nhau bởi dấu cách: ")
A = s.split()
a = int(A[0])
b = int(A[1])

while b != 0:
    a, b = b, a % b      # lặp cho đến khi số dư bằng 0

print("ƯCLN là:", a)

Ví dụ chạy:

Nhập hai số tự nhiên, cách nhau bởi dấu cách: 24 36
ƯCLN là: 12
Cách 2 — Trừ liên tiếp (thuật toán Euclid cổ điển)
s = input("Nhập hai số tự nhiên, cách nhau bởi dấu cách: ")
A = s.split()
a = int(A[0])
b = int(A[1])

while a != b:
    if a > b:
        a = a - b
    else:
        b = b - a

print("ƯCLN là:", a)
💡 Mẹo nhớ: Thuật toán Euclid dùng phép chia lấy dư (%) chạy nhanh hơn nhiều so với phép trừ liên tiếp, đặc biệt khi hai số chênh lệch lớn. Nên ưu tiên Cách 1.

Bài 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.

n = int(input("Nhập số học sinh: "))
ds_ten = []

for i in range(n):
    hoten = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
    A = hoten.split()
    ds_ten.append(A[len(A) - 1])   # lấy từ cuối cùng làm tên

ten_can_tim = input("Nhập tên cần tìm: ")

dem = 0
for x in ds_ten:
    if x == ten_can_tim:
        dem = dem + 1

print("Số bạn có cùng tên", ten_can_tim, "là:", dem)

Ví dụ chạy:

Nhập số học sinh: 3
Nhập họ tên học sinh thứ 1: Nguyễn Văn Nam
Nhập họ tên học sinh thứ 2: Trần Thị Nam
Nhập họ tên học sinh thứ 3: Lê Hoàng Anh
Nhập tên cần tìm: Nam
Số bạn có cùng tên Nam là: 2
⚠️ Lưu ý thi: Khi so sánh tên, Python phân biệt chữ hoa và chữ thường ("Nam" khác "nam"). Nếu muốn so sánh không phân biệt, có thể dùng .lower() cho cả hai vế.

🎯 Ghi nhớ: - Toán tử in kiểm tra xâu con, trả về True/False. - find() trả về vị trí xâu con (bắt đầu từ 0), không tìm thấy thì trả về -1. - split() cắt xâu thành danh sách, join() nối danh sách thành xâu – hai phép ngược nhau. - Trong họ tên tiếng Việt, tên là từ cuối cùng của xâu họ tên. - Bộ ba input → split → xử lý là khuôn mẫu chung để nhập nhiều dữ liệu trên một dòng.
Chế độ đọc sách →