Giải Tin Học 10 trang 119
Lời giải chi tiết SGK Lớp 10 · Môn Tin Há»c · Trang 119–123
Bài 24: Xâu kí tự
⚙️ Lưu ý: Phần văn bản gốc bị lỗi mã hóa font. Thầy đã khôi phục lại nội dung chuẩn của Bài 24 và giải đầy đủ tất cả câu hỏi, hoạt động, thực hành, luyện tập, vận dụng.
🔍 Kiến thức cần nhớ
1. Xâu kí tự (string) là gì?
- Xâu kí tự trong Python là một dãy các kí tự Unicode (chữ cái, chữ số, kí hiệu, dấu cách...).
- Xâu được đặt trong cặp dấu nháy đơn
' 'hoặc nháy kép" ". - Có thể coi xâu giống như một danh sách các kí tự, nhưng khác biệt quan trọng: Python KHÔNG cho phép thay đổi từng kí tự của xâu (xâu là kiểu dữ liệu bất biến).
2. Truy cập kí tự và độ dài
- Truy cập từng kí tự qua chỉ số, chỉ số bắt đầu từ 0:
s[0],s[1], ... - Chỉ số hợp lệ: từ
0đếnlen(s) - 1. - Lệnh
len(s)cho biết độ dài (số lượng kí tự) của xâu. - Python không có kiểu dữ liệu riêng cho kí tự; kí tự chính là xâu có độ dài bằng 1.
- Xâu rỗng:
s = ""(độ dài 0).
3. Duyệt kí tự của xâu — có 2 cách
s = "abc"
# Cách 1: duyệt theo CHỈ SỐ
for i in range(len(s)):
print(s[i], end=" ")
# Cách 2: duyệt theo từng KÍ TỰ
for ch in s:
print(ch, end=" ")
4. Toán tử in
s1 in s2trả vềTruenếus1là xâu con củas2, ngược lại trả vềFalse.
💡 Mẹo nhớ: Xâu = danh sách kí tự "đóng băng". Đọc được mọi kí tự bằngs[i], nhưng KHÔNG sửa đượcs[i] = ...(sẽ báo lỗi).
⚙️ Hoạt động khám phá
Hoạt động 1 — Tìm hiểu cấu trúc của xâu kí tự
Qua các ví dụ, ta rút ra: một xâu kí tự được hiểu là một dãy các kí tự, truy cập từng kí tự qua chỉ số bắt đầu từ 0, và len() cho biết số lượng kí tự. Khác với danh sách, không gán lại được từng kí tự của xâu.
Hoạt động 2 — Tìm hiểu lệnh duyệt từng kí tự của xâu
Có hai cách duyệt:
- Theo chỉ số: biến
ichạy từ0đếnlen(s) - 1, kí tự tại vị tríilàs[i]. - Theo kí tự: biến
chlần lượt nhận từng kí tự củastừ đầu đến cuối.
⚙️ Bài tập
Câu hỏi mục 1 (trang 121)
Câu 1
Đề bài: Các xâu kí tự sau có hợp lệ không?
a) "123456+78%9='@'"
b) "1010110&0101001"
c) 'Tin học'
d) 11111111 = 256
Lời giải:
Nguyên tắc: Một xâu hợp lệ phải được đặt trong cặp dấu nháy (đơn hoặc kép). Bên trong dấu nháy có thể chứa bất kì kí tự Unicode nào (chữ, số, dấu phép toán, kí hiệu đặc biệt...).
- a) Hợp lệ — toàn bộ nằm trong dấu nháy kép, các kí tự
+ % = @đều là kí tự bình thường khi nằm trong xâu. - b) Hợp lệ — dãy chữ số và kí hiệu
&đặt trong dấu nháy kép. - c) Hợp lệ — đặt trong dấu nháy đơn, chứa cả dấu cách và chữ có dấu tiếng Việt (Unicode).
- d) KHÔNG hợp lệ — đây là một biểu thức
11111111 = 256, không có dấu nháy nên không phải là xâu kí tự.
⚠️ Lưu ý thi: Đề rất hay "gài" trường hợp thiếu dấu nháy hoặc dấu nháy không khớp (mở"mà đóng'). Khớp dấu nháy là điều kiện đầu tiên để xâu hợp lệ.
Câu 2
Đề bài: Mỗi xâu hợp lệ ở Câu 1 có độ dài bằng bao nhiêu?
Lời giải: Độ dài = số kí tự bên trong dấu nháy (không tính bản thân dấu nháy).
- a)
"123456+78%9='@'"→ đếm:1 2 3 4 5 6 + 7 8 % 9 = ' @ '→ 15 kí tự. - b)
"1010110&0101001"→ 7 + 1 + 7 = 15 kí tự. - c)
'Tin học'→T i n (dấu cách) h ọ c→ 7 kí tự.
💡 Mẹo nhớ: Đếm độ dài nhớ tính cả dấu cách và các kí tự đặc biệt. Trong Python kiểm tra nhanh bằng len(s).
Câu hỏi mục 2 (trang 122)
Câu 1
Đề bài: Sau khi thực hiện các lệnh sau, biến kt sẽ có giá trị bao nhiêu?
s = "81723"
kt = ""
for ch in s:
if int(ch) % 2 == 0:
kt = kt + ch
Cách 1 — Lập bảng theo dõi vòng lặp
Chương trình duyệt từng kí tự của s, đổi sang số bằng int(ch), nếu chẵn thì nối vào kt.
ch | int(ch) | int(ch) % 2 == 0? | kt sau bước này |
|---|---|---|---|
| '8' | 8 | Đúng (8 chẵn) | "8" |
| '1' | 1 | Sai | "8" |
| '7' | 7 | Sai | "8" |
| '2' | 2 | Đúng (2 chẵn) | "82" |
| '3' | 3 | Sai | "82" |
Kết quả: kt = "82"
Cách 2 — Lọc nhanh chữ số chẵn
Chỉ cần nhặt các chữ số chẵn trong "81723" theo đúng thứ tự: các chữ số là 8, 1, 7, 2, 3 → chữ số chẵn là 8 và 2 → ghép lại được "82".
Kết quả: kt = "82"
⚠️ Lưu ý thi:ktlà xâu (""), nênkt + chlà phép nối xâu, không phải cộng số. Kết quả là"82"(xâu) chứ không phải số 10.
Câu 2
Đề bài: Cho s1 = "12", s2 = "012345". Các biểu thức lôgic sau cho kết quả đúng hay sai?
a) s1 in s2
b) s1 + s1 in s2
c) "12" in s2
d) "123" in s2
Lời giải: Toán tử in kiểm tra một xâu có là xâu con liên tiếp của xâu kia không. Xâu s2 = "012345" gồm các kí tự: 0 1 2 3 4 5.
- a)
s1 in s2="12" in "012345": "012345" chứa cụm "12" (vị trí 1–2) → Đúng (True). - b)
s1 + s1 in s2="1212" in "012345": không có cụm "1212" → Sai (False). - c)
"12" in s2="12" in "012345": có "12" → Đúng (True). - d)
"123" in s2="123" in "012345": có cụm "123" (vị trí 1–2–3) → Đúng (True).
⚠️ Lưu ý thi: in đòi hỏi các kí tự phải liền nhau và đúng thứ tự. Câu b) sai vì "1212" không xuất hiện liên tục trong "012345".
⚙️ Thực hành (trang 122)
Nhiệm vụ 1
Đề 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 từng học sinh, lưu 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.
Cách 1 — Theo hướng dẫn SGK (duyệt theo chỉ số)
n = int(input("Nhập số học sinh: "))
ds = []
for i in range(n):
hoten = input("Nhập họ tên học sinh thứ " + str(i + 1) + ": ")
ds.append(hoten)
print("Danh sách học sinh:")
for i in range(n):
print(ds[i])
Cách 2 — Duyệt trực tiếp theo phần tử (gọn hơn)
n = int(input("Nhập số học sinh: "))
ds = []
for i in range(n):
ds.append(input("Họ tên học sinh thứ " + str(i + 1) + ": "))
print("Danh sách học sinh:")
for hoten in ds:
print(hoten)
Nhiệm vụ 2
Đề 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.
Cách 1 — Duyệt kí tự theo chỉ số
Nếu S chứa xâu con "10" thì tồn tại chỉ số k mà S[k] == "1" và S[k+1] == "0".
S = input("Nhập xâu kí tự S: ")
found = False
for i in range(len(S) - 1):
if S[i] == "1" and S[i + 1] == "0":
found = True
break
if found:
print('Xâu S có chứa xâu con "10"')
else:
print('Xâu S không chứa xâu con "10"')
Cách 2 — Dùng toán tử in (nhanh, gọn)
S = input("Nhập xâu kí tự S: ")
if "10" in S:
print('Xâu S có chứa xâu con "10"')
else:
print('Xâu S không chứa xâu con "10"')
💡 Mẹo nhớ: Khi cần kiểm tra "có chứa xâu con hay không", dùng in là ngắn gọn nhất. Cách duyệt chỉ số dùng khi cần biết thêm vị trí xuất hiện.
⚙️ Luyện tập (trang 123)
Câu 1
Đề bài: Cho xâu S, viết đoạn lệnh trích ra xâu con của S gồm ba kí tự đầu tiên của S.
Cách 1 — Cắt xâu đầy đủ
xaucon = S[0:3]
print(xaucon)
Cách 2 — Viết gọn (bỏ chỉ số 0)
xaucon = S[:3] # tương đương S[0:3]
print(xaucon)
Cú pháp S[a:b] lấy các kí tự từ chỉ số a đến b - 1, nên S[0:3] lấy kí tự ở vị trí 0, 1, 2 — đúng ba kí tự đầu.
⚠️ Lưu ý thi: S[0:3] lấy 3 kí tự (vị trí 0,1,2), không lấy kí tự ở vị trí 3. Đây là lỗi nhầm rất phổ biến.
Câu 2
Đề 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".
Cách 1 — Duyệt từng kí tự, so với tập chữ số
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")
Cách 2 — Dùng phương thức isdigit()
S = input("Nhập xâu S: ")
co_chu_so = False
for ch in S:
if ch.isdigit():
co_chu_so = True
break
print("S có chứa chữ số" if co_chu_so else "S không chứa chữ số nào")
ch.isdigit() trả về True nếu kí tự là chữ số. Dùng break để dừng ngay khi gặp chữ số đầu tiên, không cần duyệt hết.
⚙️ Vận dụng (trang 123)
Câu 1
Đề bài: Cho hai xâu s1, s2. Viết đoạn chương trình chèn xâu s1 vào giữa s2 tại vị trí len(s2)//2. In kết quả ra màn hình.
Cách 1 — Cắt và nối xâu
s1 = input("Nhập xâu s1: ")
s2 = input("Nhập xâu s2: ")
vt = len(s2) // 2 # vị trí chèn (chính giữa)
kq = s2[:vt] + s1 + s2[vt:]
print(kq)
Ý tưởng: cắt s2 thành nửa đầu s2[:vt] và nửa sau s2[vt:], rồi "kẹp" s1 vào giữa.
Cách 2 — Minh họa với ví dụ cụ thể
Giả sử s2 = "ABCDEF" (độ dài 6) → vt = 6 // 2 = 3; s1 = "xy".
s2[:3]= "ABC"s2[3:]= "DEF"kq = "ABC" + "xy" + "DEF" = "ABCxyDEF"
💡 Mẹo nhớ: Phép // là chia lấy phần nguyên, luôn cho chỉ số nguyên hợp lệ để cắt xâu.
Câu 2
Đề 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".
Cách 1 — Tách lấy tên (từ cuối của họ tên)
Trong tiếng Việt, tên thường là từ cuối cùng trong họ tên. Dùng split() để tách rồi lấy phần tử cuối.
n = int(input("Nhập số học sinh: "))
ds = []
for i in range(n):
ds.append(input("Họ tên học sinh thứ " + str(i + 1) + ": "))
dem = 0
for hoten in ds:
ten = hoten.split()[-1] # lấy từ cuối cùng làm tên
if ten == "Hương":
dem = dem + 1
print("Số bạn tên là Hương:", dem)
Cách 2 — Dùng toán tử in (đếm cả khi tên nằm trong họ tên)
n = int(input("Nhập số học sinh: "))
dem = 0
for i in range(n):
hoten = input("Họ tên học sinh thứ " + str(i + 1) + ": ")
if "Hương" in hoten:
dem += 1
print("Số bạn tên là Hương:", dem)
⚠️ Lưu ý: Cách 2 chỉ kiểm tra xâu "Hương" có xuất hiện trong họ tên không, nên có thể đếm nhầm những bạn có "Hương" ở phần lót (ví dụ "Nguyễn Hương Lan"). Cách 1 chuẩn hơn khi muốn đếm đúng tên gọi là "Hương".
🎯 Ghi nhớ: - Xâu là dãy kí tự Unicode đặt trong dấu nháy, truy cập qua chỉ số từ 0 đếnlen(s) - 1, và không sửa được từng kí tự. - Hai cách duyệt xâu: theo chỉ số (for i in range(len(s))) và theo kí tự (for ch in s). -len(s)cho độ dài;s[a:b]cắt xâu con;s1 in s2kiểm tra xâu con. - Bộ ba thao tác quan trọng nhất hay ra thi: cắt xâu, duyệt xâu, kiểm train.
