SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ TRƯỜNG THPT THỌ XUÂN 5 SÁNG KIẾN KINH NGHIỆM TÊN ĐỀ TÀI GIÚP HỌC SINH PHÂN DẠNG, TẠO DỮ LIỆU ĐẦU VÀO VÀ CÀI ĐẶT CHƯƠNG TRÌNH TỐI ƯU KHI GIẢI MỘT SỐ BÀI T
Trang 1SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ
TRƯỜNG THPT THỌ XUÂN 5
SÁNG KIẾN KINH NGHIỆM
TÊN ĐỀ TÀI GIÚP HỌC SINH PHÂN DẠNG, TẠO DỮ LIỆU ĐẦU VÀO VÀ CÀI ĐẶT CHƯƠNG TRÌNH TỐI ƯU KHI GIẢI MỘT SỐ BÀI TẬP VỀ XÂU, NHẰM NÂNG CAO CHẤT LƯỢNG HỌC SINH
GIỎI MÔN TIN HỌC.
Người thực hiện: Lê Thị Hạnh Chức vụ: Giáo viên
SKKN thuộc lĩnh vực (môn): Tin học
THANH HOÁ NĂM 2020
Trang 21 MỞ ĐẦU 1
1.1 Lí do chọn đề tài 1
1.2 Mục đích nghiên cứu 2
1.3 Đối tượng nghiên cứu 2
1.4 Phương pháp nghiên cứu 2
2 NỘI DUNG CỦA SÁNG KIẾN KINH NGHIỆM 2
2.1 Cơ sở lí luận của sáng kiến kinh nghiệm 2
2.2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm 2
2.2.1 Về phía Phụ huynh học sinh 2
2.2.2 Về phía Giáo viên 2
2.2.3 Về phía học sinh 3
2.2.4 Một số tài liệu hiện có 3
2.3 Các sáng kiến kinh nghiệm hoặc các giải pháp đã sử dụng để giải quyết vấn đề 3
2.3.1 Phân dạng các bài tập này về những dạng cụ thể để học sinh có thể dễ nhận diện, áp dụng thuật toán phù hợp 3
Dạng 1 Xử lý số nguyên lớn 3
Dạng 2: Tìm số 7
Dạng 3 Biến đổi xâu 8
Dạng 4: Tần suất xuất hiện 10
Dạng 5 Xâu Palindrome 12
Dạng 6: Tìm xâu con 14
Dạng 7: Tách từ, sắp xếp xâu 16
2.3.2 Tạo test dữ liệu đầu vào kiểu xâu 17
2.4 Hiệu quả của sáng kiến kinh nghiệm đối với hoạt động giáo dục, với bản thân, đồng nghiệp và nhà trường 19
3 Kết luận, kiến nghị 20
3.1 Kết luận 20
3.2 Kiến nghị 20
Trang 31 MỞ ĐẦU
1.1 Lí do chọn đề tài.
Chương trình Tin học 11 THPT hiện nay chủ yếu trang bị kiếnthức và kĩ năng về lập trình cho học sinh Đây là một nội dungtương đối khó với đa số học sinh, đòi hỏi các em phải tư duy suyluận nhiều hơn so với chương trình Tin học lớp 10 và lớp 12 Bêncạnh đó, Tin học là môn không được chọn để xét tuyển tốt nghiệp,cao đẳng, đại học nên phần lớn các em ít quan tâm, ít đầu tư vềthời gian cũng như công sức Tuy nhiên đây là môn học có nộidung rất bổ ích và thiết thực với các em, không những rèn luyện
tư duy logic mà còn mang tính sáng tạo giúp cho học sinh có khảnăng phân tích, tổng hợp, trừu tượng hóa, khái quát hóa vấn đề
và đặc biệt là phát triển tư duy Muốn vậy ngoài dạy đại trà Tinhọc trong nhà trường nhằm đảm bảo tính phổ thông, hướngnghiệp và dạy nghề thì cần phải tạo điều kiện cho những học sinh
có năng khiếu tin học được phát triển về khả năng lập trình vàgiải quyết các bài toán Để đáp ứng yêu cầu này Giáo viên phải cókiến thức vững vàng, có cách dạy sáng tạo, phù hợp để kích thíchthích thái độ học tập của học sinh, cần phải cung cấp cho học sinhnhững kiến thức về thuật toán và các phương pháp thiết kết thuậttoán
Học sinh THPT là nguồn lao động trẻ có thể sử dụng ngaysau khi tốt nghiệp do vậy việc được tiếp cận công nghệ thông tintừ trong nhà trường phổ thông sẽ giúp cho học sinh có thể tự tinhơn trong công việc Nhất là những học sinh có niềm đam mêCNTT và muốn tiếp tục theo đuổi nó thì kiến thức vững vàng vềlập trình từ THPT sẽ giúp các em rất nhiều khi tiếp cận với nhiềungôn ngữ lập trình khác nhau, giải quyết vấn đề nhanh hơn, triệt
để hơn Giữ được thành tích học tập cao hơn các bạn cùng lớp Cùng với công tác bồi dưỡng học sinh thi Đại học – Cao đẳngthì công tác bồi dưỡng học sinh giỏi là một công tác mũi nhọn củanhà trường Do đó việc nâng cao chất lượng học sinh giỏi môn Tinhọc là cần thiết và cấp bách nhằm góp thêm vào thành tích chungcủa nhà trường Trong quá trình dạy bồi dưỡng học sinh giỏi tôigặp rất nhiều bài toán về Xâu Đây là dạng bài tập khó thườngxuất hiện trong các đề thi học sinh giỏi môn Tin học Rất nhiềuhọc sinh khi gặp dạng bài tập này bị mất điểm hoặc điểm khôngcao Nguyên nhân có thể nhiều nhưng trong đó có thể kể đến là:không nhận diện được dạng bài toán để áp dụng cho đúng thuật
Trang 4toán phù hợp Không đọc được dữ liệu đầu vào đối với một số loạitest khó chương trình cho kết quả output sai hoặc chương trìnhcho kết quả output đúng với các bộ input có dữ liệu nhỏ nhưng vớinhững bộ input có dữ liệu lớn thì chương trình chạy quá thời gianquy định là 1giây/1test (mặc dù kết quả output vẫn đúng)
Với mong muốn giúp học sinh giải quyết tốt hơn các bài tập
về Xâu và hiểu biết sâu sắc hơn cách giải các bài tập này, tôi
mạnh dạn trình bày sáng kiến kinh nghiệm: “Giúp học sinh
phân dạng, tạo dữ liệu đầu vào và cài đặt chương trình tối
ưu khi giải một số bài tập về xâu, nhằm nâng cao chất lượng học sinh giỏi môn Tin học.” để trao đổi cùng đồng
nghiệp
1.2 Mục đích nghiên cứu.
Phân dạng các bài toán về xâu, đưa ra ý tưởng giải quyết, càiđặt chương trình tối ưu giải quyết một số bài toán cụ thể, qua đóchỉ ra những sai lầm học sinh thường mắc phải, giới thiệu đến các
em những bài tập từ cơ bản đến khó có thể đưa vào từng dạng để
xử lý
1.3 Đối tượng nghiên cứu.
+ Học sinh khá giỏi lớp 11 trường THPT Thọ Xuân 5
+ Một số bài toán về Xâu được nghiên cứu ở nhiều cách làm,xét trên nhiều phương diện như: độ phức tạp, kết quả output, thờigian thực hiện chương trình
1.4 Phương pháp nghiên cứu.
+ Phương pháp nghiên cứu xây dựng cơ sở lý thuyết: Tôi chủđộng tham khảo các tài liệu lấy từ nhiều nguồn nhất là các họcliệu mở trên mạng internet và phân tích có hệ thống các dạng bàitập theo nội dung đã đề ra
+ Phương pháp điều tra, khảo sát, thu thập thông tin: Để có
cơ sở cho việc áp dụng phương pháp và kinh nghiệm này, tôi đã
tổ chức điều tra, khảo sát, thu thập thông tin về thực tế dạy họcliên quan đến đề tài của mình ở một số trường trên địa bàn huyện
và các nhóm đội tuyển Tin học hằng năm trong nhà trường
+ Phương pháp thống kê, xử lý số liệu: Với một bài toán tôi đãthực hiện nhiều cách khác nhau, dùng phần mềm themis để kiểmtra output và thời gian thực hiện chương trình
2 NỘI DUNG CỦA SÁNG KIẾN KINH NGHIỆM
2.1 Cơ sở lí luận của sáng kiến kinh nghiệm.
Nghị quyết hội nghị Trung ương VIII khóa XI đề ra mục tiêu:
“Đối với giáo dục phổ thông tập trung phát triển trí tuệ, thể chất,hình thành phẩm chất, năng lực công dân, phát hiện và bồi dưỡngnăng khiếu, định hướng nghề nghiệp cho học sinh Nâng cao chất
Trang 5lượng giáo dục toàn diện, chú trọng giáo dục lý tưởng truyềnthống đạo đức, lối sống, ngoại ngữ, tin học, năng lực và kỹ năngthực hành, vận dụng kiến thức vào thực tiễn, phát triển khả năngsáng tạo và tự học, khuyến khích học tập suốt đời, hoàn thànhđào tạo giáo dục phổ thông giai đoạn sau 2015”.[1]
Căn cứ vào những quan điểm, định hướng trên mục tiêu củamôn Tin học, là phải cung cấp những tri thức cơ bản, làm nềntảng để học sinh có thể tiếp tục đi sâu vào tìm hiểu và xây dựngkhoa học Tin học hoặc tiếp thu những tri thức của các lĩnh vực kĩthuật công nghệ tiên tiến, nhất là các lĩnh vực của công nghệthông tin
2.2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm.
2.2.1 Về phía Phụ huynh học sinh.
Môn Tin học là môn học không được đưa vào thi tốt nghiệphoặc xét các trường Cao đẳng, Đại học Chính vì vậy đa phầnkhông được phụ huynh đồng tình khi con mình được lựa chọn vàođội tuyển Tin học phải đầu tư thời gian để tìm hiểu nó
2.2.2 Về phía Giáo viên.
Tin học 11 là một lĩnh vực khó truyền tải, Không phải Giáoviên có chuyên môn tốt sẽ đào tạo được học sinh Giỏi, mà Giáoviên có chuyên môn tốt phải đồng hành với việc có phương phápgiảng dạy lập trình tốt Có sự đánh giá đúng về điểm mạnh, điểmyếu lập trình của từng học sinh, những sai lầm về lập trình từng
em hay mắc phải
2.2.3 Về phía học sinh.
Các em thường quen với việc giải toán đó là tìm cách giải saocho ra được một đáp án theo đề là được Chính vì vậy nhiều em đithi học sinh giỏi về tự tin là mình làm bài tốt mà không kiểm tracách giải của mình đã tối ưu chưa? Đã bao quát được tất cảtrường hợp xảy ra chưa? Đã chạy được test với dữ liệu lớn haychưa? Dẫn đến kết quả kỳ thi thấp
2.2.4 Một số tài liệu hiện có.
Trên thực tế đã có một số tài liệu đề cập đến các bài tập vềXâu, nhưng các tài liệu này mới chỉ đưa ra thuật toán và chươngtrình giải một số bài tập cụ thể làm ví dụ minh họa cho một kỹthuật lập trình nào đó khi nghiên cứu mà chưa khái quát dạng.Các chương trình mà một số tài liệu đưa ra rất khó hiểu và phứctạp không phù hợp năng lực học sinh Trường THPT Thọ Xuân 5,chưa bám sát vào cấu trúc thi học sinh giỏi Tỉnh Khi nghiên cứucác tài liệu này, không chỉ học sinh mà ngay cả giáo viên còn lúngtúng, mơ hồ, áp dụng một cách máy móc mà chưa biết nên chọn
Trang 6cách làm nào? Cách làm nào tối ưu hơn?
2.3 Các sáng kiến kinh nghiệm hoặc các giải pháp đã sử dụng để giải quyết vấn đề.
Từ thực trạng trên, qua 3 năm đứng đội tuyển từ 2016- 2019khi dạy về kiểu dữ liệu Xâu tôi đã giải quyết như sau:
2.3.1 Phân dạng các bài tập này về những dạng cụ thể để học sinh có thể dễ nhận diện, áp dụng thuật toán phù hợp.
Dạng 1 Xử lý số nguyên lớn
Phương pháp chung: Để thực hiện các phép tính hoặc xử lý
với số nguyên ngoài phạm vi biểu diễn được cung cấp, cách đơngiản nhất là sử dụng xâu kí tự để biểu diễn với mỗi ký tự của xâutương ứng với một chữ số của số nguyên lớn tính từ trái qua phải
Các bài tập có thể áp dụng:
Bài 1: Cộng, trừ 2 số nguyên lớn
Cho hai số nguyên dương lớn có có độ dài không quá 200chữ số Hãy đưa ra tổng và hiệu của 2 số nguyên đó
* Ý tưởng: Sử dụng xâu để lưu 2 số lớn Trước hết cho 2
xâu bằng nhau bằng cách chèn thêm nhiều ký tự '0' vào trước xâungắn hơn Việc thực hiện cộng 2 số sẽ được thực hiện bằng cáchcộng lần lượt các cặp ký tự số tương ứng từ phải sang trái của cácxâu
Trang 7Giả sử với số n được cho như trên và cho trước số nguyêndương k nhỏ hơn số chữ số của N Hãy tìm cách gạch đi k chữ sốcủa N để nhận được một số có giá trị nhỏ nhất [2]
Ví dụ:
Trang 8Vào Kết quảp=3, k =11
a1=3, a2 = 4, a3 =2
s1 = 123, s2=0, s3
= 45
44
* Ý tưởng : Ở bài toán này N là số nguyên lớn nên ta sử dụng
xâu để biểu diễn nó, giả sử số n lớn được ghép lại bởi m ký tựkhác nhau khi đó sau khi xóa ta còn lại m-k chữ số trong n Lầnlượt đi tìm m chữ số nhỏ nhất trong xâu còn lại ta được kết quảcần tìm
Dữ liệu vào:
Trang 9Ghi một hoặc nhiều dòng Mỗi dòng ghi một dãy kí số Sốdòng không vượt quá 100 Mỗi dòng ghi từ 1 đến 100 kí số Bảođảm rằng có ít nhất một dòng mà kí số đầu tiên khác 0.
Output
22000466
66220004
* Ý tưởng: Lưu các số dưới dạng mảng kiểu xâu, thực hiện sắp
xếp mảng theo thứ tự tăng dần theo tiêu chí sắp xếp phần tử s[i]đứng trước phần ử s[j] khi (s[i] ghép với s[j]) > (s[j] ghép với s[i]).Phép cộng này chính là phép ghép hai xâu Kết quả bài toán là ghilần lượt các xâu s[i] đã sắp xếp
var s: array[0 1000] of string;
Trang 10Trong dạng 2 này có hai loại bài tập chính:
Loại 1: Xóa đi K số để được số lớn nhất hoặc bé nhất.
* Ý tưởng: Gọi xâu đầu vào là xâu st, lặp K lần mỗi lần xóa
đi 1 kí tự số Nếu mà st[i] > st[i+1] ( Nếu tìm số bé nhất )thì xóa
kí tự st[i] đi và ngắt Nếu không có trường hợp nào thỏa mãn thìxóa đi kí tự cuối cùng của xâu
Cài đặt thuật toán:
Dữ liệu vào: Vào từ file văn bản XOASO.INP gồm
+ Dòng đầu tiên là số nguyên dương có N chữ số (N≤ 104).+ Dòng thứ hai là số nguyên dương K( K< N)
Kết quả: Ghi ra file XOASO.OUT gồm số nguyên bé nhất sau khixóa K chữ số
XOASO.INP XOASO.OUT
15132334312122345
3
11233312122345
Loại 2: Bỏ đi một số kí tự để được số có K chữ số là số bé nhất hoặc lớn nhất
Trang 11* Ý tưởng: Gọi xâu đầu vào là xâu s1, sử dụng vòng lắp
while và vị trí đánh dấu j để duyệt từ đầu xâu đến cuối xâu Nếu
mà s1[j] < s1[j+1] ( Nếu tìm số lớn nhất ) thì xóa kí tự s1[j] đi vàđưa j lại vị trí đầu tiên, ngược lại thì tăng j lên 1 Kết quả bài toán
là K kí tự đầu trong xâu s1
Cài đặt thuật toán:
j := 1 ; while ( length(s1) > 5 ) and ( j <length(s1) ) do
if s1[j] < s1[j+1] then
begin delete(s1,j,1); j := 1 ; end
else inc(j); s1 := copy(s1,1,5);
Bài toán có thể áp dụng:
Cho trước một xâu kí tự, trong đó có ít nhất 5 chữ số Hãyloại bỏ một số kí tự ra khỏi xâu sao cho 5 kí tự cuối cùng còn lạitheo đúng thứ tự tạo thành số lớn nhất
Dữ liệu vào: Cho tệp Bai1.inp
Kết quả: ghi vào tệp bai1.out
Bai1.inp Bai1.ou
t
13a7b48cb7d9e68f7
89687
Dạng 3 Biến đổi xâu.
Phương pháp chung: Đâ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ầnnắm rõ các hàm, thủ tục trên kiểu dữ liệu xâu để vân dụng mộtcách linh hoạt vào từng bài tập cụ thể
Bài toán có thể áp dụng:
Bài 1 Rút gọn xâu (Đề thi HSG lớp 12 tỉnh Nghệ An năm 2009-2010)
Cho một xâu S chỉ gồm các chữ cái in thường với độ dài tối
đa 250 ký tự Em hãy viết chương trình để tạo ra xâu SG từ xâu Sbằng cách xóa các ký tự liên tiếp giống nhau trong xâu S và chỉ
để lại một kí tự đại diện trong đoạn đó [2]
Dữ liệu vào: Đọc từ file văn bản XAUGON.INP chứa xâu S chỉ gồm
các chữ cái in thường
Kết quả: Ghi ra file văn bản XAUGON.OUT là xâu SG tìm được.
Trang 12Ví dụ:
hhooocccsssiiiiinnnhhh hocsinh
* Ý tưởng: Duyệt từ đầu xâu đến cuối xâu, gặp 2 ký tự liên
tiếp khác giống nhau thì xóa đi một ký tự
Cài đặt thuật toán:
Bài 2: Chuẩn hóa Văn bản (đề thi học sinh giỏi lớp 12 tỉnh
Thanh Hóa năm học 2010-2011).[2]
Một văn bản được gọi là văn bản chuẩn hóa nếu:
- Hai từ liền nhau có duy nhất một dấu cách
- Dấu ngắt câu (dấu chấm, 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 vào phía bên phải của từ cuối cùngđược đóng ngoặc
Hãy viết chương trình kiểm tra và đưa một đoạn văn bản vềdạng chuẩn
Dữ liệu vào: Tệp bai3.inp
Kết quả: Ghi vào tệp bai3.out văn bản đã được chuẩn hóa
(trích hoa và rượu của - Nguyễn Bính)
Ý tưởng : Sử dụng thành thạo, linh hoạt các hàm và thủ tục trong
xâu
while eof(f1)=false do
Trang 13begin
readln(f1,s) ;
while s[1] = ' ' do delete(s,1,1);
while s[length(s)] = ' ' do delete(s,length(s),1);
while pos(' ',s) <> 0 do delete(s,pos(' ',s),1);
while pos('( ',s) > 0 do delete (s,pos('( ',s)+1,1);
while pos(' )',s) <> 0 do delete (s,pos(' )',s),1);
Dạng 4: Tần suất xuất hiện.
Phương pháp chung: Với dạng bài tập này ta nên sử dụng thuật
toán đếm phân phối
Bài 1: Kí tự khác nhau ( Đề thi HSG Tỉnh Thanh Hóa năm 2015-2016).[2]
Cho xâu S chỉ gồm các kí tự là chữ cái tiếng anh và các chữ
số (có phân biệt chữ in hoa, in thường)
Yêu cầu: Hãy xác định số kí tự khác nhau trong xâu S và mỗi kí
tự xuất hiện bao nhiêu lần
Dữ liệu vào: Vào từ file văn bản BAI2.INP gồm 1 dòng duy nhất
là xâu kí tự S (có độ dài không quá 255).
Kết quả: Kết quả ghi ra file văn bản BAI2.OUT gồm:
- Dòng đầu ghi số kí tự khác nhau
- Các dòng tiếp theo, mỗi dòng ghi một kí tự xuất hiện trongxâu S và số lần xuất hiện của nó Các kí tự đưa ra theo thứ tự chữcái in hoa, in thường, chữ số Các chữ cái, chữ số đưa ra theo thứ
Trang 149 1
* Ý tưởng:
- Với xâu có độ dài tối đa 106 ta sẽ sử dụng khai báo kiểu
xâu Ansistring
- Sử dụng mảng đánh dấu B['a' 'z'] of longint để đếm số
lần xuất hiện các ký tự trong xâu s với B[ch] = d có nghĩa là ký tự
ch xuất hiện d lần
- Lần theo các giá trị của mảng B 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 không trong mảngB) và tìm giá trị lớn nhất của mảng B ta sẽ tìm được ký tự xuấthiện nhiều lần nhất
Cài đặt thuật toán:
mã hóa thành một xâu với quy tắc như sau:
- Xâu mã hóa chỉ lưu lại các kí tự chữ cái xuất hiện đầu tiên.Nói cách khác, các kí tự nào xuất hiện lớn hơn một lần trởlên, sẽ bị xóa bỏ, chỉ giữ lại kí tự đầu tiên
- Giá trị mật mã của xâu được tính bằng tổng số lần xuất hiệncủa các kí tự có tần suất xuất hiện lớn hơn một lần
Các bạn hãy cùng Bình giải quyết bài toán này nhé!
Dữ liệu vào: Vào từ tệp BAI2.INP
Một dòng gồm nhiều chuỗi các kí tự, có tổng độ dài không vượtquá 106
(Các kí tự là chữ cái in hoa hoặc chữ cái thường.)