Giải bài tập SGK: Bài 24: 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 119

Câu hỏi mở đầu

Đề bài: Em đã biết dữ liệu xâu kí tự (gọi tắt là xâu) từ Bài 16 và chúng ta có thể tạo các biến kiểu xâu kí tự theo nhiều cách như sau:

>>> s = "Thời khoá biểu"
>>> xau = 'Hoa học trò'
>>> Cau_tho = """ Mình về mình có nhớ ta
Mười lăm năm ấy thiết tha mặn nồng"""

Liệu có lệnh nào trích ra từng kí tự của một xâu kí tự? Đếm số kí tự của một xâu?

Lời giải:

Dự đoán:

  • Trích ra từng kí tự của xâu: Có thể dùng cú pháp s[i] để truy cập kí tự ở vị trí thứ $i$ (chỉ số bắt đầu từ $0$), tương tự như danh sách.
  • Đếm số kí tự của xâu: Có thể dùng lệnh len(s) để biết độ dài (số kí tự) của xâu $s$.

1. Xâu là một dãy các kí tự

Hoạt động 1 trang 119

Đề bài: Quan sát các ví dụ sau để biết cấu trúc xâu kí tự, so sánh với danh sách để biết sự khác nhau giữa xâu (string) và danh sách (list).

Lời giải:

Qua hai ví dụ trong SGK, ta rút ra:

Điểm giống nhau giữa xâu và danh sách:

  • Đều là dãy các phần tử có thứ tự.
  • Đều có thể truy cập từng phần tử qua chỉ số bắt đầu từ $0$ (ví dụ s[0], d[0]).
  • Đều dùng được lệnh len() để đếm số phần tử.

Điểm khác nhau:

Đặc điểm Xâu (string) Danh sách (list)
Cú pháp tạo Dùng cặp dấu "" hoặc '' Dùng cặp dấu [ ]
Thay đổi từng phần tử Không được (báo lỗi TypeError) Được

→ Python không cho phép thay đổi từng kí tự của một xâu.

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

Đề bài:

1. Các xâu kí tự sau có hợp lệ không?

a) "123&*()+-ABC" b) "1010110&0101001" c) "Tây Nguyên" d) 11111111 = 256

Lời giải:

Lựa chọn Hợp lệ? Lý do
a) "123&*()+-ABC" ✓ Hợp lệ Là xâu kí tự đặt trong cặp dấu nháy kép "".
b) "1010110&0101001" ✓ Hợp lệ Là xâu kí tự đặt trong cặp dấu nháy kép.
c) "Tây Nguyên" ✓ Hợp lệ Là xâu kí tự đặt trong cặp dấu nháy kép.
d) 11111111 = 256 ✗ Không hợp lệ Đây là lệnh gán sai cú pháp (vế trái phải là tên biến), không phải xâu.

2. Mỗi xâu hợp lệ ở Câu 1 có độ dài bằng bao nhiêu?

Lời giải:

Đếm từng kí tự (kể cả dấu cách):

  • a) "123&*()+-ABC": gồm các kí tự 1, 2, 3, &, *, (, ), +, -, A, B, C$12$ kí tự.
  • b) "1010110&0101001": gồm $7$ chữ số đầu, $1$ kí tự &, $7$ chữ số sau → $15$ kí tự.
  • c) "Tây Nguyên": gồm T, â, y, (dấu cách), N, g, u, y, ê, n$10$ kí tự.

Chú ý: Dấu cách (space) cũng được tính là một kí tự trong xâu.

2. Lệnh duyệt kí tự của xâu

Hoạt động 2 trang 120

Đề bài: Quan sát các lệnh sau để biết cách duyệt từng kí tự của xâu kí tự bằng lệnh for. Có hai cách duyệt, theo chỉ số và theo phần tử của xâu kí tự.

Lời giải:

hai cách duyệt từng kí tự của xâu $s$:

Cách 1 – Duyệt theo chỉ số (dùng lệnh range()):

>>> s = "Thời khoá biểu"
>>> for i in range(len(s)):
        print(s[i], end=" ")
T h ờ i   k h o á   b i ể u
  • Biến $i$ lần lượt chạy theo chỉ số của xâu, từ $0$ đến len(s) - 1.
  • Kí tự tại chỉ số $i$ là s[i].

Cách 2 – Duyệt theo từng kí tự của xâu:

>>> for ch in s:
        print(ch, end=" ")
T h ờ i   k h o á   b i ể u
  • Biến ch sẽ được gán lần lượt các kí tự của xâu $s$ từ đầu đến cuối.
  • Cách này ngắn gọn và dễ hiểu hơn.

Câu hỏi củng cố mục 2 trang 121

Đề bài:

1. Sau khi thực hiện các lệnh sau, biến skq sẽ có giá trị bao nhiêu?

>>> s = "81723"
>>> skq = ""
>>> for ch in s:
        if int(ch) % 2 != 0:
            skq = skq + ch

Lời giải:

Phân tích từng bước duyệt:

Bước ch int(ch) % 2 Lẻ? skq sau bước
1 "8" $0$ Không ""
2 "1" $1$ "1"
3 "7" $1$ "17"
4 "2" $0$ Không "17"
5 "3" $1$ "173"

Kết quả: skq = "173".

Ý nghĩa: Đoạn chương trình lọc ra các chữ số lẻ trong xâu $s$ và ghép thành xâu mới.

2. Cho s1 = "abc", s2 = "ababcabca". Các biểu thức lôgic sau cho kết quả là đúng hay sai?

a) s1 in s2 b) s1 + s1 in s2 c) "abcabca" in s2 d) "abc123" in s2

Lời giải:

Phân tích xâu $s2 = $ "ababcabca" (có $9$ kí tự):

Vị trí $0$ $1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$
Kí tự a b a b c a b c a

Xét từng biểu thức:

  • a) s1 in s2 → kiểm tra xâu "abc" có trong "ababcabca" không?
    • Tại vị trí $2$ đến $4$: "abc" → có. → True (Đúng).
  • b) s1 + s1 in s2 → kiểm tra xâu "abcabc" có trong "ababcabca" không?
    • Tại vị trí $2$ đến $7$: "abcabc" → có. → True (Đúng).
  • c) "abcabca" in s2 → kiểm tra "abcabca" có trong "ababcabca" không?
    • Tại vị trí $2$ đến $8$: "abcabca" → có. → True (Đúng).
  • d) "abc123" in s2 → kiểm tra "abc123" có trong "ababcabca" không?
    • Xâu $s2$ không chứa các chữ số 1, 2, 3. → False (Sai).

Thực hành trang 121 – 122

Nhiệm vụ 1 trang 121

Đề bài: Viết chương trình nhập số tự nhiên $n$ là số học sinh, sau đó nhập họ và tên học sinh. Lưu họ và tên học sinh vào một danh sách. In danh sách ra màn hình, mỗi họ tên trên một dòng.

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

Ý tưởng:

  • Dùng vòng lặp for $n$ lần để nhập họ tên rồi thêm vào danh sách bằng append().
  • Dùng tiếp một vòng lặp for để in từng phần tử trong danh sách.
n = int(input("Nhập số học sinh trong lớp: "))
ds_lop = []
for i in range(n):
    hoten = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
    ds_lop.append(hoten)
print("Danh sách lớp học:")
for i in range(n):
    print(ds_lop[i])

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

Nhập số học sinh trong lớp: 3
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
Nhập họ tên học sinh thứ 3: Lê Văn Cường
Danh sách lớp học:
Nguyễn Văn An
Trần Thị Bình
Lê Văn Cường

Chú ý: Phần str(i+1) để chuyển số thành xâu, rồi nối với các xâu khác bằng phép +.

Nhiệm vụ 2 trang 121 – 122

Đề bài: Nhập một xâu kí tự $S$ từ bàn phím rồi kiểm tra xem xâu $S$ có chứa xâu con "10" không.

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

SGK gợi ý hai cách giải:

Cách 1 – Duyệt kí tự của xâu theo chỉ số:

Ý tưởng: Nếu xâu $S$ chứa xâu con "10" thì sẽ có chỉ số $k$ mà $S[k] = $ "1" và $S[k+1] = $ "0".

S = input("Nhập xâu kí tự bất kì: ")
kq = False
for i in range(len(S)-1):
    if S[i] == "1" and S[i+1] == "0":
        kq = True
        break
if kq:
    print("Xâu gốc có chứa xâu '10'")
else:
    print("Xâu gốc không chứa xâu '10'")

Cách 2 – Dùng toán tử in:

Ý tưởng: Toán tử in kiểm tra trực tiếp một xâu có là xâu con của xâu khác không.

S = input("Nhập xâu kí tự bất kì: ")
s10 = "10"
if s10 in S:
    print("Xâu gốc có chứa xâu '10'")
else:
    print("Xâu gốc không chứa xâu '10'")

Ví dụ khi chạy (nhập S = "Thông tin 105"):

Nhập xâu kí tự bất kì: Thông tin 105
Xâu gốc có chứa xâu '10'

So sánh: Cách 2 ngắn gọn hơn rất nhiều nhờ dùng toán tử in.

Luyện tập trang 122

Luyện tập 1 trang 122

Đề bài: Cho xâu $S$, viết đoạn lệnh trích ra xâu con của $S$ bao gồm ba kí tự đầu tiên của $S$.

Lời giải:

Ý tưởng: Dùng vòng lặp for duyệt từ chỉ số $0$ đến $2$, ghép từng kí tự vào một xâu mới.

ket_qua = ""
for i in range(3):
    ket_qua = ket_qua + S[i]
print(ket_qua)

Ví dụ: Nếu $S = $ "Tin học 10" thì kết quả in ra là "Tin".

Chú ý: Lệnh range(3) tạo ra các giá trị $0, 1, 2$ — đúng $3$ chỉ số đầu tiên của xâu.

Luyện tập 2 trang 122

Đề bài: Viết chương trình kiểm tra xâu $S$ có chứa chữ số không. Thông báo "S có chứa chữ số" hoặc "S không chứa chữ số nào".

Lời giải:

Ý tưởng: Duyệt từng kí tự của $S$, kiểm tra kí tự đó có thuộc xâu "0123456789" không (dùng toán tử in).

S = input("Nhập xâu S: ")
co_chu_so = False
for ch in S:
    if ch in "0123456789":
        co_chu_so = True
        break
if co_chu_so:
    print("S có chứa chữ số")
else:
    print("S không chứa chữ số nào")

Ví dụ khi chạy:

  • Với $S = $ "Lop 10A":
    Nhập xâu S: Lop 10A
    S có chứa chữ số
    
  • Với $S = $ "Hello":
    Nhập xâu S: Hello
    S không chứa chữ số nào
    

Chú ý: Lệnh break dùng để dừng vòng lặp ngay khi tìm thấy chữ số đầu tiên, không cần kiểm tra hết các kí tự còn lại.

Vận dụng trang 122

Vận dụng 1 trang 122

Đề bài: Cho hai xâu $s_1$, $s_2$. Viết đoạn chương trình chèn xâu $s_1$ vào giữa $s_2$, tại vị trí $\text{len}(s_2) // 2$. In kết quả ra màn hình.

Lời giải:

Ý tưởng:

  • Gọi $k = \text{len}(s_2) // 2$ là vị trí cần chèn.
  • Xâu kết quả gồm $3$ phần ghép lại: $k$ kí tự đầu của $s_2$ + xâu $s_1$ + các kí tự còn lại của $s_2$.
s1 = input("Nhập xâu s1: ")
s2 = input("Nhập xâu s2: ")
k = len(s2) // 2
ket_qua = ""
# Lấy k kí tự đầu của s2
for i in range(k):
    ket_qua = ket_qua + s2[i]
# Chèn s1 vào giữa
ket_qua = ket_qua + s1
# Lấy phần còn lại của s2
for i in range(k, len(s2)):
    ket_qua = ket_qua + s2[i]
print("Kết quả:", ket_qua)

Ví dụ khi chạy (nhập $s_1 = $ "XYZ", $s_2 = $ "abcdef"):

  • $\text{len}(s_2) = 6$, nên $k = 6 // 2 = 3$.
  • Phần đầu $s_2$: "abc", chèn $s_1$: "XYZ", phần còn lại: "def".
  • Kết quả: "abcXYZdef".
Nhập xâu s1: XYZ
Nhập xâu s2: abcdef
Kết quả: abcXYZdef

Vận dụng 2 trang 122

Đề bài: Viết chương trình nhập số học sinh và họ tên học sinh. Sau đó đếm xem trong danh sách có bao nhiêu bạn tên là "Hương".

Gợi ý: Sử dụng toán tử in để kiểm tra một xâu có là xâu con của một xâu khác.

Lời giải:

Ý tưởng:

  • Bước 1: Nhập danh sách họ tên giống Nhiệm vụ 1.
  • Bước 2: Duyệt danh sách, kiểm tra xâu "Hương" có trong họ tên không (dùng toán tử in). Nếu có thì tăng biến đếm lên $1$.
n = int(input("Nhập số học sinh: "))
ds_lop = []
for i in range(n):
    hoten = input("Nhập họ tên học sinh thứ " + str(i+1) + ": ")
    ds_lop.append(hoten)

# Đếm số bạn tên Hương
dem = 0
for ten in ds_lop:
    if "Hương" in ten:
        dem = dem + 1
print("Số bạn tên Hương trong lớp là:", dem)

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

Nhập số học sinh: 3
Nhập họ tên học sinh thứ 1: Nguyễn Thị Hương
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ị Hương
Số bạn tên Hương trong lớp là: 2

Chú ý: Vì tên người Việt thường có nhiều phần (họ, đệm, tên), nên ta dùng "Hương" in ten để kiểm tra xâu "Hương" có xuất hiện trong họ tên hay không.

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