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

Xây dựng các dạng bài tập kiểu dữ liệu xâu để nâng cao chất lượng bồi dưỡng học sinh giỏi tin học ở trường THPT thường xuân 2

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 (294 KB, 58 trang )

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ

TRƯỜNG THPT THƯỜNG XUÂN 2

SÁNG KIẾN KINH NGHIỆM

XÂY DỰNG CÁC DẠNG BÀI TẬP KIỂU DỮ LIỆU XÂU ĐỂ
NÂNG CAO CHẤT LƯỢNG BỒI DƯỠNG HỌC SINH GIỎI
TIN HỌC Ở TRƯỜNG THPT THƯỜNG XUÂN 2

Người thực hiện: Lê Thị Hoa
Chức vụ: Giáo viên
SKKN thuộc môn: Tin học

THANH HOÁ NĂM 2021


MỤC LỤC
1. Mở đầu ................................................................................................................1
1.1. Lí do chọn đề tài.................................................................................................1
1.2. Mục đích nghiên cứu..........................................................................................1
1.3. Đối tượng nghiên cứu........................................................................................1
1.4. Phương pháp nghiên cứu....................................................................................1
1.5 Những điểm mới của sáng kiến kinh nghiệm ....................................................2
2. Nội dung 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.3. Các giải pháp đã sử dụng để giải quyết vấn đề..................................................3
2.4. Hiệu quả của sáng kiến....................................................................................18
3. Kết luận, kiến nghị............................................................................................18


2


1. Mở đầu
1.1. Lí do chọn đề tài
Người xưa đã từng nói: “Hiền tài là ngun khí của quốc gia, ngun khí
thịnh thì thế nước mạnh mà hưng thịnh, ngun khí suy thì thế nước yếu mà thấp
hèn” [5] . Vì Vậy bồi dưỡng học sinh giỏi là một nhiệm vụ quan trọng trong việc
nâng cao chất lượng giáo dục, bồi dưỡng nhân tài cho quê hương, đất nước. Là một
trong những nhiệm vụ chuyên môn quan trọng của nhà trường. Bồi dưỡng học sinh
giỏi là một cơng việc khó khăn và lâu dài, địi hỏi nhiều cơng sức của thầy và trò.
Trong thực tế đối với việc bồi dưỡng học sinh giỏi môn tin học, việc giúp
học sinh giải được một đề thi học sinh giỏi cấp tỉnh, cấp quốc gia thì một trong các
kiểu dữ liệu được sử dụng nhiều nhất trong các đề thi học sinh giỏi là kiểu dữ liệu
xâu. Sau thời gian được phân công bồi dưỡng học sinh giỏi tại trường THPT
Thường Xuân 2, bản thân tôi nhận thấy kiểu dữ liệu xâu rất hay bởi có thể chuyển
đổi một số dạng bài tốn ở kiểu dữ liệu khác về kiểu dữ liệu này để giải quyết, đặc
biệt với các dạng bài tốn có kiểu dữ liệu số lớn ngoài phạm vi lưu trữ của các kiểu
dữ liệu số nếu không chuyển về kiểu xâu thì thuật tốn rất khó và phức tạp, học
sinh khó hiểu và khơng nắm bắt được, nhưng khi xử lí bằng kiểu xâu lại làm cho
thuật tốn đơn giản đi rất nhiều, học sinh dễ dàng vận dụng và giải quyết được các
bài toán một cách triệt để, thế nhưng để biết cách 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 từng bài tốn cụ thể khơng phải là dễ và chưa có tài
liệu nào hướng dẫn. Với mong muốn phần nào giúp học sinh dễ dàng nhận diện
được các dạng bài tập và biết cách vận dụng các kiến thức kiểu xâu để giải quyết
các dạng bài tập đó một cách dễ dàng và hiệu quả, tôi đã tham khảo rất nhiều tài
liệu từ nhiều nguồn khác nhau như: qua sách, tài liệu ôn thi học sinh giỏi, các đề
học sinh giỏi các năm gần đây của tỉnh Thanh Hóa nói riêng và nhiều tỉnh khác trên
cả nước nói chung, các nguồn tài liệu trên Internet, vốn kiến thức và kinh nghiệm
dạy học của bản thân để viết tài liệu bồi dưỡng cho học sinh trong đội tuyển học

sinh giỏi và thấy có hiệu quả. Với những lí do trên tơi chọn đề tài: “Xây dựng các
dạng bài tập kiểu dữ liệu xâu để nâng cao chất lượng bồi dưỡng học sinh giỏi
tin học ở trường THPT Thường Xuân 2” để giúp các em học sinh có nguồn tài
liệu tham khảo cũng như các giáo viên bồi dưỡng học sinh giỏi ở trường THPT
Thường xuân 2 có thêm nguồn tài liệu rèn luyện cho học sinh.
1.2. Mục đích nghiên cứu
Nâng cao chất lượng ơn thi học sinh giỏi, từ đó góp phần nâng cao hiệu quả
dạy học Tin học 11 tại Trường THPT Thường Xn 2 nói riêng và bộ mơn tin học
nói chung.
1.3. Đối tượng nghiên
- Kiểu dữ liệu xâu và các dạng bài tập xử lý xâu.
- Học sinh trong đội tuyển học sinh giỏi tin học trường THPT Thường Xuân
2 trong hai năm học 2019-2020 và năm học 2020 – 2021.
1.4. Phương pháp nghiên cứu
- Xây dựng cơ sở lý thuyết.
1


- Thu thập thông tin trong sách, báo, các tài liệu ôn thi học sinh giỏi trên
Internet, các đề thi học sinh giỏi cấp tỉnh, kinh nghiệm trong quá trình ôn thi học
sinh giỏi.
- Sử dụng phần mềm FreePascal để viết chương trình.
1.5. Những điểm mới của sáng kiến kinh nghiệm
- Bổ sung 5 dạng bài tập thường gặp với kiểu dữ liệu xâu chưa được trình
bày trong SKKN đã được đánh giá năm 2019-2020.
- Bổ sung 20 bài tập vận dụng cho các dạng trong chuyên đề (SKKN năm
2019-2020 chưa xây dựng).
- Bổ sung 10 bài tập ôn tập cho các dạng trong chuyên đề (SKKN năm 20192020 chưa xây dựng).
- Phần giải pháp thực hiện được sắp xếp logic theo trình tự: Dạng bài tập,
phương pháp giải chung, ví dụ áp dụng và cuối cùng bài tập vận dụng.

2. Nội dung sáng kiến kinh nghiệm
2.1. Cơ sở lí luận của sáng kiến
Kiểu xâu là kiểu dữ liệu có cấu trúc được giới thiệu trong chương trình sách
giáo khoa tin học 11_ “ bài 12 _Kiểu xâu”. Sau khi học lý thuyết kiểu xâu đa số học
sinh nắm bắt được xâu là gì? Độ dài của xâu? Biết khai báo biến xâu như thế nào.
Nhưng khi làm việc với xâu thì các em cịn lúng túng với việc áp dụng các hàm, thủ
tục và các thao tác xử lý xâu để giải quyết các bài toán thực tế, các câu hỏi vì sao
‘23’+‘9’ = ‘239’, muốn thực hiện được phép tính ‘23’+ ‘9’ = 32 liệu có thực hiện
được khơng? Muốn thực hiện được thì phải làm cách nào? Và nhiều các câu hỏi
tương tự khác. Vậy làm thế nào để học sinh có thể giải quyết triệt để các bài toán liên
quan đến kiểu dữ liệu xâu hoặc chuyển các kiểu dữ liệu khác về kiểu xâu để vận
dụng xử lý được các bài tốn mang tính thực tế có trong các đề thi học sinh giỏi.
Bản thân tơi được sự tín nhiệm, tin tưởng của nhà trường đã phân công bồi
dưỡng học sinh giỏi, nên tôi đã trăn trở, tìm tịi nhiều nguồn tài liệu, dành nhiều
tâm huyết, thời gian nghiên cứu để công việc bồi dưỡng học sinh giỏi đạt kết quả
tốt nhất.
2.2. Thực trạng của vấn đề
Trong các đề thi học sinh giỏi cấp tỉnh, cấp quốc gia kiểu dữ liệu xâu là một
kiểu dữ liệu có cấu trúc thường được sử dụng 50 - 60% trong các đề thi. Tuy nhiên
phần kiểu xâu chỉ được được phân phối 4 tiết trong chương trình sách giáo khoa
Tin học 11 với vẻn vẹn 2 tiết lý thuyết và 2 tiết thực hành. Với lượng kiến thức
được cung cấp trong sách giáo khoa tin học 11 học sinh chỉ mới giải quyết được
các bài tập dạng xâu đơn giản. Thế nhưng bài tập về kiểu dữ liệu xâu có trong các
đề thi lại rất khó và đa dạng, với lượng kiến thức nhỏ được cung cấp trong sách
giáo khoa như vậy chưa đủ để giải quyết được các bài tốn có trong các đề thi.
Học sinh trường THPT Thường Xuân 2 chiếm gần 80% là người dân tộc thiểu
số, 100% học sinh sống ở vùng đặc biệt khó khăn, đa số học sinh khả năng tư duy
chưa cao, các em chỉ học máy móc, học vẹt nên việc tự lập trình giải một bài tốn
đối với học sinh là rất khó, lại khó khăn hơn rất nhiều khi học sinh bắt buộc phải
2



lập trình giải các bài tốn u cầu mức độ tư duy cao trong các đề học sinh giỏi.
Mặt khác kiến thức về lập trình cũng khá mới mẻ với học sinh, đặc biệt với chương
trình tin học lớp 11 u cầu học sinh phải có tư duy về tốn học tốt, hiểu rõ bản
chất của ngơn ngữ lập trình thì mới viết được một chương trình hồn chỉnh, bên
cạch đó mơn tin học khơng có trong chương trình thi THPT quốc gia nên học sinh
và phụ huynh chỉ xem tin học là mơn học phụ, mơn học giải trí nên chưa có ý thức
đầu tư thời gian cho bộ mơn này. Vì vậy, việc chọn tuyển học sinh vào đội tuyển
học sinh giỏi tin học là việc khó và bồi dưỡng học sinh giỏi tin học để có thành tích
lại càng khó khăn hơn. Đặc biệt khi giảng dạy cho học sinh về nội dung kiểu dữ
liệu xâu học sinh cịn lúng túng, dẫn đến viết chương trình cho một bài tốn cụ thể
cịn chưa đúng.
Tài liệu về kiểu dữ liệu xâu trên Internet chủ yếu chỉ về kiến thức xử lí xâu ở
dạng đơn giản, bài tập kiểu xâu chưa phân loại thành các dạng kiến thức thường
gặp về kiểu dữ liệu xâu và đưa ra phương pháp giải chung cho các dạng bài tập đó,
các đề thi học sinh giỏi cấp tỉnh trên Internet thường khơng có code tham khảo nên
nguồn tài liệu giúp giáo viên bồi dưỡng học sinh giỏi cũng như học sinh trong đội
tuyển nghiên cứu còn hạn chế.
2.3. Các giải pháp sử dụng để giải quyết vấn đề
Với những lí do nên trên để giải quyết vấn đề đặt ra, tôi đã thực hiện các giải
pháp sau:
- Tìm hiểu các kiến thức cơ bản về kiểu dữ liệu xâu: Khái niệm xâu, cách khai
báo, cách nhập xuất kiểu dữ liệu xâu và các thao tác và phép toán xử lý trên xâu.
- Xây dựng các dạng thường gặp với kiểu xâu, đưa ra phương pháp chung để
giải quyết từng dạng bài tập đó và sử dụng phần mềm FreePascal để viết code tham
khảo cho các ví dụ áp dụng và đưa ra các bài tập vận dụng, bài tập học sinh tự giải
cho từng dạng. Từ đó giúp học sinh biết vận dụng tự phân tích, định dạng bài tập,
tự mình tìm ra lời giải thích hợp cho từng bài tốn cụ thể, kích thích tư duy phân
tích, tổng hợp cũng như tư duy linh hoạt, sáng tạo của học sinh trong lập trình.

Kiến thức kiểu dữ liệu xâu thường được quy về một trong các dạng bài tập sau:
• Dạng bài tập kiểu xâu đơn giản
• Dạng bài tập mã hóa và giải mã xâu
• Dạng bài tập xử lý các xâu con
• Dạng bài tập xâu đối xứng
• Dạng bài tập xử lí số ngun kiểu dữ liệu lớn ngồi phạm vi lưu trữ của
các kiểu dữ liêu số
• Dạng bài tập tính tần số xuất hiện của các kí tự ‘0’.. ‘9’ hoặc ‘a’ .. ‘z
hoặc ‘A’ .. ‘Z’ có trong xâu
• Dạng bài tập ghép thành số lớn nhất hoặc số nhỏ nhất với các phần tử
của mảng là xâu kí tự
• Dạng bài tập tìm cách xóa trong xâu S K kí tự để xâu cịn lại là xâu có
giá trị lớn nhất hoặc xâu có giá trị nhỏ nhất
3


• Dạng bài tập tìm cách xóa trong xâu S một số kí tự để xâu cịn lại là xâu
có K kí tự có giá trị lớn nhất hoặc có giá trị nhỏ nhất
• Dạng bài tập tìm xâu chung dài nhất hoặc tìm các phần tử chung dài
nhất của hai xâu S1 và S2
NỘI DUNG CỤ THỂ:
2.3.1 Các kiến thức cơ bản về kiểu xâu [1]
2.3.1.1 Khái niệm
Xâu là một dãy kí tự nằm trong bộ mã ASCII. Mỗi kí tự là một phần tử của xâu.
Ví dụ: S= ‘Tin Hoc’
+ Tên Xâu: S
+ Số phần tử của xâu: 7= Độ dài xâu
2.3.1.2 Khai báo
Var <Tên biến xâu>: String[độ dài lớn nhất của xâu];
+ Tên biến xâu gồm một hoặc nhiều biến xâu, nếu nhiều biến xâu mỗi biến cách

một dấu phẩy.
+ Độ dài lớn nhất của xâu là 255. Trong trường hợp bỏ qua khai báo độ dài lớn nhất
của xâu, thì độ dài lớn nhất mặc định là 255.
Chú ý: Trong Free Pascal còn sử dụng kiểu dữ liệu ansiString có kích thước gần
2GB=230B nên thường xem là độ dài của xâu là không giới hạn.
2.3.1.3 Nhập, xuất dữ liệu kiểu xâu
- Cách nhập hay xuất kiểu dữ liệu xâu cũng tương tự như các kiểu dữ liệu khác
bằng các thủ tục Read, Readln, Write, Writeln.
2.3.1.4 Các thao tác xử lí xâu
a. Phép ghép xâu: Ví dụ: ‘HA’+ ‘NOI’= ‘HANOI’
b. Phép so sánh xâu
- Các phép so sánh: >, <, =, <>, >=, <=
- Quy tắc so sánh:
+ 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 là nhỏ
hơn B.
c. Các hàm và thủ tục xử lí xâu.
- Thủ tục Delete(S,vt,N) xóa trong xâu S từ vị trí vt, N kí tự.
- Thủ tục Insert(S1,S2,vt) chèn xâu S1 vào xâu S2 từ vị trí vt.
- Thủ tục Val(So,Xau,code) chuyển dữ liệu số từ biến so thành xâu kí tự lưu vào biến
xau. Nếu chuyển đổi thành cơng thì biến code = 0, ngược lại biến code <> 0.
- Thủ tục Str(Xau,So) chuyển dữ liệu kiểu xâu ở biến xau thành kiểu số và lưu vào
biến so.
- Hàm Copy(S,vt,N) sao chép trong xâu S từ vị trí Vt, N kí tự.
- Hàm Length(S) cho độ dài của xâu S.
4


- Hàm Upcase(ch) trả về kết quả là chữ cái in hoa nếu ch là chữ thường và giữ

nguyên ch trong trường hợp ngược lại.
- Hàn Ord(ch) trả về giá trị là mã ASCII của ch.
- Hàm Chr (ord(ch)+32) trả về kết quả là chữ cái in thường (nếu ch là chữ in hoa).
- Hàm Pos(S1,S2) trả về vị trí đầu tiên xuất hiện xâu S1 trong xâu S2.
2.3.2 Các dạng kiến thức thường gặp với kiểu xâu
2.3.2.1 Dạng bài tập kiểu xâu đơn giản (nội dung đã được trình bày trong
SKKN năm 2019 -2020 xem ở phần phụ lục trang 1 -2)
2.3.2.2 Dạng bài tập mã hóa, giải mã xâu (nội dung đã được trình bày trong
SKKN năm 2019 -2020 xem ở phần phụ lục trang 2 -5)
2.3.2.3 Dạng bài tập xử lí xâu con (nội dung đã được trình bày trong SKKN
năm 2019 -2020 xem ở phần phụ lục trang 5 -8)
2.3.2.4 Dạng bài tập xâu đối xứng (nội dung đã được trình bày trong SKKN
năm 2019 -2020 xem ở phần phụ lục trang 8- 11)
2.3.2.5 Dạng bài tập xử lí số nguyên kiểu dữ liệu lớn [2] (nội dung đã được
trình bày trong SKKN năm 2019 -2020 xem ở phần phụ lục trang 11 -16)
2.3.2.6 Dạng bài tập tính tần số xuất hiện của các kí tự ‘0’.. ‘9’ hoặc ‘a’ .. ‘z’
hoặc ‘A’.. ‘Z’ trong xâu
- Phương pháp chung:
o Khai báo mảng một chiều để đánh dấu sự xuất hiện của các kí tự chữ cái từ
‘a’ .. ‘z’ hoặc ‘A’ .. ‘Z’ hoặc các kí tự chữ số từ ‘0’ .. ‘9’ có dạng:
Var Dau:array[‘a’ .. ‘z’] of longint;
Hoặc Var Dau:array[‘A’ .. ‘Z’] of longint;
Hoặc Var Dau:array[‘0’ .. ‘9’] of longint;

Lưu ý: Tùy thuộc vào ràng buộc về dữ liệu của bài toán ta chọn kiểu dữ liệu phù
hợp với kiểu phần tử của mảng Dau.
Sử dụng đoạn lệnh:
{Ban đầu khởi tạo tất cả các phần tử của mảng dấu bằng 0, ta lựa chọn câu lệnh phù
hợp với yêu cầu cụ thể của bài toán}
For ch:=’a’ to ‘z’ Do Dau[ch]:=0;

For ch:=’A’ to ‘Z’ Do Dau[ch]:=0;
For ch:=’0’ to ‘9’ Do Dau[ch]:=0;

hoặc
hoặc
{Đánh dấu sự xuất hiện của các phần tử có trong xâu}

For i:=1 to length(S) Do
{Điều kiện tùy vào yêu cầu của bài toán} Inc[Dau[S[i]];

Với mảng đánh dấu trên để đếm số lần xuất hiện các kí tự trong xâu S với
Dau[ch]=k có nghĩa là kí tự ch xuất hiện k lần.
o
Truy vết từ mảng Dau ta được số lần xuất hiện các kí tự khác nhau và xử lý
tuỳ thuộc vào yêu cầu của từng bài tốn cụ thể.
- Ví dụ áp dụng:
Bài 1. Chữ cái xuất hiện (Đề HSG tỉnh Thanh Hóa năm 2011 -2012)[3]
5


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 CHU_CAI.INP gồm: Xâu St (độ dài ≤ 500 kí tự)
Kết quả: Ghi ra file CHU_CAI.OUT gồm: Một dòng duy nhất là bội chung nhỏ
nhất của kết quả bài tốn và 105
Ví dụ:
CHU_CAI.INP
CHU_CAI.OUT
AAABDA
100000

* Code tham khảo
Var

s:ansistring;
Dau:array['A'..'Z'] of integer;
f,g:text;
k,ch:char; i,max,dem:longint;
function
BCNN(x,y:longint):longint;
var i:integer;
begin
y:=100000;i:=1;
IF y MOD x = 0 THEN bcnn:=y
else
while i*y mod x <> 0 do inc(i);
BCNN:=i*y;
end;
begin
assign(f,'CHU_CAI.INP'); reset(f);
readln(f,s);
assign(g,'CHU_CAI.OUT'); rewrite(g);
for ch:='A' to 'Z' do Dau[ch]:=0;
for i:=1 to length(s) do
begin
k:=upcase(s[i]);
inc(Dau[k]);
end;
max:=0;
for ch:='A' to 'Z' do
if Dau[ch]>max then max:=Dau[ch];

writeln(g,BCNN(max,100000));
close(f); close(g);
end.

Bài 2. Kí tự khác nhau (Đề HSG tỉnh Thanh Hóa năm 2016 -2017)[3]
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.

6


Dữ liệu vào: Vào từ file văn bản KTKN.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 KTKN.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 trong xâ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ứ tự từ điển.
Ví dụ:
KTKN.INP
KTKN.OUT
AzB1C9A1BC
6
A2
B2
C2
z1
12

91
* Code tham khảo:
Var

s:ansistring;
Dau1:array['a'..'z'] of longint;
Dau2:array['A'..'Z'] of longint;
Dau3:array['0'..'9'] of longint;
f,g:text; k,ch:char;
i,max,dem,d1,d2,d3:longint;
begin
assign(f,'KTKN.INP'); reset(f); readln(f,s);
assign(g,'KTKN.OUT'); rewrite(g);
for ch:='a' to 'z' do Dau1[ch]:=0;
for ch:='A' to 'Z' do Dau2[ch]:=0;
for ch:='0' to '9' do Dau3[ch]:=0;
for i:=1 to length(s) do
if S[i] in ['a'..'z'] then inc(Dau1[S[i]])
else If S[i] in ['A'..'Z'] then inc(Dau2[S[i]])
else if S[i] in ['0'..'9'] then inc(Dau3[S[i]]);
d1:=0; d2:=0; d3:=0;
for ch:='a' to 'z' Do
if Dau1[ch]<>0 then inc(d1);
for ch:='A' to 'Z' Do
if Dau2[ch]<>0 then inc(d2);
for ch:='0' to '9' Do
if Dau3[ch]<>0 then inc(d3);
Writeln(g,d1+d2+d3);
for ch:='A' to 'Z' Do
if Dau2[ch]<>0 then writeln(g,ch, ' ' ,Dau2[ch]);

for ch:='a' to 'z' Do
if Dau1[ch]<>0 then writeln(g,ch, ' ', Dau1[ch]);
7


for ch:='0' to '9' Do
if Dau3[ch]<>0 then writeln(g,ch, ' ', Dau3[ch]);
close(f); close(g);
end.

Bài 3. Số thống kê [5]
Cho số nguyên dương N ở hệ thập phân dưới dạng xâu không quá 500 chữ số
và khơng có các số 0 khơng có nghĩa ở đầu. Số thống kê của N được xây dựng như
sau:
- Tính tần số xuất hiện các chữ số của N;
- Viết liên tiếp tần số và chữ số theo thứ tự tăng dần của các chữ số khác nhau
trong N.
Ví dụ: N=353, tần số xuất hiện của 3 là 2, tần số xuất hiện của 5 là 1. Như vậy số
thống kê sẽ là 2315.
Dữ liệu vào: Từ tệp văn bản SOTK.INP gồm số nguyên dương N (không quá 500
chữ số)
Kết quả: Ghi vào tệp văn bản SOTK.OUT là số thống kê tìm được
Ví dụ:
SOTK.INP
353

STK.OUT
2315

* Code tham khảo

Var

s:ansistring;
Dau:array['0'..'9'] of word;
f,g:text; ch:char; i: Word;

begin
assign(f,'SOTK.INP'); reset(f);
readln(f,s);
assign(g,'SOTK.OUT'); rewrite(g);
for ch:='0' to '9' do Dau[ch]:=0;
for i:=1 to length(s) Do
inc(Dau[S[i]]);
for ch:='0' to '9' do
if Dau[ch]>0 then write(g,dau[ch], ch);
close(f); close(g);
end.

2.3.2.7
Dạng bài tập ghép thành số có giá trị lớn nhất hoặc số nhỏ nhất
với các phần tử của mảng là xâu kí tự.
- Phương pháp chung: Lưu các số dưới dạng mảng với các phần tử kiểu xâu rồi
thực hiện:
+ Ghép số có giá trị lớn nhất: 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ử a[i] đứng trước phần từ a[j] khi (a[i] + a[j]) > (a[j] +a[i])
For i:=1 To N-1 Do
For j:=i+1 To N
If a[i]+a[j]>a[j]+a[i] Then

8



Begin
Tg:=a[i];
A[i]:=A[j];
A[j]:=tg;
End;

+ Ghép số có giá trị nhỏ nhất: Sắp xếp mảng theo thứ tự giảm dần theo tiêu chí
sắp xếp là phần tử a[i] đứng trước phần từ a[j] khi (a[i] + a[j]) < (a[j] +a[i])
For i:=1 To N-1 Do
For j:=i+1 To N
If a[i]+a[j]Begin
Tg:=a[i];
A[i]:=A[j];
A[j]:=tg;
End;

Lưu ý: Để tối ưu thời gian thực hiện bài tốn ta có thể sử dụng thuật toán sắp xếp
Quicksort (sắp xếp tăng dần).
var A: array[1..100] of string;
i,n,j: word;
procedure qsort(L,R: word);
var tg,k:string;
begin
if l>=R then exit;
i:=l; j:=R;
tg:=A[(l+R) div 2];
repeat

while tg+A[i]while tg+A[j]>A[j]+tg do dec(j);
if i<=j then
begin
if ik:=A[i];
A[i]:=A[j];
A[j]:=k;
end;
inc(i);dec(j);
end;
until i>j;
if lif iend;

+ Tương tự thay thế trong phần điều kiện để có sắp xếp giảm dần (với trường hợp
ghép số có giá trị bé nhất).
- Ví dụ áp dụng: Số lớn nhất ( [5]
9


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: Vào từ file văn bản GSLN.INP: 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 q 100. Mỗi dịng ghi từ 1 đến 100 kí tự
số. Bảo đảm rằng có ít nhất một dịng mà kí số đầu tiên khác 0.
Kết quả: Ghi ra file GSLN.OUT số lớn nhất đã có thể viết trên cuộn giấy trước khi
bị xé rách.
Ví dụ:
GSLN.INP
GSLN.OUT
2
66220004
20
004
66
3
3
* Code tham khảo
Cách 1:
var

i,j,n:longint;
a:array[1..100] of string;
x,y,tg:string; f,g:text;
Begin
assign(f,’GSLN.inp’);reset(f);
assign(g,’GSLN.out’);rewrite(g);
i:=0;
while not eof(f) do
begin inc(i); readln(f,a[i]); end;
n:=i;
for i:= 1 to n-1 do

for j:=i+1 to n do
begin
if a[i]+a[j]begin
tg:=a[j];
a[j]:=a[i];
10


a[i]:=tg;
end;
end;
for i:=1 to n do
write(g,a[i]);
close(g); close(f);
End.

Cách 2: (Dùng thuật toán sắp xếp Quicksort)

var A: array[1..100] of string;
i,n,j: word;
f,g:text;
procedure qsort(L,R: word);
var tg,k:string;
begin
if l>=R then exit;
i:=l; j:=R;
tg:=A[(l+R) div 2];
repeat
while tg+A[i]

while tg+A[j]>A[j]+tg do dec(j);
if i<=j then
begin
if ik:=A[i];
A[i]:=A[j];
A[j]:=k;
end;
inc(i);dec(j);
end;
until i>j;
if lif iend;
Begin
assign(f,'GSLN.inp');reset(f);
assign(g,'GSLN.out');rewrite(g);
i:=0;
while not eof(f) do
begin
inc(i); readln(f,a[i]);
end;
n:=i;
Qsort(1,n);
for i:=1 to n do
write(g,a[i]);
close(g); close(f);
11



End.

2.3.2.8
Dạng bài tập tìm cách xóa trong xâu S K kí tự để xâu cịn lại là
xâu có giá trị lớn nhất hoặc xâu có giá trị nhỏ nhất
- Phương pháp chung:
+ Tách xâu S chỉ gồm các kí tự số trong xâu St (nếu xâu St có chứa thêm các kí tự
khác kí tự số) bằng câu lệnh sau:
S:=’’;
For i:=1 to length(St) Do
If St[i] in[‘0’ .. ‘9’] then S:=S+St[i];

+ Xóa trong xâu S k kí tự để xâu cịn lại là xâu có giá trị lớn nhất ta sử dụng đoạn
lệnh sau:
for i:=1 to k do
Begin
KT:=true;
for j:=1 to length(s)-1 do
if (s[j]begin
delete(s,j,1);
KT:=False;
break;
end;
IF KT=true then Delete(S,length(s),1);

Chú ý: Xóa trong xâu S k kí tự để xâu cịn lại là xâu có giá trị nhỏ nhất ta chỉ cần
thay điều kiện xóa là If (s[j] > S[j+1) Then …
- Ví dụ áp dụng:
Bài 1. Số lớn nhất ( [5]

Trong giờ học mơn tốn, Cuội ngồi nghe cơ giáo giảng bài rất chăm chú, cịn
Bờm, có vẻ như đang buồn ngủ vì sở thích của anh chàng là các mơn Khoa học
Xã hội. Để giúp Bờm tỉnh táo, Cuội tổ chức một trò chơi cho Bờm bằng cách
viết ra giấy một số nguyên dương gồm N chữ số, yêu cầu Bờm tìm số lớn nhất có
thể sau ghi gạch bỏ đi K chữ số trong số N chữ số đã cho.
Dữ liệu: cho trong file văn bản NUMMAX.INP
+ Dòng đầu: ghi hai số nguyên N và K , cách nhau bởi một dấu cách.
+ Dòng thứ hai: ghi xâu N chữ số, chữ số đầu tiên luôn khác 0.
Kết quả: ghi ra file văn bản NUMMAX.OUT kết quả tìm được trên một dịng duy
nhất.
Điều kiện: 1 ≤ K ≤ N ≤ 50000
Ví dụ:
NUMMAX.INP
NUMMAX.OUT NUMMAX.INP NUMMAX.OUT
3 1
99
4 2
94
991
1924
- Code tham khảo
var n,m,i,j,k:longint;

12


s:string; f,g:text;kt:boolean;
begin
assign(f,'NUMMAX.inp');reset(f);
assign(g,'NUMMAX.out');rewrite(g);

readln(f,N,K); readln(f,S);
for i:=1 to k do
Begin
KT:=true;
for j:=1 to length(s)-1 do
if (s[j]begin
delete(s,j,1); KT:=False; break;
end;
IF KT=true then Delete(S,length(s),1);
end;
writeln(g,s); close(f); close(g);
end.

Bài 2. Số nhỏ nhất ( [5]
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
A1, A2,…,Ap và P xâu ký tự S 1, S2,...,Sp chỉ gồm các số thập phân bằng cách viết S 1
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.
Yêu cầu: 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 .
Dữ liệu vào: từ file văn bản có tên NUM_MIN.INP gồm:
- Dòng 1: Chứa 2 số nguyên dương P và k phân cách bởi dấu cách
- Dòng 2: Gồm P số nguyên dương A1, A2,…., An cách nhau dấu cách (ai<=100)
- P dòng còn lại: Dòng i chứa xâu Si (độ dài các xâu không vượt quá 255)
Kết quả: Ghi ra file NUM_MIN.OUT là số nhỏ nhất thu được sau khi xố
Ví dụ:
NUM_MIN.INP
NUM_MIN.OUT
11

44
42
123
0
45
var f,g:text;
a:array[1..20]of longint;
b:array[1..20] of ansistring;
p,k,i,j,so:longint;
kt:boolean;
s,s1:ansistring;
13


begin
assign(f,'NUM_MIN.inp'); reset(f);
assign(g,'NUM_MIN.out'); rewrite(g);
readln(f,p,k);
for i:=1 to p do read(f,a[i]);
readln(f);
for i:=1 to p do
readln(f,b[i]);
for i:=1 to p do
for j:=1 to a[i] do s1:=s1+b[i];
for i:=1 to k do
begin
kt:=true;
for j:=1 to length(s1)-1 do
if s1[j]>s1[j+1] then
begin

delete(s1,j,1);
kt:=false;
break;
end;
if kt=true then delete(s1,length(s1),1);
end;
val(s1,so);
write(g,so);
close(f);close(g);
end.

2.3.2.9
Dạng bài tập tìm cách xóa trong xâu S một số kí tự để xâu cịn lại
có K kí tự tạo thành xâu có giá trị lớn nhất hoặc xâu có giá trị bé nhất
- Phương pháp chung:
+ Tách xâu S chỉ gồm các kí tự số trong xâu St (nếu xâu St có chứa thêm các kí
tự khác kí tự số) bằng câu lệnh:
S:=’’;
For i:=1 to length(St) Do
If St[i] in[‘0’ .. ‘9’] then S:=S+St[i];

+ Xóa trong S một số kí tự để xâu cịn lại có K kí tự có giá trị lớn nhất sử dụng
đoạn lệnh sau:
for i:=1 to length(s)-k do
Begin
KT:=true;
for j:=1 to length(s)-1 do
if (s[j]begin
delete(s,j,1);

KT:=False;
break;

14


end;
IF KT=true then Delete(S,length(s),1);
end;

Chú ý: Xóa trong xâu S một số kí tự để xâu cịn lại có K kí tự tạo thành xâu có
giá trị nhỏ nhất ta chỉ cần thay điều kiện xóa là: If (s[j] > S[j+1) Then …
- Ví dụ áp dụng: Số bé nhất (Đề HSG tỉnh Ninh Bình 2013 – 2014)[3]
Cho một số nguyên dương có N chữ số. Hãy xóa đi một số kí tự để số cịn lại có K
kí tự tạo thành số bé nhất
Dữ liệu vào: Từ file NUM_MIN.INT gồm:
+ Dịng đầu tiên là số ngun dương có N chữ số (N<=104)
+ Dòng thức hai là số nguyên dương K (KKết quả: Ghi ra file văn bản NUM_MIN.OUT gồm số ngun bé nhất sau khi xóa
K chữ số.
Ví dụ:
NUM_MIN.INT

NUM_MIN.OUT

15132334312122345
14

11233312122345


* Code tham khảo
var n,m,i,j,k:longint;
s:string; f,g:text; kt:boolean;
begin
assign(f,'NUM_MIN.inp');reset(f);
assign(g,'NUM_MIN.out');rewrite(g);
readln(f,s); readln(f,k);
for i:=1 to length(s)-k do
Begin
KT:=true;
for j:=1 to length(s)-1 do
if (s[j]>s[j+1]) then
begin
delete(s,j,1);KT:=False; break;
end;
IF KT=true then Delete(S,length(s),1);
end;
writeln(g,s);
close(f); close(g);
end.

2.3.2.10
Dạng bài tập tìm xâu chung có độ dài lớn nhất
- Phương pháp chung: Áp dụng quy hoạch động
a. Hàm mục tiêu F
b. F[i,j]=0 trong trường hợp đơn giản nhất là S1=’’ hoặc S2=’’
c. Xây dựng mảng phương án:
15



Nếu S1[i]=S2[j] thì F[i,j]=F[i-1,j-1]+1 Ngược lại
F[i,j]=max(F[i-1,j],F[i,j-1];

Ví dụ: Cho hai xâu S1= ‘xmagcdklhm’; S2= ‘acdfghm’ ; Output: ‘acdhm’
Bước 1: Khởi tạo bảng phương án có tất cả các giá trị bằng 0
For i:=0 to length(S1) Do
For j:=0 to length(S2) Do

F[i,j]:=0;

Ví dụ:

Bước 2: Tạo bảng phương án
For i:=1 To length(S1) Do
For j:=1 to length(S2) Do
If S1[i]=S2[j] then F[i,j]:=F[i-1,j-1]+1
Else f[i,j]:=max(f[i-1,j],F[I,j-1]);

Ví dụ:

Bước 3: Thực hiện truy vết để đưa ra xâu chung dài nhất bằng
16


n:=length(S1); m:=length(S2);xc:=’’;
Maxx:=F[n,m];
While F[n,m]<>0 Do
Begin
While F[n,m]=F[n-1,m] Do dec(n);
xc:=S1[n]+xc;

Dec(n); Dec(m);
End;
Write(g,Maxx,' ', xc);

- Ví dụ áp dụng:
Xâu con chung ( />Một xâu ký tự Y gọi là xâu con của xâu ký tự X nếu như có thể xóa bớt một
số ký tự trong xâu X (hoặc có thể khơng xóa) để được xâu Y.
Cho hai xâu ký tự A, B có độ dài khơng q 1000 ký tự. Hãy tìm một xâu ký tự S
dài nhất sao cho S là xâu con của cả hai xâu A và B.
Dữ liệu vào: Cho từ file văn bản XCC.INP
- Dòng đầu ghi xâu A
- Dòng thứ hai ghi xâu B
Kết quả: Ghi ra file văn bản XCC.OUT ghi độ dài xâu S
Ví dụ:
XCC.INP
XCC.OUT
badcabacd
6
acbadcbce
* Code tham khảo
function max(a,b:word):word;
begin
if a>b then max:=a
else max:=b;
end;
var f1,f2:text;
F:array[0..1000,0..1000] of longint;
i,j,k,maxx:longint;
s1,s2:ansistring;
begin

assign(f1,'xcc.inp'); reset(f1);
assign(f2,'xcc.out'); rewrite(f2);
readln(f1,s1);
readln(f1,S2);
for i:=1 to length(s1) do
for j:=1 to length(s2) do F[i,j]:=0;
for i:=1 to length(s1) do
for j:=1 to length(s2) do
if s1[i]=s2[j] then
F[i,j]:=F[i-1,j-1]+1
17


else F[i,j]:=max(F[i,j-1],F[i-1,j]);
maxx:=F[i,j];
writeln(f2,maxx);
close(f1); close(f2);
End.

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
- Với hoạt động giáo dục
Đề tài này tôi đã áp dụng bồi dưỡng học sinh trong đội tuyển học sinh giỏi cấp
tỉnh năm học 2019 – 2020 và năm học 2020 - 2021 là em Vi Văn Xuân lớp A1
trường THPT Thường Xuân 2. Sau khi dạy xong chuyên đề và tiến hành kiểm tra
khảo sát, đánh giá, có thể thấy được kết quả trong bảng so sánh sau:
Tên Học sinh
Điếm số
Thi KS trước khi dạy chuyên
Vi Văn Xuân

9.0/20
đề kiểu dữ liệu xâu
Thi KS sau khi dạy chuyên đề
Vi Văn Xuân
15.5/20
kiểu dữ liệu xâu
Với đề tài trên trong quá trình áp dụng cho học sinh trường THPT Thường
Xuân 2, căn cứ vào kết quả học tập của học sinh tôi thấy việc sử dụng chuyên đề
kiểu dữ liệu xâu vào việc dạy bồi dưỡng HSG đã góp phần nâng cao hiệu quả học
tập của học sinh, giúp cho học sinh tích cực, chủ động nắm vững bài giảng và vận
dụng vào giải các bài tập thuộc dạng kiểu dữ liệu xâu kết quả tốt nhất.
- Với bản thân: Bản thân tôi đúc rút được nhiều kinh nghiệm trong quá trình
bồi dưỡng HSG và là tài liệu giúp tôi bồi dưỡng HSG trong các năm học sau.
- Với đồng nghiệp và nhà trường: Với đề tài này có tính khả thi cao thể ứng
dụng rộng dãi cho các học sinh trong nhà trường, các đồng nghiệp có thể sử dụng
áp dụng trong giảng dạy để nâng cao hiệu quả dạy học trong bộ môn tin học, đặc
biệt bồi dưỡng HSG tin học 11.
3. Kết luận, kiến nghị
3.1 Kết luận
Với kinh nghiệm ơn thi học sinh giỏi cịn ít nên việc viết thuật tốn có thể
cịn nhiều thuật tốn chưa đạt được mức tối ưu nhất. Rất mong được sự đóng góp ý
kiến của các đồng chí đồng nghiệp và Hội đồng khoa học để sáng kiến trên được
hoàn thiện hơn.
3.2 Kiến nghị:
Để nâng cao hiệu quả việc dạy và học bộ mơn Tin học thì cần kết nối mạng
cục bộ, mạng Internet trong phòng thực hành Tin học.

18



XÁC NHẬN CỦA THỦ TRƯỞNG
ĐƠN VỊ

Thanh hóa, ngày 15 tháng 05 năm 2021
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.
Lê Thị Hoa

19


TÀI LIỆU THAM KHẢO
[1]. Sách giáo khoa tin học 11 – Hồ Sĩ Đàm – Nhà xuất bản Giáo dục, 2013
[2]. Tài liệu tập huấn bồi dưỡng học sinh giỏi tỉnh Thanh Hóa năm 2017
[3]. Các đề thi học sinh giỏi cấp tỉnh.
[4]. Đề thi khảo sát HSG cấp tỉnh cụm liên trường các trường THPT tỉnh Thanh Hóa
[5].Tham khảo một số tài liệu trên Internet
- Nguồn:
- Nguồn:
- Nguồn: />- Nguồn : />- Nguồn: />
20


PHỤ LỤC
A. PHẦN NỘI DUNG SKKN NĂM 2019 – 2020
2.3.2. Các dạng kiến thức thường gặp với kiểu xâu
2.3.2.1.
Dạng bài tập kiểu xâu đơn giản
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ần nắm rõ các hàm, thủ tục trên kiểu dữ liệu xâu

đã giới thiệu ở mục 1.4 ở trên để vân dụng một cách linh hoạt vào từng bài tập cụ
thể trong thực tế.
Ví dụ áp dụng:
Bài 1. Nén xâu (Đề HSG tỉnh Hà Tĩnh năm 2013-2014) [3]
Một xâu kí tự có thể “nén” theo cách sau: Một xâu con gồm n>1 kí tự giống
nhau, chẳng hạn n kí tự “a” sẽ được ghi thành na. Ví dụ xâu ‘mmmbbcd’ sẽ được
nén thành ‘3m2bcd’. Hãy viết chương trình nén xâu theo quy tắc trên.
Dữ liệu vào: Cho trong tệp NEN.INP chứa một xâu kí tự (khơng q 200 kí tự)
Kết quả: Ghi vào tệp NEN.Out xâu đã nén.
Ví dụ:
NEN.INP
NEN.OUT
BbbAaaaceeegmmmm 3b4ac3eg4m
* Code tham khảo
var f,g:text; S,st,xau:string;i,dem:byte;
begin
assign(f,'NEN.inp'); reset(f);
Assign(g,'NEN.out'); Rewrite(g);
readln(f,s);
S:=S+' ';St:=''; dem:=1;
for i:=2 to length(s) do
if s[i]=S[i-1] then inc(dem)
else
begin
str(dem,xau);
if dem >1 then st:=st+xau+S[i-1] else st:=st+s[i-1];
dem:=1;
end;
writeln(g,st);Close(f); Close(g);
end.


Bài 2. Ghép xâu.
Cho 2 xâu ký tự S1, S2. Có thể ghép một số lần liên tiếp xâu S 1 để được xâu
S2 hay không?
Dữ liệu: Vào từ file văn bản XAU.INP
- Dòng đầu tiên ghi xâu S1,
- Dòng thứ hai ghi xâu S2.
Kết quả: Ghi vào file văn bản XAU.OUT
21


Trong trường hợp ghép được, ghi số K là số lần ghép liên tiếp xâu S 1 để được
xâu S2, trường hợp ngược lại ghi số 0.
Ví dụ:
XAU.INP
XAU.OUT
XAU.INP
XAU.OUT
ACM
3
MNP
0
ACMACMACM
MNPMNPMNPC
* Code tham khảo
Var

f,g:text;
s1, s2:string;
Function Ghepduoc(x,y:string):boolean;

var i:byte;
s:string;
begin
s:='';
for i:=1 to length(y) div length(x) do
s:=s+x;
Ghepduoc:=s=y;
end;
begin
assign(f,'Xau.inp'); reset(f);
readln(f,s1);
readln(f,s2);
assign(g,'Xau.out'); rewrite(g);
if Ghepduoc(s1,s2) then write(g,length(s2) div
length(s1))
else write(g,0);
close(f); close(g);
end.

2.3.2.2.
Dạng bài tập mã hóa, giải mã xâu
Ở dạng này kiến thức thường xoay quanh việc:
+ Mã hóa một xâu kí tự bằng cách thay mỗi chữ cái bằng chữ cái đứng sau K vị trí
vịng trịn theo bảng chữ cái. Các kí tự ngồi chữ cái thì giữ ngun.
+ Giải mã một xâu kí tự dựa vào quy tắc mã hóa ở trên
Phương pháp chung:
- Xây dựng chương trình con mã hóa một kí tự từ đó thực hiện mã hóa cả xâu kí tự.
Function Mahoa(Ch:Char):Char;
Var vt:byte;
Begin

If upcase(ch) in ['A'..'Z'] then
Begin
Vt:=ord(upcase(ch))-65; Vt:=Vt+k;
Mahoa:=Char(vt mod 26 +65);
End
Else Mahoa:=ch;

22


End;

- Giải mã xâu đã được mã hóa theo quy tắc trên: Xây dựng chương trình con giải
mã một kí tự từ đó thực hiện giải mã cả xâu kí tự. (Áp dụng trong bảng chữ cái)

Function Giaima(Ch:Char):Char;
Var vt:byte;
Begin
If upcase(ch) in ['A'..'Z'] then
Begin
Vt:=ord(upcase(ch))-65;Vt:=vt-k+26;
Giaima:=Char(vt mod 26 +65);
End
Else Giaima:=ch;

Ví dụ áp dụng:
Trong lúc ngồi học lập trình Pascal Bờm nghĩ ra một việc muốn viết nhận kí
cho bản thân nhưng lại khơng muốn cho bất kì ai đọc được nhật kí mà mình viết.
Bờm nghĩ mình phải mã hóa các thơng tin trước khi muốn lưu trữ lại nội dung nhật
kí. Bờm đưa ra cách mã hóa như sau: thay mỗi chữ cái bằng chữ cái đứng sau K vị

trí trong bảng chữ cái khi viết. Nếu bảng chữ cái có N chữ, thì sau chữ cái thức N-1
là chữ cái thứ N, sau chữ cái thứ N là chữ thứ nhất, ….Cách mã hóa như vậy được
gọi là nhật kí mã hóa. Các kí tự ngồi bảng chữ cái vẫn được giữ nguyên.
Cho tệp văn bản MAHOA.INP có cấu trúc như sau:
- Dòng 1: Ghi số nguyên K (1- Dòng 2: Xâu S1
- Dịng 3: Xâu S2
Các xâu S1, S2 khơng q 255 kí tự. Hãy lập trình đọc dữ liệu từ tệp trên, thực hiện
mã hóa xâu S1 theo quy tắc nhật kí mã hóa và giải mã xâu S2 (xâu S2 là xâu được
mã hóa theo quy tắc nhật kí mã hóa). Kết quả ghi vào tệp MAHOA.OUT
Ví dụ:
MAHOA.INP
MAHOA.OUT
3
WKSW WKXRQJ AXDQ 2
THPT Thuong xuan 2
TIN HOC 11
Wlq krf 11
* Code tham khảo
Var S1,S2,S,SG:AnsiString; f,g:Text;i,k:byte;
Function Mahoa(Ch:Char):Char;
Var vt:byte;
Begin
If upcase(ch) in ['A'..'Z'] then
Begin
Vt:=ord(upcase(ch))-65; Vt:=Vt+k;
Mahoa:=Char(vt mod 26 +65);
End
Else Mahoa:=ch;


23


×