1. Mở Đầu
1.1. Lí do chọn đề tài.
MônTinhọcnói
chung
và
nộidungTinhọclậptrình
nói
riênglàmộtmônhọckhámớilạ
đốivớihọcsinhtrung
học
phổthông(THPT)
nênđasốcácemrấtbỡngỡkhitiếpcậnnội
dungmônhọcnày.
Trongthựctiễn,dữliệuvàocủacácbàitoánđềuliênquanđếncáckiểudữliệu
khácnhau,đểxử lídữliệu theo yêu cầu đề bàichúngtathườngđưadữliệuđó về các
dạng kiểu dữ liệu chuẩn hoặc kiểu dữ liệu có cấu trúc, một trong những kiểudữ
liệu có cấu trúc rất hay sử dụng là kiểu xâu kí tự.
Qua quá trình giảng dạy môn Tin học tôi nhận thấy dữ liệu kiểu xâu
thường gặp rất nhiều trong các bài toán nhưng để học sinh có thể vận dụng linh
hoạt các thao tác xử lí trên kiểu dữ liệu này vào bài toán cụ thể không phải là dễ.
Trong các đề thi chọn học sinh giỏi (HSG) của các trường THPT trong
tỉnh hoặc đề thi HSG cấp tỉnh của Nghệ An và nhiều tỉnh khác, tôi nhận thấy đề
thi nào cũng có các bài tập liên quan đến kiểu dữ liệu xâu kí tự. Do vậy, việc
giúp học sinh nắm chắc các thao tác xử lí và phân dạng các bài toán điển hình
trên kiểu dữ liệu xâu kí tựđể các em có thể dễ dàng nhận biết và giải quyết các
bài toán một cách tối ưu là việc làm vô cùng quan trọng của các giáo viên phụ
trách bồi dưỡng đội tuyển HSG.
Trong quá trình giảng dạy ở các lớp mũi nhọn và bồi dưỡng đội tuyển thi
HSG cấp tỉnh, dựa vào kinh nghiệm của bản thân, tôi đã có các giải pháp ôn tập
có hiệu quả phần kiểu dữ liệu xâu. Trong đó, tôi đã phân dạng các bài toán điển
hình trên xâu kí tự giúp học sinh có hứng thú và tiếp cận tốt hơn khi giải quyết
các bài toán trên xâu kí tự trong các đề thi HSG. Chính vì vậy, tôi chọn đề
tài:“Một số biện pháp ôn tập có hiệu quả phần kiểu dữ liệu xâu nhằm nâng
cao chất lượng bồi dưỡng học sinh giỏi môn Tin học”làm sáng kiến kinh
nghiệm với mục đích được trao đổi cùng các bạn đồng nghiệp các phương pháp
mà tôi đã và đang áp dụng rất có hiệu quả tại ngôi trường tôi đang công tác và
cũng hy vọng cách làm này sẽ được bổ sung, hoàn thiện
1.2. Mục đích nghiên cứu.
Việc dạy cho học sinh niềm đam mê và khả năng tư duy lập trình là điều
không thể thiếu đối với việc bồi dưỡngHSG môn Tin học. Tôi viết về đề tài này
với mục đích:
- Cùng trao đổi với các bạn đồng nghiệp về cách dạy học sinh bước đầu
vào học lập trình môn Tin học và xử lí tốt các bài toán trên xâu kí tự.
- Giúp học sinh có thêm một tài liệu để tham khảo trong quá trình học lập
trình.
- Giúp anh chị em đồng nghiệp trong trường và ở các trường phổ thông
trên địa bàn tỉnh có thêm một tài liệu để ôn tậpthi giáo viên giỏi và phục vụ công
tác bồi dưỡng HSG.
0
1.3. Đối tượng nghiên cứu.
- Nghiên cứu các phương pháp giải các bài toán trên xâu kí tự, từ đó phát
triển làm tốt các bài toán nâng cao hoặc các bài toán trong các kì thi HSG Tin
học ở THPT.
1.4. Phương pháp nghiên cứu.
- Điều tra khả năng tiếp cận môn Tin học lập trình của giáo viên THPT.
- Điều tra khả năng tiếp cận môn Tin học lập trình của học sinh THPT.
-Tham khảo tài liệu, nghiên cứu các đề thi, các bài toán thiên về tư duy
toán học cơ bản chuyển về bài toán lập trình...
- Phương pháp thực nghiệm trên đối tượng là học sinh THPT.
2. Nội dung sáng kiến kinh nghiệm
2.1. Cơ sở lí luận của sáng kiến kinh nghiệm.
Trong bối cảnh toàn ngành GD&ĐT đang nỗ lực đổi mới phương pháp
dạy học theo hướng phát huy tính tích cực chủ động của học sinh trong hoạt
động học tập. Điều 24.2 của Luật giáo dục đã nêu rõ: “Phương pháp giáo dục
phổ thông phải phát huy tính tích cực, tự giác, chủ động, sáng tạo của học sinh,
phù hợp với đặc điểm của từng lớp học, môn học; bồi dưỡng phương pháp tự
học, rèn luyện kỹ năng vận dụng kiến thức vào thực tiễn, tác động đến tình cảm,
đem lại niềm vui, hứng thú học tập cho học sinh”.
Như vậy, chúng ta có thể thấy định hướng đổi mới phương pháp dạy học
đã được khẳng định, không còn là vấn đề tranh luận. Cốt lõi của việc đổi mới
phương pháp dạy học ở trường phổ thông là giúp học sinh hướng tới việc học
tập chủ động, chống lại thói quen học tập thụ động. Với một số nội dung trong
đề tài này, học sinh có thể tự học, tự rèn luyện thông qua một số bài tập, dạng
bài tập cụ thể.
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến.
Qua thực tế giảng dạy
tôi nhận thấy khi học đến chương
trìnhTinhọclớp11đasốhọcsinhđềuchorằngđâylàmônhọckhónhấttrongcácmôn học,
nhiều em còn sợ môn họcnày.
Khi học sinh học bài học bài 12 “Kiểu xâu” –SGK Tin học 11, học sinh đã
có rất nhiều khó khăn, nhầm lẫn trong việc xử lí dữ liệu vì các em đang quen với
các bài toán xử lí dữ liệu kiểu số, các bài toán quen thuộc như tính tổng hoặc
tích của một dãy số thỏa mãn điều kiện nào đó…
Khigặpcácbàitoánphảisửdụngkiểudữliệulớnnhiềuemlúnglúng.Việcgiảicác
bàitoánvớikiểudữliệulớnthựcsựcầnthiếtchocácemkhilàmcácbàitoánlậptrình trong
chương trình Tin học phổ thông nói riêng và việc giải quyết các bài toán thực tế
nói chung.
Thực tế cho thấy, các đề thi HSG đều có các bài tập xử lí xâu kí tự. Nếu
học sinh không hiểu rõ và nhận biết tốt thì thường các bài tập về xâu hay gặp
nhiều sai sót hoặc không xử lí hết test theo yêu cầu đề bài ra.
1
2.3. Các giải pháp đã áp dụng để giải quyết vấn đề.
2.3.1. Giải pháp 1: Yêu cầu học sinh nắm chắc các kiến thức về xâu kí tự, bổ
sung thêm một số hàm và thủ tục không có trong sách giáo khoa Tin học 11.
Để thực hiện giải pháp này tôi yêu cầu học sinh ôn tập thật kỹ các kiến
thức về kiểu dữ liệu xâu được trình bày trong sách giáo khoa Tin học 11. Ngoài
ra, để giúp các em làm được các bài tập nâng cao tôi bổ sung thêm cho học sinh
một số hàm và thủ tục không có trong chương trình.
a. Khái niệm xâu: Xâu là dãy các kí tự trong bộ mã ASCII, mỗi kí tự được gọi
là một phần tử của xâu.
b. Cách khai báo:
Var <Tên biến xâu>: String[<độ dài lớn nhất của xâu>];
{Độ dài lớn nhất của xâu không vượt quá 255}
Trong mô tả xâu có thể bỏ qua phần khai báo độ dài. Khi đó độ dài lớn
nhất của xâu sẽ nhận giá trị ngầm định là 255.
c. Các thao tác xử lí xâu:
* Phép ghép xâu:
Kí hiệu là dấu cộng (+) được sử dụng để ghép nhiều xâu thành một xâu.
Có thể thực hiện phép ghép xâu với hằng và biến xâu.
* Phép so sánh:
Hai xâu kí tự có thể so sánh với nhau bằng các phép so sánh bằng (=),
khác (<>), nhỏ hơn (<), lớn hơn (>), nhỏ hơn hoặc bằng (<=), lớn hơn hoặc bằng
(>=) có thứ tự ưu tiên thực hiện thấp hơn phép ghép xâu. Nguyên tắc so sánh
thực hiện như sau:
+ Xâu A lớn hơn xâu B nếu kí tự đầu tiên khác nhau giữa chúng kể từ trái
sang trong xâu A có mã ASCII lớn hơn.
+ Nếu A và B là các xâu có độ dài khác nhau và A là đoạn đầu của B thì A
nhỏ hơn B.
+ Hai xâu được coi là bằng nhau nếu chúng giống nhau hoàn toàn.
* Các thủ tục và hàm chuẩn xử lí xâu kí tự:
“+ Hàm LENGTH(st): Hàm trả về giá trị là độ dài thực của xâu kí tự st.
+ Hàm COPY(st,i,n): Tạo xâu gồm n kí tự liên tiếp bắt đầu từ vị trí i của
xâu st.
+ Hàm CONCAT(s1,s2,…,sn): Hàm cho ra 1 xâu mới bằng cách ghép liên
tiếp các xâu s1,s2,…,sn lại với nhau theo đúng thứ tự đó.
+ Hàm POS(t1,s2): Hàm cho ta vị trí tìm thấy đầu tiên của xâu s1 trong
xâu s2.
+ Hàm CHR(x): Hàm trả về kí tự có vị trí x trong bảng mã ASCII.
+ Hàm ORD(ch): Hàm trả về vị trí kí tự ch trong bảng mã ASCII.
+ Thủ tục DELETE(st,i,n): Xóa n kí tự trong xâu st kể từ vị trí i.
+ Thủ tục INSERT(st,st1,i): Thủ tục này thực hiện việc chèn xâu kí tự st1
vào xâu st tại vị trí i, những kí tự đứng sau i sẽ được dời về phía sau của xâu kí
tự st. Kết quả trả về cho xâu st.
+ Thủ tục STR(value,st): Thủ tục này thực hiện việc chuyển đổi giá trị
kiểu số (value) sang dạng xâu kí tự và gán cho biến st.
2
+ Thủ tục VAL(st,x,code): Thủ tục này thực hiện việc đổi một xâu kí tự st
sang dạng số và gán cho biến x, nếu phép chuyển đối thành công thì code sẽ
nhận giá trị bằng 0, ngược lại thì cho giá trị khác 0.
+ Thủ tục STR(x,St): Thủ tục này thực hiện việc chuyển số x thành xâu kí
tự tương ứng và lưu trong biến St.
Các thuật toán xử lí trên xâu kí tự gần giống với các thuật toán xử lí trên
mảng, tuy nhiên khi giải quyết trên xâu kí tự nó thực hiện được một cách “tự
nhiên” hơn so với mảng nhờ những ưu thế trên xâu như sau: Khi khai báo và
nhập vào một xâu ta chưa ấn định số phần tử của nó, khi thực hiện các thao tác
như xóa xâu hay chèn xâu ta không phải dịch chuyển các phần tử của nó như đối
với mảng, trong xâu ta có thể đọc và xử lí toàn bộ từng phần tử của nó chứ
không nhất thiết phải đọc hay xử lí từng phần tử như trên mảng.
Chính vì thế các bài toán xử lí được trong mảng gần như xử lí được trong
xâu nhưng có những bài toán khi dùng mảng xử lí rất khó khăn nhưng dùng xâu
hiệu quả hơn rất nhiều”. [1]
Thời gian thực hiện giải pháp 1 là 1 buổi, đối với các thao tác trên xâu
giáo viên cần lấy ví dụ cụ thể mô phỏng cho học sinh hiểu rõ bản chất. Giáo
viên có thể bổ sung thêm một số bài tập vận dụng nhỏ, mức độ trung bình có sử
dụng các hàm và thủ tục chuẩn xử lí xâu để học sinh củng cố chắc kiến thức vừa
học.
Kết quả sau khi thực hiện giải pháp 1: Học sinh nắm được các thao tác
trên xâu kí tự, vận dụng được để giải được các bài tập trong sách giáo khoa là
tiền đề vững chắc để các em học các buổi nâng cao sau.
2.3.2 Giải pháp 2: Phân loại các dạng toán điển hình trên xâu kí tự.
2.3.2.1.Dạng 1: Dạng toán cơ bản.
Phương pháp chung: Đây là dạng cơ bản thường gặp, những bài toán cơ
bản như: Đưa xâu về dạng chuẩn, đếm số kí tự nào đó xuất hiện trong xâu hay
đếm số từ trong xâu... Các bài toán ở dạng này tương đối dễ hiểu với học sinh.
Bài toán 1.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 S bằ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 đó.
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.
Ví dụ:
XAUGON.INP
XAUGON.OUT
hhooocccsssiiiiinnnhhh
hocsinh
* Ý tưởng:
Duyệt từ đầu xâu đến cuối xâu, gặp 2 kí tự liên tiếp giống nhau thì xóa đi
1kí tự.
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
Bài toán 1.2Chữ cái xuất hiện(Đề thi HSG tỉnh Thanh Hóa năm 2012)
3
Cho xâu St chỉ gồm các chữ cái. Tính số lần xuất hiện của chữ cái xuất
hiện nhiều nhất trong xâu (không phân biệt chữ in hoa và in thường).
Dữ liệu vào:Từ file KT_MAX.INP gồm: Xâu St (độ dài ≤ 500 kí tự).
Kết quả:Ghi ra file KT_MAX.OUT gồm: Một dòng duy nhất là bội số
chung nhỏ nhất của kết quả bài toán và 105.
Ví dụ:
KT_MAX.INP
AAABDA
KT_MAX.OUT
100000
*Ý tưởng:
Dùng mảng D để lưu số lần xuất hiện của mỗi phần tử trong xâu st sau đó
ta chỉ việc duyệt từ đầu đến cuối mảng D để tìm phần tử lớn nhất của mảng là
max. Kết quả bài toán chính bội chung nhỏ nhất của max và 10000.
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
Bài toán 1.3 Gửi thư(Nguồn />Vị Giám đốc công ty XYZ cần gửi một văn bản quan trọng tới một đối tác
của mình. Văn bản là một xâu S các chữ cái la tinh in thường. Để bảo mật nội
dung văn bản, ông Giám đốc gửi 2 bức thư. Bức thư thứ nhất là phần đầu Sb của
xâu S, bức thư thứ 2 là phần cuối Se của S. Hai bức thư Sb và Se đảm bảo đầy
đủ nội dung của S, tuy nhiên có thể một phần cuối của Sb có thể được viết lặp
lại trong phần đầu của Se, song số kí tự được viết lặp lại không biết trước.
Ví dụ: Với văn bản S= ‘truongnguyenduquannhat’ tạo ra hai bức thư:
Sb= ‘truongnguyendu’ và Se= ‘nguyenduquannhat’
Yêu cầu: Cho hai xâu Sb và Se, hãy xác định một xâu S có thể là nội
dung của bức thư sao cho độ dài của xâu S là ngắn nhất.
Dữ liệu vào từ file GUITHU.INP:
- Dòng đầu chứa xâu Sb, dòng thứ hai chứa xâu Se.
- Mỗi xâu có độ dài không quá 250.
Dữ liệu ra đưa ra file GUITHU.OUT:Ghi ra độ dài của xâu S tìm được.
Ví dụ:
GUITHU.INP
truongnguyendu
nguyenduquannhat
GUITHU.OUT
22
* Ý tưởng:
- Lần lượt xét các xâu con d, c tương ứng tính từ cuối xâu s1 và đầu xâu
s2, nếu d=c thì ta lưu lại độ dài của xâu d. Quá trình cứ tiếp tục như vậy và ta
nhận được độ dài xâu con chung dài nhất cần tìm (giả sử là max).
- Kết quả bài toán là length(s1)+length(s2) - max
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
2.3.2.2. Dạng 2: Xóa và thay thế.
Phương pháp chung: Để giải các bài toán của dạng 2ta thực hiện lặp đi
lặp lại (câu lệnh lặp while) các công việc: Tìm vị trí, xóa và thay thế.
4
Bài toán 2.1 Giải mã (Đề thi HSG lớp 12 tỉnh Vĩnh Phúc năm 2012 – 2013)
Cho xâu s đã được mã hóa theo quy tắc các nguyên âm a, e, i, o, u được
viết thêm chữ cái p đằng sau và thêm chính nguyên âm đó đằng sau chữ cái p.
Đưa ra xâu sau khi giải mã
Ví dụ:Từ ‘welcome’ sẽ được mã hóa thành ‘wepelcopomepe’
* Ý tưởng:
Sử dụng ý tưởng chung của dạng bài tập này là tìm vị trí xuất hiện, xóa đi
hai kí tự từ vị trí tìm được +1. Bình thường vị trí xuất hiện của xâu x trong xâu s
chỉ có 1 nhưng ở đây có 5 trường hợp. Vì vậy, sử dụng mảng để duyệt từng
trường hợp.
* Đoạn chương trình:
x[1]:= ‘apa’; x[2]:= ‘epe’; x[3]:= ‘ipi’; x[4]:= ‘opo’; x[5]:= ‘upu’;
for i:=1 to 5 do
while pos(x[i], s) <>0 do
begin
vt:= pos(x[i], s); delete(s,vt+1, 2);
end;
Bài toán 2.2 Xóa số(Đề HSG lớp 10tỉnh Vĩnh Phúc năm 2011 – 2012)
Cho số nguyên dương gồm N chữ số, tìm số lớn nhất có thể sau khi gạch
bỏ đi k chữ số trong số N chữ số đã cho.
Ví dụ: với N=3; k=1 số đó là 991 số còn lại sau khi xóa là 99 Với N=4;
k=2 số đó là 1782 số còn lại sau khi xóa là 82.
* Ý tưởng:
- Đọc số vào dưới dạng xâuS.
- Duyệt từ đầu xâu, xét 2 kí tựliền kề nhau nếu s[i]
giảm k đi 1 đơn vị. Công việc này thực hiện lặp đi lặp lại cho đến khi k=0 hoặc
duyệt hết xâuS.
- Nếu sau khi duyệt ở trên mà k>0 thì xâu S còn lại là xâu gồm các kí
tự số theo thứ tự giảm dần, như vậy chỉ cần xóa từ cuối xâu đúng k kí tự.
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
Bài toán 2.3 Tìm số lớn (Đề thi HSG tỉnh Thanh Hóa 2013 - 2014)
Cho một dãy gồm N các kí tự có mặt trên bàn phím trong đó có ít nhất 4
chữ số (N< 106).
Yêu cầu: Hãy loại bỏ một số kí tự khỏi dãy sao cho 4 kí tự cuối cùng còn
lại theo đúng thứ tự đó tạo nên 1 số lớn nhất.
Dữ liệu vào: File văn bản chứa MAX.INP chứa N kí tự.
Dữ liệu ra: File văn bản MAX.OUT chứa 4 chữ số tạo thành số lớn nhất.
Ví dụ:
MAX.INP
24t5j4r05f704y652k393
MAX.OUT
7693
* Ý tưởng:
- Lọc ra xâu S chỉ chứa các kí tự số
- Áp dụng phương pháp giải của bài toán 2.2 với k = n-4
5
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
2.3.2.3. Dạng 3: Các bài tập xâu Palindrome.
Phương pháp chung: Xâu Palindrome hay còn gọi là xâu đối xứng. Xâu
đối xứng là xâu có tính chất: Đọc nó từ phải sang trái cũng thu được kết quả
giống như đọc từ trái sang phải.
Với những bài tập kiểm tra xâu Palindrome hay tìm kiếm xâu có tính chất
Palindrome thì trước hết nên xây dựng hàm kiểm tra tính chất đối xứng của một
xâu với độ phức tạp O(n), trên cơ sở đó chúng ta đi giải quyết những bài tập khó
hơn.
Bài toán 3.1 Khóa vòng(Nguồn />Người ta xâu N viên đá kích thước giống nhau thành 1 vòng đeo cổ
(5<=N<=250), mỗi viên có 1 màu trong số các màu đánh số từ 1 đến 9. Người ta
định lắp khóa đeo vào vị trí sao cho khi mở vòng ta được một dây đá có tính
chất: Không phụ thuộc vào việc cầm đầu dây nào bên tay phải và đầu kia bên
tay trái, ta đều được một chuỗi hạt giống nhau, tức là viên đá thứ i từ trái sang
luôn có màu j không phụ thuộc vào cách cầm.
Dữ liệu:Đọc từ file KHOAVONG.INP gồm xâu S chứa các kí tự từ 0..9
có độ dài bé hơn 256.
Kết quả:Ghi ra file KHOAVONG.OUT số cách đặt khóa khác nhau thỏa
mãn yêu cầu.
Ví dụ:
KHOAVONG.INP
222222335533
KHOAVONG.OUT
2
* Ý tưởng:
Xử lí dữ liệu vòng tròn bằng cách nhân đôi xâu ban đầu, kiểm tra từng
xâu con có độ dài bằng N bắt đầu từ vị trí i (i = 1, 2,..., N) có là xâu đối xứng
không? Nếu đối xứng thì tăng biến đếm.
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
Bài toán3.2 Robot công nghiệp
(Đề thi HSG lớp 11 tỉnh Hà Tĩnh năm học 2010-2011)
Trong một nhà máy có trang bị loại Robot công nghiệp để thực hiện việc
tự động hoá gia công các sản phẩm. Việc gia công các sản phẩm của Robot được
thực hiện đồng thời trên hai sản phẩm cùng một lúc theo tiến trình: Với mỗi loại
thao tác gia công được Robot thực hiện trên sản phẩm thứ nhất xong rồi chuyển
sang thực hiện trên sản phẩm thứ hai. Để hoàn thành một sản phẩm, Robot có
thể thực hiện tới N loại thao tác gia công (N≤ 24) và mỗi loại thao tác gia công
đã thực hiện trên một sản phẩm nào đó rồi thì không thực hiện lại trên sản phẩm
đó nữa. Robot hoạt động bằng lệnh là một dãy kí tự in hoa, mỗi kí tự là lệnh
thực hiện cho một loại thao tác gia công. Lệnh thực hiện các loại thao tác gia
công khác nhau là các kí tự khác nhau. Việc đọc dòng lệnh và thực hiện lệnh của
Robot được tiến hành theo các chu trình như sau:
6
+ Chu trình thứ nhất: Đọc kí tự thứ nhất, thực hiện lệnh tương ứng trên
sản phẩm thứ nhất. Tiếp theo đọc kí tự thứ N, thực hiện lệnh tương ứng trên sản
phẩm thứ hai.
+ Chu trình thứ hai: Đọc kí tự thứ hai, thực hiện lệnh tương ứng trên sản
phẩm thứ nhất. Tiếp theo đọc kí tự thứ N-1, thực hiện lệnh tương ứng trên sản
phẩm thứ hai.
+ Chu trình thứ ba: Đọc kí tự ba, thực hiện lệnh tương ứng trên sản phẩm
thứ nhất. Tiếp theo đọc kí tự thứ N-2, thực hiện lệnh tương ứng trên sản phẩm
thứ hai.
...
Tương tự với các chu trình còn lại để đọc hết dòng lệnh.
Với một xâu S các kí tự in hoa có số lượng các kí tự là chẵn và không quá
N x 2, hãy xác định xem nó có phải là một dòng lệnh của Robot đã nói ở trên
hay không?
Dữ liệu vào: Tệp văn bản ROBOT.INP có cấu trúc:
- Dòng đầu tiên ghi 1 số là độ dài xâu S.
- Dòng thứ 2 ghi xâu S.
Dữ liệu ra: Tệp văn bản ROBOT.OUT ghi thông báo ‘CO’ nếu xâu S là
dòng lệnh của Robot, ngược lại ghi thông báo ‘KHONG’
Ví dụ:
ROBOT.INP
6
CBAABC
ROBOT.INP
6
ROBOT.OUT
CO
ROBOT.OUT
KHONG
ACBDCA
* Ý tưởng:
Với yêu cầu của đề bài, bài toán trở thành kiểm tra xâu đầu vào có đối
xứng hay không. Nếu xâu đầu vào đối xứng thì ghi ra tệp dữ liệu ra “CO”,
ngược lại thì ghi “KHONG”.
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
Bài toán 3.3 Đối xứng kép (Đề thi HSG lớp 12 tỉnh Vĩnh Phúc năm 2011)
Với mỗi xâu T, ta kí hiệu Trlà xâu nhận được từ T bằng cách viết T theo
chiều từ phải qua trái, chẳng hạn (abc)r= cba. Mỗi xâu đối xứng độ dài chẵn luôn
có dạng T.Tr, dấu ‘.’để chỉ phép nối xâu.
Ta định nghĩa một xâu là đối xứng kép nếu nó có dạng TT rTTr, chẳng hạn
abbaabbalà một xâu đối xứng kép với T= ab.
Cho xâu S, xác định độ dài xâu con đối xứng kép dài nhất của S.
Dữ liệu: Cho bởi file dpalin.inp ghi xâu S với độ dài không vượt quá
1000,chỉ gồm các chữ cái latinh từ a..z, A..Z.
Kết quả: Ghi ra file dpalin.out trên một dòng gồm một số nguyên là độ
dài xâu con đối xứng kép dài nhất của xâu S.
Ví dụ:
7
dpalin.inp
Aaaaxyyxxyyxbbbb
dpalin.out
8
* Ý tưởng:
Dùng mảng S để lưu xâu đã cho. Dùng thêm mảng hai chiều d kích thước
1000x1000 kiểu boolean để kiểm tra có thỏa mãn dpalin hay không tại mỗi điểm
xétd:array[1..10000,1..10000]of boolean;
Gọi n là độ dài xâu S, gọi max là độ dài xâu con đối xứng kép dài nhất.
Ta duyệt từ đầu xâu đến độ dài trừ 2.
for i:=1 to n-2 do
begin
if S[i]=S[i+1] then
begin
d[i,i+1]:=true;
j:=i-1;k:=i+2;
while (j>=1)and(k<=n)and(S[j] = S[k]) do
begin
d[j,k]:=true;
dec(j);inc(k);
end;
end;
end;
for i:=1 to n do
for j:=i+2 to n do
if d[i,j] then
begin
k:=(i+j) div 2;
if d[i,k] then if j-i+1>max then max:=j-i+1;
end;
Kết quả bài toán là max.
2.3.2.4. Dạng 4: Mã hóa và giải mã.
Phương pháp chung:
- Sử dụng mảng gán giá trị ban đầu cho các kí tự từ A đến Z là 1 đến 26.
- Theo yêu cầu đề bài phải xây dựng được hàm f.
- Từ hàm f giải mã ngược trở lại theo quy tắc mã hóa.
Bài toán 4.1 Mã hóa (Đề thi HSG tỉnh Vĩnh Phúc 2008 -2009)
Một người thích làm một việc như sau: Anh ta xem các chữ cái tiếng Anh
từ A đến Z là các số tương ứng từ 1 đến 26. Khi đó thay vì viết một từ tiếng Anh,
anh ta viết dãy số nhận được bằng cách thay mỗi chữ cái xuất hiện trong đó
bằng số tương ứng, dãy số này được gọi là mã hóa của từ đó. Nhập từ bàn phím
một dãy chữ số thập phân S1 gồm không quá 30 chữ số. Hãy in ra mọi từ S mà
S1 là mã hóa của nó. Nếu không có thì in ra -1.
Ví dụ:
MAHOA.INP
MAHOA.OUT
8
123
ABC
AW
LC
* Ý tưởng:
Đọc dãy chữ số thập phân S1 vào xâu St. Dùng mảng A gồm tối đa 30 kí
tự để lưu các kí tự sẽ được mã hóa. Độ dài xâu số St là N.
Dùng biến OK có kiểu boolean để kiểm tra xem việc mã hóa có thành
công hay không. Nếu OK = true thì việc mã hóa thành công và kết quả của mã
hóa là mảng A còn nếu Ok = false thì việc mã hóa không thành công và kết quả
của mã hóa là -1.
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
Bài toán 4.2Từ điển (Nguồn từ diễn đàn lập trình CTS.edu.vn)
Hai từ được gọi là ANAGRAM của nhau nếu từ này là một hoán vị các kí
tự của từ kia và ngược lại, chẳng hạn DARE và READ là ANAGRAM của nhau.
Yêu cầu: Hãy tìm các nhóm từ là ANAGRAM của nhau.
Dữ liệu:Vào từ File văn bản TUDIEN.INP gồm N từ không có dấu, chỉ
toàn chữ cái thường (1< N<=100), mỗi từ được ghi trên một dòng
Kết quả: Ghi ra File văn bản TUDIEN.INP có cấu trúc: Mỗi nhóm từ là
ANAGRAM của nhau được ghi trên một dòng, mỗi từ cách nhau một dấu cách
trống.
Ví dụ:
TUDIEN.INP
Care
read
race
opt
dear
dare
TUDIEN.OUT
care race
dear dare read
opt
* Ý tưởng:
Dùng mảng A tối đa 100 phần tử, mỗi phần tử là một xâu để đọc dữ liệu:
Mỗi từ trên một dòng được lưu vào một phần tử của mảng A. Dùng thêm mảng
B có cấu trúc hoàn toàn như A để lấy phần tử từ A trong quá trình xử lí. Đầu tiên
ta sắp xếp lại mảng B (chính là nội dung của mảng A) sau đó kiểm tra có phải là
anagram không
for i:= 1 to n do
begin
B[i]:= A[i];
for j:= 1 to length(B[i])-1 do
for k:= j+1 to length(B[i]) do
if B[i][j]>B[i][k] then
begin
ch:= B[i][j];
9
B[i][j]:= B[i][k];
B[i][k]:= ch;
end;
end;
for i:= 1 to n-1 do
for j:= i+1 to n do
if B[i]>B[j] then
begin
S:= b[i]; B[i]:=B[j]; B[j]:=S;
S:= a[i]; a[i]:=a[j]; a[j]:=S;
end;
for i:= 1 to n do
if B[i]=B[i+1] then write(f,A[i],' ')
else writeln(f,A[i]);
Bài toán 4.3Xâu hạt nhân (Nguồn từ HBCCoder – Bài tập)
Xâu u được gọi là hạt nhân của xâu v nếu u là xâu ngắn nhất sao cho ghép
một số lần u thì nhận được v. Cho xâu S, tìm hạt nhân của nó.
Dữ liệu: Cho từ file XAU_HN.INP gồm một xâu S.
Kết quả: Ghi ra file XAU_HN.OUT là hạt nhân của xâu S.
Ví dụ:
XAU_HN.INP
Abcabcabc
XAU_HN.OUT
Abc
* Ý tưởng:
Dùng biến S để lưu trữ xâu đã cho, trước tiên ta dùng hàm KT để kiểm tra
xâu u có thỏa mãn xâu hạt nhân hay không?
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
2.3.2.5. Dạng 5: Tìm xâu con.
Phương pháp chung: Để tìm các xâu con (tức là một xâu con gồm các kí
tự liên tiếp nhau)thỏa mãn một điều kiện cho trước thì thường sử dụng phương
pháp vét cạn với bộ dữ liệu đầu vào nhỏ, tuy nhiên nên sử dụng linh hoạt các
phương pháp khác như phương pháp quy hoạch động, phương pháp chặt nhị
phân trong trường hợp bài toán có bộ dữ liệu lớn.
Bài toán 5.1. Xâu chung(Đề thi HSG tỉnh Nghệ An lớp 12 năm 2013)
Xâu S được gọi là xâu con chung của xâu S1 và xâu S2 nếu xâu S là một
dãy các kí tự liên tiếp trong S1 và cũng là dãy các kí tự liên tiếp trong S2.
Yêu cầu: Cho hai xâu kí tự S1 và S2 (có không quá 255 kí tự). Hãy tìm
một xâu con chung S dài nhất của hai xâu S1 và S2.
Ví dụ: S1 = ‘Ky thi học sinh gioi Tinh mon Tin hoc’, S2 = ‘hoc sinh gioi
mon Tin hoc’ thì S = ‘hoc sinh gioi’.
Dữ liệu:Vào từ file văn bản xauchung.inp:
Dòng đầu tiên ghi xâu S1.
Dòng thứ hai ghi xâu S2.
10
Kết quả:Ghi ra file văn bảnxauchung.out chỉ một số duy nhất là độ dài
của xâu con chung dài nhất S. (Nếu hai xâu S1, S2 không có kí tự nào chung thì
ghi số 0).
Ví dụ:
xauchung.inp
Ky thi hoc sinh gioi Tinh mon tin hoc
hoc sinh gioi mon Tin hoc
xauchung.out
14
* Ý tưởng:
Trước tiên ta xây dựng thủ tục để cập nhật độ dài xâu con chung lớn nhất
tại các thời điểm:
procedure capnhat;
begin
if kmax < k then kmax:=k;
end;
Quá trình tìm xâu con chung lớn nhất hoàn toàn tương tự như phương
pháp đoạn xâu lớn nhất:
procedure xuly;
begin
l1:=length(s1);
l2:=length(s2);
k:=0;
kmax:=0;
for i:=1 to l1 do
for j:=1 to l2 do
if s1[i]=s2[j] then
begin
k:=1;
while (i+k<=l1) and (j+k<=l2) and (s1[i+k]=s2[j+k])
do
inc(k);
capnhat;
end;
end;
Kết quả của bài toán là kmax.
Bài toán 5.2Đoạn max(Đề thi HSG tỉnh Nghệ An lớp 12 năm 2014)
Cho chuỗi kí tự S gồm toàn các chữ cái in hoa (‘A’…’Z’) với độ dài
không quá 104.
Yêu cầu:Hãy tìm đoạn con các kí tự liên tiếp dài nhất sao cho không có kí
tự nào xuất hiện nhiều hơn một lần. Trong trường hợp có nhiều hơn một đoạn
con có cùng chiều dài dài nhất, hãy chỉ ra đoạn xuất hiện đầu tiên trong chuỗi S.
Dữ liệu: Vào từ văn bản DOANMAX.INP: Gồm một dòng duy nhất chứa
chuỗi S.
Kết quả: Ghi ra file văn bảnDOANMAX.OUT
11
Chỉ một dòng duy nhất chứa số nguyên P và L tương ứng là vị trí và chiều
dài của đoạn con dài nhất tìm được.
Ví dụ:
DOANMAX.INP
DOANMAX.OUT
ABABCDAC
34
Lưu ý: Có 80% số test có độ dài xâu S không vượt quá 255.
Giải thích test ví dụ: Đoạn con dài nhất tìm được là ABCD có vị trí 3 và
độ dài 4.
* Ý tưởng:
“Cách 1: Một cách đơn giản nhất là ta duyệt trực tiếp từ đầu xâu đến cuối xâu
tất cả các cặp i và j. Với mỗi cặp duyệt để kiểm tra từng cặp.
Với cách làm này độ phức tạp lên đến O(N4)
Cách 2: Ta nâng cấp cách 1 trên bằng một số nhận xét:
Vì xâu chỉ chứa các kí tự từ A đến Z (bao gồm 26 kí tự) nên độ dài đoạn
con dài nhất thỏa mãn yêu cầu sẽ không quá 26.
- Xét mọi đoạn con có độ dài d và cận đầu là i:
+ Vì cần tìm đoạn con dài nhất nên ta xét độ dài d giảm dần từ 26 về 1 và
dãy đầu tiên thỏa mãn là dãy dài nhất cần tìm.
+ Với mỗi d cần xét tất cả các dãy con có độ dài d, các dãy con đó có cận
đầu nhận giá trị từ 1 đến n- d +1
- Với mỗi đoạn con cận đầu i và độ dài d(tức là từ 1 đến n- d +1) ta kiểm
tra xem trong đoạn đó có 2 kí tự giống nhau hay không.
Với cách làm này độ phức tạp đã giảm xuống còn O(263 N)
Cách 3: Ta nâng cấp thuật toán đạt mức chuẩn nhất:
- Gọi cd là vị trí bắt đầu của đoạn cần tìm
- Gọi B là mảng có chỉ số là các kí tự từ A đến Z
Khai báo B: array [‘A’..’Z’] of longint;
Với B[c] = j tức là j là vị trí của kí tự c được cập nhật mới nhất.
Với mỗi kí tự S[i] ta có:
+ Nếu B[s[i]] >= cd vị trí mới của cd là B[s[i]]+ 1
+ Khi đó các kí tự từ vị trí cd đến vị trí i sẽ đôi một khác nhau, so sánh độ
dài và lưu lại.
+ Cập nhật lại vị trí của S[i] là B[s[i]]:= i.
Với cách làm này độ phức tạp đã giảm xuống đạt chuẩn thấp nhất
O(N)”. [2]
Chương trình tham khảo ở cách 3: (Mô tả chi tiết ở phụ lục).
Bài toán 5.3Chiếc nón kỳ diệu
(Đề thi HSG lớp 12 tỉnh Phú Yên năm học 2009-2010)
Một lần trong chương trình “Chiếc nón diệu kỳ”, ở phần chơi dành cho
khán giả, thay vì đoán chữ như mọi khi, người dẫn chương trình tự mình quay
“chiếc nón” và cho hiện lên màn hình trước mặt khán giả trong trường quay các
số trong các ô mà kim chỉ thị lần lượt đi qua. “Chiếc nón” quay đúng một số
nguyên vòng, nên trong dãy số hiện lên màn hình, số cuối cùng trùng với số đầu
tiên. Sau đó, người dẫn chương trình mời một khán giả ở cuối trường quay (chỉ
12
nhìn thấy màn hình mà không nhìn thấy “chiếc nón”) cho biết chiếc nón có tối
thiểu bao nhiêu ô?
Yêu cầu: Hãy trả lời câu hỏi của người dẫn chương trình.
Dữ liệu: Vào từ tập tin văn bản CNDK.INP gồm hai dòng:
+ Dòng 1 ghi số N là số lượng số đã hiện lên màn hình (2 <= N<= 100).
+ Dòng 2 ghi lần lượt N số, mỗi số có giá trị không quá 32000.
Kết quả: Ghi ra tập tin văn bản CNDK.OUT số ô tối thiểu của “chiếc
nón”.
Lưu ý: Các số trên cùng một dòng cách nhau ít nhất một khoảng trắng.
Ví dụ:
CNDK.INP
13
5313525313525
CNDK.OUT
6
* Ý tưởng:
Nhận thấy nếu ghép toàn bộ các số hiện lên màn hình (trừ số cuối cùng)
vào một xâu S thì trong xâu S sẽ luôn tồn tại một xâu s1 dài nhất mà khi ghép
liên tiếp một số lần xâu s1 ta sẽ được xâu s. Số lần xuất hiện xâu s1 là kết quả
cần tìm. Bài toán trở thành tìm xâu con dài nhất s1.
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
Bài toán 5.4 Xâu Palindrome
(Đề thi HSG tỉnh Thanh Hóa 2012-2013)
Một xâu kí tự được gọi là xâu Palindrome (đối xứng) nếu ta đọc từ trái
sang phải hay đọc từ phải sang trái đều giống nhau.
Yêu cầu: Cho trước một xâu kí tự S. Hãy xác định số xâu đối xứng là xâu
con của nó. Một kí tự cũng được coi là một xâu đối xứng. Xâu con của S là xâu
gồm một số kí tự liên tiếp trong S.
Dữ liệu vào: Từ tệp văn bản Palindrom.INP:
- Dòng thứ nhất ghi số nguyên dương N (N<100).
- N dòng tiếp theo mỗi dòng là một xâu kí tự (độ dài xâu <255).
Kết quả: Ghi vào tệp văn bản Palindrom.OUT gồm:
- N dòng, mỗi dòng chứa một số nguyên biểu thị số xâu con đối
xứng.
Ví dụ:
Palindrom.INP
1
IOI
Palindrom.OUT
4
* Ý tưởng:
- Xây dựng hàm kiểm tra tính đối xứng bằng phương pháp tìm kiếm nhị
phân.
- Dùng 2 vòng for duyệt 2 vị trí là đầu tới cuối xâu -1 và đầu xâu +1 đến
cuối xâu. Gọi hàm kiểm tra.
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
13
Bài toán 5.5Xâu chung lớn nhất (Nguồn )
Cho hai xâu X và Y chỉ gồm các kí tự chữ số. Hãy tìm xâu con chung
(gồm các kí tự liên tiếp) của X và Y có giá trị lớn nhất.
Ví dụ:X = 11234; Y = 001230234
Xâu con chung lớn nhất là xâu: 234
Dữ liệu:Cho trong file COM.INP như sau:Dòng thứ nhất ghi xâu X.Dòng
thứ hai ghi xâu Y.
Kết quả: Ghi trong file COM.OUT gồm một xâu là xâu con chung lớn
nhất tìm được.
Ví dụ:
COM.INP
11234
01230234
COM.OUT
234
Chú ý:- Độ dài của X và Y thuộc [1; 200];
- Xâu con chung không đưa chữ số không đứng đầu.
* Ý tưởng:
Dùng biến max có kiểu xâu để lưu xâu có giá trị số lớn nhất tìm được.
Dùng ba biến st, st1, st2 có kiểu xâu lần lượt để lưu xâu thứ nhất đọc vào,
xâu thứ hai đọc vào và xâu con chung của hai xâu st, st1 tại mỗi thời điểm.
N là độ dài xâu st, M là độ dài xâu st1. Duyệt xâu st đồng thời duyệt xâu
st1 từ trái sang phải để tìm xâu con chung. Cập nhật xâu con chung lớn nhất cho
xâu max.
for i:=1 to n do if st[i]<>'0' then
begin
for j:=1 to m do if st1[j]=st[i] then
begin
st2:='';
u:=0;
while ((u+i)<=n) and ((u+j)<=m) and(st[i+u]=st1[j+u]) do
begin
st2:=st2+st[i+u];
nc(u);
end;
if length(st2)>=length(max) then
begin
if length(st2)=length(max) then
if st2>max then max:=st2;
f length(st2)>length(max) then
max:=st2;
end;
end;
end;
Kết quả bài toán là Max.
14
2.3.2.6. DẠNG 6: 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 đơn giản nhất là sử dụng
xâu kí tự để biểu diễn với mỗi kí tự của xâu tương ứng với một chữ số của số
nguyên lớn tính từ trái qua phải. Dưới đây tôi xin đưa ra một số ứng dụng kiểu
xâu trong xử lí số lớn.
Bài toán 6.1 Cộng, trừ 2 số nguyên lớn
(Chuyên đề: Các phép tính với số lớn trong ngôn ngữ lập trình Pascal trường
THPT chuyên Hà Nội – AMSTERDAM)
Cho hai số nguyên dương lớn có có độ dài không quá 200 chữ 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âu ngắn hơn. Việc thực hiện cộng 2 số sẽ
được thực hiện bằng cách cộng lần lượt các cặp kí tự số tương ứng từ phải sang
trái của các xâu (Đối với phép trừ 2 số nguyên thực hiện tương tự)
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
Bài toán 6.2 Ghép số lớn (Nguồn />Vaxia đã viết được một số lớn trên một cuộn giấy dài và muốn khoe với
anh trai Petia về thành quả vừa đạt được. Tuy nhiên, khi Vaxia vừa ra khỏi
phòng để gọi anh trai thì cô em Kachia chạy vào phòng và xé rách cuộn giấy
thành một số mảnh. Kết quả là trên mỗi mảnh có một hoặc vài kí số theo thứ tự
đã viết. Bây giờ Vaxia không thể nhớ chính xác mình đã viết số gì. Vaxia chỉ
nhớ rằng đó là một số rất lớn. Để làm hài lòng cậu em trai, Petia quyết định truy
tìm số nào là lớn nhất mà Vaxia đã có thể viết lên cuộn giây trước khi bị xé. Bạn
hãy giúp Petia làm việc này.
Dữ liệu vào:
Ghi 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.
Dữ liệu ra:
Ghi ra số lớn nhất đã có thể viết trên cuộn giấy trước khi bị xé rách.
Ví dụ:
Input
Output
2
66220004
20
004
66
3
3
* Ý 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 là phần tử s[i] đứng trước phần từ s[j] khi (s[i]
ghép với s[j]) > (s[j] ghép với s[i])
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
15
Bài toán 6.3 Tìm số (Đề thi HSG lớp 11 tỉnh Hà Tĩnh năm học 2007-2008)
Cho trước một xâu kí tự, trong đó có ít nhất 5 chữ số. Hãy loại bỏ một số
kí tự ra khỏi xâu sao cho 5 kí tự cuối cùng còn lại theo đúng thứ tự đó tạo thành
số lớn nhất.
Dữ liệu vào: Cho trong tệp timso.inp
Kết quả: Xuất ra tệp timso.out
Ví dụ:
Timso.inp
13a7b48cb7d9e68f7
Timso.out
89687
* Ý tưởng:
- Xóa các kí tự chữ cái xuất hiện trong xâu
- Thực hiện xóa các kí tự số chỉ giữ lại 5 số để tạo thành số lớn nhất bằng
cách lần lượt đi tìm 4 chữ số lớn nhất có trong xâu còn lại.
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
Bài toán 6.4 Số nhỏ nhất
(Đề thi HSG lớp 11 tỉnh Hà Tĩnh năm 2008-2009)
Một số nguyên dương n rất lớn có thể được cho bởi P số nguyên dương A
và P xâu kí tự s1, s2,...,sp (độ dài các xâu không vượt quá 255) chỉ gồm các số
thập phân bằng cách viết s1 liên tiếp A1 lần rồi viết s2 liên tiếp A2 lần... viết sp
liên tiếp Ap lần.
Giả sử với số n được cho như trên và cho trước số nguyên dươ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.
Ví dụ:
Input
p=3, k =11
44
a1=3, a2 = 4, a3 = 2
s1 = 123, s2=0, s3 = 45
Output
* Ý 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ần lượ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.
Chương trình tham khảo: (Mô tả chi tiết ở phụ lục).
Thời gian thực hiện giải pháp 2 là 6 buổi ôn tập (mỗi buổi ôn một dạng).
Đối với mỗi bài toán, giáo viên yêu cầu học sinh trình bày ý tưởng giải thuật của
các em sau đó để các em tự viết chương trình hoàn chỉnh. Trong mỗi buổi ôn
tập, đối với các bài toán giáo viên có thể tạo các test chấm và hướng dẫn học
sinh tự chấm bài bằng phần mềm chấm bài tự động Themis nếu chương trình
học sinh không đúng, không đạt điểm tối đa thì giao cho các em về nhà tiếp tục
hoàn thiện và gửi lại bài đã hoàn thiện cho giáo viên kiểm tra. Việc để học sinh
16
tự cải tiến giải thuật cho bài toán sẽ giúp cho các em hiểu rõ bài toán và có rất
nhiều kỹ năng trong lập trình.
Kết quả sau khi thực hiện giải pháp 2: Đa số các học sinh trong đội
tuyển đều là học sinh có học lực khá, giỏi, tư duy giải thuật tốt nên sau khi thực
hiện giải pháp này tôi nhận thấy kỹ năng giải quyết các bài tập có liên quan đến
kiểu dữ liệu xâu của các em được nâng cao rõ rệt. Phần lớn các bài toán trong đề
thi HSG tỉnh có thể dùng kiểu dữ liệu xâu để giải quyết thì các em đều làm đạt
điểm tối đa. Học sinh phấn khởi, tin tưởng vào sự hướng dẫn của giáo viên và có
sự quyết tâm cao trong quá trình học tập nên khả năng bám giải rất cao.
2.4. Hiệu quả của sáng kiến.
Trong nhiều năm chịu trách nhiệm bồi dưỡng đội tuyển HSG, tôi và nhóm
giáo viên phụ trách giảng dạy bộ môn Tin học hoc dụng sáng kiến này. Tôi nhận
thấy sau khi áp dụng sáng kiến này, các em học sinh trong đội tuyển HSG cấp
trường không còn cảm giác sợ những bài toán trên kiểu dữ liệu xâu kí tự nữa.
Các em mạnh dạn, tự tin để giải quyết các bài toán trong các đề thi HSG
3. Kết luận và kiến nghị
3.1. Kết luận.
.
Như vậy có thể kết luận về hiệu quả mang lại sau khi triển khai các giải
pháp đã nêu là: Phần lớn các em học sinh đã hứng thú hơn trong học tập, chủ
động trong việc học tập, tự học, tự nghiên cứu, tìm hiểu kiến thức và rèn luyện
kỹ năng; nhiều em đã phát huy tối đa được tính sáng tạo và nhạy bén trong tư
duy, tự tìm tòi kiến thức, có sự say mê trong học tập và nghiên cứu. Kết quả học
tập của nhiều em học sinh có sự tiến bộ rõ rệt.
Đồng thời sau thời gian áp dụng các phương pháp trên tôi nhận thấy chất
lượng ôn đội tuyển môn Tin học ngày càng được nâng cao, trình độ chuyên môn
của giáo viên đứng đội tuyển được củng cố vững chắc; giáo viên tự tin trong ôn
luyện học sinh. Vị thế của nhà trường so với các trường THPT trong tỉnh cải
thiện rõ rệt.
Tuy nhiên đềtài này chỉ mới nghiên cứu được các giải pháp ôn tập có hiệu
quả phần kiểu dữ liệu xâu.
3.2. Kiến nghị.
Với kết quả của đề tài này, tôi thiết nghĩ những giải pháp mà đề tài đã đưa
ra có thể là những gợi ý tốt để các thầy cô giáo trong và ngoài đơn vị tổ chức tốt
và hiệu quả hoạt động bồi dưỡngHSG. Trước tiên là phải tạo hứng thú và gợi
động cơ học tập cho học sinh. Có đam mê, có hứng thú, có quyết tâm thì các em
sẽ học hết khả năng và sẽ mang lại nhiều kết quả tiến bộ. Qua đó, có thể đúc rút
kinh nghiệm để bổ sung và hoàn thiện các giải pháp làm cho đề tài thực sự đi
vào thực tiễn của hoạt động giáo dục.
Tài liệu tham khảo
17
18