Tải bản đầy đủ (.doc) (19 trang)

SKKN mở rộng các bài tập cơ bản về kiểu xâu cho học sinh khá, giỏi

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

1. MỞ ĐẦU
1.1. Lý do chọn đề tài
Tin học là một môn học mới ở các trường phổ thông nên học sinh còn nhiều bỡ
ngỡ khi tiếp cận với môn học này. Nội dung tin học lập trình lớp 11 là một nội dung
mới lạ đối với đa số học sinh với nhiều khái niệm, thuật ngữ, cấu trúc dữ liệu mà học
sinh mới được tiếp xúc lần đầu. Chính vì vậy mà học sinh dễ mắc sai lầm khi lập trình
giải quyết các bài toán. Trong việc giảng dạy cho HS, ngoài việc giúp học sinh lĩnh
hội những kiến thức cơ bản, người thầy còn phải biết kích thích tính tích cực, sự sáng
tạo say mê học hỏi trong học tập của các em. Vì vậy đòi hỏi học sinh phải có ý thức
về những mục tiêu đặt ra, tạo được động lực bên trong thúc đẩy bản thân các em hoạt
động để đạt các mục tiêu đó. Điều này được thực hiện trong dạy học không chỉ đơn
giản bằng việc nêu rõ mục tiêu mà quan trọng hơn còn gợi động cơ trong học tập bằng
việc đổi mới phương pháp dạy học.
Là một giáo viên giảng dạy bộ môn này, theo tôi không phải cứ tìm được nhiều
bài toán khó, bài toán hay để giảng dạy cho học sinh. Mà vấn đề đặt ra là chúng ta
phải tích cực tìm tòi, sáng tạo trong việc đưa ra những bài toán đó để giúp học sinh có
được sự hứng thú, sáng tạo trong học tập để giải quyết vấn đề đưa ra. Xuất phát từ
thực tiễn giảng dạy tại trường PT Nguyễn Mộng Tuân, tôi nhận thấy rằng để đạt hiệu
quả cao trong mỗi phần học, tiết học cần có phương pháp, đưa ra được ý tưởng và đi
xây dựng viết chương trình. cách thiết kế bài giảng cho phù hợp với nội dung kiến
thức, phương pháp và phương tiện dạy học cho từng học sinh. Để qua mỗi phần học,
tiết học, học sinh hứng thú với kiến thức mới, hiểu được kiến thức đã học trên lớp và
vận dụng vào thực tiễn.
Trong các môn học ở bậc THPT thì Tin học lớp 11 được các em cho là môn học
khó hiểu nhất. Các em được làm quen với ngôn ngữ lập trình mới Turbo Pascal. Trong
ngôn ngữ lập trình này các em được làm quen với nhiều kiểu dữ liệu mới, hiểu được
các thuật toán cho một bài toán rồi mới đi xây dựng viết chương trình. Quả thật đối
với các em hết sức khó khăn, từ việc các em chỉ là người sử dụng phần mềm có sẵn
như: soạn thảo văn bản, phần mềm Excel, các phần mềm học tập, giải trí … thì các
em lại phải tìm ra lời giải cho các bài toán, chỉ ra các bước cho máy tính thực hiện và
viết chương trình để tạo ra các sản phẩm phần mềm cho người khác sử dụng.


Qua quá trình giảng dạy Tin học khối 11, 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 và 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 là không dễ. Việc học sinh tìm hiểu về kiểu dữ liệu có cấu trúc
nói chung và kiểu dữ liệu xâu nói riêng còn nhiều lúng túng. Đặc biệt là dữ liệu vào
kiểu xâu và những yêu cầu của bài toán liên quan đến dữ liệu kiểu xâu, học sinh
thường không biết bắt đầu từ đâu để giải quyết vấn đề mà bài toán đưa ra. Qua thực tế
công tác hơn 10 năm ở trường, qua học hỏi kinh nghiệm từ đồng nghiệp, với mong
muốn phần nào giúp cho học sinh cũng như giáo viên trong việc tìm ra lời giải cho
1


một số bài toán liên quan tới kiểu dữ liệu xâu dễ dàng hơn. Để học sinh được rèn
luyện các bài tập cơ bản, và từ đó mở rộng các bài toán nâng cao về kiểu xâu dành
cho học sinh khá giỏi sẽ cuốn hút học sinh, tạo hứng thú cho học sinh khi học lập
trình. Vì vậy, tôi xin mạnh dạn giới thiệu đề tài sáng kiến kinh nghiệm mà mình
nghiên cứu là: “Mở rộng các bài tập cơ bản về kiểu xâu cho học sinh khá, giỏi ” trong
Tin học 11 mà tôi đã áp dụng có hiệu quả trong quá trình giảng dạy.
1.2. Mục đích nghiên cứu
- Giới thiệu cách khai báo và truy xuất đến kiểu dữ liệu xâu.
- Giới thiệu một số phép toán trên dữ liệu kiểu xâu, đồng thời cung cấp thêm
một số hàm, thủ tục chưa có trong bài 12 sách giáo khoa tin học 11.
- Hệ thống các bài toán dưới dạng một số dạng bài tập thường gặp giúp cho
giáo viên và học sinh phần nào nhận dạng và giải một số bài tập liên quan.
- Sử dụng các ví dụ cụ thể trước hết để học sinh nắm được cú pháp, ý nghĩa của
kiểu xâu. Đồng thời giới thiệu thêm một số hàm, thủ tục xử lý xâu nhằm giúp các em
học sinh xử lý được một số bài tập ứng dụng, tăng sự yêu thích đối với môn học được
cho là khó và trừu tượng.
1.3. Đối tượng nghiên cứu
Sử dụng ngôn ngữ lập trình Turbo Pascal và Free Pascal để tiến hành nghiên
cứu các bài toán trên kiểu dữ liệu xâu với đối tượng nghiên cứu là học sinh khối 11

của trường PT Nguyễn Mộng Tuân.
Hình thành được kỹ năng thực hành giải các bài tập cho học sinh và có được
một hệ thống kiến thức với các dạng bài tập lập trình nâng cao theo độ khó dần về bài
tập dữ liệu kiêu xâu.
1.4. Phương pháp nghiên cứu
Hình thành ở học sinh kỹ năng phân tích, xử lý các vấn đề liên quan đến bài tập
kiểu xâu.
Để trình bày sáng kiến kinh nghiệm này, tôi đã sử dụng phối kết hợp nhiều
phương pháp như: nghiên cứu tài liệu, sách, báo, thuyết trình, quan sát, tham khảo ý
kiến của cấp trên và đồng nghiệp, điều tra cơ bản, thực nghiệm so sánh, phân tích kết
quả thực nghiệm phù hợp với môn học thuộc lĩnh vực Tin học.
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 đổ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 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ư
2


vậy, có thể khẳng định đổ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ố
dạng bài tập cụ thể và nâng cao.
Căn cứ vào mục tiêu của môn Tin học, là phải cung cấp những tri thức cơ bản,
làm nền tảng để học sinh có thể tiếp tục đi sâu vào tìm hiểu và xây dựng khoa 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ông nghệ thông tin. Môn Tin học, cũng như mọi môn học khác, căn cứ

vào mục tiêu trên để xác định ra nhiệm vụ cụ thể của môn học, tổ chức hoạt động đào
tạo góp phần thực hiện mục tiêu giáo dục mà Đảng và nhà nước đề ra.
Nếu học sinh được rèn luyện các kỹ năng cơ bản về bài tập thì việc mở rộng
các bài toán cơ bản về kiểu xâu dành cho học sinh khá giỏi sẽ cuốn hút học sinh, tạo
hứng thú cho học sinh khi học lập trình.
2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm
Trước đây khi chưa áp dụng phương pháp giảng dạy bằng giáo án điện tử, hệ
thống các bài tập, bài thực hành có nội dung liên hệ được với thực tiễn, học sinh luôn
phản ánh với giáo viên rằng những bài tập về kiểu xâu thường trừu tượng và khó hiểu.
Tin học là môn học đặc thù có nhiều kiến thức khó như lập trình pascal ở lớp
11, đây là kiến thức thi học sinh giỏi tỉnh nhưng thường bị xem nhẹ, bị xem là “môn
phụ”. Học sinh và phụ huynh chưa mặn mà, chưa quan tâm đúng mực tới môn học
nên việc lựa chọn và bồi dưỡng học sinh giỏi là vô cùng khó khăn. Đứng trước một
bài toán tin học, học sinh thường lúng túng và không biết tìm thuật toán của bài toán
từ đâu và tìm như thế nào? Một số học sinh khá, giỏi thì có thói quen là mò mẫm và
thử nghiệm để tìm lời giải, điều đó có thể dẫn tới kết quả đúng hoặc sai hoặc chệch
hướng giải quyết bài toán, hiệu suất để tìm thuật toán như thế là không cao, một số
học sinh kém hơn thì không biết cách tìm thuật toán từ đâu và điều đó gây tâm lý chán
nản cho các em. Với tình hình ấy để giúp học sinh định hướng tốt hơn trong quá trình
tìm thuật toán, trước khi có thể tự tìm được thuật toán tốt hơn thì người giáo viên cần
tạo cho học sinh thói quen tìm thuật toán cho bài toán khó hơn từ các các bài toán cơ
bản quen thuộc mà các em đã biết, khai thác các yếu tố đặc trưng của một số bài toán
cơ bản để tìm thuật toán cho các bài toán nâng cao.
Qua việc giảng dạy học sinh học lập trình lớp 11, tôi nhận thấy học sinh còn
nhiều bỡ ngỡ khi tiếp cận với lập trình có cấu trúc cũng như kiểu dữ liệu có cấu trúc.
Với các thao tác duyệt xâu và các thao tác kiểm tra tính chất phần tử của xâu cần phải
sử dụng cấu trúc lặp học sinh thường gặp nhiều khó khăn. Và đó cũng là bước cơ bản
để tạo tiền đề trong việc lựa chọn học sinh để bồi dưỡng học sinh giỏi với chuyên đề
và bài tập kiểu xâu.
2.3. Giải pháp đã sử dụng để giải quyết vấn đề

2.3.1. Giới thiệu kiến thức cơ bản về kiểu xâu
a. Khai báo xâu:
3


- Xâu là một dãy kí tự thuộc bảng mã ASCII, mỗi kí tự được gọi là một phần tử
của xâu. Số lượng kí tự trong xâu được gọi là độ dài xâu. Xâu có độ dài bằng 0 gọi là
xâu rỗng.
- Để khai báo dữ liệu kiểu xâu ta sử dụng tên dành riêng String, tiếp theo là độ
dài lớn nhất của xâu
Var <tên biến>:string [độ dài lớn nhất của xâu];
Ví dụ: Var hocsinh:string[28];
- Có thể xem xâu là mảng một chiều mà mỗi phần tử là một kí tự. Các kí tự của
xâu được đánh số thứ tự thường bắt đầu từ 1.
- Nếu không khai báo độ dài lớn nhất của xâu thì xâu sẽ nhận giá trị ngầm định
là 255.
- Ngoài ra có các kiểu khai báo khác của xâu như:
+ Shortstring: chính là String
+ longstring: là mảng ký tự có kiểu char. Thông thường kiểu char có kích
thước 16 bit nên mảng có kích thước tối đa 16 bit = 65535 ký tự
+ ansistring (chỉ có trong free pascal) có kích thước gần 2GB = 230 B
b. Các thao tác xử lí xâu
- Phép ghép xâu: (phép cộng xâu): kí hiệu là dấu cộng (+), dùng để ghép nhiều
xâu thành một.
VD: ‘hoc ’ + ‘sinh’ cho kết quả ‘hocsinh’
- Các phép so sánh: <, <=, =, >=, >, <> có thứ tự thực hiện ưu tiên thấp hơn
phép ghép xâu và thực hiện việc so sánh hai xâu theo các quy tắc sau:
+ Xâu A > 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.
VD: ‘Ha Noi’ > ‘Ha Nam’

(111 kí tự)
(97 kí tự)
+ Xâu B là đoạn đầu của xâu A
VD: ‘Xau ki tu’ > ‘Xau’
+ A=B nếu xâu A và B giống nhau hoàn toàn
VD: ‘tin’= ‘tin’, ‘tin’<> ‘TIN’
c. Một số thủ tục xử lý xâu:
Thủ tục
Delete(s,vt,n)
Insert(s1,s2,vt)
Str(value,s)
val(s,value,code)

Ý nghĩa
Ví dụ
Xóa n kí tự của xâu S bắt đầu
S= ‘Song Hong’
từ vị trí vt
Delete(S,1,5)= ‘Hong’
Chèn xâu s1 vào s2, bắt đầu ở
S1= ‘1’; S2= ‘Hinh 2’
vị trí vt
Insert(S1,S2,6)= ‘Hinh 1.2’
Chuyển đổi giá trị kiểu số VD: n:=‘2019’
(value) sang dạng xâu kí tự và str(n,s)= ‘2019’
gán cho biến s.
đổi xâu kí tự s sang dạng số và VD: val(‘198’,value,code)
4



gán cho biến value, nếu biến lúc
này
đổi thành công thì code nhận value=198
giá trị bằng 0, ngược lại cho
giá trị khác 0.
d. Một số hàm:
TT
Hàm
1 Copy(s,vt,n)
2 Length(s)
3 Pos(s1,s2)
4 Upcase(ch)
5 Ord(ch)
6 Chr(n)
7 Concat(s1,s2,..,sn)
Ví dụ:
TT
Giá trị s
1 ‘Tin hoc’
2 ‘Xin chao’
3 ‘Xin chao’
TT
4
5
6
7

code=0




Ý nghĩa
Tạo xâu mới gồm n kí tự liên tiếp bắt đầu từ vị trí vt của xâu s

Cho giá trị là độ dài xâu s
Cho vị trí xuất hiện đầu tiên của xâu s1 trong xâu s2
Cho chữ cái in hoa ứng với chữ cái trong ch
Cho mã của kí tự ch trong bảng mã ASCII
Cho kí tự có mã là n
Cho xâu mới bằng cách nối đuôi các xâu s1,s2,..,sn lại với
nhau
Biểu thức
Copy(s,5,3)
Length(s)
Pos(‘c’,s)

Kết quả
‘hoc’
8
5

Upcase(ch)
Ord(ch)
Chr(65)
Concat(‘tin’,’hoc’)

‘A’
97
‘A’
‘tinhoc’


Giá trị ch
‘a’
‘a’

2.3.2. Các dạng bài tập cơ bản về kiểu xâu
Bài tập 1: Nhập vào từ bàn phím một xâu. Thay thế tất cả các cụm kí tự “anh” bằng
cụm kí tự “em”.
* GV gợi ý cho HS cách viết chương trình theo dàn ý sau:
{Phần khai báo}
BEGIN
{Nhập xâu S}
{Chừng nào còn tìm thấy xâu con “anh” trong xâu S còn làm ba việc sau:
- Tìm vị trí bắt đầu của xâu “anh”
- Xóa xâu “anh” vừa tìm thấy
- Chèn xâu “em” vào xâu S tại vị trí trước đây xuất hiện xâu “anh” }
In xâu S kết quả.
END.

5


Viết chương trình:
Program baitap1;
Var vt:byte;
S:string;
Begin
Write(‘Nhap vao mot xau: ’); readln(s);
While pos(‘anh’,s) <> 0 do
Begin

Vt:=pos(‘anh’,s);
Delete(s,vt,3);
Inset(‘em’,s,vt);
End;
Write(s);
Readln
End.
Bài tập 2: Nhập 1 xâu S từ bàn phím (S<=100), đưa ra màn hình xâu đảo ngược của
xâu đó (viết theo chiều ngược lại).
VD: Input: ‘Tinhoc’
Output: ‘cohniT’
GV nêu câu hỏi: làm thế nào để chúng ta có thể viết ngược lại xâu nhập vào?
* Ý tưởng:
- Để duyệt lần lượt các kí tự trong xâu S từ 1 đến hết (phần tử cuối cùng có chỉ
số trùng với độ dài của xâu) ở các ví dụ và bài tập 1 chúng ta sử dụng vòng lặp biết
trước for i:=1 to length(s) do …Vậy nếu chúng ta sử dụng vòng lặp lùi for i:=length(s)
downto 1 do …thì có thể giải quyết được yêu cầu của bài toán không?
- GV gọi học sinh lên bảng viết chương trình, sau đó nhận xét và chạy thử
chương trình học sinh viết, HS quan sát kết quả thực hiện chương trình trên màn hình
máy chiếu. (GV giải thích thêm vì sao xâu s trong bài tập này có độ dài tối đa 100 kí
tự).
* Viết chương trình:
Program xaunguoc;
Var S: String[100]; i:Byte;
Begin
Write(‘Nhap xau S: ‘); Readln(S);
For i:=length(S) downto 1 do write(S[i]);
Write(‘Xau nguoc cua xau la: ‘, S);
Readln;
End.

Bài tập 3: Nhập 1 xâu S từ bàn phím (S<=50), đưa ra màn hình xâu S nhưng mỗi kí tự
viết trên 1 dòng ngược lại với xâu S.
6


VD: Input: ‘Tinhoc’
Output: c
o
h
n
i
T
Đa số học sinh còn chưa nắm được dùng write và writeln khi nào, mục đích của bài
tập này đưa ra nhằm củng cố cho học sinh sử dụng thành thạo write và writeln và sự
khác biệt của nó.
Chương trình mà em học sinh đã sửa như sau:
Program baitap3;
Uses Crt;
Var S: String[50];
i:Byte;
Begin
Clrscr;
Write(‘Nhap xau S: ’);
Readln(S);
Write(‘ketqua la:’);
For i:= length(S) downto 1 do writeln(S[i]:30);
Readln;
End.
* GV đặt câu hỏi: Khi đưa ra màn hình xâu S nhưng mỗi kí tự viết trên 1 dòng
Chương trình viết giống trên chỉ khác lệnh:

For i:=1 to length(S) do write (S[i]:15);
Khi chạy chương trình cho các em HS theo dõi kết quả trên màn hình máy chiếu mà
mình đã sửa thì các em ngạc nhiên và rất hào hứng: đơn giản chỉ sửa chương trình có
ít mà đã có kết quả rất thú vị, các em thấy được tin học 11 không khó lắm.
GV: Vậy chúng ta có thể tô màu cho chữ được không? Chẳng hạn xâu S đưa ra có
màu xanh hoặc đỏ hoặc mỗi kí tự có một màu khác nhau?
GV làm mẫu cho học sinh để các em thấy được kết quả cho các kí tự hiện ra có màu
xanh lá. Tất cả học sinh trong lớp đều thấy phấn chấn và hào hứng học tập.
Chương trình bài tập 3 mở rộng
Program baitap3;
Uses Crt;
Var St: String[25];
i:Byte;
Begin
Write(‘Nhap xau S: ‘);
7


Readln(S);
Write(‘ketqua la:’);
Textcolor(2);
For i:= length(S) downto 1 do writeln(S[i]:15);
Readln;
End.
2.3.3. Dạng bài tập nâng cao về biến đổi xâu
Việc biến đổi xâu được thực hiện trên mỗi kí tự trong xâu nên cần nắm rõ các
hàm, thủ tục trên kiểu dữ liệu xâu để vận dụng một cách linh hoạt vào từng bài tập cụ
thể.
Bài tập 1: Tìm số
Cho trước một xâu kí tự, trong đó có ít nhất 5 chữ số. Hãy thực hiện xóa các kí

tự chữ số sao cho 5 kí tự cuối cùng tạo thành số lớn nhất.
Dữ liệu vào: Cho trong tệp timso.inp
Dữ liệu ra: Ghi ra tệp timso.out
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 Timso như sau:
Program baitap5;
Const fi=’timso.inp’;
fo=’timso.out’;
Procedure xuli;
Var i,j,k:byte;
Begin
i:=1;
Repeat
If s[i] in [‘0’.. ‘9’] inc(i) else delete(s,i,1);
Until i>length(s);
For i:=1 to 5 do
Begin
k:=i;
for j:=i to length(s)+i-5 do
if s[k]if k>i then delete(s,i,k-i);

end;
writeln(copy(s,1,5));
8


BEGIN
Assign(input,fi);reset(input);
Assign(output,fo);rewrite(output);
Read(s);
Xuli;
Close(input);
Close(output);
END.
Bài tập 2: Rút gọn xâu
Cho xâu S1 chỉ gồm các chữ cái in thường với độ dài tối đa 250 kí tự. Hãy viết
chương trình để tạo ra xâu S2 từ xâu S1 bằng cách xóa các kí tự liên tiếp giống nhau
trong xâu S1 và chỉ để lại một kí tự đại diện trong đoạn đó.
Input: Đọc từ file văn bản XAU.INP chứa xâu S1 chỉ gồm các chữ cái in thường.
Output: Ghi ra file văn bản XAU.OUT là xâu S2 tìm được.
Ví dụ:
Trung.inp
trung.out
hhhhhoooccsinnhh
Hocsinh
* Ý tưởng:
- Duyệt từ đầu xâu đến cuối xâu, gặp hai kí tự liên tiếp khác nhau thì xóa đi một
kí tự.
- Ban đầu gán:i:=1; j:=2; {so sánh hai phần tử liên tiếp trong xâu}
- Khi kí tự đầu giống kí tự thứ 2: ta thực hiện xóa và dịch chuyển kí tự thứ hai
- Khi kí tự đầu khác kí tự thứ hai thì: i:=j; j:=j+1;

- Ta được xâu p là xâu sau khi đã xóa các kí tự trùng
* Viết chương trình:
Program rutgon;
Const
fi=’trung.inp’;
fo=’trung.out’;
Var
s,p:string;
i,j,n:integer;
BEGIN
Assign(input,fi); reset(input);
Assign(output,fo);rewrite(output);
P:=’’;
Read(s);
i:=1;
j:=2;
n:=length(s);
while j9


begin
while s[i]=s[j] do
begin
delete(s,j,1);
j:=j+1;
end;
while s[i]<>s[j] do
begin
p:=p+s[i];

i:=j;
j:=j+1;
end;
write(p);
close(input);
close(output);
END.
Bài tập 3: Kí tự khác nhau
Cho xâu S (có độ dài vượt không quá 106) chỉ gồm các kí tự từ ‘a’ đến ‘z’. Cho
biết có bao nhiêu loại kí tự xuất hiện trong s và đưa ra một kí tự xuất hiện nhiều nhất
trong s cùng với số lần xuất hiện của kí tự đó.
* Ý tưởng:
- 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 kí tự 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 0 trong mảng B) và tìm giá trị lớn nhất của mảng B ta sẽ
tìm được kí tự xuất hiện nhiều lần nhất
* Viết chương trình :
Program kitu;
Var s:ansistring;
B:array[‘a’..’z’] of longint;
Procedure nhap;
Begin
Write(‘nhap xau s: ’);
Readln(s);
End;
Procedure xuli;
Var ch,kt:char;
i.max,dem:longint;

begin
for ch:=’a’ to ‘z’ do b[ch]:=0;
10


for i:=1 to length(s) do inc(b[s[i]]);
dem:=0; max:=0;
for ch:=’a’ to ‘z’ do
begin
if b[ch]<>0 then inc(dem);
if b[ch]> max then
begin
max:=b[ch];
kt:=ch;
end;
end;
writeln(‘so luong ki tu khac nhau: ’,dem);
writeln(‘ki tu xuat hien nhieu lan nhat la: ‘,kt,’,so lan xua hien ’,max);
end;
BEGIN
Nhap;
Xuli;
Readln;
END.
2.3.4. Dạng bài tập về xâu Palindrome
Xâu Palindrome hay còn gọi là xâu đối xứng, có nghĩa một xâu khi đọc các ký
tự trong xâu từ trái sang phải cũng giống từ phải sang trái thì xâu đó được gọi là xâu
Palindrome.
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 giải quyết những bài tập khó hơn.
Bài tập 1: Kiểm tra một xâu có phải là xâu Palindrome không
Program kiemtra;
Var i,x:byte;
s1,s2:string;
Begin
Write(‘nhap xau s1’);
Readln(s1);
X:=length(s1);
s2:=’’;
For i:=x downto 1 do s2:=s2+s1[i];
If s1=s2 then write(‘xau s1 la xau palindrome’)
else write(‘xau s1 không la xau palindrome’);
Readln
End.
11


Bài tập 2: Xâu con Palindrome: Cho một xâu S có độ dài không vượt quá 1000 kí tự;
tìm xâu palindrome dài nhất là xâu con của S.
- Ý tưởng: Sử dụng phương pháp quy hoạch động bằng cách sử dụng mảng 2 chiều F
và giá trị F[i, j] = true/false nếu đoạn gồm các kí tự từ i đến j của S có/không là
palindrome.
Ta có công thức là:
- F[i, i] = True
- F[i, j] = F[i+1, j-1]; ( nếu s[i] = s[j] )
- F[i, j] = False; ( nếu s[i] <> s[j] )
- Đoạn chương trình tham khảo
var s:ansistring; n,i,j,d,max,k,csd,csc:longint;
F: array[0..1001,0..1001] of boolean;

Begin
Write('nhap s:');
readln(s);
FillChar( F, sizeof(F), false );
n:=length(s); max:=1;
for i := 1 to n do F[i, i] := True;
for k := 1 to (n-1) do
for i := 1 to (n-k) do
begin
j := i + k;
F[i, j] := ( F[i+1, j-1] ) and (s[i] = s[j] );
end;
for i:=1 to n do
for j:=1 to n do
begin
d:=j-i+1;
if (f[i,j]=true) and (d>max) then
begin
max:=d; csd:=i; csc:=j;
end;
end;
for i:=csd to csc do write(s[i]);
readln;
End.
2.3.5. Dạng bài tập về xâu con
Bài tập 1: Cho trước hai xâu kí tự S1 và S2. Viết chương trình tính số lần lặp lại của
xâu S1 trong xâu S2.
Dữ liệu vào từ tệp văn bản xau.inp gồm:
12



- Dòng đầu tiên chứa xâu S1
- Dòng thứ hai chứa xâu S2
Kết quả ghi ra tệp xau.out chỉ một lần duy nhất ghi số lần lặp lại của xâu s1
trong xâu s2.
Xau.inp
Aba
Bababababa

Xau.out
4

* Ý tưởng:
Sử dụng hàm Pos(s1,s2) để xuất hiện có hay không xuất hiện xâu s1 trong xâu
s2. Giả sử giá trị hàm trả về là i khác 0, ta tăng biến đếm lên 1 và xóa kí tự thứ i trong
xâu s2, tiếp tục quá trình cho đến khi hoặc i=0 hoặc xâu s2 rỗng.
* Viết chương trình:
Var s1,s2:ansistring;
f,g:text;
dem:longint;
begin
assign(f,’xau.inp’);reset(f);
assign(g,’xau.out’);rewrite(g);
readln(f,s1);
readln(f,s2);
dem:=0;
while (pos(s1,s2)<>0) and (length(s2)<>0) do
begin
inc(dem);
delete(s2,pos(s1,s2),1);

end;
writeln(g,dem);
close(f);
close(g);
end.
Bài tập 2: Xâu kí tự X gọi là xâu con của kí tự Y nếu ta có thể xóa đi một số kí tự
trong xâu Y đê được xâu X.
Cho biết hai xâu kí tự A và B, hãy tìm xâu kí tự C có độ dài lớn nhất và là con
của cả A và B.
Dữ liệu vào từ file xaucon.inp gồm:
- Dòng 1: chứa xâu A (độ dài xâu <=103)
- Dòng 2: chứa xâu B (độ dài xâu <=103)
Kết quả: Ghi ra file xaucon.out gồm một dòng ghi độ dài xâu C tìm được
Ví dụ:
13


Xaucon.inp
Abc1def2ghi3
abcdefghi123

Xaucon.out
10

* Ý tưởng:
- Gọi đồ dài của xâu A là n, độ dài của xâu B là m
- Gọi F[i,j] là độ dài xâu con chung lớn nhất khi xét xâu A từ vị trí 1 đến vị trí I,
xâu B từ vị trí 1 đến vị trí j.
- Bài toán cơ sở F[I,0]=F[0,j]=0;
- Sử dụng công thức quy hoạch động:

F[i,j]=F[i-1,j-1]+1 nếu A[i]=B[j]
F[i,j]=max(F[i-1],j),F(i,j-1) nếu ngược lại
- Kết quả bài toán là F[n,m].
* Viết chương trình:
Const fi=’xaucon.inp’;
fo=’xaucon.out’;
var n,m:longint;
a,b:ansistring;
f:arrayy[0..1000,0..1000] of integer;
Procedure
docfile;
Begin
assign(input,fi);reset(input);
assign(output,fo);rewrite(output);
readln(a);
n:=length(a);
readln(b);
m:=length(b);
Procedure dongfile;
Begin
Close(input);
Close(output);
End;
Function max(x,y:longint):longint;
Begin
If x>y then exit(x) else exit(y);
Procedure xuli;
Var i,j:longint;
Begin
For i:=1 to n do f[i,0]:=0;

For j:=1 to m do f[0,j]:=0;
For i:=1 to n do
For j:=1 to m do
If a[i]=b[j] then f[i,j]:=f[i-1,j-1]+1
14


else
F[i,j]:=max(f[i-1,j],f[I,j-1]);
End;
Procedure ghifile;
Begin
writeln(f[n,m]);
end;
BEGIN
docfile;
xuli;
ghifile;
dongfile;
END.
2.3.6. Dạng bài tập tự luyện
Bài 1: Viết chương trình đăng kí account, mật khẩu, sau đó kiểm tra mật khẩu và
account mà người dùng nhập vào có đúng với đăng kí không.
- Một số dạng bài tập khác có thể tìm hiểu thêm:
+ Bài toán tách từ.
+ Xâu đối xứng dài nhất...
+ Tìm xâu palindrome dài nhất là xâu con của S
Bài 2: 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 lần nhất trong xâu (không phân biệt chữ hoa và chữ thường)
Bài 3: Viết chương trình chuyển một xâu kí tự in hoa thành kí tự thường.

Gợi ý: - Kí tự in hoa thành kí tự thường
- Các kí tự khác như các dấu ngoặc giữ nguyên
for i:=1 to length(s) do
if (‘A’<=s[i]) and s[i]<=’Z’ then s[i]:=chr(ord(s[i]+32);
else if (‘a’<=s[i]) and s[i]<=’z’ then s[i]:=chr(ord(s[i]-32);
Bài 4: Một xâu gọi là xâu đối xứng nếu xâu đó đọc từ trái sang phải cũng giống như
đọc từ phải sang trái. Cho một xâu S, hãy tìm số kí tự ít nhất cần thêm vào S để S trở
thành xâu đối xứng.
Dữ liệu vào: xau_dx.inp gồm một dòng là xâu S
Dữ liệu ra: ghi vào têp xau_dx.out
- Dòng 1: đưa ra số lượng kí tự ít nhất cần thêm vào
- Dòng 2: các kí tự cần chèn thêm vào
Bài 5: Đếm xâu con
Cho xâu S bao gồm các chữ cái ‘A’.. ‘Z’ và các chữ số ‘0’.. ‘9’.
Yêu cầu: Đếm số xâu con trong xâu S có số lượng chữ cái nhiều hơn số lượng chữ số
(xâu con của xâu S là một dãy kí tự liên tiếp trong xâu S)
15


Bài 6: Viết chương trình nhập số tự nhiên a có n chữ số. Hãy tạo ra số mới b từ số a
bằng cách viết ngược lại các chữ số xuất hiện trong a.
Ví dụ: cho a=234 thì b=432.
GV: Dựa vào kiến thức kiểu xâu, em nào có thể nêu ý tưởng giải bài toán này?
GV: Nhận xét câu trả lời của hs, và nêu rõ: để tạo được số b từ số a, bằng cách viết
ngược lại các chữ số của a thì:
+ Tạo một xâu rỗng s
+ Cần sử dụng vòng lặp biết trước lùi (giống bài tập 2 phần a)
+ Dùng thủ tục val để đổi xâu kí tự s sang dạng số và gán cho biến value.
GV yêu cầu HS viết chương trình, sau đó GV sẽ chạy chương trình cho học sinh quan
sát trên màn hình máy chiếu. GV giải thích và giúp học sinh sửa các lỗi ở chương

trình các em viết.
Bài 7: Số nhỏ nhất: Một số nguyên dương n rất lớn có thể được cho bởi P (P≤ 20) 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ụ:
Và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ầ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.
Bài 8: Cho số nguyên dương N, ta tạo ra số nguyên N1 bằng cách viết liên tiếp nhau
các số nguyên từ 1 đến N. Ví dụ N = 4 ta có N1 = 1234. Thực hiện việc thu gọn N1
bằng cách xóa tất cả các chữ số ở vị trí lẻ, sau đó xóa tất cả các số ở vị trí chẵn, rồi lại
xóa các chữ số ở vị trí lẻ, … cho đến khi chỉ còn lại một chữ số.
Ví dụ: 1234 ->24-> 2


16



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
Việc tổ chức dạy học theo tiến trình đưa những bài toán cơ bản trong SGK
trước sau đó mở rộng nâng cao hơn đã đem lại hiệu quả trong việc nâng cao kiến thức
cho học sinh. Các em dần dần lĩnh hội được tri thức, yêu thích môn học hơn. Học sinh
đã nâng cao được tính tư duy sáng tạo, vận dụng linh hoạt lập trình tốt về các dạng bài
toán. Đây là động lực thúc đẩy quá trình học hỏi, tìm tòi của bản thân. Trong quá trình
trao đổi, thảo luận, trình bày, các em HS thể hiện được khả năng vận dụng, hiểu biết
của mình nên các em tỏ ra hăng hái trong việc giơ tay phát biểu tranh luận. Đồng thời
tiết học trở nên sinh động hơn và GV không đóng vai trò là người xây dựng lý luận
mà học sinh là người chủ động để giải quyết các vấn đề. Và đó cũng là bước tiến quan
trọng trong việc lựa chọn ra các em xuất sắc ôn luyện học sinh giỏi. Sau khi áp dụng
đề tài nghiên cứu này trong ba năm gần đây tôi thấy chất lượng học sinh được nâng
lên rõ rệt, đặc biệt số lượng các em học sinh khá, giỏi môn Tin học khối 11 cũng
nhiều hơn.
Trong phạm vi chương trình môn tin học lớp 11, chúng ta có thể sử dụng một
số hệ thống bài tập sau để rèn luyện kỹ năng lập trình cho học sinh khá, giỏi thông
qua các buổi học các em cũng có thói quen tối ưu hóa thuật toán và cài đặt chương
trình phù hợp để đạt được kết quả. Và đó cũng là tiền đề để lựa chọn các em tham gia
ôn đội tuyển học sinh giỏi có hiệu quả hơn. Trong năm 2016-2017 và năm 2017-2018
trong kỳ thi HSG tỉnh các em học sinh tham dự đều có giải. Với nội dung này được
triển khai thông qua các buổi học (mỗi buổi học 3 tiết). Trong quá trình giảng dạy tôi
nhận thấy rằng: để hiểu hết được ý nghĩa của người viết sách giáo khoa thật là không
dễ, nhưng để truyền đạt được những kiến thức cơ bản đó đến học sinh với vai trò là
người tổ chức hướng dẫn học sinh tìm tòi, phát hiện kiến thức càng khó khăn hơn. Để
bài học hấp dẫn, gây hứng thú đối với học sinh, ngoài việc tìm hiểu kỹ SGK, người
dạy cần có lòng say mê nhiệt tình, nâng cao trình độ, tìm hiểu thêm các kiến thức bên
ngoài, tích lũy các kinh nghiệm.
Trong năm học 2018- 2019 thì tỉ lệ % kết quả học tập của học sinh khi chưa

thực hiện đề tài: Cụ thể với lớp 11A2 có 45 học sinh, ta thu được kết quả như sau:
Điểm
3
4
5
6
7
8
9

Số học sinh
4
8
13
9
7
3
1

Tỉ lệ (%)
8.88%
17.78%
28.89%
20%
15.56%
6.67%
2.22%

17



Sau khi thực hiện đề tài, tỉ lệ học sinh khá giỏi đã tăng lên nhiều. Kết quả kiểm tra đối
với lớp 11A5(giống với đề kiểm tra lớp 11A2 trong năm học 2018-2019)
Điểm
3
4
5
6
7
8
9
10

Số học sinh
0
0
4
11
16
6
5
3

Tỉ lệ (%)
0%
0%
8.89%
24.44%
35.56%
13.33%

11.11%
6,67%

3. KẾT LUẬN VÀ KIẾN NGHỊ
3.1. Kết luận
Sau một thời gian áp dụng cách làm này tôi nhận thấy kỹ năng lập trình của các
em tăng lên đáng kể, đặc biệt các em có hứng thú khi học lập trình hơn. Nhiều học
sinh đã biết vận dụng các thuật toán của các bài toán cơ bản đã biết để giải quyết các
bài toán mở rộng, một số em có thể tự tìm được lời giải được một số bài toán khác
khó hơn và trong khi thi học sinh giỏi vừa rồi các em đã có thể giành được kết quả.
Điều đó cho thấy hiệu quả của cách rèn luyện kỹ năng lập trình bằng việc mở rộng bài
toán cơ bản. Với cách làm đơn giản này các em học sinh sẽ có hứng thú để tiếp tục
tìm hiểu và giải quyết các bài toán khác, các thầy, cô có thể áp dụng cách làm này với
nhiều dạng bài tập khác nhau để thấy được hiệu quả. Tôi hy vọng các thầy cô có thể
chọn được đội tuyển để đi thi học sinh giỏi môn tin học và có được thành tích cao và
đó cũng là mong muốn của tôi khi viết SKKN này.
SKKN này cũng là một phương pháp và là một kinh nghiệm của bản thân khi
dạy đến bài tập phần kiểu xâu, dựa trên các bài tập cơ bản phát triển dạng và nâng cao
hơn Với kết quả đó, tôi mạnh dạn viết ra sáng kiến kinh nghiệm mày mặc dù cách
làm chưa được đầy đủ và sâu sắc, chưa thể hiện đầy đủ được các ưu nhược điểm và
còn nhiều thiếu sót, rất mong được sự góp ý kiến của lãnh đạo cấp trên, của tất cả các
đồng nghiệp để đề tài được hoàn thiện hơn.
3.2. Kiến nghị
Qua thực tế giảng dạy khối lớp 11 trong năm học 2018-2019 tôi nhận thấy rằng
việc mở rộng các bài toán cơ bản để nâng cao kỹ năng lập trình giải các bài tập về
kiểu xâu cho học sinh khá giỏi đã đem lại hiệu quả cao, giúp cho đa số học sinh hiểu
bài, có hứng thú khi học lập trình, đặc biệt đưa ra được phương pháp ôn đội tuyển có
hiệu quả nhất. Tuy nhiên, để việc ứng dụng đề tài này vào việc dạy học được tốt hơn,
tôi xin có một số kiến nghị, đề xuất như sau:


18


+ Để giúp học sinh yêu thích lập trình có nhiều điều kiện rất mong được sự
quan tâm của nhà trường cùng các ngành có liên quan giúp đỡ về cơ sở vật chất.
+ Thư viện cần bổ sung thêm tài liệu tham khảo, bồi dưỡng về môn tin học.
+ Nên tổ chức được các buổi thảo luận, giới thiệu được các sáng kiến kinh
nghiệm có chất lượng cao, ứng dụng lớn trong thực tiễn để đồng nghiệp cùng học hỏi.
Trên đây là một số kinh nghiệm, biện pháp mà tôi đã rút ra được trong quá trình
dạy học, trao đổi với đồng nghiệp và đã áp dụng trong việc lựa chọn được học sinh
khá giỏi. Trên thực tế, việc ứng dụng sáng kiến này mới chỉ tong một phạm vi hẹp và
chưa được nhiều nên cũng chưa đánh giá được toàn diện những ưu điểm và hạn chế
của ứng dụng sáng kiến này trong dạy học. Vì vậy, tôi rất mong được sự góp ý chân
thành từ các đồng nghiệp, của Ban giám hiệu, đặc biệt là của hội đồng sáng kiến kinh
nghiệm để đề tài được hoàn chỉnh hơn.
Tôi xin chân thành cảm ơn!
XÁC NHẬN CỦA THỦ TRƯỞNG
ĐƠN VỊ

Thanh Hóa, ngày 15 tháng 5 năm 2019
Tôi xin cam đoan đây là SKKN của mình viết,
không sao chép nội dung của người khác.

Người viết

Lê Thị Thanh Huyền

19




×