Tải bản đầy đủ (.pdf) (45 trang)

SKKN rèn luyện kỹ năng lập trình với chủ đề xâu ký tự cho học sinh khá giỏi trong ngôn ngữ lập trình c++ và python

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.16 MB, 45 trang )

Đề tài:
“RÈN LUYỆN KỸ NĂNG LẬP TRÌNH VỚI CHỦ ĐỀ XÂU KÝ TỰ
CHO HỌC SINH KHÁ GIỎI
TRONG NGÔN NGỮ LẬP TRÌNH C++ VÀ PYTHON”
MỤC LỤC
NỘI DUNG

Trang

Phần 1 - ĐẶT VẤN ĐỀ:

3

I - Lý do chọn đề tài.

3

II – Điểm mới của đề tài.

4

Phần 2 - NỘI DUNG.

5

I – CƠ SỞ LÝ LUẬN

5

1. Vai trò của việc rèn luyện kỹ năng lập trình cho học sinh
khá giỏi.



5

2. Sự cần thiết dạy học cho học sinh khá giỏi về ngơn ngữ lập
trình C++ và Python.

5

3. Tầm quan trọng của chủ đề Xâu ký tự trong dạy học lập
trình.

6

II – THỰC TRẠNG VẤN ĐỀ

6

1. Thực trạng dạy học ngơn ngữ lập trình C++, Python ở các
trường THPT.

6

2. Thực trạng dạy học ngôn ngữ lập trình C++, Python ở
trường chúng tơi.

7

3. Thực trạng dạy học chủ đề xâu dữ liệu cho đối tượng học
sinh khá giỏi.


7

III – GIẢI QUYẾT VẤN ĐỀ

8

1 – Một số đặc tính và kiến thức cơ bản về xâu dữ liệu trong
NNLT C++ và Python

8

1.1 Một số đặc tính khác nhau giữa Xâu trong C++ và Xâu
trong Python

8

1.2 Tóm tắt một số thao tác xử lý xâu trong C++

8

1.3 Tóm tắt một số thao tác xử lý xâu trong Python

10

1


2 – Rèn luyện kỹ năng lập trình với chủ đề Kiểu xâu

11


2.1 Ôn luyện kỹ năng sử dụng thao tác xử lý xâu qua một số
bài toán cơ bản

11

2.2 Rèn luyện kỹ năng giải một số dạng bài tập phổ biến về
xâu ký tự.

19

2.2.1 Dạng bài tập yêu cầu biến đổi xâu

19

2.2.2 Dạng bài tập có yêu cầu duyệt xử lý xâu con

23

2.2.3 Dạng bài tập có yêu cầu xử lý số lớn.

27

3 - Một số bài tập mở rộng và nâng cao

31

4 - Hiệu quả của sáng kiến

42


Phần 3. PHẦN KẾT LUẬN

43

I - Kết luận chung

43

II – Ý nghĩa của đề tài

43

III - Khả năng ứng dụng, mở rộng của đề tài

44

IV - Đề xuất

44

DANH MỤC CÁC CHỮ VIẾT TẮT TRONG SÁNG KIẾN
Nội dung

Viết tắt

Giáo dục phổ thông

GDPT


Phát triển năng lực.

PTNL

Trung học phổ thông

THPT

Giáo viên

GV

Học sinh

HS

Ngôn ngữ lập trình

NNLT

Ngơn ngữ lập trình C++

C++

Ngơn ngữ lập trình Python

Python

2



Phần 1. ĐẶT VẤN ĐỀ
I. LÝ DO CHỌN ĐỀ TÀI.
Giáo dục phổ thông nước ta đang thực hiện bước chuyển từ chương trình
giáo dục tiếp cận nội dung sang chương trình giáo dục “định hướng năng lực”.
Trong chương trình giáo dục phổ thơng mới, bộ mơn Tin học có rất nhiều điểm
mới, trong đó Bộ GD-ĐT đã ban hành hướng dẫn điều chỉnh nội dung dạy học,
cho phép và khuyến khích các cơ sở giáo dục dần loại bỏ ngơn ngữ lập trình
Pascal lựa chọn giảng dạy các ngơn ngữ lập trình có tính cập nhật, hiện đại, và
thơng dụng như C++, Python…
Hưởng ứng thực hiện nhiệm vụ đổi mới của ngành ở trường chúng tôi đã
triển khai dạy học ngơn ngữ lập trình C++ cho tồn bộ học sinh khối 11 thay thế
Pascal và trong các hoạt động nhóm chuyên môn chúng tôi đã tổ chức nghiên
cứu về ngôn ngữ Python, tổ chức Câu lạc bộ Tin học tập hợp các học sinh yêu
thích, đam mê Tin học bước đầu triển khai cho học sinh có sân chơi bổ ích, lành
mạnh, thu hút học sinh khá giỏi tham gia học tập, chia sẻ lẫn nhau nhằm khơi
dậy niểm đam mê tin học đối với học sinh, đồng thời nâng cao năng lực chuyên
môn của giáo viên, trang bị kiến thức, nghiệp vụ sẵn sàng thực hiện tốt nhiệm vụ
đổi mới góp phần đi tới đạt mục tiêu chung của ngành.
Là một giáo viên bộ môn Tin học, bên cạch việc dạy học các kiến thức
phổ thông về tin học thì việc bồi dưỡng học sinh khá giỏi cũng hết sức quan
trọng; trách nhiệm của người giáo viên Tin học là tổ chức các hoạt động học tập
cho học sinh để phát triển hệ thống năng lực mà một học sinh phổ thơng cần
phải có. Khi giảng dạy tơi thường phân tích những điểm ưu, nhược của các ngơn
ngữ lập trình để các em có cái nhìn tổng quan, bao qt về một số ngơn ngữ lập
trình như C++, Python để gieo niềm đam mê định hướng những học sinh có
năng lực vào đội ngũ nhân lực CNTT chất lượng cao của đất nước.
Qua quá dạy học, tôi nhận thấy chủ đề “Xâu ký tự” là một nội dung rất
quan trọng trong việc tiếp cận ngơn ngữ lập trình bậc cao, xử lý xâu ký tự cũng
là yêu cầu thường gặp trong việc xây dựng các phần mềm ứng dụng thực tiễn,

nhưng việc dạy học chủ để này ở một số trường THPT cịn gặp nhiều khó khăn,
hiệu quả chưa cao. Với niềm đam mê chuyên môn, ham học hỏi tơi ln tìm tịi
nghiên cứu và tơi đã có những giải pháp tốt nhất nhằm đem lại hiệu quả cao
trong công tác bồi dưỡng học sinh khá giỏi và đã đạt được những kết quả mong
đợi. Tôi xin chia sẻ sáng kiến chủ đề “Rèn luyện kỹ năng lập trình với chủ đề
xâu ký tự cho học sinh khá giỏi trong ngơn ngữ lập trình C++ và Python” với
mong muốn đưa ra được giải pháp nhằm nâng cao hiệu quả bồi dưỡng học sinh
khá giỏi và giúp giáo viên có thêm một số cách thức để ôn luyện phù hợp. Qua
đó, tơi cũng mong muốn mọi giáo viên Tin học ln có ý thức tìm tịi, nghiên
cứu nâng cao trình độ, năng lực chuyên môn, thực hiện tốt công cuộc đổi mới
của ngành.

3


II. ĐIỂM MỚI CỦA ĐỀ TÀI
- Hiện nay Python là ngơn ngữ lập trình đang được sử dụng rộng rãi để tạo
ra các ứng dụng Trí tuệ nhân tạo (AI), phân tích dữ liệu lớn (Big data), học máy
(machine learning).... Trong chương trình GDPT mới 2018, python sẽ là một lựa
chọn phù hợp để giảng dạy cho học sinh THPT vì câu lệnh đơn giản ngắn gọn,
dễ viết, dễ tiếp cận. Với những lý do trên, trường chúng tôi đã triển khai dạy học
ngơn ngữ lập trình C++ song song với ngơn ngữ lập trình Python cho học sinh
khá giỏi thông qua các số hoạt động học tập như Sinh hoạt Câu lạc bộ Tin học,
trong bồi dưỡng học sinh khá giỏi và nghiên cứu khoa học kỹ thuật.
- Sáng kiến này là sự đón đầu giúp giáo viên chuẩn bị kiến thức chuyên
môn nghiệp vụ để triển khai chương trình chương trình GDPT 2018 một cách
hiệu quả nhất.
- Sáng kiến đã xây dựng các bài toán thành một hệ thống theo một trình tự
logic có sự sắp đặt của phương pháp và quy trình giải tốn, giúp học sinh dễ
dàng tiếp cận với nội dung và rèn luyện tư duy thuật toán .

- Sáng kiến đã chọn lọc hệ thống các bài tập thích hợp, sắp xếp một cách
logic, hợp lí từ dễ đến khó nhằm giúp học sinh củng cố kiến thức, rèn luyện kỹ
năng phát triển tư duy và biết áp dụng Tin học vào thực tiễn.
- Thơng qua việc hướng dẫn giải các bài tốn giáo viên rèn luyện kỹ năng
lựa chọn thuật toán cho học sinh bằng cách định hướng, uốn nắn, trau chuốt
từng lời giải từng bài tập, qua đó góp phần tạo niềm tin và hứng thú học tập.

4


Phần 2. NỘI DUNG
I - CƠ SỞ LÝ LUẬN:
1. Vai trị của việc rèn luyện kỹ năng lập trình cho học sinh khá giỏi.
Trong thời công nghệ 4.0, ngành công nghệ thơng tin (CNTT) nói chung
và Tin học nói riêng đang phát triển một cách mạnh mẽ. Mọi ngành nghề, lĩnh
vực hay hoạt động nào trong xã hội hiện đại cũng cần tới sự góp mặt của CNTT,
ở đâu ứng dụng của CNTT cũng vơ cùng quan trọng. Vì vậy, nhu cầu về nguồn
nhân lực CNTT là rất lớn và vẫn còn tiếp tục tăng vọt trong những năm tiếp
theo, việc nâng cao chất lượng nguồn nhân lực CNTT để đáp ứng yêu cầu phát
triển và hội nhập kinh tế quốc tế của đất nước là một nhiệm vụ hết sức cấp thiết
hiện nay. Là một giáo viên bộ môn Tin học, bên cạch việc dạy học các kiến thức
phổ thơng về tin học ứng dụng thì việc dạy học lập trình cũng hết sức quan
trọng; trách nhiệm của người giáo viên Tin học là giúp học sinh hiểu hơn về sự
hoạt động của máy tính, am hiểu về khoa học kỹ thuật, góp phần định hướng
những học sinh có năng lực và đam mê Tin học vào đội ngũ nhân lực CNTT
chất lượng cao của đất nước.
2. Sự cần thiết dạy học cho học sinh khá giỏi về ngôn ngữ lập trình C++
và Python.
Ngơn ngữ lập trình C++ và Python là ngơn ngữ lập trình phù hợp cho việc
dạy học trong trường phổ thơng, đều có thể sử dụng trong kỳ thi học sinh giỏi

tỉnh Nghệ An vừa qua; đây cũng là hai trong những ngôn ngữ đang được sử
dụng phổ biến hiện nay trong việc thiết kế, xây dựng các phần mềm ứng dụng
thực tiễn và có những ưu thế riêng nhất định.
Ngơn ngữ lập trình C++ rất phù hợp để rèn luyện cho học sinh hiểu sâu về
thuật tốn cũng như phân tích, đánh giá chính xác hiệu suất thuật tốn. Trong lập
trình thi đấu ở chương trình trung học phổ thơng, ngơn ngữ C++ là ngơn ngữ
được lựa chọn hàng đầu.
Ngơn ngữ lập trình Python khá đơn giản giúp học sinh dễ học, dễ viết
nhưng việc thực thi chương trình rất chậm khơng phù hợp với lập trình thi đấu
trong giai đoạn hiện nay nhưng lại phù hợp hơn với định hướng giáo dục Stem
của bộ mơn Tin học (Sở GD&ĐT Nghệ An đã có cơng văn số 1677/SGD&ĐTGDTrH ngày 26/8/2020 về hướng dẫn thực hiện giáo dục STEM trong trường
trung học từ năm học 2020-2021)
Việc dạy học cho đối tượng học sinh khá giỏi cả 2 ngôn ngữ giúp các em
thấy được sự đa dạng phong phú trong lĩnh vực lập trình; giúp các em có cái
nhìn tổng qt, tồn diện hơn; biết ưu, nhược điểm của mỗi ngơn ngữ từ đó kích
thích sự tìm tòi, khám phá thúc đẩy niềm đam mê say sưa với Tin học; giúp các
em có định hướng nghề nghiệp sớm hơn và phấn đấu để đạt mục tiêu của mình.

5


3. Tầm quan trọng của chủ đề Xâu ký tự trong dạy học lập trình.
Chủ đề “Xâu dữ liệu” là một nội dung rất quan trọng trong việc tiếp cận
ngôn ngữ lập trình bậc cao và cũng là yêu cầu thường gặp khi xây dựng các
phần mềm ứng dụng thực tiễn.
Trong việc dạy học lập trình, giáo dục Stem, bồi dưỡng học sinh khá giỏi
ở trường phổ thông, chủ đề Xâu dữ liệu là một nội dung trọng tâm. Học sinh cần
nắm được các thao tác xử lý trên xâu, có kỹ năng tốt trong việc phân tích bài
tốn và lựa chọn phương pháp phù hợp để có chương trình tốt hơn cả về độ sáng
sủa của thuật toán lẫn thời gian thực hiện chương trình. Để đạt được điều đó,

giáo viên cần lựa chọn các ví dụ, bài tập đảm bảo tính mục đích, tính khả thi,
tính hiệu quả; các bài toán đưa ra chứa đựng những mâu thuẫn cần giải quyết,
gợi ra cho học sinh nhiều hướng suy nghĩ, nhiều cách giải quyết vấn đề. Thiết kế
trình tự thực hiện các bài toán cũng được xem là cơ sở quan trọng trong việc
truyền tải kiến thức và kỹ năng, cần chú ý vận dụng linh hoạt cho từng trường
hợp cụ thể để đạt mục đích dạy học.
II - THỰC TRẠNG VẤN ĐỀ
1. Thực trạng dạy học ngôn ngữ lập trình C++, Python ở các trường THPT.
Ngơn ngữ lập trình C++, Python là ngơn ngữ được định hướng dạy học
trong chương trình GDPT 2018 và được khuyến khích triển khai dạy học trong
giai đoạn chuyển tiếp hiện nay nhưng việc thực hiện cịn có một số khó khăn
nhất định:
+ SGK hiện hành dùng ngơn ngữ lập trình Pascal để minh họa nên học
sinh khơng có sách phù hợp để làm tài liệu học tập. Việc tìm kiếm tài liệu dạy
học phù hợp trình độ học sinh rất vất vả.
+ Đối với giáo viên việc trao đổi, chia sẻ, học hỏi kinh nghiệm gặp nhiều
khó khăn do hầu hết đội ngũ giáo viên đều quen với ngơn ngữ lập trình Pascal,
chưa mạnh dạn chuyển sang dạy ngơn ngữ khác có tính ưu việt hơn.
+ Kiến thức về lập trình khơng nằm trong nội dung thi THPT quốc gia
nên hầu hết học sinh khơng coi trọng, ít học bài và làm bài tập chỉ những học
sinh đã yêu thích, đam mê mới đầu tư thời gian cho việc học lập trình. Vì thế
lượng giáo viên đam mê chun mơn, đầu tư thời gian trăn trở nghiên cứu cải
tiến cách dạy, cách học không nhiều.
+ Thời lượng dành cho dạy học ngôn ngữ lập trình 1,5 tiết/tuần, để mơ tả
thuật tốn giải các bài tốn trên máy tính là rất ít để có thể hiểu rõ ràng và áp
dụng thành thạo ngơn ngữ lập trình. Thêm vào đó, cơ sở vật chất chưa đáp ứng
được nhu cầu học tập nên việc triển khai dạy học chỉ có thể giúp học sinh hiểu
được cơ bản q trình giải một bài tốn trên máy tính, cịn để tất cả học sinh tự
giải một bài hồn chỉnh là rất khó.
6



2. Thực trạng dạy học ngơn ngữ lập trình C++, Python ở trường chúng tôi.
Từ năm học 2018 - 2019 chúng tôi đã được tham dự các lớp tập huấn do
sở GD & ĐT Nghệ An tổ chức về lập trình trên ngơn ngữ lập trình C++. Năm
học 2019 – 2020 tiếp tục tham dự tập huấn và được khuyến khích triển khai dạy
học ngơn ngữ C++ thay Pascal. Hào hứng thực hiện nhiệm vụ đổi mới của
ngành, chúng tôi đã mạnh dạn đưa C++ vào dạy học ở một số lớp. Đến năm học
2020 – 2021, trường chúng tôi đã triển khai cho toàn bộ học sinh khối 11 trong
chương trình chính khóa.
Trong năm học 2019-2020, chúng tơi đã tập hợp những học sinh có học
lực khá giỏi, yêu thích lập trình, truyền cảm hứng cho các em, thành lập Câu lạc
bộ Tin học. Bước đầu tổ chức cho các em học tập, trao đổi về lập trình trên 3
ngơn ngữ lập trình là C++, Scratch và Python. Đối với những em học sinh lớp
10 mới tham gia chúng tơi cho làm quen với ngơn ngữ lập trình Scratch để kích
thích hứng thú và giúp các em làm quen với tư duy máy tính, sau đó chúng tơi
cho tiếp cận dần với ngơn ngữ lập trình C++ và Python.
Trong q trình triển khai thực hiện chúng tơi đã gặp rất nhiều khó khăn
vướng mắc cả về kiến thức chuyên môn lẫn nghiệp vụ sư phạm. Với sự yêu
nghề, nhiệt huyết với học sinh, tơi đã khơng ngừng tìm tịi, nghiên cứu trau dồi
kiến thức đồng thời tích cực kết bạn với các đồng nghiệp trên mọi miền tổ quốc
để giao lưu, học hỏi nâng cao trình độ. Qua quá trình này tơi cũng đã có những
sáng kiến đem áp dụng mang lại kết quả rất khả quan, đã đúc rút thành những
kinh nghiệm đáng chia sẻ.
3. Thực trạng dạy học chủ đề xâu dữ liệu cho đối tượng học sinh khá giỏi.
+ Chủ đề Xâu dữ liệu trong C++, Python có hệ thống khái niệm, câu lệnh,
hàm xử lý đa dạng phong phú mà tài liệu tham khảo lại rất ít ỏi. Nên việc tìm tịi
tài liệu, bài tập phù hợp với trình độ học sinh đã gặp rất nhiều khó khăn, việc
tổng hợp bài tập và đề thi thành các dạng bài tập phục vụ giảng dạy mất rất
nhiều thời gian. Đặc biệt đối với những giáo viên ít tham gia bồi dưỡng thì cịn

vất vả hơn nhiều.
+ Qua dạy học chủ đề Xâu dữ liệu những năm trước, tôi đã khảo sát các
cấp độ nhận thức của học sinh cho kết quả như sau: Đa số học sinh chỉ đạt ở
mức độ biết và hiểu, vận dụng được thì khơng đến 50% học sinh. Trong khi đó
đối với học sinh khá giỏi yêu cầu cao hơn như viết được chương trình một số bài
tốn đơn giản; liên hệ được kiến thức về xâu với các tình huống trong thực tiễn
và vận dụng dữ liệu kiểu xâu vào giải bài toán ứng dụng cụ thể.
Lo lắng trước thực tế đó, tơi đã đầu tư thời gian, khơng ngừng học hỏi,
nghiên cứu xây dựng nội dung, lựa chọn phương pháp, kỹ thuật phù hợp để kích
thích đam mê, hứng thú giúp học sinh hình thành kiến thức và phát triển các kỹ
năng, năng lực lập trình một cách tốt nhất. Kết quả trong kỳ thi HSG những năm
gần đây, học sinh của tôi đã đạt được kết quả đáng tự hào.

7


III – GIẢI PHÁP
1 – MỘT SỐ ĐẶC TÍNH VỀ XÂU VÀ HỆ THỐNG KIẾN THỨC CỐT LÕI.
1.1 Một số đặc tính khác nhau giữa Xâu trong C++ và trong Python.
Xâu trong C++

Xâu trong Python

- Là chuỗi ký tự trong bảng mã ASCII.

- Python hỗ trợ hoàn toàn cho bảng mã
Unicode.

- Tên kiểu dữ liệu: string


- Tên kiểu dữ liệu: str

- Các ký tự của xâu được đặt trong cặp - Các ký tự của xâu được đặt trong cặp
nháy đơn hoặc kép. Xâu trên nhiều
nháy kép.
dòng được đặt trong cặp 3 nháy đơn
hoặc 3 nháy kép.
- Các ký tự trong xâu được đánh chỉ số - Các ký tự trong xâu được đánh chỉ số
từ trước ra sau bắt đầu từ 0; không từ trước ra sau bắt đầu từ 0 và đảo
chiều âm từ sau về trước bắt đầu từ -1.
đánh chỉ số ngược.
- Khai báo: Để sử dụng cần khai báo - Khai báo: Trong Python không cần
khai báo, để tạo biến xâu ta chỉ cần gán
biến xâu: string <tên biến xâu>;
xâu cho biến đó.
- Trong C++ có thể thực hiện các thao - Trong Python, xâu là bất biến, không
thể thực hiện các thao tác làm thay đổi
tác làm thay đổi giá trị của xâu
giá trị của xâu
- Trong C++ có kiểu dữ liệu ký tự:
char
- Có thể thực hiện xóa, hoặc chèn ký tự
theo chỉ số

- Python khơng có kiểu dữ liệu ký tự,
một ký tự cũng thuộc kiểu xâu.
- Khơng thể thực hiện xóa, chèn ký tự
theo chỉ số nhưng vẫn cho phép truy
xuất ký thự theo chỉ số


- Không cho phép thực hiện phép nhân - Cho phép thực hiện phép nhân xâu
xâu với một số nguyên.
với một số nguyên.

1.2 Tóm tắt một số thao tác xử lý xâu trong C++
* Một số thao tác cơ bản với xâu trong C++
- Phép ghép nối xâu: +
- Phép so sánh: >, >=, <, <=, ==, !=
- Hàm lấy độ dài xâu s: s.length() hoặc s.size();
8


- Hàm sao chép trong xâu s từ chỉ số VT lấy n ký tự: s.substr(VT, n);
- Hàm chèn thêm vào xâu x vào xâu s tại vị trí VT: s.insert(VT, x);
- Hàm xóa trong xâu s từ chỉ số VT xóa đi n ký tự: s.erase(VT, n);
- Hàm tìm kiếm: tìm vị trí đầu tiên xuất hiện xâu x trong xâu s: s.find(x).
Nếu xâu x khơng có trong xâu S thì kết quả = -1
- Hàm tìm kiếm ngược: tìm vị trí cuối cùng xuất hiện xâu x trong xâu s:
s.rfind(x). Nếu xâu x khơng có trong xâu S thì kết quả = -1
- Hàm thay thế n ký tự từ vị trí VT của xâu s bởi xâu x: s.replace(VT,n,x);
- Hàm đổi ký tự thành ký tự hoa: toupper(ch);
- Hàm đổi ký tự thành ký tự thường: tolower(ch)
* Một số thao tác mở rộng với xâu trong C++
- Hàm chuyển xâu s thành số n kiểu int:

n = atoi(s.c_str());

- Hàm chuyển xâu s thành số n kiểu long:

n = atol(s.c_str());


- Hàm chuyển xâu s thành số n kiểu long long: n = atoll(s.c_str());
- Hàm chuyển xâu s thành số n kiểu float:

n = atof(s.c_str());

- Hàm chuyển số n thành xâu s:
stringstream convert; covert << n; s = convert.str();
- Hàm s.size(); lấy chiều dài của xâu s.
- Hàm s.insert(VT, s1, n); Thêm n ký tự vào xâu s từ chuỗi s1 vào vị trí Vt.
Nếu n có độ dài lớn hơn độ dài chuỗi s1 thì tiếp tục thêm vào 1 khoảng trắng và
sau đó lại tiếp tục thêm các ký tự của s1cho đủ n ký tự.
- Hàm s.insert(VT, n, 'z'); Thêm n lần ký tự z vào vị trí VT.
- Hàm s.insert(s.begin() + x, s2.begin() + y, s2.begin() + z); Thêm chuỗi ký
tự con của chuỗi s2 bắt đầu từ vị trí y cho đến vị trí z - 1 vào vị trí x trong xâu s.
- Hàm s.erase(S.begin() + x); Xóa đi trong xâu S ký tự tại vị trí x.
- Hàm s.erase(s.begin() + x, s.begin() + y); Xóa đi các ký tự từ chỉ số x đến
chỉ số y – 1.
- s.find(x, vt): Tìm kiếm vị trí đầu tiên xuất hiện xâu x trong xâu s.
- s.rfind(x, vt): Tìm kiếm vị trí cuối cùng xuất hiện xâu x trong xâu s.
- Transform(s.begin(), s.end(), s.begin(), ::toupper); hàm chuyển tất cả các
ký tự trong xâu s thành chữ hoa.
- Transform(s.begin(), s.end(), s.begin(), ::tolower); hàm chuyển tất cả các
ký tự trong xâu s thành chữ thường.
- .....
9


1.3 Tóm tắt một số thao tác xử lý xâu trong Python
* Một số thao tác cơ bản với xâu trong Python

- Phép ghép nối xâu: +
- Phép so sánh: >, >=, <, <=, ==, !=
- Phép toán a in b: cho kết quả = True nếu a là xâu con của b, ngược lại thì
kết quả là False
- Thao tác cắt trích: s[start : end : step] lần lượt duyệt và trích các phần tử
thuộc phạm vi từ vị trí start đến vị trí end-1 sau mỗi lần lấy một phần tử trong
phạm vi thì di chuyển con trỏ với bước nhảy có độ rộng step. Các tham số trên có
thể vắng mặt: nếu thiếu start thì mặc định là bắt đầu từ đầu xâu, thiếu end thì mặc
định đến hết xâu, thiếu step thì mặc định là 1
- Hàm lấy độ dài xâu s: len(s);
- Sao chép trong xâu s: ta sử dụng thao tác cắt trích xâu để gán cho biến
khác.
- Chèn và Xóa xâu: Trong python khơng cho phép chèn vào xâu. Ta có thể
sử dụng hàm replace() hoặc thao tác cắt trích kết hợp ghép nối để xử lý.
- Hàm tìm kiếm: tìm vị trí đầu tiên xuất hiện xâu x trong xâu s: s.find(x).
Nếu xâu x khơng có trong xâu S thì kết quả = -1
- Hàm tìm kiếm ngược: tìm vị trí cuối cùng xuất hiện xâu x trong xâu s:
s.rfind(x). Nếu xâu x khơng có trong xâu S thì kết quả = -1
- Hàm thay thế: s.replace(s1, s2) thay thế xâu con s1 của xâu s bởi xâu s2
trả về một xâu mới.
- Hàm ord(ch): cho mã ASCII thập phân của ký tự ch.
- Hàm chr(x): cho ký tự có mã ASCII là x
- Hàm tạo xâu in hoa từ xâu s: s.upper()
- Hàm tạo xâu in thường từ xâu s: s.lower()
* Một số thao tác mở rộng với xâu trong Python
- Hàm tìm kiếm: s.find(sub, [start], [end]), với ý nghĩa tìm xâu con sub trong
xâu s, vị trí bắt đầu tìm kiếm là start và vị trí kết thúc tìm kiếm là end, nếu vắng
start thì mặc định bắt đầu tìm là vị trí 0 (cận trái) và nếu vắng end thì mặc định vị
trí kết thúc tìm kiếm là cuối xâu. Nếu khơng tìm thấy thì kết quả = -1
- s.rfind(x, [start], [end]): Tìm kiếm vị trí cuối cùng xuất hiện xâu x trong

xâu s bắt đầu từ vị trí end-1, trở về vị trí start.
- Hàm thay thế: s.replace(s1, s2) để thay thế phần xâu con s1 bằng một xâu
s2, trả về một xâu mới.

10


- Hàm capitalize() viết hoa ký tự đầu tiên trong xâu, các chữ còn lại viết
thường
- Hàm s.strip(ch): trả về xâu mới có giá trị bằng xâu s đã xóa ký tự ch bên
trái, bên phải hoặc xóa ký tự bên trái, bên phải.
- Hàm s.startswith(x) Dùng để kiểm tra chuỗi s có bắt đầu bằng chuỗi con x
hay khơng
- Hàm s.endswith(x) Dùng để kiểm tra chuỗi s có kết thúc bằng chuỗi con x
hay không
- Hàm s.count(x) sẽ trả về số lần xuất hiện của chuỗi con x trong chuỗi mẹ s.
- Hàm ds = s.split(x): cắt xâu s thành nhiều chuỗi con, dựa vào tiêu chí ngăn
cách để cắt là xâu x lưu vào list có tên ds. Nếu vắng mặt xâu x thì việc cắt dựa vào
xâu con các dấu cách.
- Hàm s=x.join(ds): nối các xâu trong list ds thành xâu s bởi xâu gắn kết x.

2. RÈN LUYỆN KỸ NĂNG LẬP TRÌNH VỚI CHỦ ĐỀ KIỂU XÂU
Rèn luyện kỹ năng lập trình cho học sinh cần xây dựng các bài toán thành
một hệ thống theo một trình tự logic có sự sắp đặt của phương pháp và quy trình
giải tốn, giúp học sinh dễ dàng tiếp cận với nội dung bài học, đồng thời có thể
phát triển tư duy cũng như tạo ra niềm vui và sự hứng thú trong học tập.
2.1 Ôn luyện kỹ năng sử dụng thao tác xử lý xâu qua một số bài toán cơ bản
Để giúp học sinh ghi nhớ, khắc sâu và vận dụng linh hoạt các thao tác xử
lý cơ bản trên xâu, tôi thường đưa ra các bài tập cơ bản rồi cho học sinh phân
tích, tìm các cách giải quyết khác nhau. Những bài tốn này khơng yêu cầu cao

về mặt thuật toán mà cần huy động hết vốn kiến thức để có càng nhiều giải pháp
càng tốt. Chương trình giải bài tốn có nhiều cách diễn đạt khác nhau, giáo
viên có thể yêu cầu các em diễn đạt hết các cách để rèn luyện kỹ năng diễn đạt
câu lệnh.
Bài luyện tập 1:
Mục tiêu: Rèn luyện kỹ năng sử dụng các phép toán: ghép xâu, lấy độ dài
xâu, đảo xâu, duyệt thuận, duyệt ngược xâu:
Bài toán 1: Viết chương trình nhập vào một xâu ký tự S, đưa ra xâu đó
nhưng được viết theo chiều ngược lại.
Ý tưởng giải thuật:
Cách 1: Sử dụng phép toán ghép nối (+):
Khởi tạo biến kq= “”
Duyệt lần lượt các ký tự của xâu ghép nối vào xâu kq (việc duyệt
và ghép nối có thể có rất nhiều cách diễn đạt)

11


Cách 2: Sử dụng hàm đảo Xâu: trong C++ sử dụng hàm reverse, trong
Python dùng thao tác cắt trích s[start : end : step] .
Chương trình tham khảo viết bằng C++:

Ý tưởng sư phạm: Thơng qua các chương trình nhấn mạnh cho học sinh các
thao tác đã được vận dụng trong bài toán này và ý nghĩa, kỹ thuật sử dụng các thao
tác.
- Hàm s.length(): lấy độ dài xâu s, ngoài ra s.size() cũng cho độ dài xâu s.
- Phép cộng (+): Ghép nối xâu.
- Hàm reverse(s.begin(), s.end()): Đảo xâu.
Chương trình tham khảo viết bằng Python:


12


Ý tưởng sư phạm:
Thơng qua các chương trình nhấn mạnh cho học sinh các thao tác đã được
vận dụng trong bài toán này và ý nghĩa, kỹ thuật sử dụng các thao tác trong Python.
- Hàm len(): lấy độ dài xâu s.
- Phép cộng (+): Ghép nối xâu.
- Thao tác Cắt trích: s[start : end : step]
Ý nghĩa là, lần lượt duyệt và trích các phần tử thuộc phạm vi từ vị trí
start đến vị trí end-1 sau mỗi lần lấy một phần tử trong phạm vi thì di
chuyển con trỏ với bước nhảy có độ rộng step. Các tham số trên có thể
vắng mặt: nếu thiếu start thì mặc định là bắt đầu từ đầu xâu, nếu thiếu end
thì mặc định đến hết xâu, nếu thiếu step thì mặc định là 1.
Bài luyện tập 2:
Mục tiêu:
Rèn luyện kỹ năng sử dụng thao tác ghép nối, tìm kiếm, thay thế; thao tác
xóa trong C++;
Bài tốn 2:
Viết chương trình nhập vào một xâu ký tự S, đưa ra xâu đó nhưng loại bỏ
các dấu cách trống.
Ý tưởng giải thuật:
Cách 1: Sử dụng thêm biến kq để lưu kết quả:
Duyệt các phần tử, nếu gặp phần tử khác cách ‘ ’ thì nối sang xâu
kết quả.
Cách 2: Duyệt tìm các dấu cách trống rồi xóa khỏi xâu.
* Trong C++:
- Ta có thể duyệt từ sau ra trước bằng lệnh for hoặc while để
tìm và xóa dấu cách.
- Dùng hàm find tìm và xóa dấu cách bằng lệnh delete hoặc

lệnh replace.
* Trong Python: (khơng thể xóa phần tử theo chỉ số)
- Dùng hàm replace để thực hiện
- Dùng phép tốn cắt trích kết hợp ghép nối.
Chương trình tham khảo bằng C++:

13


Ý tưởng sư phạm:
Thông qua bài tập rèn luyện cho học sinh sự nhìn nhận đa hướng, mỗi bài
tốn có rất nhiều cách giải quyết; nhấn mạnh, khắc sâu ý nghĩa, kỹ thuật sử dụng
các thao tác xử lý xâu:
- Lưu ý hàm s.length() và hàm s.size() cùng cho độ dài xâu s.
- Hàm tìm kiếm:
+ s.find(x, vt): Tìm kiếm vị trí đầu tiên xuất hiện xâu x trong xâu s.
bắt đầu từ vị trí vt trở đi, nếu khơng có tham số vt thì bắt đầu tìm từ
đầu xâu. Nếu khơng tìm thấy thì kết quả = -1
+ s.rfind(x, vt): Tìm kiếm vị trí cuối cùng xuất hiện xâu x trong xâu s.
bắt đầu từ vị trí vt trở về, nếu khơng có tham số vt thì bắt đầu tìm từ
cuối (tìm ngược từ sau về đầu). Nếu khơng tìm thấy thì kết quả = -1

14


- Hàm thay thế:
+ s.replace(vt, n, x): thay thế n ký tự trong xâu s, tính từ vị trí vt bởi
xâu x.
Chương trình tham khảo viết bằng Python:


Ý tưởng sư phạm:
Thông qua bài tập này nhấn mạnh, khắc sâu ý nghĩa, kỹ thuật sử dụng các
thao tác xử lý xâu như phép ghép nối xâu, cắt trích xâu và hàm tìm kiếm, thay thế:
- Hàm tìm kiếm:
+ s.find(x, [start], [end]): Tìm kiếm vị trí đầu tiên xuất hiện xâu x
trong xâu s. bắt đầu từ vị trí start, kết thúc ở vị trí end-1, nếu vắng start thì
mặc định bắt đầu tìm là vị trí 0 và nếu vắng end thì mặc định vị trí kết thúc
tìm kiếm là cuối xâu. Nếu việc tìm kiếm khơng có kết quả thì hàm trả về giá
trị -1
+ s.rfind(x, [start], [end]): Tìm kiếm vị trí cuối cùng xuất hiện xâu x
trong xâu s bắt đầu từ vị trí end-1, trở về vị trí start.
- Hàm thay thế:
+ s.replace(s1, s2) để thay thế phần xâu con s1 bằng một xâu
mới s2.
Bài luyện tập 3:
Mục tiêu: Rèn luyện kỹ năng sử dụng thao tác sao chép, chèn, xóa, tìm
kiếm, thay thế trong C++; thao tác cắt trích, ghép nối, thay thế trong Python.
Bài tốn 3:
Viết chương trình nhập vào từ bàn phím xâu ký tự s, tìm và thay thế tất cả
các cụm ký tự s1 thành s2.
Ví dụ:

Xâu nhập vào:
Xâu kết quả:

s = “anh oi, anh dang o đau”
s1= “anh”; s2= “em”;
S = “em oi, em dang o đau”

15



Ý tưởng giải thuật:
Cách 1:
- Trong C++:
Dùng hàm tìm kiếm s.find(s1) để xác định vị trí xuất hiện xâu s1 trong
xâu s: vt = s.find(s1) Nếu vt != -1 tức là có xâu s1 trong xâu s thì thay thế xâu s1
bởi xâu s2 bằng hàm s.replace(vt,l1,s2); hoặc thay thế bằng lệnh xóa và chèn:
s.erase(vt,l1); s.insert(vt,s2);
Lưu ý: Trong xâu có thể có rất nhiều cụm từ cần thay thế nên ta phải sử
dụng lệnh while để thay thế hết: trong khi s.find(s1) != -1 thì tiếp tục thay thế
- Trong Python:
Sử dụng thao tác cắt trích, so sánh và ghép nối để thực hiện ý tưởng trên.
Cách 2: - Trong C++:
Để duyệt hết tất cả các khả năng cần thay thế ta sử dụng lệnh for kết hợp
lệnh s.substr() để sao chép từng đoạn con có độ dài bằng độ dài xâu s1 rồi so
sánh với s1. Nếu kết quả bằng s1 thì ta tiến hành thay thế bằng các câu lệnh
tương tự cách 1.
- Trong Python: Dùng hàm replace để thực hiện.
Chương trình tham khảo bằng C++
Chương trình 1:

Chương trình 2:

Ý tưởng sư phạm:
Thơng qua bài tập rèn luyện nhấn mạnh, khắc sâu ý nghĩa, kỹ thuật sử dụng
các thao tác xử lý xâu.
16



Chương trình tham khảo bằng Python:

Ý tưởng sư phạm:
Thơng qua bài tập này nhấn mạnh, khắc sâu kỹ thuật sử dụng các thao tác cắt
trích, thay thế.
Bài luyện tập 4:
Mục tiêu: Rèn luyện kỹ năng xử lý ký tự theo mã ASCII, kỹ thuật đếm
phân phối trên mảng với kiểu chỉ số tương ứng các ký tự.
Bài toán 4: Đếm số lần xuất hiện mỗi loại ký tự.
Cho xâu s (có độ dài khơng vượt q 10 3) chỉ gồm các ký tự từ 'A' đến 'Z'.
Cho biết có bao nhiêu loại ký tự xuất hiện trong s và đưa ra một ký tự xuất hiện
nhiều nhất trong s cùng với số lần xuất hiện của ký tự đó
Ý tưởng giải thuật:
- Các ký tự từ 'A' đến 'Z' có mã ASCII tương ứng từ 65 đến 90. Nên ta sử
dụng mảng T gồm 91 phần tử với kiểu chỉ số từ 0 đến 90, kiểu giá trị int để lưu
số lần xuất hiện: T[65] …T[90] tương ứng số lần xuất hiện ký tự ‘A’… ‘Z’.
- Lần theo các giá trị của mảng T trên đoạn từ 65 đến 90 ta được số lượng
các ký tự khác nhau (tức số lượng phần tử có giá trị khác 0 trong mảng T) và tìm
giá trị lớn nhất của mảng T ta sẽ tìm được ký tự xuất hiện nhiều lần nhất.
Về nguyên tắc, ta chỉ cần sử dụng mảng với 26 phần tử kiểu int với chỉ số
từ 0 đến 25, khi đó với mỗi ký tự ta chuyển sang mã ASCII rồi dịch chuyển chỉ
số 65 đơn vị. Chương trình tham khảo trong Python (cách 1) sau được viết với ý
tưởng này.
Ngồi ra, trong Python ta có thể sử dụng lệnh count để đếm số lần xuất
hiện không chồng lấn của một ký tự hay xâu con bên tròn xâu lớn. Chương trình
tham khảo trong Python (cách 2) sau được viết với ý tưởng này.

17



Chương trình tham khảo:
Chương trình viết bằng C++

Chương trình viết bằng Python (cách 1)

Chương trình viết bằng Python (cách 2)

Ý tưởng sư phạm:
Thông qua bài tập này nhấn mạnh cách thức sử dụng bảng mã ASCII, cách
chuyển đổi qua lại giữa mã thập phân và ký tự, kỹ thuật đếm phân phối trên mảng
với kiểu chỉ số tương ứng các ký tự. Ngoài ra, cần nhấn mạnh lệnh khởi tạo tồn
bộ phần tử của mảng = 0, trong chương trình trên là lệnh memset, lệnh nhân (*).
Lưu ý thêm lệnh ý nghĩa và cách sử dụng lệnh count trong Python.

18


2.2 - Rèn luyện kỹ năng giải một số dạng bài tập phổ biến về xâu ký tự:
Việc phân loại dạng bài tập chỉ mang tính tương đối, một bài tập ở dạng này
hay dạng kia còn phụ thuộc rất nhều vào cách nhìn nhận đa chiều của người lập
trình. Trong phạm vi đề tài này mục tiêu của tôi là rèn luyện cho học sinh một số
định hướng để giúp học sinh cái nhìn tổng quan hơn, nên mỗi bài tốn có thể được
đề xuất nhiều cách giải từ đó học sinh có thể phân tích, lựa chọn giải pháp tốt hơn
để giải quyết bài toán. (Các giải pháp được đề xuất chỉ là các cách giải quyết, chưa
hẳn đã là giải pháp tối ưu để giải bài toán)
2.2.1 Dạng bài tập yêu cầu biến đổi xâu
Đây là dạng cơ bản thường gặp, việc biến đổi xâu được thực hiện trên mỗi
ký tự trong xâu nên cần nắm rõ các thao tác, các hàm xử lý trên kiểu dữ liệu xâu để
vận dụng một cách linh hoạt vào từng bài tập cụ thể.
Bài tập 1: Chuyển đổi phông chữ:

Khi soạn thảo và trình bày văn bản, việc chuyển đổi đoạn văn chữ hoa
sang thường hay chữ thường sang chữ hoa là một nhu cầu rất phổ biến.
Em hãy viết chương trình nhập vào 1 xâu s chỉ chứa dấu cách và các ký tự
thuộc bảng chữ cái tiếng Anh, Hãy tạo xâu s1 chứa các tự trong xâu s nhưng ở
dạng chữ hoa, tạo xâu s2 chứa các tự trong xâu s nhưng ở dạng chữ thường.
Xuất kết quả xâu s1, s2 ra màn hình.
Ý tưởng giải thuật:
Cách 1: Duyệt và chuyển đổi từng ký tự:
Trong C++: Dùng hàm toupper(), tolower() để chuyển đồi từng ký tự hoặc biến
đổi qua mã ASCII.
Trong Python: Sử dụng hàm ord() và chr() để thực hiện.
Cách 2: Dùng hàm chuyển đổi đồng loạt
Trong C++: Dùng hàm transform() để chuyển đồi tất cả các ký tự.
+ transform(s.begin(), s.end(), s.begin(), ::toupper); chuyển xâu s sang
chữ hoa
+ transform(s.begin(), s.end(), s.begin(), ::tolower); chuyển xâu s sang
chữ thường
Trong Python: Dùng hàm upper(), lower().
+ s.upper() Hàm này trả lại xâu s sau khi chuyển tất cả các ký tự thành
chữ hoa.
+ s.lower() Hàm này trả lại xâu s sau khi chuyển tất cả các ký tự thành
chữ thường.

19


* Chương trình tham khảo trong C++:
Chương trình 1:

Chương trình 2:


* Chương trình tham khảo trong Python:

Ý tưởng sư phạm: Rèn luyện kỹ năng vận dụng hàm chuyển đổi ký tự
sang ký tự hoa toupper(), ký tự thường tolower(), hàm chuyển đổi đồng loạt
sang chữ hoa, chữ thường tranform() trong C++.
Trong Python chuyển đổi chữ hoa, chữ trường dựa vào mã ASCII và hàm
chuyển đổi xâu sang in hoa, in thường upper(), lower().

20


Bài tập 2: Xóa dấu cách thừa:
Khi soạn thảo và trình bày văn bản, một số bạn thường mắc lỗi gõ nhiều
dấu cách giữa các từ.
Em hãy viết chương trình nhập vào 1 xâu s, Hãy đưa ra xâu đã loại dấu
cách thừa.
Ý tưởng giải thuật:
Ta hồn tồn có thể duyệt xâu rồi xóa các ký tự cách liền nhau như chúng
ta thường làm trong ngơn ngữ lập trình Pascal. Nhưng ở đây ta sringstream của
C++ và thao tác split(), join() trong Python để chương trình đơn giản hơn.
* Chương trình tham khảo:
Chương trình viết bằng C++

Chương trình viết bằng Python

Ý tưởng sư phạm:
Rèn luyện kỹ năng vận dụng stringstream trong C++ và thao tác tách
split(), nối join(). Thao tác này rất hữu ích trong việc giải quyết một số bài tốn
về xâu.

Bài tập 3: Mã hóa Xê Da (sách bài tập tin học 11)
Để giữ bí mật người ta phải mã hóa các thơng tin trước khi truyền đi hoặc
lưu trữ. Một trong những cách mã hóa sớm nhất được sử dụng rộng rãi thời cổ
đại là cách mã hóa do Xê Da đề xuất: trong thơng điệp, người ta thay đổi chữ cái
bằng chữ cái đứng sau nó K vị trí trong bảng chữ cái. Việc tìm kiếm thay thế
được tiến hành vòng tròn theo bảng chữ cái. Nếu bảng chữ cái có N chữ, thì sau
chữ cái thứ N-1 là chữ cái N, sau chữ cái N là chữ cái thứ nhất,… Cách mã hóa
này gọi là mã Xê Da. Các kí tự ngồi bảng chữ cái vẫn được giữ nguyên.

21


Ví dụ, bảng chữ cái tiếng Anh có 26 chữ cái. Nếu K = 2 thì có nghĩa là a
được thay thế bằng c, b được thay thế bằng d, . . ., y được thay thế bằng a, z
được thay thế bằng b. Các chữ cái in hoa sẽ được thay thế bằng chữ cái in hoa
tương ứng. Trong trường hợp này, từ ‘TIN HOC’ sẽ được mã hóa thành ‘VKP
JQE’ .
Hãy lập trình: Nhập vào từ bàn phím số ngun K (1khơng q 255 kí tự. Mã hóa theo quy tắc mã Xê Da và đưa kết quả ra màn hình.
Ý tưởng giải thuật:
Để dễ xử lý hơn khi dịch k ký tự theo vòng tròn, ta dùng thêm 2 biến phụ
S1 để lưu 2 lần bảng chữ cái in hoa. S2 lưu 2 lần bảng chữ cái in thường.
Duyệt từng ký tự trong xâu s, tìm vị trí xuất hiện của nó trong xâu s1, s2.
Nếu tìm thấy thì ta lấy ký tự cách nó k ký tự trên mảng tương ứng.
Chương trình tham khảo:
Chương trình viết bằng C++

Chương trình viết bằng Python

Ý tưởng sư phạm:

Rèn luyện kỹ năng sử dụng bảng mã ASCII để giải quyết một số bài toán.
Qua đây nhấn mạnh cho học sinh cách chuyển đổi ký tự sang mã thập và từ mã
thập phân sang ký tự. Trong C++ ta ép kiểu, trong Python ta dùng hàm ord(),
chr(), qua ví dụ này nhấn mạnh hơn với học sinh về phép toán nhân (*) xâu.

22


2.2.2 Dạng bài tập có yêu cầu duyệt xử lý xâu con.
Duyệt xâu con trên xâu ký tự là một u cầu thường gặp khi giải các bài
tốn, có nhiều cách thực hiện duyệt khác nhau, để giải quyết các bài tốn dạng
này học sinh phải có kỹ năng nhận dạng, phân tích bài tốn rồi lựa chọn thuật
tốn thích hợp để giải quyết.
Bài tập 1: Xâu con dài nhất
Cho xâu S, tìm xâu con liên tục dài nhất của xâu S mà không chứa chữ số
nào. Kết quả đưa ra vị trí đầu và xâu con đó. Nếu có nhiều xâu con dài nhất thì
đưa ra xâu đầu tiên.
Ý tưởng giải thuật:
Có rất nhiều giải thuật để duyệt tìm xâu con dài nhất thỏa mãn một điều
kiện nào đó.
Cách 1: Duyệt vét cạn thử với mọi xâu con để tìm xâu con dài nhất.
Sử dụng hai vịng for lồng nhau duyệt từ đầu đến hết xâu với mỗi cặp chỉ
số đầu i và chỉ số j. Ta kiểm tra có thỏa mãn điều kiện hay khơng, rồi so sánh
tìm xâu con thỏa mãn dài nhất.
Cách 2: Duyệt theo các xâu con với độ dài từ lớn đến bé.
Ta duyệt các xâu con với độ dài từ độ dài xâu mẹ giảm dần. Khi gặp xâu
con đầu tiên thỏa mãn điều kiện thì đây chính là xâu cần tìm và ta kết thúc việc
duyệt bằng lệnh break;
Cách 3: Duyệt phát triển xâu con:
Lần lượt duyệt lần lượt các ký tự trong xâu, dùng biến lmax để lưu độ dài

xâu lớn nhất đã tìm được, nếu gặp ký tự thỏa mãn (không phải số) ta tăng dần độ
dài xâu con. Khi gặp ký tự khơng thỏa mãn (ký tự số) thì ta thu được một xâu
con thỏa mãn điều kiện, đem độ dài xâu này so sánh với lmax đã lưu để cập nhật
lại lmax mới.
Đây là 3 cách duyệt xâu con, đoạn con dài nhất phổ biến. với từng bài
toán cụ thể các mô tả về xâu con, đoạn con lại khác nhau và lúc đó phương pháp
duyệt tốt nhất lại khác nhau, ta cần phân tích cân nhắc kỹ càng để lựa chọn thuật
toán tốt nhất.
Với bài toán này ta sử dụng cách 3 duyệt theo phát triển xâu con với độ
phức tạp o(n).
Các chương trình tham khảo sau được viết theo ý tưởng này:

23


Chương trình viết bằng C++

Chương trình viết bằng Python

Ý tưởng sư phạm: Qua bài tập này phân tích cho học sinh:
+ Một số hướng giải dạng bài tốn tìm xâu con dài nhất thỏa mãn một
điều kiện nào đó, đây cũng là một dạng toán thường gặp trong các đề thi. Việc
lựa chọn thuật giải nào còn phụ thuộc vào điều kiện cụ thể.
+ Lưu ý học sinh về cách sử dụng các hàm: isdigit(), isalpha()
Bài tập 2: Đảo từ trong xâu
Cho xâu ký tự s, từ là một xâu con liên tiếp không chứa dấu cách. Một
xâu ký tự có thể gồm nhiều từ.
Em hãy viết chương trình nhập vào xâu ký tự s. Đưa ra xâu đó với các từ
được viết theo chiều ngược lại.
Ví dụ: s = “di xe dap” thì kết quả là: kq =“dap xe di”

Ý tưởng giải thuật:
Cách 1: Duyệt trên từng ký tự của xâu: Duyệt ngược xâu từ sau ra trước,
mỗi lần tìm thấy dấu cách hoặc ký tự đầu tiên của xâu, thì đọc các ký tự từ vị trí
đó đến vị trí dấu cách đã gặp trước đó.

24


Cách 2: Duyệt tìm vị trí chứa các dấu cách copy xâu con giữa 2 dấu cách
rồi nối vào xâu kết quả.
Cách 3: (dành riêng cho Python) tách xâu thành các xâu con lưu vào list,
sau đó thực hiện đảo chiều list rồi nối lại thành xâu kết quả
Chương trình tham khảo:
Sau đây là chương trình thể hiện ý tưởng cách 2 bằng C++ và cách 3 bằng
Python
Chương trình cách 3 bằng Python

Ý tưởng sư phạm:
Qua bài toán này lưu ý học sinh:
+ Khi diễn tả thuật toán ta cần chú ý trau chuốt từng câu lệnh để chương
trình trở nên ngắn gọn, sáng sủa hơn. Ví dụ trong chương trình trên việc nội
thêm dấu cách vào trước và sau xâu nhập vào đã giúp việc diễn tả trở nên đơn
giải hơn.
+ Khi dùng hàm find() trong vòng lặp chúng ta cần cân nhắc lựa chọn có
hay khơng tham số vị trí bắt đầu tìm, vì một số trường hợp có thể dẫn đến việc
máy phải tìm đi tìm lại một đối tượng trên xâu nhiều lần do nguyên lý hoạt động
của hàm find(). Chúng ta cần giám sát để khéo léo loại tình huống đó.
+ Cũng qua bài tốn này ta thấy việc sử dụng linh hoạt các hàm của
Python có thể thu được chương trình rất ngắn gọn, sáng sủa.


25


×