1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

45 28 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 45
Dung lượng 1,16 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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ở g

Trang 1

Đề 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”

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

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

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

Trang 2

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ố

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

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

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

Trang 3

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 toà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 quát 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 luôn 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 luôn 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

Trang 4

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 toá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 toá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

Trang 5

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 toán cũng như phân tích, đánh giá chính xác hiệu suất thuật toá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&ĐT-GDTrH 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 quát, toà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

Trang 6

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 toá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ê chuyên 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 toán giải các bài toá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 quá trình giải một bài toán trên máy tính, còn để tất cả học sinh tự giải một bài hoàn chỉnh là rất khó

Trang 7

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 quá 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 toá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

Trang 8

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

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

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

- Các ký tự của xâu được đặt trong cặp

nháy kép

- Các ký tự trong xâu được đánh chỉ số

từ trước ra sau bắt đầu từ 0; không

đánh chỉ số ngược

- Khai báo: Để sử dụng cần khai báo

biến xâu: string <tên biến xâu>;

- Trong C++ có thể thực hiện các thao

tác làm thay đổi 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ố

- Không cho phép thực hiện phép nhân

xâu với một số nguyên

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

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

- 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 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ố

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

- Khai báo: Trong Python không cần khai báo, để tạo biến xâu ta chỉ cần gán xâu cho biến đó

- 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 giá trị của xâu

- 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ố

- Cho phép thực hiện phép nhân xâu 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();

Trang 9

- 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

-

Trang 10

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

- 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

Trang 11

- Hàm capitalize() viết hoa ký tự đầu tiên trong xâu, các chữ còn lại viết

- 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 toá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 toá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 toá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)

Trang 12

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:

Trang 13

- 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

Ý 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

Trang 14

Ý 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 toá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

Trang 15

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

Trang 16

Ý 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: Dùng hàm replace để thực hiện

Chương trình tham khảo bằng C++

Ý 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

Chương trình 1: Chương trình 2:

Trang 17

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 quá 103) 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

Ngoà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

Trang 18

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 toà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

Trang 19

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 toá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

Trang 20

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

* 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()

Chương trình 1: Chương trình 2:

Trang 21

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 hoàn toà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:

Ý 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 toá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ự ngoài bảng chữ cái vẫn được giữ nguyên

Trang 22

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ố nguyên K (1<K<=26) và xâu S không quá 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

Ngày đăng: 21/05/2021, 22:05

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
7. Một số tài liệu, trang mạng liên quan: http://laptrinhphothong.vn/ Link
1. Bộ Giáo dục và Đào tạo, Chương trình giáo dục phổ thông môn Tin học 2018. Thông tư số 32/2018/TT-BGDĐT, Hà Nội Khác
2. Hồ Sỹ Đàm, Sách giáo khoa Tin học 10 (2011). Nhà xuất bản giáo dục, Hà Nội Khác
3. Hồ Sỹ Đàm, Sách giáo khoa Tin học 11 (2011). Nhà xuất bản giáo dục, Hà Nội Khác
4. Hồ Sỹ Đàm, Sách bài tập Tin học 11 (2011). Nhà xuất bản giáo dục, Hà Nội Khác
5. Bùi Việt Hà, Python cơ bản, Nhà xuất bản Đại Học Quốc Gia Hà Nội 6 Khác
6. Bùi Việt Hà – Bùi Vũ Huy, Lời giải bài tập Python cơ bản, Nhà xuất bản Đại Học Quốc Gia Hà Nội Khác

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w