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

(SKKN mới NHẤT) một số BIỆN PHÁP NÂNG CAO HIỆU QUẢ CÔNG tác bồi DƯỠNG học SINH GIỎI môn TIN học BẰNG NGÔN NGỮ lập TRÌNH c++

95 63 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

Tiêu đề Một Số Biện Pháp Nâng Cao Hiệu Quả Công Tác Bồi Dưỡng Học Sinh Giỏi Môn Tin Học Bằng Ngôn Ngữ Lập Trình C++
Tác giả Tô Thị Tường, Nguyễn Minh Hải
Người hướng dẫn Tổ Toán Tin - Phó Hiệu Trưởng
Trường học Trường THPT Yên Thành 3
Chuyên ngành Tin học
Thể loại sáng kiến
Năm xuất bản 2021 - 2022
Thành phố Nghệ An
Định dạng
Số trang 95
Dung lượng 2,38 MB

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

Nội dung

Là một giáo viên bộ môn Tin học, tôi nhận thấy bên cạnh 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

Trang 1

SỞ GIÁO DỤC VÀ ĐÀO TẠO NGHỆ AN TRƯỜNG THPT YÊN THÀNH 3

Trang 2

1 Tầm quan trọng của việc bồi dưỡng học sinh giỏi 5

2 Lợi thế của việc lựa chọn NNLT C++ trong công tác BD HSG 5

3 Một số năng lực đặc thù cần chú trọng trong công tác bồi dưỡng

1 Thực trạng về công tác bồi dưỡng học sinh giỏi môn Tin học ở

2 Những thuận lợi và khó khăn trong công tác bồi dưỡng học sinh

1 Công tác chỉ đạo - Thắp lửa đam mê, hứng thú học tập cho HS 9

1.1/ Vai trò của ban giám hiệu trong công tác BDHSG 9

1.2/ Vai trò của giáo viên trực tiếp bồi dưỡng đội tuyển 10

2 Phát hiện học sinh có khả năng tham gia bồi dưỡng và tuyển

2.1/ Phát hiện học sinh có năng khiếu và hình thành đội tuyển 11

2.2/ Tuyển chọn học sinh tham gia dự thi 12

3 Xây dựng nội dung chương trình, lập kế hoạch bồi dưỡng 12

3.1/ Một số lưu ý khi xây dựng nội dung chương trình bồi dưỡng 12

3.2/ Xây dựng các chuyên đề bồi dưỡng 12

4.1.2 Tự kiểm tra đánh giá, rút kinh nghiệm của học sinh 15

Trang 3

4.2 Dạy học theo chuyên đề 16

4.2.1 Chuyên đề kiến thức cơ bản trong C++ 16

5 Tổ chức thi thử, đánh giá, kinh nghiệm làm bài thi 44

5.1 Tổ chức thi thử, đánh giá học sinh 44

PHỤ LỤC:

Một số bài tập luyện tập, mở rộng và nâng cao

Hướng dẫn giải và chương trình tham khảo

52

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

Trang 4

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

I LÝ DO CHỌN ĐỀ TÀI

Trong thời đại ngày nay, 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 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, tôi nhận thấy bên cạnh 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

Qua thời gian giảng dạy tại đơn vị mình, tôi đã được BGH tin tưởng, phân công bồi dưỡng học sinh giỏi (HSG) Với niềm đam mê, ham học hỏi tôi luôn tìm tòi nghiên cứu để 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 Và đã đạt được những kết quả rất đáng tự hào, trong những năm gần đây học sinh của tôi đều đạt giải cao tại kỳ học sinh giỏi cấp tỉnh

Trong quá trình giảng dạy tôi luôn tích cực trao đổi kinh nghiệm, thảo luận

về các giải pháp nâng cao hiệu quả công tác BDHSG từ việc tổ chức, chọn đội tuyến đến nội dung, phương pháp, kỹ thuật dạy học với đồng nghiệp và nhận thấy nhiều giáo viên gặp khó khăn trong công tác bồi dưỡng học sinh giỏi, đặc biệt với ngôn ngữ lập trình C++ các giáo viên lại có nhiều hạn chế và khó khăn hơn nên tôi đã nghiên cứu một cách nghiêm túc và đề xuất một số biện pháp hữu hiệu, khả thi để đạt kết quả cao hơn Rất mong các đồng nghiệp tiếp tục góp ý để đề tài của tôi ngày càng hoàn thiện và ứng dụng rộng rãi trong thực tiễn

II – MỤC ĐÍCH CỦA SÁNG KIẾN

Nghiên cứu và chia sẻ các biện pháp góp phần nâng cao hiệu quả trong công tác BDHSG cấp tỉnh bộ môn Tin học ở các trường THPT trên địa bàn tỉnh Nghệ An

III – ĐỐI TƯỢNG NGHIÊN CỨU:

- Đối tượng học sinh khá giỏi khối 11, 12

- Nội dung chương trình theo yêu cầu của công tác BDHSG

- Phương pháp, kỹ thuật dạy học HSG

Trang 5

IV – PHƯƠNG PHÁP NGHIÊN CỨU:

Kết hợp nhiều phương pháp : Nghiên cứu lý thuyết, nghiên cứu từ thực tiễn dạy học, phân tích, tổng hợp, điều tra, thực nghiệm

V - ĐIỂM MỚI CỦA ĐỀ TÀI NGHIÊN CỨU

- Về lý luận: Góp phần làm rõ cơ sở lí luận về vấn đề bồi dưỡng học sinh giỏi, làm rõ khái niệm, vai trò đặc điểm của các yếu tố ảnh hưởng đến chất lượng công tác bồi dưỡng học sinh giỏi

+ Xây dựng được nội dung chương trình bồi dưỡng học sinh giỏi môn Tin học

+ Đưa ra được quy trình tổ chức dạy học dạy học bồi dưỡng hsg môn Tin học

+ Sáng kiến đã đưa ra một 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ập trình cho học sinh bằng cách định hướng, uốn nắn qua 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 6

Phần 2 NỘI DUNG

I - CƠ SỞ LÝ LUẬN:

1 Tầm quan trọng của việc bồi dưỡng học sinh giỏi

- Nhân tài có vai trò hết sức quan trọng trong việc phát triển kinh tế, xã hội Trong đường lối đổi mới toàn diện của đất nước ta về giáo dục và đào tạo, Đảng

ta đã xác định: “Cùng với khoa học và công nghệ, giáo dục và đào tạo là quốc sách hàng đầu nhằm nâng cao dân trí, đào tạo nhân lực, bồi dưỡng nhân tài ”

- Việc bồi dưỡng học sinh giỏi, đào tạo nguồn nhân tài cho đất nước là một nhiệm vụ rất quan trọng và cần thiết vì những người tài bao giờ cũng là nhân tố quan trọng để thúc đẩy xã hội phát triển

- Đã từ lâu việc phát hiện và bồi dưỡng học sinh giỏi là nhiệm vụ trọng tâm của các trường THPT vì vậy các nhà trường đặc biệt quan tâm và mọi giáo viên đều có nhiệm vụ phát hiện và bồi dưỡng học sinh giỏi

- Tổ chức bồi dưỡng học sinh giỏi và thi học sinh giỏi nhằm: Động viên khích lệ những học sinh và giáo viên trong dạy và học, góp phần thúc đẩy việc cải tiến, nâng cao chất luợng giáo dục, đồng thời phát hiện học sinh có năng khiếu để tiếp tục bồi dưỡng và định hướng nghề nghiệp đúng sở thích, sở trường, nhằm tạo nguồn nhân lực chất lượng cao cho đất nước

2 Lợi thế của việc lựa chọn NNLT C++ trong công tác BD HSG

Trong quy định của các kỳ thi HSG Tin học, thí sinh có thể lập trình bằng ngôn ngữ Pascal, C++ (trên DevC++, Code Block), Python để giải các bài toán Trong ba NNLT này, C++ là ngôn ngữ nên được lựa chọn hàng đầu vì nó có những ưu điểm nổi bật hơn hẳn so với hai ngôn ngữ lập trình còn lại ở một số đặc điểm sau:

- 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 Bên cạnh đó C++ cũng là một NNLT đ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

- Thư viện C++ có nhiều cấu trúc dữ liệu khác nhau cho học sinh linh hoạt lựa chọn cấu trúc phù hợp để lưu trữ và xử lý bài toán của mình Bên cạnh đó C++

có hệ thống hàm có sẵn rất phong phú như tìm min, max, tính tổng, sắp xếp (với nhiều thuật toán khác nhau), thay thế các phần tử, tìm kiếm (tìm kiếm thường và tìm kiếm nhị phân)… Do đó tiết kiệm thời gian và tăng tốc độ viết code lên rất nhiều

- Tốc độ thực thi chương trình rất nhanh do C++ sử dụng trình biên dịch Thời gian thực thi và thời gian biên dịch chương trình viết bằng ngôn ngữ C++ được đánh giá nhanh hơn bất kỳ ngôn ngữ lập trình nào khác Đây là một tiêu chí cực kỳ quan trọng trong lập trình thi đấu cũng như trong các kỳ thi học sinh giỏi các cấp

Trang 7

3 Một số năng lực đặc thù cần chú trọng trong công tác bồi dưỡng học sinh giỏi bộ môn Tin học

* Năng lực vận dụng, khai thác kiểu dữ liệu, cấu trúc dữ liệu

Mỗi ngôn ngữ lập trình đều cung cấp một số kiểu dữ liệu đơn giản cho biết phạm vi giá trị có thể lưu trữ, dung lượng bộ nhớ cần thiết để có thể lưu trữ và các phép toán tác động lên dữ liệu Kiểu dữ liệu có cấu trúc là kiểu dữ liệu được tạo ra từ các phần tử có kiểu dữ liệu đơn giản bằng một cách nào đó Chúng được đặc trưng bằng kiểu dữ liệu của các phần tử và điều quan trọng hơn cả là phương pháp cấu thành kiểu dữ liệu mới, phương pháp truy nhập vào kiểu dữ liệu có cấu trúc

Các đề thi học sinh giỏi ngày nay thường có yêu cầu cao về phạm vi dữ liệu cần được xử lý và có giới hạn về dung lượng bộ nhớ nên việc sử dụng cấu trúc dữ liệu cần phải được cân nhắc và sử dụng một cách hợp lý để tránh lãng phí về mặt

bộ nhớ và thuận lợi, hiệu quả trong việc xử lý

Đối với một học sinh giỏi tin học yêu cầu học sinh phải hiểu biết các cấu trúc dữ liệu mà ngôn ngữ lập trình cung cấp; có khả năng vận dụng các cấu trúc

dữ liệu để tổ chức và xử lý dữ liệu đặc thù cho từng lớp bài toán

* Năng lực phân tích và đánh giá độ phức tạp của thuật toán

Mỗi thuật toán chỉ giải một bài toán, nhưng có thể có nhiều thuật toán khác nhau cùng giải một bài toán Do vậy, cần thiết phải lựa chọn một thuật toán tốt nhất để giải bài toán đã cho Khi đánh giá và lựa chọn thuật toán người ta thường căn cứ vào các tiêu chí như:

+ Thuật toán đơn giản, dễ hiểu, dễ cài đặt - dễ viết chương trình;

Các đề thi học sinh giỏi môn Tin học có yêu cầu ngày càng cao cả về độ khó lẫn thời gian thực hiện chương trình Chúng ta thường thấy trong các bài thi

có ghi yêu cầu thời gian thực hiện là 1 giây và việc cho điểm ứng với miền giá trị của tham số Vì vậy, hiểu rõ về khái niệm độ phức tạp thuật toán và cách tính toán, ước lượng độ phức tạp của giải thuật để lựa chọn thuật toán tối ưu giải quyết được các bộ dữ liệu lớn của bài toán là hết sức quan trọng, yêu cầu học sinh phải thường xuyên học tập và rèn luyện

* Năng lực viết chương trình triển khai giải thuật

Việc viết chương trình bao gồm cả việc lựa chọn cấu trúc dữ liệu để diễn tả

Trang 8

thuật toán Kỹ năng viết chương trình hết sức quan trọng Nó liên quan tới phong cách, thói quen, tay nghề lập trình và thậm chí cả yếu tố tâm lý lúc làm việc

Khi giải một bài toán tin ở phần chuẩn bị các em thường chỉ dừng lại bước đoán nhận giải thuật rồi bắt tay ngay vào việc viết chương trình Vì vậy chương trình thường không hiệu quả, dễ mắc lỗi, mà việc tìm và sửa lỗi nhiều khi rất khó khăn, mất thời gian, có khi phải mất thời gian ngang với thời gian lập trình Để khắc phục điều này các em cần phải viết sơ đồ cấu chương trình trước khi đi vào viết chi tiết

Kỹ năng trình bày giải thuật là một kỹ năng vô cùng quan trọng, cần được rèn luyện kỹ năng này từ rất sớm, bắt đầu từ những bài toán đơn giản và trong suốt quá trình học cho đến khi các em đi thi

Viết chương trình triển khai giải thuật là cả một vấn đề nghệ thuật, nếu triển khai không khéo thì dù có thuật toán tốt thời gian thực hiện chương trình có thể đội lên cao

Trong những năm gần đây, vị trí, vai trò của môn Tin học có nhiều thay đổi song chưa được đưa vào các kỳ thi mang tính chất đại trà, vì vậy học sinh và phụ huynh chưa quan tâm đến môn học này, một bộ phận học sinh ít chú ý đến bộ môn học, tự bản thân các em coi đó là môn phụ Bởi vậy không ít các giờ học Tin học diễn ra tẻ nhạt, nặng nề, học sinh ít quan tâm làm giáo viên mất hứng thú và nhiệt huyết Chính vì thế lượng giáo viên Tin học đam mê chuyên môn, chuyên tâm với nghề còn rất ít nên đã ảnh hưởng không nhỏ đến việc bồi dưỡng học sinh giỏi

Trong thực tế, quan niệm sai lầm của một số người là “thi gì học nấy”, môn tin là môn phụ - không thi THPT quốc gia, không có khối nào dùng để xét vào các trường cao đẳng, đại học Quan niệm này không chỉ có ở học sinh, mà còn có trong cả phụ huynh, thậm chí ngay cả trong đội ngũ giáo viên Đa số các học sinh không muốn tham gia bồi dưỡng học sinh giỏi vì sợ mất thời gian ảnh hưởng các môn học khác, phụ huynh cũng không ủng hộ, ngay cả trong đội ngũ giáo viên cũng có những người không muốn cho học sinh của mình thi HSG môn Tin Chính những khó khăn đó luôn tạo áp lực cho giáo viên khi tham gia dạy bồi dưỡng học sinh giỏi Vì vậy ảnh hưởng không nhỏ đến kết quả, chất lượng học sinh giỏi môn Tin học ở các trường trung học phổ thông

Trang 9

2 Những thuận lợi và khó khăn trong công tác bồi dưỡng học sinh giỏi môn Tin học ở trường THPT hiện nay

* Thuận lợi:

- Ban giám hiệu các trường THPT đã rất quan tâm đến công tác bồi dưỡng học sinh giỏi và đã có sự chỉ đạo, quan tâm sâu sát kịp thời, có những kế hoạch

cụ thể và lâu dài cho công tác bồi dưỡng HSG

- Rất nhiều giáo viên có trình độ chuyên môn vững vàng, có kinh nghiệm

và nhiệt huyết lớn trong công tác bồi dưỡng HSG ở trong và ngoài trường sẵn sàng giúp đỡ chia sẻ, hỗ trợ nhau trong công tác BD HSG

- Có rất nhiều trang mạng về lập trình phổ thông giúp học sinh có thể học tập, làm bài, thi thử, chấm bài tự động để các em đánh giá và rèn luyện khả năng của bản thân Đây là các yếu tố quan trọng tạo nên kết quả học sinh giỏi tỉnh hàng năm cao

* Khó khăn:

- Giáo viên dạy bồi dưỡng vừa phải bảo đảm chất lượng đại trà, vừa phải hoàn thành chỉ tiêu chất lượng mũi nhọn và công tác kiêm nhiệm do đó cường độ làm việc quá tải và việc đầu tư cho công tác bồi dưỡng HSG cũng có phần bị hạn chế

- Giáo viên dạy bồi dưỡng đều phải tự soạn chương trình dạy, theo kinh nghiệm của bản thân, tự nghiên cứu, tự sưu tầm tài liệu:

+ Tài liệu về bộ môn Tin học không nhiều 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ả

+ Hệ thống bài tập ít ỏi, rời rạc nê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ụ dạy học mất rất nhiều thời gian

+ Rất ít tài liệu, sách vở nói đến các tiểu tiết để cải tiến chương trình

- Học sinh học chương trình chính khóa phải học quá nhiều môn, lại phải học thêm nhiều môn khác, cộng thêm chương trình bồi dưỡng HSG nên rất hạn chế về thời gian tự học Các em đầu tư ít thời gian cho việc học bồi dưỡng HSG,

do đó kết quả không cao là điều tất yếu

- Sau các kỳ thi học sinh giỏi môn Tin thường không có đáp án Nếu có đáp

án tham khảo thì việc đọc và hiểu được đáp án cũng rất khó do đáp án thường không có ý tưởng thuật toán kèm theo Thực tế, qua các kỳ thi HSG tỉnh Nghệ An

đã có rất nhiều học sinh, giáo viên khó hiểu khi bài thi làm đúng nhưng điểm thi vẫn rất thấp và sự khó hiểu đó vẫn cứ kéo dài do đáp án tham khảo và test chấm

ít được công bố

Vì vậy, trong quá trình giảng dạy giáo viên phải luôn tích cực trao đổi kinh nghiệm, thảo luận về nội dung, phương pháp, kỹ thuật dạy học với các đồng nghiệp trong và ngoài nhà trường để nâng cao chất lượng giáo dục bộ môn

Trang 10

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

1 Công tác chỉ đạo - Thắp lửa đam mê, hứng thú học tập cho HS 1.1 Vai trò của ban giám hiệu trong công tác BDHSG

Ban giám hiệu nhà trường quan tâm chỉ đạo sát sao tới công tác bồi dưỡng học sinh giỏi của trường, coi đó là nhiệm vụ chính trị quan trọng hàng đầu của trường; luôn nghiên cứu để tìm ra biện pháp chỉ đạo bồi dưỡng học sinh giỏi nhằm nâng cao chất lượng bồi dưỡng học sinh giỏi cụ thể là:

- Nâng cao nhận thức về công tác bồi dưỡng học sinh giỏi:

+ Thường xuyên gặp gỡ, trao đổi, nắm bắt những tâm tư nguyện vọng, những đề xuất, kiến nghị của giáo viên, học sinh để tìm biện pháp đáp ứng, đặc biệt là vấn đề tài liệu, công cụ học tập …

+ Luôn quan tâm đến công tác bồi dưỡng giáo viên: bồi dưỡng tư tưởng, chính trị, đạo đức, phẩm chất nghề nghiệp; năng lực chuyên môn; kỹ năng sư phạm; kiến thức kinh nghiệm thực tế và bồi dưỡng các kiến thức bổ trợ

+ Làm tốt công tác động viên, khen thưởng thích đáng giáo viên, học sinh

có kết quả cao trong quá trình bồi dưỡng

- Xây dựng kế hoạch công tác bồi dưỡng học sinh giỏi:

+ Xây dựng kế hoạch phải dài hạn, khoa học, chi tiết, cụ thể, có chiều sâu

- Phân công giáo viên trực tiếp bồi dưỡng đội tuyển học sinh:

Vai trò của người giáo viên trong công tác phát hiện, bồi dưỡng học sinh giỏi là hết sức quan trọng Có thể nói giáo viên bồi dưỡng là một trong những yếu

tố quan trọng quyết định kết quả bồi dưỡng Vì vậy khi tuyển chọn và phân công giáo viên bồi dưỡng, cán bộ quản lí phụ trách công tác chuyên môn cần dựa trên tiêu chí như:

+ Lựa chọn giáo viên có trình độ năng lực, chuyên môn, nghiệp vụ cao + Nhiệt tình, yêu nghề, say sưa với nghề, ham học hỏi, tự bồi dưỡng và cầu tiến, có ý thức kỉ luật cao trong chuyên môn

+ Có sức khoẻ, tự tin, giàu kinh nghiệm, có tính sáng tạo trong giảng dạy + Cần phân công, cần giao nhiệm vụ cho giáo viên ngay từ lớp 10 đến lớp

12 để giáo viên có trách nhiệm và kế hoạch bồi dưỡng sớm

- Tổ chức chỉ đạo bồi dưỡng học sinh giỏi:

Trang 11

+ Việc bồi dưỡng học sinh giỏi cần được làm thường xuyên, liên tục không nhất thiết phải tổ chức riêng lớp, riêng buổi Giáo viên có thể dạy lồng ghép vào trong từng bài học, tiết học của bộ môn Mỗi giờ học có thể phát triển một lượng kiến thức nâng cao một cách phù hợp, nhẹ nhàng, tự nhiên rồi ra bài tập thêm cho đối tượng học sinh khá, giỏi qua nhiều hình thức khác nhau

+ Khoảng ba tháng trước thi có thể tổ chức bồi dưỡng nâng cao cho học sinh mỗi tuần một buổi với thời lượng phù hợp vừa sức với học sinh tránh gò ép, nhồi nhét dẫn đến tình trạng học sinh mất hứng thú với việc học

+ Tổ nhóm chuyên môn cần xây dựng nội dung chương trình thống nhất, giáo viên cần phải sử dụng quỹ thời gian hợp lý đảm bảo theo hết chương trình này

- Tổ chức kiểm tra, đánh giá xếp loại học sinh:

Hàng tháng, tổ chức kiểm tra, thi thử xếp thứ tự học sinh trong đội tuyển bằng các hình thức như: Giáo viên trực tiếp dạy tự ra đề, chấm, xếp loại học sinh hoặc kết hợp với các trường trong huyện tổ chức thi cụm để tăng tính thi đua và luyện tập cho học sinh Hàng tháng, động viên, khen thưởng những em có thành tích cao nhất trong đội tuyển

Sự quan tâm của BGH ảnh hưởng lớn đến nhận thức của phụ huynh, học sinh Từ đó giáo viên và học sinh ngày càng thấy được niềm tự hào và trách nhiệm của mình trong việc thực hiện mục tiêu đào tạo của nhà trường trong công tác bồi dưỡng học sinh giỏi

1.2 Vai trò của giáo viên trực tiếp giảng dạy

+ Phẩm chất, uy tín, năng lực của người giáo viên có ảnh hưởng trực tiếp đến quá trình học tập và rèn luyện của học sinh Thầy cô là yếu tố hàng đầu đóng vai trò quyết định trong công tác BDHSG, là người chỉ đường về quy trình ôn luyện, định hướng các nội dung học tập, truyền dạy hứng thú, niềm say mê môn học cho các em

+ Giáo viên là tấm gương trong việc tự học, tự hoàn thiện bản thân về phẩm chất và năng lực chuyên môn, tâm huyết với công việc để từ đó các em tin tưởng noi theo

+ Giáo viên phải rất cố gắng, nỗ lực, sáng tạo và nghiêm túc trong trong các khâu của quá trình bồi dưỡng: như tuyển chọn học sinh, thiết kế nội dung bồi dưỡng, các phương pháp dạy học truyền thống và hiện đại phải được sử dụng linh hoạt và nhuần nhuyễn, phát huy được khả năng tự học, tự nghiên cứu của học trò trong lĩnh hội kiến thức

Môn tin học là một lĩnh vực không ngừng phát triển và thay đổi vì vậy người giáo viên giảng dạy tin học phải không ngừng học tập và cập nhật những kiến thức mới về lĩnh vực CNTT để kịp thời bổ sung cho học sinh gieo niềm tin,

sự hứng thú học tập và kích thích đam mê khám phá cho học sinh

Trang 12

2 Phát hiện học sinh có khả năng tham gia bồi dưỡng và tuyển chọn học sinh dự thi kỳ thi học sinh giỏi

2.1 Phát hiện và hình thành đội tuyển

Việc phát hiện và tuyển chọn học sinh vào đội tuyển học sinh giỏi là một trong những khâu rất quan trọng, quyết định phần lớn chất lượng của công tác bồi dưỡng học sinh giỏi

Trước khi thành lập đội tuyển tôi quan tâm tới đối tượng học sinh, đặc biệt

là những học sinh có khả năng học tốt môn Tin học; tìm hiểu tố chất, năng lực lĩnh hội kiến thức cũng như tâm lý, nhu cầu, động cơ học tập của các em để đo mức độ hứng thú và say mê học tập Trên cơ sở đó, kịp thời nắm bắt diễn biến tư tưởng và ý thức học tập của các em; khích lệ, động viên kịp thời

Việc phát hiện và bồi dưỡng học sinh giỏi cần được tiến hành từ đầu cấp thông qua quá trình giảng dạy trên lớp, qua các giờ thực hành, qua các bài kiểm tra và qua phụ huynh và giáo viên trực tiếp giảng dạy các môn

Thực tế ngay trong năm học đầu cấp, giáo viên đã phải sàng lọc những em

có tố chất và có tinh thần say mê môn học và từ đó có kế hoạch bồi dưỡng Đến năm sau thì việc hình thành đội tuyển đã dần dần được cụ thể

Môn Tin là môn học đặc trưng, như chúng ta biết việc thi HSG Tin Học liên quan đến nhiều kiến thức môn Toán Vì vậy GV bồi dưỡng sau khi nhắm vào một số đối tượng thì phải tìm hiểu khả năng học toán của các đối tượng đó thông qua giáo viên Toán, giáo viên chủ nhiệm Mặt khác có những học sinh giỏi Toán nhưng chưa say mê môn Tin học thì GV tin học lại động viên khích lệ những học sinh này yêu thích môn học của mình để từ đó có thể bổ sung thêm vào danh sách đội tuyển

2.2 Tuyển chọn học sinh tham gia dự thi

Trong quá trình bồi dưỡng giáo viên cần đánh giá học sinh một cách khách quan, chính xác, qua bài thi và qua việc học tập bồi dưỡng hằng ngày để lựa chọn chính xác đối tượng học sinh có đủ phẩm chất và năng lực đại diện cho trường tham dự kỳ thi

- Học sinh được lựa chọn cần có các tố chất sau:

+ Có niềm say mê, yêu thích môn học Sự say mê ấy phải được biểu hiện thường xuyên, liên tục và bằng ý thức tự giác trong học tập Học sinh có khả năng

và phương pháp tự học sẽ lĩnh hội được nhiều kiến thức và ghi nhớ được lâu

+ Có tư duy tốt, tiếp thu vấn đề nhanh, nhớ lâu Các em có khả năng suy luận, quy nạp, khái quát hóa, trừu tượng hóa Các em có khả năng hiểu sâu, rộng nhiều vấn đề

Trang 13

+ Có tính sáng tạo, tư duy độc lập, có óc phê phán, không suy diễn theo lối mòn, luôn muốn đi tìm bản chất, tìm ra quy luật, có khả năng phán đoán, tìm ra cách thức tối ưu

- Học sinh được lựa chọn cuối cùng là những học sinh có năng lực nổi bật trong việc khai thác các kiểu dữ liệu, tư duy thuật toán tốt, có kỹ năng triển khai giải thuật

Trong quá trình bồi dưỡng, tổ chức các cuộc thi định kỳ hàng tháng để đánh giá, sàng lọc, tuyển chọn học học sinh vào đội tuyển chính thức, trước thời gian thi Tỉnh khoảng 2 tháng để tiếp tục bồi dưỡng nâng cao

3 Xây dựng nội dung chương trình, kế hoạch bồi dưỡng

3.1 Một số lưu ý khi xây dựng nội dung bồi dưỡng

- Khi xây dựng nội dung chương trình bồi dưỡng cần căn cứ vào kế hoạch của Sở Giáo dục & Đào tạo, nhiệm vụ của nhà trường về công tác bồi dưỡng học sinh giỏi, khung chương trình và cấu trúc đề thi mà Sở ban hành đối với bộ môn

- Hiện nay có rất nhiều sách nâng cao và các tài liệu tham khảo, internet song việc soạn thảo chương trình bồi dưỡng thích hợp là một việc làm hết sức quan trọng và rất khó khăn, nếu không có sự tham khảo, tìm tòi và chọn lọc tốt

- Khi soạn thảo nội dung bồi dưỡng cần thiết kế từ nội dung cơ bản, tới chương trình nâng cao, từ đơn giản tiến tới phức tạp Đồng thời cũng phải có ôn tập củng cố

- Không nên phụ thuộc sách nâng cao hiện nay vì các sách này phù hợp hơn cho đối tượng học sinh hệ chuyên bởi thế học sinh không chuyên khó hiểu sâu, nắm chắc, dễ nhầm lẫn và trong sách nâng cao có một số bài quá khó đối với học sinh

- Giáo viên cần tổng hợp các dạng bài, các phương pháp giải theo hệ thống

Vì hầu hết học sinh chưa tự mình hệ thống được mà đòi hỏi phải có sự giúp đỡ của giáo viên Ngoài ra, cần có hệ thống các bài tập tổng hợp giúp học sinh rèn luyện khả năng nhận dạng các lớp bài toán

- Khi thiết kế các bài tập rèn luyện cần đưa ra các miền giá trị khác nhau, việc đưa ra nhiều ràng khác nhau của miền giá trị sẽ giúp rèn luyện và đánh giá được năng lực của học sinh Với mỗi miền giá trị việc giải quyết bài toán thường

sẽ khác nhau cả về thuật toán lẫn khối lượng lập trình

4.2/ Xây dựng các chuyên đề dạy học

Ngoài hệ thống kiến thức, kỹ năng được rèn luyện trong chương trình chính khóa Cần xây dựng các chuyên đề bồi dưỡng nâng caođể giáo viên xác định được nhiệm vụ của mình dạy cho học sinh nội dung gì và dạy như thế nào

Trang 14

Căn cứ khung chương trình và cấu trúc đề thi của Sở Giáo dục & Đào tạo,

ví dụ cấu trúc đề thi HSG cấp tỉnh lớp 12, năm học 2021-2022 cùng với kinh nghiệm của nhiều năm qua, tôi đã xây dựng hệ thống chuyên đề bồi dưỡng nâng cao học sinh giỏi như sau:

Chuyên đề 1: Kiến thức cơ bản về NNLT C++

- Kiểu dữ liệu đơn giản và các phép toán cơ bản

- Các cấu trúc điều khiển;

- Kiểu dữ liệu có cấu trúc

- Kiểu dữ liệu tệp

- Chương trình con và lập trình có cấu trúc

Chuyên đề 2: Số học

- Phép toán chia lấy dư và nguyên lý đồng dư

- Số hoàn hảo, số Fibonaxi

- Số nguyên tố, sàng số nguyên tố

- Phân tích thừa số nguyên tố

Chuyên đề 3: Xử lý dãy số

- Thuật toán tìm giá trị nhỏ nhất, lớn nhất của dãy số

- Thuật toán tìm kiếm: tìm kiếm tuần tự, tìm kiếm nhị phân

- Thuật toán sắp xếp dãy số: Sắp xếp nổi bọt, sắp xếp nhanh, sắp xếp bằng đếm phân phối

- Kỹ thuật duyệt đoạn con liên tiếp

- Kỹ thuật dùng mảng đánh đánh dấu (lùa bò vào chuồng)

- Kỹ thuật dùng mảng nhớ tổng tiền tố, hậu tố

Chuyên đề 4: Xử lý xâu ký tự

- Kỹ thuật duyệt các phần tử trên xâu

- Kỹ thuật duyệt xâu con liên tiếp

- Biến đổi, xử lý trên xâu

- Sử dụng xâu ký tự để lưu trử và xử lý số lớn

Chuyên đề 5: Đệ quy, quy lui;

Chuyên đề 6: Quy hoạch động

Mỗi chuyên đề tôi đã lựa chọn hệ thống các bài tập dùng để củng cố kiến thức và rèn luyện các kỹ năng cho học sinh Trong đó, một số bài tập được phát triển dựa trên các bài toán điển hình và có thể được phát biểu lại bằng các tình huống mang tính chất thực tiến khác nhau để rèn luyện kỹ năng nhận dạng bài toán Các bài toán được lựa chọn có độ khó khác nhau giúp giáo viên có thể linh hoạt sử dụng ở các thời điểm khác nhau trong từng giai đoạn bồi dưỡng

Trang 15

4.3 Lập kế hoạch bồi dưỡng

Căn cứ kế hoạch tổ chức thi, cấu trúc đề thi của Sở GD&ĐT ban hành cùng

kế hoạch BD HSG của nhà trường, thực trạng của công tác bồi dưỡng HSG tại đơn vị

- Thời gian ôn tập: Bắt đầu từ đầu năm học đến thời điểm diễn ra cuộc thi

- Thời lượng, hình thức triển khai:

+ Dạy học trực tiếp: 18 buổi (theo kế hoạch của nhà trường)

+ Tăng cường thêm hình thức dạy học Online Thời lượng tùy thuộc vào điều kiện thực tế và mức độ tiếp thu của học sinh

Hàng tháng, cho học sinh làm bài thi để loại những học sinh không đạt yêu cầu; chọn đội tuyển chính thức trước thời điểm thi ít nhất 1 tháng

Chuyên đề 1: Kiến thức cơ bản về NNLT C++ 3 buổi trực tiếp + Online

Chuyên đề 2: Số học 3 buổi trực tiếp + Online

Chuyên đề 3: Xử lý dãy số 4 buổi trực tiếp + Online

Chuyên đề 4: Xử lý xâu ký tự 2 buổi trực tiếp + Online

Chuyên đề 5: Đệ quy, quay lui; 1 buổi trực tiếp + Online

Chuyên đề 6: Quy hoạch động 2 buổi trực tiếp + Online

Phân tích các đề thi, nhận dạng các dạng toán

và giải quyết bài toán 3 buổi trực tiếp + Online

Ngoài ra tăng cường tự học, tự kiểm tra đánh giá: Tự học thông qua nguồn tài liệu học tập từ giáo viên Tự học thông qua các website dạy học lập trình, làm bài, chấm bài tự động; Tích cực tham gia các contest từ các nhóm cùng học lập trình…

4 Triển khai bồi dưỡng học sinh giỏi

4.1 Chú trọng phát triển năng lực tự học, tự kiểm tra đánh giá cho học sinh

4.1.1 Phát triển năng lực tự học

Tự học là hoạt động học tập và nhận thức có hệ thống, có mục đích rõ rệt của học sinh nhằm giải quyết các nhiệm vụ nhận thức một cách độc lập bằng các phương tiện được lựa chọn độc lập với mục đích hình thành và phát triển kiến thức, kĩ năng của cá nhân dưới sự điều chỉnh của giáo viên

Để việc tự học có kết quả, học sinh phải có một số kiến thức và kĩ năng cần thiết, một phần trong đó do giáo viên trang bị, một phần quan trọng hơn là sự học hỏi và rèn luyện thường xuyên của người học

Trang 16

Trong dạy học bồi dưỡng học sinh giỏi, tự học ở nhà có ảnh hưởng rất lớn đến kết quả học tập của học sinh Vì vậy, muốn đạt hiệu quả cao phải hướng vào việc phát huy năng lực tự học của học sinh, phải kích thích và tạo động lực làm cho HS tự tin nhờ đó say mê học tập

Đối với môn Tin học điều kiện và phương tiện để tự học rất phong phú Ngoài việc tự học thông qua hướng dẫn của giáo viên với các nội dung và yêu cầu

cụ thể, học sinh có thể tự học và qua các diễn đàn, các nhóm học tập zalo, facebook, các video youtube và rất nhiều trang mạng hướng dẫn học tập, làm bài

Tự học trên các website về dạy học lập trình như các trang http:// laptrinhphothong.vn/; http://thptchuyen.ntucoder.net/; http:/vinhdinhcoder.net/; https://vnoi.info/problems/; http://ntucoder.net/; http://cplusplus.com …

Trong cả quá trình, giáo viên cần thường xuyên theo dõi, bám sát học sinh

để định hướng cho học sinh lựa chọn những nội dung phù hợp tránh đi quá sâu hoặc quá rộng ra ngoài phạm vi yêu cầu làm sao loãng kiến thức, mất nhiều thời gian mà lại không hiệu quả

4.1.2 Phát triển năng lực tự kiểm tra đánh giá

Tự kiểm tra đánh giá trong quá trình học tập, đặc biệt trong quá trình tự học giúp học sinh hình thành kỹ năng, kỹ xảo từ đó nhận biết rõ ưu khuyết điểm của bản thân cũng như khắc phục các sai lầm, thiếu sót Nó góp phần củng cố vững chắc các kiến thức đã lĩnh hội Đặc biệt, khi tự kiểm tra, đánh giá học sinh sẽ tự khẳng định được mình, tự mình đề xuất được biện pháp thỏa đáng để điều khiển

và thúc đẩy hoạt động học tập của bản thân

- Cần hướng dẫn cho học sinh sử dụng phần mềm chấm bài tự động Themis của thầy Lê Minh Hoàng để tự chấm bài, tự đánh giá và rút kinh nghiệm sau khi giải quyết các bài toán

+ Giáo viên thiết kế, xây dựng nội dung tự học cho học sinh kèm hệ thống bài tập có test, giao nhiệm vụ học sinh hoàn thành các bài tập và tiếp tục cải tiến chương trình của mình để chấm đúng tối đa các bộ test do giáo viên cung cấp

+ Cần sưu tập cho học sinh hệ thống đề thi học sinh giỏi chính thức các cấp, các tỉnh Nguồn bài tập này thường có bộ test chuẩn, phân loại được độ phức tạp của thuật toán và đã được các tổ chức phê duyệt Sau khi học sinh giải đề thì tiến hành tự chấm bài và đánh giá mức độ hoàn thành của bản thân để từ đó điều chỉnh cách học, lối tư duy để ngày càng tiến bộ

Trang 17

- Hướng dẫn cho học sinh khai thác các hệ thống website dạy học lập trình, giải bài trực tuyến, với các trang này có hệ thống bài tập đa dạng, phong phú Có phân loại theo dạng và mức độ Học sinh có thể viết chương trình và tiến hành chấm bài tự động online Ngoài ra trên các website này có nhiều đợt mở các contest mở rộng, học sinh cần theo dõi tham gia để đánh giá mức độ của mình so với các bạn cùng trang lứa ở khắp mọi miền

4.2 Dạy học theo chuyên đề

Sau khi xây dựng nội dung chương trình bồi dưỡng, tôi triển khai dạy học theo từng chủ đề đã xác định ở trên Do giới hạn phạm vi của đề tài và thực tế dạy học chương trình chính khóa nên ở đây tôi chỉ đưa vào một số vấn đề cốt lõi cần lưu ý và một vài bài toán cơ bản tiêu biểu để phân tích Phần bài tập luyện tập và

nâng cao có gợi ý giải và một số chương trình tôi đặt ở phần phần phụ lục

4.2.1 Chuyên đề kiến thức cơ bản trong C++

Đối với mỗi nội dung tôi triển khai theo các hoạt động:

- Hướng dẫn học sinh tìm hiểu các kiến thức lý thuyết, các khái niệm, tính ứng dụng và cả kinh nghiệm về chủ đề

- Giáo viên cùng học sinh giải quyết một vài ví dụ về bài toán cơ bản, tiêu biểu về chủ đề Sau đó phát triển các toán này với các yêu cầu cao hơn, mở rộng hơn

- Luyện tập giải một số bài tập theo chuyên đề; Giải một số bài tập mở rộng

và nâng cao có vận dụng kiến thức kết hợp nhiều chủ đề đã được học ở trước

1) Kiểu dữ liệu đơn giản và các phép toán cơ bản

Một số kiểu dữ liệu thường dùng:

+ Kiều logic: bool + Kiều ký tự: char + Số nguyên: int, long long, unsigned long long + Số nguyên: float, double

Ta thấy rằng phạm vi kiểu dữ liệu càng lớn thì càng cần nhiều bộ nhớ và các đề thi học sinh giỏi ngày nay ngoài giới hạn về thời gian thực hiện chương trình còn giới hạn cả về dung lượng bộ nhớ vì vậy cần sử dụng các kiểu dữ liệu một cách hợp lý

Các phép toán trên các loại dữ liệu đã được giới thiệu trong chương trình chính khóa nên tôi không nhắc lại ở đây

Lưu ý trong một số trường hợp tính toán cụ thể hoặc cần biểu diễn giá trị

dưới những định dạng khác nhau, chúng ta cần thực hiện ép kiểu để chuyển đổi

qua lại giữa những kiểu dữ liệu có khả năng lưu trữ giá trị giống nhau

Trang 18

Bài toán cơ bản

Viết chương trình nhập vào 2 số nguyên a, b (a,b<=109) Tính tổng (a+b), hiệu (a-b), tích (a*b), du (a%b), thương nguyên (a/b), thương thực a chia b hiển thị 2 chữ số sau dấu phẩy

Lưu ý học sinh:

- Khai báo kiểu dữ liệu phù hợp cho từng biến

- Hai biến a,b là số nguyên nên khi thực hiện phép chia a/b ta sẽ thu được kết quả là nguyên Khi muốn lấy kết quả là số thực ta cần ém kiểu (float) Ta có thể viết (float)a/b hoặc a/(float)b

- Câu lệnh cout<<setprecision(2); để lấy 2 chữ số thập phân sau dấu phẩy

- Câu lệnh cout <<fixed; để luôn hiển thị 2 chữ số thập phân Ví dụ phép

chia (float)4/2 nếu không có câu lệnh này thì kết quả hiện ra là 2 Khi có câu lệnh này thì kết quả hiển thị là 2.00

2) Cấu trúc điều khiển:

- Cấu trúc tuần tự

- Cấu trúc rẽ nhánh: if…, if … else…

- Lặp với số lần biết trước câu lệnh: for…

- Lặp với số lần chưa biết trước: while …

Bài toán cơ bản:

Bài 1: Viết chương trình nhập vào số nguyên N (1 < n <= 109) Hãy đưa ra màn hình các số chẵn thuộc đoạn từ 1 đến N

Trang 19

Cách 1: Dùng câu lệnh for Cách 2: Dùng câu lệnh for

Cách 1: Dùng câu lệnh while Cách 2: Dùng câu lệnh while

Đánh giá thuật toán:

Trong 2 ý tưởng tưởng trên ta thấy cách 1 độ phức tạp thuật toán là O(n) cách 2 độ phức tạp là O(n/2) Như vậy ta nên chọn cách 2 để giải quyết bài toán

Lưu ý: Câu lệnh lặp có độ phức tạp lớn khi số lần lặp lớn Vì vậy ta cần nghiên cứu tìm cách làm giảm số lần lặp xuống hết mức có thể

Trang 20

3) Kiểu dữ liệu có cầu trúc

Ngôn ngữ lập trình C++ cung cấp rất nhiều kiểu dữ liệu có cấu trúc Hai kiểu cơ bản thường dùng nhất đó là kiểu mảng một chiều và xâu dữ liệu Ngoài

ra, trong quá trình giảng dạy để thuận lợi hơn trong việc lưu trữ và xử lý chúng ta

có thể giới thiệu thêm cho học sinh các kiểu khác như: pair, vecto…

* Kiểu dữ liệu mảng một chiều:

- Khái niệm về mảng một chiều

* Kiểu dữ liệu Xâu ký tự:

- Khai báo xâu

- Nhập xâu bằng lệnh: cin, getline

- Xuất xâu: cout

- Một số thao tác trên xâu:

+ 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();

+ 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 đổi ký tự thành ký tự hoa: toupper(ch);

+ Hàm đổi ký tự thành ký tự thường: tolower(ch);

Bài toán cơ bản:

Bài 1: Cho dãy số A gồm N số nguyên A1, A2, , AN Hãy tìm giá trị lớn

nhất của dãy số A và chỉ số các phần tử có giá trị là lớn nhất

Dữ liệu vào: Gồm 2 dòng:

- Dòng đầu tiên chứa số N (N<=106)

- Dòng thứ hai chứa dãy số A, các số ghi cách nhau ít nhất là một ký tự trống (1<=a[i]<=109)

Trang 21

Dữ liệu ra: Gồm 2 dòng:

- Dòng đầu tiên chứa một số nguyên là giá trị lớn nhất của dãy A

- Dòng thứ hai chứa dãy số là chỉ số các phần tử có giá trị là lớn nhất, các

Ý tưởng giải quyết bài toán:

Cách 1: - Đọc các giá trị vào mảng A và tìm giá trị lớn nhất Max của dãy

- Duyệt tất cả các phần tử của dãy A để đưa ra chỉ số các phần tử Max

Cách 2: Đọc các giá trị của dãy, vừa đọc vừa tìm các giá trị lớn nhất và lưu các

chỉ số của các phần tử lớn nhất vào mảng B (Khi duyệt đến phần tử i thì mảng B

sẽ lưu chỉ số của các phần tử lớn nhất trong các phần tử từ 1 đến i)

Chương trình diễn đạt các ý tưởng như sau:

Phân tích thuật toán:

- Cả 2 cách đều phải dùng đến 2 vòng for để duyệt, nhưng cách 2 sẽ thực hiện nhanh hơn cách 1 vì ở vòng for thứ hai cách 1 lặp n lần, cách 2 lặp k lần mà

k luôn nhỏ hơn hoặc bẳng n

- Thông qua chương trình ở cách 2, giáo viên nhấn mạnh cho học sinh cách tạo mảng lưu kết quả trong khi duyệt

Trang 22

Bài 2: Để chuẩn bị cho kỳ thi nghề THPT sắp tới, cô đã cho các nhóm đăng

ký dự thi và gửi danh sách đăng ký cho bạn An lớp trưởng tổng hợp thành danh sách đăng ký của lớp Do các nhóm làm việc cẩu thả nên danh sách gửi cho An còn rất nhiều lỗi chính tả: Giữa các từ còn gõ nhiều dấu cách, họ tên học sinh chưa viết hoa đầu từ

Em hãy viết chương trình: nhập vào xâu s là họ tên của một học sinh, xuất

ra xâu đã xóa các dấu cách thừa và viết hoa đầu từ

Ý tưởng giải quyết bài toán:

- Các công việc chính: Khai báo, nhập xâu, xóa dấu cách thừa, viết hoa đầu

từ, xuất kết quả

- Xóa dấu cách thừa:

+ Cách 1: Dùng câu lệnh for duyệt lùi, cứ gặp 2 dấu cách liền nhau thì dùng lệnh s.erase() xóa đi 1 (Lưu ý với hs nếu dùng for tiến sẽ k xóa hết được)

+ Cách 2: Dùng lệnh while duyệt tiến để xóa

+ Cách 3: Dùng lệnh while kết hợp hàm s.find để xóa

+ Cách 4: Dùng thêm biến phụ để lưu kết quả khi duyệt for tiến

- Chuyển ký tự đầu từ thành chữ hoa: Duyệt xâu, cứ gặp ký tự khác cách

mà ký tự trước đó là dấu cách thì sẽ chuyển ký tự này thành ký tự hoa

Lưu ý: Cần xử lý tình huống đặc biệt đầu dãy

Chương trình diễn đạt các ý tưởng như sau:

Trang 23

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, như hàm s.length(); s.find(); s.erase(); toupper(); +…

4) Kiểu dữ liệu tệp:

Trong các kỳ thi học sinh giỏi, thường chỉ yêu cầu xử lý với một tệp Input

và một tệp Output Như vậy để làm việc với tệp trước tiên ta cần mở tệp bằng hai câu lệnh sau:

freopen(<tên tệp input>,"r", stdin);

freopen(<tên tệp output>,"w", stdout);

- Đọc tệp khi số phần tử đã xác định, sau khi mở tệp ta thực hiện bình thường như đọc vào từ bàn phím

- Khi đọc tệp với số phần tử chưa xác định ta cần kết hợp câu lệnh while

Ví dụ đọc tệp vào mảng A với số phần tử chưa xác định:

int i = 1;

while (cin >> a[i]) { i++; } Đọc các dòng của tệp vào xâu S với số phần tử chưa xác định:

while (getline(cin,S))

- Câu lệnh đưa con trỏ xuống dòng trong tệp Input: cin.ignore() ;

Trang 24

Bài tập cơ bản:

Bài 1: Cho dãy số A gồm N số nguyên A1, A2, , AN (n<=106 ), giá trị các số không vượt quá 109 Hãy cho biết trong tệp có bao nhiêu số và đưa ra các

số lẻ trong dãy

Trường hợp 1: Dữ liệu vào từ Tệp TEPSO.INP

- Dòng đầu chứa số nguyên n

- Dòng thứ 2 chứa n số nguyên ghi cách nhau ít nhất là một ký tự trống

Trường hợp 2: Dữ liệu vào Tệp TEPSO.INP

Chứa n số nguyên ghi cách nhau ít nhất là một ký tự trống

Kết quả ra: Ghi vào tệp TEPSO.OUT gồm 2 dòng:

- Dòng đầu tiên chứa một số nguyên là số lượng số có mặt trong tệp

- Dòng thứ hai chứa dãy số lẻ có trong dãy theo tuần tự từ trước ra sau, các

số ghi cách nhau ít nhất là một ký tự trống

Ý tưởng giải quyết:

Trường hợp 1:

+ Đọc n từ tệp Input ghi vào tệp Output

+ Ta chỉ cần duyệt 1 lần bằng lệnh for để vừa đọc vừa kiểm tra tìm các số lẻ

Trường hợp 2: Ta cần duyệt 2 lần trên các số:

+ Lần 1 dùng câu lệnh while kết hợp lệnh cin để đọc các số vào mảng

và đếm số lượng số

+ Duyệt các số trên mảng để tìm các số lẻ

Chương trình giải:

Trang 25

Bài 2: Cho tệp văn bản TEPXAU.INP ghi họ tên học sinh trong một lớp

học Hãy cho biết trong tệp có bao nhiêu học sinh và đưa ra họ tên của học sinh dài nhất

Trường hợp 1: Dữ liệu vào: Tệp TEPXAU.INP

Gồm nhiều dòng, mỗi dòng là họ tên của 1 học sinh

Trường hợp 2: Dữ liệu vào: Tệp TEPXAU.INP

- Dòng đầu tiên chứa số nguyên n là số học sinh trong lớp

- n dòng tiếp theo mỗi dòng là họ tên của 1 học sinh

Kết quả ra: Ghi vào tệp TEPSO.OUT gồm 2 dòng:

- Dòng đầu tiên chứa số lượng học sinh trong lớp

- Dòng thứ hai ghi họ tên của học sinh dài nhất

Ý tưởng giải quyết:

Trường hợp 1: Ta dùng câu lệnh while kết hợp lệnh getline(cin,s) để đọc

và đếm số học sinh

Trường hợp 2:

- Ta dùng lệnh cin để đọc số lượng học sinh

- Dùng lệnh cin.ignore(); để đưa con trỏ xuống dòng

- Dùng câu lệnh for kết hợp lệnh getline(cin,s) để đọc từng dòng

Lưu ý: Ta nên vừa đọc vừa xử lý để không phải lưu lại danh sách trong mảng và

tránh việc duyệt danh sánh nhiều lần

Chương trình:

Trang 26

5) Chương trình con và lập trình có cấu trúc

- Chương trình con đóng vai trò quan trọng trong lập trình, đặc biệt trong lập trình có cấu trúc

- Có 2 loại hàm đó là hàm có giá trị trả về và hàm không có giá trị trả về

- Biến toàn cục, biến cục bộ

- Tham số hình thức, tham số thực sự;

- Tham trị, tham biến

* Bài toán cơ bản:

Cho dãy số A gồm N số nguyên A1, A2, , AN Hãy cho biết có bao nhiêu

số trong dãy số A có tổng các chữ số là một số chính phương

Dữ liệu vào: Tệp CTC.INP gồm 2 dòng:

- Dòng đầu tiên chứa số N (N<=104)

- Dòng thứ hai chứa dãy số A, các số ghi cách nhau ít nhất là một ký tự trống (1<=a[i]<=109)

Dữ liệu ra: Tệp CTC.OUT chứa 1 số nguyên duy nhất là kết quả của bài toán

Ý tưởng: Để giải bài toán ta cần thực hiện các công việc sau:

- Xây dựng hàm void doc() để đọc dữ liệu từ tệp vào mảng

- Xây dựng hàm int tongcs(int n) đưa vào số n, lấy ra tổng chữ số của n

- Xây dựng hàm bool cphuong(int n) đưa vào số nguyên n kiểm tra n có

phải là chính phương hay không

- Hàm int main()

+ Gọi hàm doc();

+ Sau đó duyệt từng phần tử của mảng gọi hàm tính tổng các chữ số

và kiểm tra chính phương để đếm số lượng số thỏa mãn

Chương trình giải quyết bài toán:

Trang 27

Trong chương trình trên ta đã sử dụng một hàm có sẵn xây dựng 3 hàm:

- Hàm có sẵn sqrt(n);

- Hàm không có giá trị trả về void doc(),

- Hàm giá trị trả về là kiểu số nguyên int tong(int x)

- Hàm trả về giá trị logic bool cphuong(int x)

Lưu ý:

Khi giải quyết mỗi bài toán ta nên dành thời gian để phân tích, xây dựng

bố cục cấu trúc chương trình Công việc này sẽ đơn giản và dễ dàng hơn khi ta

sử dụng bí quyết TTNV (Tách, Tìm, Nhìn, Viết) để giải quyết vấn đề

+ Tách (Tách lớn ra nhỏ): Tách công việc lớn thành nhiều công việc nhỏ hơn, dễ giải quyết hơn Có thể tách lớn ra nhỏ nhiều lần cho đến khi công việc đủ đơn giản dễ thực hiện

+ Tìm (Tìm điểm chung): Tìm điểm chung giữa các công việc nhỏ với nhau + Nhìn (Nhìn tổng quát): Nhìn tổng quát để tìm ra điều cốt lõi bằng cách lược bỏ hoặc đơn giản hóa các chi tiết

4.2.2 Chuyên đề Số học

1) Phép toán chia lấy dư và nguyên lý đồng dư

Trong các bài toán tin học các yêu cầu xử lý cần dùng phép toán chia lấy

dư (%) rất phổ biến Rất nhiều bài toán cần đến xử lí số lớn, nhưng khi ý đồ của tác giả chỉ là tìm ra thuật toán đúng để giải quyết bài toán chứ không coi trọng việc cài đặt số lớn, lúc đó thường thì đề ra sẽ yêu cầu ghi ra số dư của kết quả khi chia cho 1 cơ số bất kì nào đó Vì vậy mà ta cần tìm hiểu các tính chất đồng dư để

có thể đảm bảo kết quả mình đưa ra là chính xác

Giả sử có 2 số nguyên x và y, với cơ số là n, có những tính chất đồng dư sau đây:

1 (x+y)% n = ((x % n)+(y % n)) % n

2 (x*y)% n =((x % n)*(y % n))%n

Bài toán cơ bản Tổng lập phương

Cho số tự nhiên n Hãy viết chương trình tính S = 13 + 23 + 33 + …+ n3

Trang 28

Ví dụ

TLP.inp TLP.out

Ràng buộc: 70% test ứng với giới hạn 1<=n<=104

30% test ứng với các trường hợp còn lại

Cách 2: Sử dụng công thức toán học:

Ta có thể chuyển độ phức tạp xuống O(1), nhưng lưu ý rằng giá trị của S là rất lớn, không có kiểu dữ liệu nguyên nào có thể lưu lại giá trị kết quả Vì vậy ta cần vận dụng tính chất đồng dư để giải quyết bài toán

Khi đó ta có câu lệnh tính

𝟏𝟑+ 𝟐𝟑 + 𝟑𝟑 + ⋯ + 𝒏𝟑 =𝒏

𝟐(𝒏 + 𝟏)𝟐𝟒Khai báo hằng e: e= 109 +7

S = ((n%e)*(n%e))%e)*((n+1)%e)*((n+1)%e)%e)/4;

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

Trang 29

2) Số hoàn hảo

Số hoàn hảo (hay còn gọi là số hoàn chỉnh, số hoàn thiện) là một số nguyên dương mà tổng các ước nguyên dương chính thức của nó (số nguyên dương bị nó chia hết ngoại trừ nó) bằng chính nó

Các số sau là số hoàn hảo:

Số 6 (1 + 2 + 3 = 6)

Số 28 (1 + 2 + 4 + 7 + 14 = 28)

Bài toán cơ bản:

Cho số tự nhiên N Hãy cho biết N có phải là số hoàn hảo hay không?

Dữ liệu vào: Đọc từ tệp SHH.Inp gồm một dòng duy nhất chứa số nguyên

Phân tích bài toán:

Để kiểm tra số nguyên dương N(N>1) có là số hoàn hảo không, ta tính tổng

S tổng các số nguyên i (1<=i<=N-1) mà i là ước của N Sau đó ta kiểm tra S có bằng N hay không Nếu S=N thì N là số hoàn hảo, ngược lại N không phải là số hoàn hảo

Xét các số i với i<=√𝑁, ta thấy nếu i là ước của N thỉ thương N/i cũng là ước của N Do đó, việc tìm ước với k từ 1 đến N- 1 là không cần thiết, mà chỉ cần kiểm tra k từ 1 đến √𝑁 Khi đó, ta có chương trình:

Trang 30

Lưu ý: Trong hàm kiểm tra tính hoàn hảo nói trên Nếu N là số chính phương thì việc tính tổng các ước thực sự của N là chưa đúng Vì trong trường

hợp này 𝑖 = √𝑁 là ước thì N/i cũng là √𝑁 vì vậy tổng đã cộng 2 lần √𝑁 Ở đây

ta thấy số chính phương không bao giờ là số hoàn hảo nên tổng không phải trừ

√𝑁 kết quả vẫn đúng

3) Số Fibonaxi

Dãy Fibonacci là dãy vô hạn các số tự nhiên bắt đầu bằng hai phần tử 0 và

1 hoặc 1 và 1, các phần tử sau đó được thiết lập theo quy tắc mỗi phần tử luôn bằng tổng hai phần tử trước nó Công thức truy hồi của dãy Fibonacci là:

𝑓(𝑛) = {

1, 𝑘ℎ𝑖 𝑛 = 1

1, 𝑘ℎ𝑖 𝑛 = 2𝑓(𝑛 − 1) + 𝑓, 𝑘ℎ𝑖 𝑛 > 2

Lưu ý: Giá trị của số Fibonaxi thứ n tăng rất nhanh khi n tăng Vì vậy

đối với các bài toán có liên quan đến số Fibonaxi ta cần đặc biệt lưu ý về miền

dữ liệu đầu vào của bài toán để sử dụng cấu trúc dữ liệu và phương án xử lý bài toán được tốt nhất

Bài toán cơ bản về dãy số Fibonaxi:

Dãy số fibonacci được thành lập bởi công thức:

𝑓1 = 𝑓2 = 1;

𝑓𝑖 = 𝑓𝑖−1+ 𝑓𝑖−2 (𝑖 ≥ 3).

Yêu cầu: Cho số nguyên dương n (n<=50) Tính giá trị Fn

Input: Gồm một dòng duy nhất chứa số nguyên dương n

Output: In ra kết quả bài toán

Ví dụ:

Fibo1.INP Fibo1.OUT

Phân tích bài toán:

Để tính Fn ta phải tính các giá trị đứng trước của dãy F1, f2,…, fN-1 Công thức lặp Fi=Fi-1 + Fi-2 với i lần lượt nhận giá trị từ 3 đến n

Để tính giá trị tiếp theo của dãy thì giá trị trước giá trị hiện tại lại là giá trị trước thứ 2 Giá trị hiện tại lại là giá trị trước giá trị cần tính Vì vậy với mỗi giá trị mới của i ta lại phải xác định lại giá trị trước và trước thứ 2 của i mới

Giá trị của số fibonaxi tăng rất nhanh khi n tăng, nên ta cần phải để ý sử dụng biến với kiểu dữ liêụ phù hợp

Trang 31

Cách 1: Sử dụng câu lệnh lặp để tính các giá trị từ F3 tới Fn

Cách 2: Sử dụng mảng để lưu các giá trị của dãy

1 Ta có thể đề cập lại bài toán trong phát triển bài toán, mở rộng yêu cầu bài toán thành các bài toán sau

Một số yêu cầu mở rộng về dãy Fibonaxi:

Dãy số fibonacci được thành lập bởi công thức:

𝑓1 = 𝑓2 = 1;

𝑓𝑖 = 𝑓𝑖−1+ 𝑓𝑖−2 (𝑖 ≥ 3).

a/ Tính tổng n số đầu tiên của dãy

b/ Đưa ra danh sách n số của dãy và

c/ Đưa ra danh sách n số lẻ đầu tiên của dãy

d/ kiểm tra số n có thuộc dãy fibonacci hay không

e/ Tính số Fibonaxi thứ n %(109+7) với (n<=106)

Yêu cầu học sinh chỉnh sửa bài toán gốc để giải quyết các bài toán con Giáo viên quan sát và hỗ trợ khi học sinh gặp vướng mắc

Trang 32

Kiểu unsigned long long ta có thể lưu trữ được số Fibonaxi thứ 93

Với n lớn ta phải có phương pháp xử lý khác

- Với câu d của bài toán, ta sử dụng tính chất đồng dư để thu gọn giá trị trong quá trình tính từng số của dãy:

Tính chất đơn giản sau của số nguyên tố:

+ Trừ số 2 các số nguyên tố còn lại đều là số lẻ

+ Trừ số 2, số 3 các số nguyên tố có dạng 6𝑘 ± 1 vì số có có dạng 6𝑘 ± 2 thì chia hết cho 2, số có dạng 6𝑘 ± 3thì chia hiêt cho 3

Bài toán cơ bản:

Cho số tự nhiên N Hãy cho biết N có phải là số nguyên tố hay không?

Dữ liệu vào: Đọc từ tệp SNT.Inp gồm một dòng duy nhất chứa số nguyên

Phân tích bài toán:

Để kiểm tra số nguyên dương N(N>1) có là số nguyên tố không, ta kiểm tra xem có tồn tại một số nguyên k (2<=i<=N-1) mà i là ước của N ( N chia hết i) thì N không phải là số nguyên tố, ngược lại N là số nguyên tố

Trang 33

Nếu N(N>1) không phải là số nguyên tố, ta luôn có thể tách N =i1*i2 mà (2<= i1<=i2 <=N-1) Vì i1*i1<= i1*i2=N nên i1<=√𝑁 Do đó, việc kiểm tra với i

từ 2 đến N- 1 là không cần thiết, mà chỉ cần kiểm tra i từ 2 đến √𝑁 Khi đó, ta có chương trình:

Dựa vào tính chất: Trừ số 2, số 3 các số nguyên tố đều có dạng 6𝑘 ± 1 Vậy

ta chỉ cần kiểm tra xem N có chia hết cho số 2, số 3 và các số có dạng 6𝑘 ± 1 trong đoạn [5,√𝑁 ] Chương trình thể hiện như sau:

Trang 34

5) Sàng nguyên tố

Cho số tự nhiên N Hãy đưa ra các số nguyên tố thuộc đoạn [1- N];

Dữ liệu vào: Đọc từ tệp SangNT.Inp gồm một dòng duy nhất chứa số

Dùng lệnh for duyệt lần lượt các số i trong đoạn [1, N], kiểm tra tính nguyên

tố của i số bằng hàm kiểm tra nguyên tố Nếu i là số nguyên tố thì xuất i ra

Cách này đơn giản nhưng chạy chậm để duyệt đến 107 là rất mất nhiều thời gian, để cải tiến có thể sử dụng các tính chất của số nguyên tố để loại bỏ trước những số không phải là số nguyên tố và không cần kiểm tra các số này (sử dụng sàng Eratosthene)

bộ phần tử chia hết cho i giá trị 0

Duyệt cho đến khi gặp số nguyên tố lớn hơn √𝑁 thì dừng lại Tất cả giá trị

i có A[i] = 1 đều là số nguyên tố

Chương trình sử dụng sàng nguyên tố như sau:

Trang 35

6) Phân tích thừa số nguyên tố

Cho số tự nhiên N Hãy phân tích n thành thừa số nguyên tố;

Ví dụ: Số 18 = 2 x 32 Số 100 = 22 x 52

Dữ liệu vào: Đọc từ tệp TSNT Inp gồm một dòng duy nhất chứa số nguyên N

(1<=n<=107)

Dữ liệu ra: Ghi kết quả ra tệp TSNT.Out mỗi dòng là gồm 2 số nguyên

Số đầu là thừa số nguyên tố số tiếp theo là số mũ tương ứng với thừa

Lần lượt chia n cho các số nguyên tố nhỏ hơn n theo chiều từ nhỏ đến lớn

Tức là chia n cho số nguyên tố nhỏ nhất (i), nếu phép chia hết, chúng ta ghi nhận

thêm giá trị (a[i]++), kết quả của phép chia sẽ gán lại cho n, nếu không chia hết, chúng ta tiếp tục chia giá trị n cho số nguyên tố lớn hơn

Lưu ý rằng: Khi duyệt các số i lần lượt tử 2 trở đi, thuật toán sẽ nhảy qua

số không phải là số nguyên tố vì số không phải là số nguyên tố sẽ chia hết cho số

nguyên tố nhỏ hơn nó, do đó ta không cần kiểm tra tính nguyên tố của các số chia

Chương trình giải quyết bài toán:

Một ứng dụng của việc phân tích N ra thừa

số nguyên tố đó là các bài toán liên quan đến việc đếm số lượng các ước và tình tổng các ước của N

Giả sử N được phân tích thành thừa số nguyên tố như sau:

N=a i * b j * … * c k

Khi đó số lượng các ước của N là:

(i+1)*(j+1) * … * (k+1)

Trang 36

Chuyên đề 3: Xử lý dãy số

Bài toán có xử lý dãy số là một yêu cầu thường gặp trong dạy học lập trình

và cũng là nội dung quan trọng trong việc bồi dưỡng HSG Vì vậy cần rèn luyện cho học sinh kỹ năng nhận dạng bài toán khi được phát biểu dưới nhiều dạng khác nhau và lựa chọn thuật toán thích hợp để giải quyết

* Một số thuật toán và kỹ thuật xử lý dãy số thông dụng

- Duyệt các phần tử, tìm kiếm đơn giản

- Thuật toán tìm giá trị nhỏ nhất, lớn nhất của dãy số

- Thuật toán sắp xếp dãy số: Sắp xếp nổi bọt, sắp xếp nhanh, đếm phân phối

- Thuật toán tìm kiếm nhị phân

- Kỹ thuật dùng mảng đánh đánh dấu (lùa bò vào chuồng)

- Kỹ thuật dùng mảng nhớ tổng tiền tố, hậu tố

- Kỹ thuật duyệt đoạn con liên tiếp

* Một số hàm sẵn có trên dãy số của C++

+ Hàm sắp xếp tăng:

sort (tên mảng + chỉ số đầu, tên mảng + chỉ số cuối +1);

Ví dụ: Sắp xếp n phần tử tăng từ a[1] đến a[n]: sort (a +1, a+ n + 1);

Sắp xếp n phần tử tăng từ a[0] đến a[n - 1]: sort (a , a+ n);

+ Hàm sắp xếp giảm:

sort (tên mảng + chỉ số đầu, tên mảng + chỉ số cuối +1, greater < int >( ));

Ví dụ: Sắp xếp n phần tử giảm từ a[1] đến a[n]:

sort (a +1, a+ n + 1, greater < int >( ));

Sắp xếp n phần tử giảm từ a[0] đến a[n - 1]:

sort (a , a+ n, greater < int >( ));

+ Hàm tìm kiếm nhị phân:

binary_search(l, r, <giá trị >);

Tìm kiếm xem <giá trị> có xuất hiện trong đoạn [l, r - 1] của đoạn cần tìm không (lưu ý đoạn tìm kiếm phải được sắp xếp theo một trật tự nhất định) Nếu tìm thấy <giá trị> thì trả về true, ngược lại trả về false

Bài toán áp dụng:

Bài 1: Marathon:

Trong cuộc thi chạy marathon có n thí sinh tham dự Số thứ tự của mỗi thí sinh chính là số báo danh của thí sinh Thí sinh thứ icó thời gian về đích là ai Ban tổ chức kỳ thi quyết định chọn ra k thí sinh có thời gian chạy ít nhất để trao giải Em hãy đưa ra số báo danh của k thí sinh được trao giải theo thời gian tăng dần

Trang 37

Dữ liệu vào: Dòng đầu chứa 2 số nguyên n và k (n,k<=1000)

Dòng 2 là thời gian chạy của thí sinh thứ 1 đến thứ n

Kết quả ra: K số trên 1 dòng là số báo danh của thí sinh được giải

- Xây dựng hàm bool cmp() để xác định tiêu chí sắp xếp

- Sử dụng hàm sort với tiêu chí sắp xếp cmp để sắp xếp thí sinh theo thời

gian chạy tăng dần

- Duyệt mảng sau khi sắp xếp để xuaart kết quả

Chương trình giải:

Lưu ý:

Trong các bài toán sắp xếp với nhiều tiêu chí khác nhau, để sử dụng hàm sort() sẵn có ta cần xây dựng hàm bool cmp() để xác định tiêu chí sắp xếp Khi đó

ta sắp xếp với lời gọi: sort(a+1,a+1+n,cmp); việc này sẽ giúp ta tiết kiệm thời

gian viết lại code hàm sắp xếp

Trang 38

Bài 2: SEQ (đề thi HSG tỉnh Nghệ An 2016-2017)

Cho dãy số gồm n số nguyên a1, a2, …, an và 2 số nguyên không âm L, R (L ≤ R)

Yêu cầu:

Đếm số cặp (i, j) thỏa mãn điều kiện: i ≤ j và L ≤ |ai+…+aj| ≤ R

Dữ liệu vào:

Từ file văn bản SEQ.INP gồm:

- Dòng đầu tiên chứa 3 số nguyên n, L, R (n ≤ 105 ; 0 ≤ L ≤ R ≤ 109)

- Dòng thứ hai chứa n số nguyên dương a1, a2,…, an (ai ≤ 109)

Kết quả:

Ghi ra file văn bản SEQ.OUT

Gồm một số nguyên duy nhất là số lượng cặp (i, j) đếm được

+ Đọc giá trị của dãy, kết hợp tạo mảng nhớ tổng a, với a[i] là tổng i phần

tử đầu của dãy

+ Sắp xếp các giá trị trong mảng theo thứ tự tăng dần

+ Xét các giá trị a[i] với 2≤i≤n, với mỗi giá trị a[i] ta cần tìm kiếm nhị phân 2 vị trí:

Vị trí d: là vị trí mà a[d] bé nhất nhưng a[d] ≥ a[i]-r

Vị trí c: là vị trí mà a[c] lớn nhất nhưng a[c] ≤ a[i]-l

Và lúc này số lượng đoạn con thỏa mãn kq sẽ tăng lên kq= kq+(c-d+1); Sau khi thực hiện n-1 lần thì số đoạn con thỏa mãn đề bài chính bằng kq

Trang 39

Chương trình giải quyết bài toán:

Trang 40

Chuyên đề 4: Xử lý xâu ký tự

Xử lý xâu ký là yêu cầu thường gặp trong dạy học lập trình và cũng là bài toán thường xuyên xuất hiện trong các đề thi HSG Các dạng bài toán phổ biến như: Duyệt các phần tử, duyệt xâu con trên xâu; biến đổi, xử lý trên xâu; lưu trữ

và xử lý số lớn Để dễ dàng trong việc giải các bài toán về xâu, ta cần nắm rõ 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ể

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

- 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

-

Bài toán áp dụng: Chuẩn hóa văn bản:

Một văn bản được gọi là văn bản chuẩn nếu:

- Hai từ liền nhau có duy nhất một dấu cách trống

- Dấu ngắt câu (dấu chấm, dấu phẩy, dấu chấm phẩy, dấu chấm hỏi, dấu chấm than) được đặt sát vào từ ngay trước nó, sau đó mới đến dấu cách trống

- Dấu mở ngoặc đặt sát vào phía bên trái của từ bắt đầu mở ngoặc

- Dấu đóng ngoặc đặt sát bên phải từ cuối cùng được đóng ngoặc

Cho một xâu ký tự Hãy đưa ra xâu đó ở dạng văn bản chuẩn

Dữ liệu vào: tệp văn bản CHVB.inp chứa một xâu ký tự

Kết quả ra: Ghi vào tệp văn bản CHVB.inp gồm 1 dòng là kết quả của bài toán

* Ý tưởng:

- Xóa các dấu cách thừa: dùng lệnh for lùi duyệt để tìm và xóa

- Xử lý với các dấu câu:

+ Dùng xâu phụ để chứa các dấu câu: s1=".,;?!)";

+ Duyệt từng ký tự i của xâu s:

+/ Nếu s[i] có mặt trong xâu s1 thì xóa dấu cách phía trước nếu có và thêm dấu cách phía sau nếu chưa có

Ngày đăng: 03/07/2022, 17:03

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. Hồ Sỹ Đàm, Tài liệu giáo khoa chuyên tin quyển 1, quyển 2, quyển 3 Khác

HÌNH ẢNH LIÊN QUAN

2.1/ Phát hiện học sinh có năng khiếu và hình thành đội tuyển. 11 - (SKKN mới NHẤT) một số BIỆN PHÁP NÂNG CAO HIỆU QUẢ CÔNG tác bồi DƯỠNG học SINH GIỎI môn TIN học BẰNG NGÔN NGỮ lập TRÌNH c++
2.1 Phát hiện học sinh có năng khiếu và hình thành đội tuyển. 11 (Trang 2)
các giá trị i là số chẵn để xuất ra màn hình. - (SKKN mới NHẤT) một số BIỆN PHÁP NÂNG CAO HIỆU QUẢ CÔNG tác bồi DƯỠNG học SINH GIỎI môn TIN học BẰNG NGÔN NGỮ lập TRÌNH c++
c ác giá trị i là số chẵn để xuất ra màn hình (Trang 19)
- Tham số hình thức, tham số thực sự; - Tham trị, tham biến. - (SKKN mới NHẤT) một số BIỆN PHÁP NÂNG CAO HIỆU QUẢ CÔNG tác bồi DƯỠNG học SINH GIỎI môn TIN học BẰNG NGÔN NGỮ lập TRÌNH c++
ham số hình thức, tham số thực sự; - Tham trị, tham biến (Trang 26)
tạo. Lưu ý cấu hình bài thi đúng đề ra. - (SKKN mới NHẤT) một số BIỆN PHÁP NÂNG CAO HIỆU QUẢ CÔNG tác bồi DƯỠNG học SINH GIỎI môn TIN học BẰNG NGÔN NGỮ lập TRÌNH c++
t ạo. Lưu ý cấu hình bài thi đúng đề ra (Trang 46)
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, - (SKKN mới NHẤT) một số BIỆN PHÁP NÂNG CAO HIỆU QUẢ CÔNG tác bồi DƯỠNG học SINH GIỎI môn TIN học BẰNG NGÔN NGỮ lập TRÌNH c++
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, (Trang 79)
Mỗi từ trong ngôn ngữ của bộ tộc Mumba là một xâu kí tự hình thành chỉ từ hai kí tự a và b theo quy tắc sau: - (SKKN mới NHẤT) một số BIỆN PHÁP NÂNG CAO HIỆU QUẢ CÔNG tác bồi DƯỠNG học SINH GIỎI môn TIN học BẰNG NGÔN NGỮ lập TRÌNH c++
i từ trong ngôn ngữ của bộ tộc Mumba là một xâu kí tự hình thành chỉ từ hai kí tự a và b theo quy tắc sau: (Trang 87)

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