Bỏ qua để đến nội dung

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)

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.

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ợp ghé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ối kết hợp và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ủa trả 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).
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ặpiKý tự lấy rakết quả sau vòng lặp
Trước khi lặp--(rỗng)
11aa
22bab
33cabc

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.

<[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.

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.

Chưa cần vòng lặp - chỉ dùng các khối chuỗi đã học ở Phần 1.

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.

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.

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.

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.

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.

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ì.

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ả)

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).

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.

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ự.

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.

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ả)

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.

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.

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ậ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à.

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.

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.

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.

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.

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.

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ừ.

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.

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.