Xử lý chuỗi ký tự (String)
Chuyên đề này nối tiếp chuyên đề 3 Xử lý danh sách (List). Trong chuyên đề này, chúng ta sẽ học và giải các bài tập liên quan đến chuỗi ký tự (string): tên, câu, mật khẩu, địa chỉ email… Gồm 2 phần: ôn lý thuyết chuỗi, sau đó thực hành 26 bài xếp từ dễ đến khó - ghép chuỗi, đếm ký tự, lấy chuỗi con, thay thế, tìm kiếm, tách câu thành danh sách từ…
Bạn có thể tải file .pdf ở đây: Xử lý chuỗi ký tự (String)
Phần 1 - Lý thuyết: Chuỗi ký tự
Phần tiêu đề “Phần 1 - Lý thuyết: Chuỗi ký tự”Chuỗi là gì?
Phần tiêu đề “Chuỗi là gì?”Chuỗi là một dãy ký tự: chữ cái, chữ số, dấu cách, dấu câu… Ví dụ
Scratch, Nguyen Van An, abc123. Câu trả lời người dùng gõ vào khối
hỏi ... và đợi (lưu trong khối trả lời) luôn là một chuỗi. Các ký tự
trong chuỗi được đánh số từ 1: trong chuỗi Scratch, ký tự thứ 1 là
S, ký tự thứ 7 là h.
4 khối xử lý chuỗi
Phần tiêu đề “4 khối xử lý chuỗi”Cả 4 khối đều nằm trong nhóm Các toán tử (màu xanh lá). Xem thêm ở bài Toán tử.
(kết hợp [Xin chào, ] [Scratch!]) (ký tự thứ (1) của chuỗi [Scratch]) (độ dài của [Scratch]) <[Scratch] chứa ký tự [cra]?>
kết hợpghép 2 chuỗi thành 1:Xin chào, Scratch!. Muốn ghép 3 chuỗi trở lên thì lồng nhiều khốikết hợpvào nhau.ký tự thứ () của chuỗi ()lấy ra 1 ký tự ở vị trí cho trước. Nếu vị trí vượt quá độ dài chuỗi, khối trả về chuỗi rỗng.độ dài củatrả về số ký tự của chuỗi (tính cả dấu cách).chứa ký tự ?kiểm tra chuỗi thứ nhất có chứa chuỗi thứ hai hay không - chuỗi thứ hai có thể dài hơn 1 ký tự (craở ví dụ trên).
Duyệt qua từng ký tự
Phần tiêu đề “Duyệt qua từng ký tự”khi bấm vào @greenFlag hỏi [Nhập một chuỗi:] và đợi đặt [chuỗi v] thành (trả lời) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nói (ký tự thứ (i) của chuỗi (chuỗi)) trong (0.5) giây thay đổi [i v] một lượng (1) end
Giống hệt cách duyệt danh sách - chỉ thay kích thước của bằng độ dài của, và phần tử thứ bằng ký tự thứ.
Dựng một chuỗi mới (mẫu dùng lại nhiều lần)
Phần tiêu đề “Dựng một chuỗi mới (mẫu dùng lại nhiều lần)”đặt [kết quả v] thành [] đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> đặt [kết quả v] thành (kết hợp (kết quả) (ký tự thứ (i) của chuỗi (chuỗi))) thay đổi [i v] một lượng (1) end
Ví dụ với chuỗi abc, biến kết quả lớn dần qua từng vòng lặp:
| Vòng lặp | i | Ký tự lấy ra | kết quả sau vòng lặp |
|---|---|---|---|
| Trước khi lặp | - | - | (rỗng) |
| 1 | 1 | a | a |
| 2 | 2 | b | ab |
| 3 | 3 | c | abc |
Bắt đầu từ một chuỗi rỗng (ô trống), rồi mỗi vòng kết hợp thêm một
ký tự vào cuối - giống như “cộng dồn” nhưng với chữ. Đoạn trên chép lại
nguyên chuỗi; các bài phía dưới chỉ việc thêm nếu để chọn ký tự nào được
thêm, hoặc thêm ký tự khác vào.
Mẹo: kiểm tra ký tự thuộc nhóm nào
Phần tiêu đề “Mẹo: kiểm tra ký tự thuộc nhóm nào”<[0123456789] chứa ký tự (ký tự)?> <[aeiouy] chứa ký tự (ký tự)?>
Muốn biết một ký tự có phải chữ số (hay nguyên âm…) không, ta viết sẵn
cả nhóm thành một chuỗi mẫu rồi hỏi chuỗi mẫu có chứa ký tự đó không -
gọn hơn nhiều so với so sánh = với từng giá trị rồi nối bằng hoặc.
Phần 2 - Thực hành: 26 bài xử lý chuỗi
Phần tiêu đề “Phần 2 - Thực hành: 26 bài xử lý chuỗi”Mỗi bài có đánh dấu độ khó: ⭐ dễ, ⭐⭐ trung bình, ⭐⭐⭐ khó. Học sinh tiểu học nên làm hết các bài ⭐ và ⭐⭐ (Nhóm 1-3); các bài ⭐⭐⭐ (Nhóm 4-5) dành cho học sinh THCS hoặc các bạn muốn thử thách thêm.
Nhóm 1: Làm quen với chuỗi
Phần tiêu đề “Nhóm 1: Làm quen với chuỗi”Chưa cần vòng lặp - chỉ dùng các khối chuỗi đã học ở Phần 1.
Bài 1: Ghép họ và tên ⭐
Phần tiêu đề “Bài 1: Ghép họ và tên ⭐”Hỏi họ, rồi hỏi tên của người dùng, sau đó nói họ tên đầy đủ (có dấu cách
ở giữa). Ví dụ họ Nguyen, tên An → Nguyen An.
Xem lời giải
khi bấm vào @greenFlag hỏi [Họ của bạn là gì?] và đợi đặt [họ v] thành (trả lời) hỏi [Tên của bạn là gì?] và đợi nói (kết hợp (kết hợp (họ) [ ]) (trả lời))
Phải cất họ vào biến họ trước khi hỏi câu thứ hai, vì khối trả lời chỉ
nhớ câu trả lời mới nhất. Chuỗi [ ] ở giữa là một dấu cách - thiếu nó
thì họ và tên sẽ dính liền nhau: NguyenAn.
Bài 2: Lời chào theo tên ⭐
Phần tiêu đề “Bài 2: Lời chào theo tên ⭐”Hỏi tên người dùng, sau đó nói Xin chào An! Tên bạn có 2 ký tự.
Xem lời giải
khi bấm vào @greenFlag hỏi [Bạn tên là gì?] và đợi nói (kết hợp (kết hợp [Xin chào ] (trả lời)) (kết hợp [! Tên bạn có ] (kết hợp (độ dài của (trả lời)) [ ký tự.])))
Câu trả lời gồm 5 mảnh nên cần lồng 4 khối kết hợp. Nhớ để một dấu
cách ở cuối Xin chào và đầu ký tự., nếu không các chữ sẽ dính vào
nhau.
Bài 3: Ký tự đầu và ký tự cuối ⭐
Phần tiêu đề “Bài 3: Ký tự đầu và ký tự cuối ⭐”Nhập một chuỗi, nói ra ký tự đầu tiên và ký tự cuối cùng của chuỗi.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một chuỗi:] và đợi đặt [chuỗi v] thành (trả lời) nói (kết hợp (kết hợp [Đầu: ] (ký tự thứ (1) của chuỗi (chuỗi))) (kết hợp [ - Cuối: ] (ký tự thứ (độ dài của (chuỗi)) của chuỗi (chuỗi))))
Ký tự cuối cùng nằm ở vị trí bằng đúng độ dài của chuỗi.
Bài 4: Tên dài hay ngắn ⭐
Phần tiêu đề “Bài 4: Tên dài hay ngắn ⭐”Hỏi tên người dùng. Nếu tên có nhiều hơn 5 ký tự thì nói Tên của bạn khá dài!, ngược lại nói Tên của bạn ngắn gọn!.
Xem lời giải
khi bấm vào @greenFlag hỏi [Bạn tên là gì?] và đợi nếu <(độ dài của (trả lời)) > (5)> thì nói [Tên của bạn khá dài!] nếu không thì nói [Tên của bạn ngắn gọn!] end
độ dài của cho ra một số, nên dùng được ngay trong phép so sánh >
như mọi số khác.
Nhóm 2: Duyệt từng ký tự
Phần tiêu đề “Nhóm 2: Duyệt từng ký tự”Dùng vòng lặp để đi qua từng ký tự của chuỗi, đếm hoặc dựng dần một chuỗi mới.
Bài 5: Đánh số từng ký tự ⭐
Phần tiêu đề “Bài 5: Đánh số từng ký tự ⭐”Nhập một chuỗi, nói lần lượt từng ký tự kèm số thứ tự của nó. Ví dụ
Meo → 1: M, 2: e, 3: o.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một chuỗi:] và đợi đặt [chuỗi v] thành (trả lời) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nói (kết hợp (kết hợp (i) [: ]) (ký tự thứ (i) của chuỗi (chuỗi))) trong (1) giây thay đổi [i v] một lượng (1) end
Chính là đoạn duyệt qua từng ký tự ở Phần 1, chỉ ghép thêm số thứ tự
i vào trước mỗi ký tự - nhờ vậy dễ thấy ký tự thứ mấy là chữ gì.
Bài 6: Lặp lại chuỗi N lần ⭐
Phần tiêu đề “Bài 6: Lặp lại chuỗi N lần ⭐”Nhập một chuỗi và số N, tạo chuỗi mới gồm chuỗi đó lặp lại N lần. Ví dụ
ha, N = 3 → hahaha.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một chuỗi:] và đợi đặt [chuỗi v] thành (trả lời) hỏi [Lặp lại mấy lần?] và đợi đặt [kết quả v] thành [] lặp lại (trả lời) đặt [kết quả v] thành (kết hợp (kết quả) (chuỗi)) end nói (kết quả)
Bài 7: Đếm dấu cách ⭐
Phần tiêu đề “Bài 7: Đếm dấu cách ⭐”Nhập một câu, đếm xem câu đó có bao nhiêu dấu cách. Ví dụ toi di hoc có
2 dấu cách.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một câu:] và đợi đặt [chuỗi v] thành (trả lời) đặt [đếm v] thành (0) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <(ký tự thứ (i) của chuỗi (chuỗi)) = [ ]> thì thay đổi [đếm v] một lượng (1) end thay đổi [i v] một lượng (1) end nói (kết hợp [Số dấu cách: ] (đếm))
Ô [ ] trong phép so sánh chứa đúng một dấu cách (không phải ô trống).
Bài 8: Đếm chữ a ⭐
Phần tiêu đề “Bài 8: Đếm chữ a ⭐”Nhập một câu, đếm xem chữ a xuất hiện bao nhiêu lần. Ví dụ ba ma an na có 4 chữ a.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một câu:] và đợi đặt [chuỗi v] thành (trả lời) đặt [đếm v] thành (0) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <(ký tự thứ (i) của chuỗi (chuỗi)) = [a]> thì thay đổi [đếm v] một lượng (1) end thay đổi [i v] một lượng (1) end nói (kết hợp [Số chữ a: ] (đếm))
Giống hệt Bài 7, chỉ đổi ký tự cần so sánh. Vì Scratch không phân biệt
hoa/thường, chữ A viết hoa cũng được đếm.
Nhóm 3: Kiểm tra và biến đổi chuỗi
Phần tiêu đề “Nhóm 3: Kiểm tra và biến đổi chuỗi”Kết hợp vòng lặp với nếu, mẹo chuỗi mẫu và mẫu dựng chuỗi mới để kiểm tra, xoá, thay thế ký tự.
Bài 9: Đếm chữ số trong chuỗi ⭐⭐
Phần tiêu đề “Bài 9: Đếm chữ số trong chuỗi ⭐⭐”Nhập một chuỗi bất kỳ, đếm xem có bao nhiêu ký tự là chữ số. Ví dụ
lop 6A2 nam 2025 có 6 chữ số.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một chuỗi:] và đợi đặt [chuỗi v] thành (trả lời) đặt [đếm v] thành (0) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <[0123456789] chứa ký tự (ký tự thứ (i) của chuỗi (chuỗi))?> thì thay đổi [đếm v] một lượng (1) end thay đổi [i v] một lượng (1) end nói (kết hợp [Số chữ số: ] (đếm))
Dùng mẹo chuỗi mẫu ở Phần 1: ký tự là chữ số khi chuỗi 0123456789
chứa nó.
Bài 10: Tổng các chữ số trong chuỗi ⭐⭐
Phần tiêu đề “Bài 10: Tổng các chữ số trong chuỗi ⭐⭐”Nhập một chuỗi gồm cả chữ và số, tính tổng các chữ số xuất hiện trong
chuỗi. Ví dụ a1b2c3 → 1 + 2 + 3 = 6.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một chuỗi:] và đợi đặt [chuỗi v] thành (trả lời) đặt [tổng v] thành (0) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <[0123456789] chứa ký tự (ký tự thứ (i) của chuỗi (chuỗi))?> thì thay đổi [tổng v] một lượng (ký tự thứ (i) của chuỗi (chuỗi)) end thay đổi [i v] một lượng (1) end nói (kết hợp [Tổng các chữ số: ] (tổng))
Giống Bài 9, nhưng thay vì cộng thêm 1, ta cộng thêm chính ký tự đó -
Scratch tự hiểu ký tự 3 là số 3 khi dùng trong phép cộng.
Bài 11: Chèn dấu gạch giữa các ký tự ⭐⭐
Phần tiêu đề “Bài 11: Chèn dấu gạch giữa các ký tự ⭐⭐”Nhập một chuỗi, chèn dấu - vào giữa các ký tự. Ví dụ Scratch →
S-c-r-a-t-c-h.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một chuỗi:] và đợi đặt [chuỗi v] thành (trả lời) đặt [kết quả v] thành (ký tự thứ (1) của chuỗi (chuỗi)) đặt [i v] thành (2) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> đặt [kết quả v] thành (kết hợp (kết hợp (kết quả) [-]) (ký tự thứ (i) của chuỗi (chuỗi))) thay đổi [i v] một lượng (1) end nói (kết quả)
Lấy sẵn ký tự đầu tiên, rồi từ ký tự thứ 2 trở đi mỗi lần thêm - trước
ký tự - nhờ vậy không bị thừa dấu - ở cuối chuỗi.
Bài 12: Xoá một ký tự khỏi chuỗi ⭐⭐
Phần tiêu đề “Bài 12: Xoá một ký tự khỏi chuỗi ⭐⭐”Nhập một chuỗi và một ký tự, xoá mọi lần xuất hiện của ký tự đó. Ví dụ
banana, xoá a → bnn.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một chuỗi:] và đợi đặt [chuỗi v] thành (trả lời) hỏi [Xoá ký tự nào?] và đợi đặt [kết quả v] thành [] đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <không phải <(ký tự thứ (i) của chuỗi (chuỗi)) = (trả lời)>> thì đặt [kết quả v] thành (kết hợp (kết quả) (ký tự thứ (i) của chuỗi (chuỗi))) end thay đổi [i v] một lượng (1) end nói (kết quả)
Không cần “xoá” thật - chỉ cần không chép ký tự đó sang chuỗi mới.
Lưu ý: xoá a thì A cũng bị xoá, vì Scratch không phân biệt hoa/thường.
Bài 13: Thay thế ký tự ⭐⭐
Phần tiêu đề “Bài 13: Thay thế ký tự ⭐⭐”Nhập một chuỗi, ký tự cũ và ký tự mới, thay mọi ký tự cũ bằng ký tự mới.
Ví dụ banana, thay a bằng @ → b@n@n@.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một chuỗi:] và đợi đặt [chuỗi v] thành (trả lời) hỏi [Ký tự cũ:] và đợi đặt [cũ v] thành (trả lời) hỏi [Ký tự mới:] và đợi đặt [mới v] thành (trả lời) đặt [kết quả v] thành [] đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <(ký tự thứ (i) của chuỗi (chuỗi)) = (cũ)> thì đặt [kết quả v] thành (kết hợp (kết quả) (mới)) nếu không thì đặt [kết quả v] thành (kết hợp (kết quả) (ký tự thứ (i) của chuỗi (chuỗi))) end thay đổi [i v] một lượng (1) end nói (kết quả)
Bài 14: Lấy chuỗi con ⭐⭐
Phần tiêu đề “Bài 14: Lấy chuỗi con ⭐⭐”Nhập một chuỗi và hai vị trí a, b (a ≤ b). Lấy ra phần chuỗi từ ký tự thứ a
đến ký tự thứ b. Ví dụ Scratch, a = 2, b = 4 → cra.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một chuỗi:] và đợi đặt [chuỗi v] thành (trả lời) hỏi [Từ vị trí:] và đợi đặt [a v] thành (trả lời) hỏi [Đến vị trí:] và đợi đặt [b v] thành (trả lời) đặt [kết quả v] thành [] đặt [i v] thành (a) lặp lại cho đến khi <(i) > (b)> đặt [kết quả v] thành (kết hợp (kết quả) (ký tự thứ (i) của chuỗi (chuỗi))) thay đổi [i v] một lượng (1) end nói (kết quả)
Scratch không có sẵn khối lấy chuỗi con, nên ta tự dựng bằng mẫu ở Phần 1,
chỉ đổi điểm bắt đầu thành a và điểm dừng thành b.
Bài 15: Đếm nguyên âm và phụ âm ⭐⭐
Phần tiêu đề “Bài 15: Đếm nguyên âm và phụ âm ⭐⭐”Nhập một câu tiếng Việt không dấu, đếm số nguyên âm (a, e, i, o, u, y) và số phụ âm (các chữ cái còn lại). Dấu cách, chữ số, dấu câu không tính.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một câu:] và đợi đặt [chuỗi v] thành (trả lời) đặt [nguyên âm v] thành (0) đặt [phụ âm v] thành (0) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> đặt [ký tự v] thành (ký tự thứ (i) của chuỗi (chuỗi)) nếu <[aeiouy] chứa ký tự (ký tự)?> thì thay đổi [nguyên âm v] một lượng (1) nếu không thì nếu <[bcdfghjklmnpqrstvwxz] chứa ký tự (ký tự)?> thì thay đổi [phụ âm v] một lượng (1) end end thay đổi [i v] một lượng (1) end nói (kết hợp (kết hợp [Nguyên âm: ] (nguyên âm)) (kết hợp [ - Phụ âm: ] (phụ âm)))
Phải kiểm tra phụ âm bằng một chuỗi mẫu riêng thay vì dùng nếu không thì luôn - nếu không, dấu cách và chữ số cũng bị đếm là phụ âm. Vì Scratch
không phân biệt hoa/thường, chữ A, B… viết hoa cũng được đếm đúng.
Bài 16: Viết tắt họ tên ⭐⭐
Phần tiêu đề “Bài 16: Viết tắt họ tên ⭐⭐”Nhập họ tên (các từ cách nhau đúng 1 dấu cách), in ra chữ viết tắt gồm chữ
cái đầu của mỗi từ. Ví dụ Nguyen Van An → NVA.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập họ tên:] và đợi đặt [chuỗi v] thành (trả lời) đặt [kết quả v] thành (ký tự thứ (1) của chuỗi (chuỗi)) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <(ký tự thứ (i) của chuỗi (chuỗi)) = [ ]> thì đặt [kết quả v] thành (kết hợp (kết quả) (ký tự thứ ((i) + (1)) của chuỗi (chuỗi))) end thay đổi [i v] một lượng (1) end nói (kết quả)
Chữ cái đầu của mỗi từ là ký tự đứng ngay sau một dấu cách (vị trí
i + 1), riêng từ đầu tiên thì lấy sẵn ký tự thứ 1.
Nhóm 4: Thử thách
Phần tiêu đề “Nhóm 4: Thử thách”Bài 17: Kiểm tra mật khẩu mạnh ⭐⭐⭐
Phần tiêu đề “Bài 17: Kiểm tra mật khẩu mạnh ⭐⭐⭐”Nhập một mật khẩu. Mật khẩu mạnh khi có ít nhất 8 ký tự, có ít nhất 1
chữ số và ít nhất 1 chữ cái. Nói Mật khẩu mạnh hoặc Mật khẩu yếu.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập mật khẩu:] và đợi đặt [chuỗi v] thành (trả lời) đặt [có số v] thành (0) đặt [có chữ v] thành (0) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <[0123456789] chứa ký tự (ký tự thứ (i) của chuỗi (chuỗi))?> thì đặt [có số v] thành (1) end nếu <[abcdefghijklmnopqrstuvwxyz] chứa ký tự (ký tự thứ (i) của chuỗi (chuỗi))?> thì đặt [có chữ v] thành (1) end thay đổi [i v] một lượng (1) end nếu <<(độ dài của (chuỗi)) > (7)> và <<(có số) = (1)> và <(có chữ) = (1)>>> thì nói [Mật khẩu mạnh] nếu không thì nói [Mật khẩu yếu] end
Dùng 2 biến “cờ” (có số, có chữ) bắt đầu bằng 0, chuyển thành 1 khi gặp
ký tự phù hợp. Cuối cùng gộp cả 3 điều kiện bằng và.
Bài 18: Kiểm tra email đơn giản ⭐⭐⭐
Phần tiêu đề “Bài 18: Kiểm tra email đơn giản ⭐⭐⭐”Nhập một địa chỉ email, kiểm tra theo 2 quy tắc đơn giản: có ký tự @
nhưng không đứng đầu, và có dấu . ở phía sau @. Ví dụ an@gmail.com
hợp lệ; an.gmail.com, @gmail.com, an@gmail không hợp lệ.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập email:] và đợi đặt [chuỗi v] thành (trả lời) đặt [vị trí @ v] thành (0) đặt [có chấm v] thành (0) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <(ký tự thứ (i) của chuỗi (chuỗi)) = [@]> thì đặt [vị trí @ v] thành (i) end nếu <<(ký tự thứ (i) của chuỗi (chuỗi)) = [.]> và <(vị trí @) > (0)>> thì đặt [có chấm v] thành (1) end thay đổi [i v] một lượng (1) end nếu <<(vị trí @) > (1)> và <(có chấm) = (1)>> thì nói [Email hợp lệ] nếu không thì nói [Email không hợp lệ] end
Dấu . chỉ được tính khi đã gặp @ trước đó (vị trí @ > 0). Còn
vị trí @ > 1 đảm bảo có @ và @ không đứng đầu.
Bài 19: Kiểm tra đuôi tệp ⭐⭐⭐
Phần tiêu đề “Bài 19: Kiểm tra đuôi tệp ⭐⭐⭐”Nhập tên một tệp và một đuôi, kiểm tra tên tệp có kết thúc bằng đuôi đó
không. Ví dụ tro choi.sb3 có đuôi .sb3, còn anh.png thì không.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập tên tệp:] và đợi đặt [tên tệp v] thành (trả lời) hỏi [Nhập đuôi cần kiểm tra:] và đợi đặt [đuôi v] thành (trả lời) đặt [đoạn v] thành [] đặt [i v] thành ((độ dài của (tên tệp)) - (độ dài của (đuôi))) lặp lại (độ dài của (đuôi)) thay đổi [i v] một lượng (1) đặt [đoạn v] thành (kết hợp (đoạn) (ký tự thứ (i) của chuỗi (tên tệp))) end nếu <(đoạn) = (đuôi)> thì nói [Đúng đuôi tệp] nếu không thì nói [Sai đuôi tệp] end
Chỉ cần cắt ra đoạn cuối của tên tệp, dài bằng đúng độ dài của đuôi,
rồi so sánh. Chú ý i được tăng trước khi lấy ký tự, nên đoạn cắt ra
bắt đầu ở vị trí độ dài tên tệp - độ dài đuôi + 1.
Bài 20: Tìm vị trí chuỗi con ⭐⭐⭐
Phần tiêu đề “Bài 20: Tìm vị trí chuỗi con ⭐⭐⭐”Nhập chuỗi lớn và chuỗi con, tìm vị trí đầu tiên chuỗi con xuất hiện
trong chuỗi lớn (không dùng khối chứa ký tự). Ví dụ tìm na trong
banana → vị trí 3. Nếu không có thì báo Không tìm thấy.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập chuỗi lớn:] và đợi đặt [chuỗi v] thành (trả lời) hỏi [Nhập chuỗi con:] và đợi đặt [con v] thành (trả lời) đặt [vị trí v] thành (0) đặt [i v] thành (1) lặp lại cho đến khi <<(i) > (độ dài của (chuỗi))> hoặc <(vị trí) > (0)>> đặt [đoạn v] thành [] đặt [j v] thành (0) lặp lại (độ dài của (con)) đặt [đoạn v] thành (kết hợp (đoạn) (ký tự thứ ((i) + (j)) của chuỗi (chuỗi))) thay đổi [j v] một lượng (1) end nếu <(đoạn) = (con)> thì đặt [vị trí v] thành (i) end thay đổi [i v] một lượng (1) end nếu <(vị trí) = (0)> thì nói [Không tìm thấy] nếu không thì nói (kết hợp [Vị trí: ] (vị trí)) end
Tại mỗi vị trí i, vòng lặp bên trong cắt ra một đoạn dài bằng chuỗi con
(bắt đầu từ i, giống Bài 14) rồi so sánh với chuỗi con. Vòng lặp ngoài
dừng ngay khi đã tìm thấy.
Bài 21: Nén chuỗi ⭐⭐⭐
Phần tiêu đề “Bài 21: Nén chuỗi ⭐⭐⭐”Nhập một chuỗi chữ cái, nén các ký tự giống nhau đứng liền nhau thành
“ký tự + số lần”. Ví dụ aaabbc → a3b2c1.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một chuỗi:] và đợi đặt [chuỗi v] thành (trả lời) đặt [kết quả v] thành [] đặt [đếm v] thành (1) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <(ký tự thứ (i) của chuỗi (chuỗi)) = (ký tự thứ ((i) + (1)) của chuỗi (chuỗi))> thì thay đổi [đếm v] một lượng (1) nếu không thì đặt [kết quả v] thành (kết hợp (kết quả) (kết hợp (ký tự thứ (i) của chuỗi (chuỗi)) (đếm))) đặt [đếm v] thành (1) end thay đổi [i v] một lượng (1) end nói (kết quả)
So sánh mỗi ký tự với ký tự ngay sau nó: còn giống thì đếm tiếp, khác
thì ghi “ký tự + số lần” rồi đếm lại từ 1. Ở ký tự cuối, ký tự thứ (i + 1)
là chuỗi rỗng nên luôn khác - nhóm cuối cùng tự được ghi vào.
Bài 22: Đảo thứ tự các từ ⭐⭐⭐
Phần tiêu đề “Bài 22: Đảo thứ tự các từ ⭐⭐⭐”Nhập một câu (các từ cách nhau đúng 1 dấu cách), in ra câu với các từ theo
thứ tự ngược lại. Ví dụ hom nay troi dep → dep troi nay hom.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một câu:] và đợi đặt [chuỗi v] thành (kết hợp (trả lời) [ ]) đặt [từ v] thành [] đặt [kết quả v] thành [] đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <(ký tự thứ (i) của chuỗi (chuỗi)) = [ ]> thì đặt [kết quả v] thành (kết hợp (kết hợp (từ) [ ]) (kết quả)) đặt [từ v] thành [] nếu không thì đặt [từ v] thành (kết hợp (từ) (ký tự thứ (i) của chuỗi (chuỗi))) end thay đổi [i v] một lượng (1) end nói (kết quả)
Hai kỹ thuật mới:
- Thêm một dấu cách vào cuối câu ngay từ đầu, để từ cuối cùng cũng kết thúc bằng dấu cách như mọi từ khác.
- Mỗi khi đọc xong một từ, ghép từ đó vào phía trước
kết quả(thay vì phía sau) - từ đọc sau cùng sẽ đứng đầu, nên thứ tự bị đảo ngược.
Bài 23: Từ dài nhất trong câu ⭐⭐⭐
Phần tiêu đề “Bài 23: Từ dài nhất trong câu ⭐⭐⭐”Nhập một câu (các từ cách nhau đúng 1 dấu cách), tìm từ dài nhất. Nếu có nhiều từ dài bằng nhau thì lấy từ xuất hiện đầu tiên.
Xem lời giải
khi bấm vào @greenFlag hỏi [Nhập một câu:] và đợi đặt [chuỗi v] thành (kết hợp (trả lời) [ ]) đặt [từ v] thành [] đặt [dài nhất v] thành [] đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <(ký tự thứ (i) của chuỗi (chuỗi)) = [ ]> thì nếu <(độ dài của (từ)) > (độ dài của (dài nhất))> thì đặt [dài nhất v] thành (từ) end đặt [từ v] thành [] nếu không thì đặt [từ v] thành (kết hợp (từ) (ký tự thứ (i) của chuỗi (chuỗi))) end thay đổi [i v] một lượng (1) end nói (kết hợp [Từ dài nhất: ] (dài nhất))
Dùng lại cách tách từ của Bài 22, kết hợp với cách tìm lớn nhất ở chuyên đề danh sách - chỉ khác là so sánh độ dài của từ.
Nhóm 5: Chuỗi và danh sách
Phần tiêu đề “Nhóm 5: Chuỗi và danh sách”Tách chuỗi thành danh sách rồi dùng lại các kỹ thuật của chuyên đề danh sách.
Bài 24: Tách câu thành danh sách từ ⭐⭐⭐
Phần tiêu đề “Bài 24: Tách câu thành danh sách từ ⭐⭐⭐”Nhập một câu (các từ cách nhau đúng 1 dấu cách), tách từng từ đưa vào danh
sách các từ, rồi hiện danh sách lên sân khấu.
Xem lời giải
khi bấm vào @greenFlag Xóa hết tất cả trong liệt kê [các từ v] hỏi [Nhập một câu:] và đợi đặt [chuỗi v] thành (kết hợp (trả lời) [ ]) đặt [từ v] thành [] đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <(ký tự thứ (i) của chuỗi (chuỗi)) = [ ]> thì thêm phần tử (từ) vào trong [các từ v] đặt [từ v] thành [] nếu không thì đặt [từ v] thành (kết hợp (từ) (ký tự thứ (i) của chuỗi (chuỗi))) end thay đổi [i v] một lượng (1) end hiện danh sách [các từ v]
Cùng khung với Bài 22 và Bài 23, chỉ khác việc làm với mỗi từ: lần này là
thêm từ đó vào danh sách. Khi đã có danh sách, ta dùng lại được mọi kỹ
thuật của chuyên đề danh sách.
Bài 25: Đếm số lần một từ xuất hiện ⭐⭐⭐
Phần tiêu đề “Bài 25: Đếm số lần một từ xuất hiện ⭐⭐⭐”Nhập một câu và một từ, đếm xem từ đó xuất hiện bao nhiêu lần trong câu.
Ví dụ câu con meo con cho con ga, từ con → 3 lần.
Xem lời giải
khi bấm vào @greenFlag Xóa hết tất cả trong liệt kê [các từ v] hỏi [Nhập một câu:] và đợi đặt [chuỗi v] thành (kết hợp (trả lời) [ ]) đặt [từ v] thành [] đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> nếu <(ký tự thứ (i) của chuỗi (chuỗi)) = [ ]> thì thêm phần tử (từ) vào trong [các từ v] đặt [từ v] thành [] nếu không thì đặt [từ v] thành (kết hợp (từ) (ký tự thứ (i) của chuỗi (chuỗi))) end thay đổi [i v] một lượng (1) end hỏi [Đếm từ nào?] và đợi đặt [đếm v] thành (0) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (kích thước của [các từ v])> nếu <(phần tử thứ (i) của [các từ v]) = (trả lời)> thì thay đổi [đếm v] một lượng (1) end thay đổi [i v] một lượng (1) end nói (kết hợp (kết hợp [Xuất hiện ] (đếm)) [ lần])
Nửa trên là Bài 24 (tách câu), nửa dưới là bài đếm quen thuộc trên danh
sách. Vì so sánh cả từ bằng =, chữ con nằm bên trong các từ khác
như cong hay bacon sẽ không bị đếm nhầm - điều mà cách tìm chuỗi con
như Bài 20 không làm được.
Bài 26: Thống kê chữ cái ⭐⭐⭐
Phần tiêu đề “Bài 26: Thống kê chữ cái ⭐⭐⭐”Nhập một câu, đếm số lần xuất hiện của từng chữ cái a-z. Hiện 2 danh sách
song song: chữ cái (a, b, c…) và số lần tương ứng.
Xem lời giải
khi bấm vào @greenFlag Xóa hết tất cả trong liệt kê [chữ cái v] Xóa hết tất cả trong liệt kê [số lần v] đặt [i v] thành (1) lặp lại (26) thêm phần tử (ký tự thứ (i) của chuỗi [abcdefghijklmnopqrstuvwxyz]) vào trong [chữ cái v] thêm phần tử (0) vào trong [số lần v] thay đổi [i v] một lượng (1) end hỏi [Nhập một câu:] và đợi đặt [chuỗi v] thành (trả lời) đặt [i v] thành (1) lặp lại cho đến khi <(i) > (độ dài của (chuỗi))> đặt [vị trí v] thành (số thứ tự của (ký tự thứ (i) của chuỗi (chuỗi)) trong [chữ cái v]) nếu <(vị trí) > (0)> thì thay thế phần tử thứ (vị trí) của danh sách [số lần v] bằng ((phần tử thứ (vị trí) của [số lần v]) + (1)) end thay đổi [i v] một lượng (1) end hiện danh sách [chữ cái v] hiện danh sách [số lần v]
Đoạn đầu tạo sẵn 26 chữ cái cùng 26 số 0. Với mỗi ký tự trong câu,
số thứ tự của ... trong [chữ cái] cho biết nó là chữ cái thứ mấy (hoặc 0
nếu không phải chữ cái, ví dụ dấu cách) - rồi tăng ô tương ứng trong
số lần thêm 1, giống kỹ thuật danh sách song song ở chuyên đề danh sách.
Mở rộng thêm
Phần tiêu đề “Mở rộng thêm”- Gói đoạn “lấy chuỗi con” (Bài 14) thành một khối tự tạo nhận 3 tham số (chuỗi, a, b), rồi dùng lại ở Bài 19 và Bài 20 cho gọn.
- Sửa Bài 24 để câu có nhiều dấu cách liền nhau vẫn tách đúng (gợi ý:
chỉ thêm
từvào danh sách khi độ dài của nó lớn hơn 0). - Làm tiếp các bài xử lý chuỗi khó hơn trong Bài tập tổng hợp - Nhóm 7, ví dụ: đảo ngược chuỗi, chuỗi đối xứng, mã hoá Caesar, kiểm tra đảo chữ (anagram).