Giải bài tập SGK: Bài 25: Một số lệnh làm việc với xâu kí tự – Tin học 10

Mục lục [Ẩn]

Chọn đến phần học sinh cần nhanh chóng thông qua mục lục bằng cách click đến phần đó

Câu hỏi mở đầu trang 123

Câu hỏi mở đầu

Đề bài: Cho xâu $c = $ "Trường Sơn" và xâu $m = $ "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 $m$ không. Nếu có thì tìm vị trí của xâu $c$ trong xâu $m$.

Lời giải:

  • Kiểm tra xem $c$ có là xâu con của $m$ không: Quan sát xâu $m$, ta thấy "Trường Sơn" xuất hiện ở cuối xâu $m$ → $c$ là xâu con của $m$.
  • Tìm vị trí: Đếm vị trí của các kí tự trong xâu $m$ (chỉ số bắt đầu từ $0$, tính cả dấu cách):
    $0$ $1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$ $9$ $19$
    B ư c _ c h â n _ T

    → Kí tự "T" đầu tiên của "Trường Sơn" nằm ở chỉ số $19$.

Vị trí của $c$ trong $m$ là chỉ số $19$.

Có thể kiểm tra bằng lệnh Python: m.find(c) → trả về $19$.

1. Xâu con và lệnh tìm vị trí xâu con

Hoạt động 1 trang 123

Đề bài: Quan sát các ví dụ sau để tìm hiểu cách kiểm tra xâu con và tìm kiếm vị trí xâu con trong xâu kí tự.

Lời giải:

Qua các ví dụ trong SGK, ta thấy có hai cách để làm việc với xâu con:

Cách 1 – Toán tử in: Kiểm tra một xâu có là xâu con của xâu khác không.

>>> "abc" in "123abc"
True
>>> "010" in "1101"
False

→ Trả về True nếu có, False nếu không.

Cách 2 – Lệnh find(): Tìm vị trí xuất hiện đầu tiên của xâu con.

>>> s = "ab bc cd 123 456 00"
>>> s.find("b")
1
>>> s.find("12")
9
>>> s.find("AB")
-1

→ Trả về chỉ số vị trí xuất hiện đầu tiên. Nếu không tìm thấy, trả về $-1$.

Câu hỏi củng cố mục 1 trang 124

Đề bài:

1. Biểu thức lôgic sau là đúng hay sai?

>>> "010" in "001100"

Lời giải:

Phân tích xâu "001100" có $6$ kí tự, tìm "010":

Vị trí thử Lấy $3$ kí tự So với "010"
$0$ "001"
$1$ "011"
$2$ "110"
$3$ "100"

→ Không tìm thấy "010" trong "001100".

Kết quả: False (Sai).

2. Lệnh sau trả lại giá trị gì?

>>> "abababbabab".find("ab", 4)

Lời giải:

Lệnh find("ab", 4) tìm vị trí "ab" bắt đầu từ chỉ số $4$.

Liệt kê vị trí các kí tự của "abababbabab":

$0$ $1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$ $9$ $10$
a b a b a b b a b a b

Bắt đầu từ chỉ số $4$:

  • Chỉ số $4$: 'a', chỉ số $5$: 'b' → ghép lại được "ab"tìm thấy ngay!

Kết quả: $4$.

2. Một số lệnh thường dùng với xâu kí tự

Hoạt động 2 trang 124

Đề bài: Quan sát các ví dụ sau để biết cách sử dụng một số lệnh thường dùng với xâu kí tự như: split(), join().

Lời giải:

Hai lệnh đặc biệt dành cho xâu kí tự:

Lệnh split() – Tách xâu thành danh sách các từ:

>>> 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']

>>> st = "0,1,2,3,4,5,6,10"
>>> st.split(",")
['0', '1', '2', '3', '4', '5', '6', '10']
  • Mặc định tách theo dấu cách.
  • Có thể chỉ định kí tự tách khác trong ngoặc (ví dụ ",").

Lệnh join() – Nối các phần tử trong danh sách thành một xâu:

>>> 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'

→ Đặt kí tự nối trước .join(), sau đó truyền danh sách vào.

Chú ý: split()join() là hai lệnh ngược nhausplit() tách xâu thành danh sách, join() nối danh sách thành xâu.

Câu hỏi củng cố mục 2 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.

Lời giải:

Ý tưởng: Kết hợp hai lệnh split()join():

  • Bước 1: Dùng split(",") để tách xâu theo dấu phẩy thành danh sách các từ.
  • Bước 2: Dùng " ".join(...) để nối lại các phần tử bằng dấu cách.
s = "gà,vịt,chó,lợn,ngựa,cá"
ds = s.split(",")
kq = " ".join(ds)
print(kq)

Kết quả:

gà vịt chó lợn ngựa cá

Giải thích từng bước:

  • Sau s.split(","): ds = ['gà', 'vịt', 'chó', 'lợn', 'ngựa', 'cá'].
  • Sau " ".join(ds): kq = "gà vịt chó lợn ngựa cá".

Thực hành trang 125 – 126

Nhiệm vụ 1 trang 125

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

Hướng dẫn thực hành:

Ý tưởng:

  • Dùng input() để nhập một xâu (các số cách nhau bởi dấu cách).
  • Dùng split() để tách thành danh sách.
  • Chuyển từng phần tử thành số nguyên rồi đưa vào danh sách mới.
s = input("Nhập các số nguyên cách nhau bởi dấu cách: ")
sline = s.split()
n = len(sline)
nline = []
for x in sline:
    nline.append(int(x))
print("Bạn đã nhập", n, "số.")
for k in nline:
    print(k, end=" ")

Ví dụ khi chạy (nhập 5 10 15 20):

Nhập các số nguyên cách nhau bởi dấu cách: 5 10 15 20
Bạn đã nhập 4 số.
5 10 15 20 

Nhiệm vụ 2 trang 126

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

Hướng dẫn thực hành:

Ý tưởng: Khi tách xâu bằng split() (không chỉ định kí tự), Python sẽ bỏ qua các dấu cách thừa. Sau đó dùng join() để nối lại với chỉ một dấu cách giữa các từ.

s = input("Nhập đoạn văn bản: \n")
sline = s.split()
skq = " ".join(sline)
print(skq)

Ví dụ khi chạy (nhập xâu có nhiều dấu cách):

Nhập đoạn văn bản: 
Tin    học    lớp     10
Tin học lớp 10

Chú ý: Đây là cách rất hữu ích để dọn dẹp dấu cách thừa trong văn bản nhập vào.

Nhiệm vụ 3 trang 126

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

Hướng dẫn thực hành:

Ý tưởng:

  • Mỗi họ tên tách thành danh sách các từ bằng split().
  • Phần tử cuối cùngtên, các phần tử còn lại là họ đệm.
  • Dùng del để xoá phần tử tên khỏi danh sách, phần còn lại ghép bằng join().
n = int(input("Nhập số học sinh trong lớp: "))
ten = []
hodem = []
for i in range(n):
    s = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
    sline = s.split()
    m = len(sline) - 1
    ten.append(sline[m])
    del sline[m]
    hodem.append(" ".join(sline))
print("Danh sách học sinh:")
for i in range(n):
    print(ten[i], hodem[i])

Ví dụ khi chạy (nhập $n = 2$):

Nhập số học sinh trong lớp: 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
Danh sách học sinh:
An Nguyễn Văn
Bình Trần Thị

Luyện tập trang 126

Luyện tập 1 trang 126

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

Lời giải:

Ý tưởng: Tương tự Nhiệm vụ 1, nhưng dùng float() để chuyển đổi (vì có cả số thực) và cộng dồn vào biến tong.

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)
print("Tổng các số đã nhập là:", tong)

Ví dụ khi chạy (nhập 1.5 2 3.5 4):

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

Chú ý: Dùng float() thay vì int() để chương trình nhận được cả số nguyên và số thực.

Luyện tập 2 trang 126

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

Lời giải:

Ý tưởng: Tương tự Nhiệm vụ 3, nhưng chỉ làm với một họ tên (không cần vòng lặp $n$ lần).

ht = input("Nhập họ tên đầy đủ: ")
sline = ht.split()
m = len(sline) - 1
ten = sline[m]
del sline[m]
hodem = " ".join(sline)
print("Tên:", ten)
print("Họ đệm:", hodem)

Ví dụ khi chạy (nhập Nguyễn Thị Hồng Hạnh):

Nhập họ tên đầy đủ: Nguyễn Thị Hồng Hạnh
Tên: Hạnh
Họ đệm: Nguyễn Thị Hồng

Vận dụng trang 126

Vận dụng 1 trang 126

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

Lời giải:

Ý tưởng:

  • Nhập một xâu, tách thành $2$ phần bằng split(), chuyển sang số nguyên.
  • Tìm ƯCLN bằng thuật toán Euclid: lấy số dư của $a$ chia $b$, gán $a = b$, $b = $ số dư, lặp đến khi $b = 0$. Khi đó $a$ chính là ƯCLN.
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 b != 0:
    r = a % b
    a = b
    b = r
print("ƯCLN của hai số là:", a)

Ví dụ khi chạy (nhập 24 36):

Nhập hai số tự nhiên cách nhau bởi dấu cách: 24 36
ƯCLN của hai số là: 12

Kiểm tra: $\text{ƯCLN}(24, 36) = 12$. ✓

Vận dụng 2 trang 126

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

Lời giải:

Ý tưởng:

  • Bước 1: Nhập danh sách $n$ họ tên, tách lấy tên (phần tử cuối) lưu vào danh sách ten.
  • Bước 2: Nhập tên cần tìm.
  • Bước 3: Duyệt danh sách ten, đếm số bạn trùng tê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) + ": ")
    sline = s.split()
    m = len(sline) - 1
    ten.append(sline[m])

ten_tim = input("Nhập tên cần tìm: ")
dem = 0
for x in ten:
    if x == ten_tim:
        dem = dem + 1
print("Số bạn có tên", ten_tim, "trong lớp là:", dem)

Ví dụ khi chạy (nhập $n = 3$ và tên cần tìm là Hoa):

Nhập số học sinh trong lớp: 3
Nhập họ tên học sinh thứ 1: Nguyễn Thị Hoa
Nhập họ tên học sinh thứ 2: Trần Văn An
Nhập họ tên học sinh thứ 3: Lê Thị Hoa
Nhập tên cần tìm: Hoa
Số bạn có tên Hoa trong lớp là: 2

Chú ý: Ở đây ta so sánh bằng dấu == để tìm trùng khớp chính xác với tên cần tìm (lấy đúng phần tên cuối của họ tên, không lấy nhầm sang họ hay đệm).

Thầy Phạm Thành Danh

Thầy Phạm Thành Danh

(Người kiểm duyệt, ra đề)

Chức vụ: Trưởng ban biên soạn môn Tin Học THPT

Trình độ: Cử nhân Sư phạm Tin học, Chứng chỉ hạng II, Chứng chỉ Tin học, Ngoại ngữ B1

Kinh nghiệm: 8+ năm kinh nghiệm tại Trường THPT Thuận Hóa