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

Kiểu xâu trong Pascal

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 (208.88 KB, 24 trang )

MỤC LỤC
DANH MỤC CÁC TỪ VIẾT TẮT.......................................................................2
PHẦN I. MỞ ĐẦU................................................................................................3
1.1. Lý do chọn đề tài......................................................................................3
1.1.1. Cơ sở lí luận........................................................................................3
1.1.2. Cơ sở thực tiễn....................................................................................3
1.2. Định hướng nghiên cứu............................................................................3
1.2.1. Mục đích nghiên cứu..........................................................................3
1.2.2. Đối tượng nghiên cứu.........................................................................4
1.2.3. Phạm vi nghiên cứu............................................................................4
1.2.4. Phạm vi ứng dụng...............................................................................4
1.2.5. Phương pháp nghiên cứu....................................................................4
PHẦN II. NỘI DUNG...........................................................................................5
2.1. Cơ sở lý thuyết..........................................................................................5
2.1.1. Kiểu dữ liệu xâu.................................................................................5
2.1.2. Kiểu dữ liệu xâu trong TP và FP........................................................6
2.1.2.1. Kiểu dữ liệu xâu trong TP..........................................................6
2.1.2.2. Kiểu dữ liệu xâu trong FP..........................................................6
2.2. Một số câu hỏi chọn lọc liên quan đến kiểu dữ liệu xâu trong các đề thi
HS giỏi tỉnh Vĩnh Phúc những năm gần đây......................................................7
2.3. Một số lưu ý............................................................................................20
PHẦN III. KẾT LUẬN VÀ KIẾN NGHỊ...........................................................21
3.1. Kết luận...................................................................................................21
3.2. Kiến nghị.................................................................................................21
NHẬN XÉT CỦA TỔ CHUYÊN MÔN VÀ HỘI ĐỒNG CHẤM.....................22
PHỤ LỤC CÂU HỎI..........................................................................................23
DANH MỤC TÀI LIỆU THAM KHẢO............................................................24


Sáng kiến kinh nghiệm tin học


DANH MỤC CÁC TỪ VIẾT TẮT
Từ viết tắt

Ý nghĩa

TP

Turbo Pascal

FP

Free Pascal

HS

Học sinh

GV

Giáo viên

THPT

Trung học phổ thông

SKKN

Sáng kiến kinh nghiệm

Trang 2



Sáng kiến kinh nghiệm tin học

PHẦN I. MỞ ĐẦU
1.

Lý do chọn đề tài

1.1.1. Cơ sở lí luận
Trong thời đại thông tin bùng nổ ngày nay, việc lập được các chương trình
tự hoạt động cho máy tính, máy gia dụng là cần thiết. Và để làm được việc đó
cần có một quá trình nghiên cứu, học tập về ngôn ngữ lập trình lâu dài, qua đó
nhà lập trình có thể chọn một ngôn ngữ lập trình thích hợp. Tuy nhiên mọi thứ
điều có điểm khởi đầu của nó, với HS việc học Pascal là khởi đầu cho việc tiếp
cận ngôn ngữ lập trình bậc cao, qua đó giúp các em hình dung được sự ra đời,
cấu tạo, hoạt động cũng như ích lợi của các chương trình hoạt động trong máy
tính, các máy tự động…Từ đó giúp các em có thêm một định hướng, một niềm
đam mê về tin học, về nghề nghiệp mà các em chọn sau này. Đồng thời Pascal là
một ngôn ngữ có cấu trúc thể hiện trên 3 yếu tố: Cấu trúc về mặt dữ liệu, cấu
trúc về mặt lệnh, cấu trúc về mặt chương trình.
Mỗi ngôn ngữ đều cung cấp cho chúng ta rất nhiều kiểu dữ liệu khác nhau
như: kiểu số nguyên, kiểu số thực, kiểu kí tự, kiểu logic, kiểu mảng, kiểu bản
ghi, kiểu xâu, kiểu tệp,…để có thể giải quyết nhiều dạng bài toán khác nhau.
Trong đó, kiểu xâu là một kiểu dữ liệu đặc biệt do nó có thể biến đổi qua lại một
cách linh hoạt bằng cách sử dụng các hàm, các phép toán trên xâu kí tự, đôi khi
các kiểu dữ liệu khác cũng có thể biến đổi thành kiểu xâu để xử lý một cách dễ
dạng hơn (cộng, nhân, chia, chia lấy nguyên, chia lấy dư,… các số lớn,…)
1.1.2. Cơ sở thực tiễn
Qua hơn ba năm dạy đội tuyển HS giỏi tin học, hơn hai năm dạy chương

trình chính khóa tin học lớp 11. Tôi nhận thấy kiểu dữ liệu xâu là một phần hay
nhưng không phải dễ. Từ những kinh nghiệm mà tôi có được, cùng quá trình tìm
hiểu về xâu trong Pascal tôi nhận thấy kiến thức về xâu rất rộng. Mặc dù kiến
thức về xâu của bản thân tôi còn nhiều hạn chế nhưng sau một thời gian tìm hiểu
về kiểu dữ liệu xâu kí tự tôi rất muốn viết ra những kiến thức mà tôi đã lĩnh hội
được, muốn đưa ra những chương trình về xâu mà tôi cảm thấy tâm đắc nhất có
thể giúp cho các em HS, đặc biệt là những HS trong đội tuyển HS giỏi và những
GV mới ra trường đang bồi dưỡng đội tuyển có được những kiến thức bổ trợ cho
quá trình giảng dạy và học tập của mình. Từ những lý do trên tôi viết đề tài:
“Kiểu dữ liệu xâu và thuật toán một số bài tập về xâu trong kì thi chọn HS giỏi
tin học THPT những năm gần đây”.
2.

Định hướng nghiên cứu

1.1.3. Mục đích nghiên cứu
- Cải thiện kiến thức của bản thân về kiểu dữ liệu xâu trong ngôn ngữ lập
trình Pascal.

Trang 3


Sáng kiến kinh nghiệm tin học

- Giúp các GV mới tham gia bồi dưỡng HS giỏi tin học, các HS tham gia
vào các đội tuyển tin học trong các trường và các HS có niềm đam mê với
môn lập trình Pascal có một tài liệu để tham khảo trong quá trình giảng
dạy và học tập của mình.
1.1.4. Đối tượng nghiên cứu
Xâu dữ liệu trong ngôn ngữ lập trình Pascal dựa trên một số bài tập liên

quan đến kiểu xâu trong các đề thi HS giỏi tin học THPT tỉnh Vĩnh Phúc những
năm gần đây.
1.1.5. Phạm vi nghiên cứu
- Kiến thức: Kiểu dữ liệu xâu trong ngôn ngữ lập trình Pascal
- Thời gian: từ 02/01/2012 – đến nay
1.1.6. Phạm vi ứng dụng
Tài liệu này có thể sử dụng để GV và HS đọc tham khảo
- Đối với HS: Giúp HS hiểu hơn và tham khảo về hướng giải quyết một vài
dạng bài tập kiểu dữ liệu xâu trong các đề thi HS giỏi gần đây
- Đối với GV: Đây là một tài liệu tham khảo cho các GV THPT khi dạy HS
giỏi cũng như các GV dạy trên lớp.
1.1.7. Phương pháp nghiên cứu
- Nghiên cứu về lí luận dạy học, quá trình dạy học
- Nghiên cứu chương trình, thuật toán
- Tổng kết kinh nghiệm

Trang 4


Sáng kiến kinh nghiệm tin học

PHẦN II. NỘI DUNG
3.

Cơ sở lý thuyết

2.1.1. Kiểu dữ liệu xâu
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. Số lượng kí tự trong một xâu được gọi là độ dài của xâu. Xâu

có độ dài bằng 0 gọi là xâu rỗng.
- Các ngôn ngữ lập trình đều có quy tắc, cách thức cho phép xác định:
o Tên kiểu xâu
o Cách khai báo biến kiểu xâu
o Số lượng các kí tự của xâu
o Các phép toán thao tác với xâu
o Cách tham chiếu tới phần tử của xâu
- Tham chiếu tới phần tử trong xâu được xác định thông qua chỉ số của
phần tử trong xâu.
- Chỉ số phần tử trong xâu thường được đánh số là 1.
- Trong ngôn ngữ Pacal, tham chiếu tới phần tử thường được viết:
<Tên biến xâu>[chỉ số]. Ví dụ: s= ‘abcde’  s[2]= ‘b’
b) Khai báo xâu
Var <tên các biến xâu>:<kiểu dữ liệu xâu>;
Trong đó:
- Tên các biến xâu là các biến xâu được đặt tên theo đúng quy tắc đặt tên
- Kiểu dữ liệu xâu có thể tùy thuộc vào sử dụng ngôn ngữ lập trình TP và
FP:
o Trong TP: String;
o Trong FP: asistring, shortstring, string…
c) Các thao tác xử lý xâu
- Phép ghép xâu: sử dụng dấu cộ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
Ví dụ: ‘Lap Thach’ + ‘ ‘ + ‘Vinh Phuc’= ‘Lap Thach Vinh Phuc’
- Phép so sánh xâu: 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 và thực hiện việc so sánh hai xâu theo quy tắc sau:
o 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.
Ví dụ: ‘May tinh cua toi’ < ‘may tinh cua toi’


Trang 5


Sáng kiến kinh nghiệm tin học

o 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
Ví dụ: ‘May tinh’ < ‘May tinh cua toi’
o Hai xâu được coi là bằng nhau nếu như chúng giống nhau hoàn
toàn:
Ví dụ: ‘TIN HOC’ = ‘TIN HOC’
d) Các hàm và thủ tục xử lý xâu, kí tự (Đây cũng là một trong các lý do tại
sao không xử dụng mảng các kí tự để khai báo cho xâu mặc dù cách thức
truy cập tới phần tử của xâu và mảng tương tự nhau – Nếu sử dụng mảng
thì ta sẽ không áp dụng được các hàm và thủ tục rất tiện lợi này).
Một số thủ tục chuẩn:
Delete(St, vt, n): xóa n kí tự của xâu St bắt đầu từ vị trí vt.
Insert(S1, S2, vt): chèn sâu S1 vào S2 bắt đầu từ vị trí vt của S2
Val(St, x, m): Đổi giá trị xâu St thành số ghi giá trị vào biến X, nếu không
đổi được thì vị trí gây lỗi ghi trong m, nếu đổi thành công thì m = 0
Str(X, St): chuyển số X thành xâu kí tự lưu trong St.
Một số hàm chuẩn:
Copy(St, vt, n): sao chép từ xâu St, n kí tự bắt đầu từ vị trí vt.
Pos(S1, S2): tìm vị trí xuất hiện đầu tiên của S1 trong S2.
Length(St): cho độ dài xâu St.
Upcase(ch): cho chữ cái viết hoa tương ứng với chữ trong ch.
Chr(X): cho kí tự có mã X trong bảng mã ASCII.
Ord(ch): cho mã của kí tự ch trong bảng mã.
Concat(St1,St2,...StN): Hàm ghép nối các xâu St1,St2,...StN thành xâu ký

tự theo thứ tự đã viết. Các viết này tương tự như: ST := St1 + St2 + ... +
StN
2.1.2. Kiểu dữ liệu xâu trong TP và FP
2.1.2.1. Kiểu dữ liệu xâu trong TP
Trong TP xâu chỉ có độ dài không quá 255 kí tự nên nếu như với bài toán
có độ dài lớn hơn thì việc sử dụng kiểu xâu trong TP gặp khó khăn hơn rất nhiều
do vậy lựa chọn tốt hơn khi bạn vẫn muốn lập trình bằng ngôn ngữ Pascal đó là
sử dụng trình biên dịch FP. Đối với TP kiểu dữ liệu xâu thường dùng là String
chỉ có độ dài tối đa 255 kí tự. Nhưng hầu hết các bài toán trong các đề thi học
sinh giỏi có độ dài xâu lớn hơn rất nhiều nên việc xử lý sẽ gặp rất nhiều khó
khăn. Do vậy, ta phải dùng tới trình biên dịch FP.
2.1.2.2. Kiểu dữ liệu xâu trong FP
Khi lập trình, chúng ta rất nhiều lần gặp vấn đề với các xâu tối đa 255 kí tự
của TP (chẳng hạn bài toán xâu đối xứng, bài toán đếm từ…). Ta có thể giải
Trang 6


Sáng kiến kinh nghiệm tin học

quyết vấn đề bằng mảng kí tự (array of char) nhưng khi đó ta lại không thể dùng
các phép toán trên xâu rất mạnh của Pascal.
Không chỉ có cải tiến về kiểu nguyên, kiểu string trong FP cũng được cải
tiến rất tốt. Kiểu xâu kí tự trong FP không còn hạn chế 255 kí tự của TP nữa mà
có kích thước tối đa là khoảng 2 tỉ kí tự. Hơn nữa FP còn hỗ trợ kiểu xâu
Unicode (WideString). Nếu bạn vẫn muốn sử dụng kiểu String cũ của TP, bạn có
thể dùng kiểu ShortString hoặc String.
Trong môi trường Windows, trình biên dịch FP có nhiều ưu thế hơn do tính
tương thích và hỗ trợ bộ nhớ lớn hơn.
Các kiểu dữ liệu xâu kí tự thường sử dụng trong FP: String, ShortString,
AnsiString, WideString.

4.

Một số câu hỏi chọn lọc liên quan đến kiểu dữ liệu xâu trong các đề
thi HS giỏi tỉnh Vĩnh Phúc những năm gần đây

Câu 1. (Bài 2 – Kì thi chọn HSG lớp 12 THPT – Năm học: 2014 – 2015)
Keyboard: Harry – người bạn của chúng ta đang gõ một đoạn văn bản bằng một
bàn phím đặc biệt với các ký tự được sắp xếp theo cách như sau:
qwertyuiop
asdfghjkl;
zxcvbnm,./
Thật không may, Harry bị khiếm thị, do vậy đôi khi nó cũng là vấn đề cho mỗi
lần muốn đặt tay lên bàn phím một cách chính xác. Harry vô tình di chuyển cả
hai bàn tay của mình một vị trí cùng sang trái hoặc cùng sang phải. Điều đó có
nghĩa là hiện tại Harry đã bấm phải phím mà Harry không muốn
Chúng ta đã có một dãy các ký tự mà Harry đã gõ vào, giờ cần tìm lại chuỗi
nguyên bản ban đầu
Dữ liệu:
Dòng đầu ghi một ký tự là “R” – chuyển qua phải hoặc “L” chuyển qua
trái
Dòng tiếp theo ghi một dãy không quá 1000 ký tự - là chuỗi được đánh
máy bởi Harry. Dãy chỉ chứa các ký tự có trên bàn phím của Harry, chuỗi đã cho
cũng không có dấu cách, và bàn phím của Harry cũng không có không gian
trống, điều này đảm bảo rằng mặc dù tay có di chuyển thì Harry vẫn bấm vào
phím trên bàn phím mà không phải bấm ra ngoài bàn phím.
Kết quả: in ra một dòng chứa chuỗi kí tự nguyên bản.
Ví dụ:
Input

Output


R
s;;upimrrfod;pbr

allyouneedislove

Trang 7


Sáng kiến kinh nghiệm tin học

Thuật toán:
Bước 1. Đọc ch1 tương ứng là kiểu kí tự lưu kí tự “L” hoặc “R”
Bước 2. Trong khi chưa kết thúc tệp ta tiếp tục thực hiện
B2.1. Đọc ch tương ứng với từng kí tự;
B2.2. Gán k1:=pos(ch,s1); k2:=pos(ch,s2); k3:=pos(ch,s3) với s1, s2, s3 là các
hằng số ứng với các xâu là từng dòng các kí tự như trên đề bài
B2.3. Nếu ch1=’R’ ta kiểm tra
B2.3.1. Nếu k1>0 thì s:=s+s1[k1-1];
B2.3.2. Nếu k2>0 thì s:=s+s2[k2-1]
B2.3.3. Nếu k3>0 thì s:=s+s3[k3-1]
B2.4. Nếu ch1=’L’ ta thực hiện:
B2.4.1. Nếu k1>0 thì s:=s+s1[k1+1];
B2.4.2. Nếu k2>0 thì s:=s+s2[k2+1]
B2.4.3. Nếu k3>0 thì s:=s+s3[k3+1]
Bước 3. Đưa ra xâu cần tìm: s
Code:
const

s1='qwertyuiop';

s2='asdfghjkl;';
s3='zxcvbnm,./';

var f,g:text; ch,ch1:char;
k1,k2,k3:byte;
s:ansistring;
BEGIN
assign(f,'keyboard.inp'); reset(f);
assign(g,'keyboard.out'); rewrite(g);
readln(f,ch1); s:='';
while not eof(f) do
begin
read(f,ch);
k1:=pos(ch,s1);k2:=pos(ch,s2); k3:=pos(ch,s3);
if ch1='R' then
begin
if k1>0 then s:=s+s1[k1-1];
if k2>0 then s:=s+s2[k2-1];
if k3>0 then s:=s+s3[k3-1];
end else
Trang 8


Sáng kiến kinh nghiệm tin học

begin
if k1>0 then s:=s+s1[k1+1];
if k2>0 then s:=s+s2[k2+1];
if k3>0 then s:=s+s3[k3+1];
end;

end;

writeln(g,s);

close(f); close(g);
END.

Câu 2. (Bài 3 – Kì thi chọn HSG lớp 10 THPT – Năm học: 2013 – 2014)
Cho bảng kích thước
được chia thành lưới ô vuông đơn vị. Các hàng
được đánh số từ
theo chiều từ trên xuống dưới. Các cột được đánh số từ
theo chiều từ trái qua phải. Ô nằm trên giao của hàng và cột được
gọi là ô
và trên đó ghi ký tự , kí tự này là chữ cái latin in hoa hoặc dấu #.
Mỗi từ trong bảng là một dãy liên tiếp các chữ cái trên cùng một hàng (tính từ
trái qua phải) hoặc một dãy liên tiếp các kí tự trên cùng một cột (tính từ trên
xuống dưới) sao cho hai từ liên tiếp trên cùng một hàng hoặc trên cùng một cột
cách nhau ít nhất bởi một dấu #. Yêu cầu: Tìm từ lớn nhất theo thứ tự từ điển.
Dữ liệu:
 Dòng Hai số nguyên dương
cách nhau ít nhất một dấu cách
 Dòng
: Dòng thứ
ghi ký tự liền nhau, kí tự thứ là
Kết quả: Ghi ra từ lớn nhất theo thứ tự từ điển.
Ràng buộc:
Ví dụ:
crosswrd.inp


crosswrd.out

45
#DACA
DA##B
ABB#B
ABBAC

DACA

Thuật toán: Với những test có m, n nhỏ ta có thể sử dụng mảng 2 chiều để thực
hiện bài toán sẽ dễ dàng hơn nhưng với test lớn, chẳng hạn như với m, n mang
giá trị tối đa theo yêu cầu đề bài thì sử dụng mảng 2 chiều sẽ tốn bộ nhớ và với
những máy tính thông thường hiện nay thì không thể chạy được, do vậy ta chỉ sử
dụng kiểu xâu lớn là ansistring, nhưng khi không sử dụng mảng 2 chiều thì việc
đọc và xử lý dữ liệu sẽ mất nhiều thời gian hơn do ta phải đọc từng kí tự.
Các bước xây dựng thuật toán:

Trang 9


Sáng kiến kinh nghiệm tin học

Lưu ý về việc sử dụng các biến s, max kiểu ansistring; ch kiểu char để đọc từng
kí tự trong xâu. Sử dụng thêm mảng xâu a kiểu ansistring có tối đa 1000 kí tự.
Bước 1. Đọc n, m {m tương ứng là số cột, n tương ứng là số hàng)
Bước 2. {Ta sẽ đọc dữ liệu và xử lý dữ liệu theo hàng ngang trước. Sau khi kết
thúc quá trình xử lý này ta sẽ thu được xâu lớn nhất theo hàng ngang của mảng
kí tự}
- B2.1. i:=1 ,gán s:=’’; max:=s

- B2.2. Trong khi i<=n ta thực hiện
o B2.2.0. Gán j:=1;
o B2.2.1. Trong khi j<=m thực hiện đọc dữ liệu bằng thủ tục
read(f,ch) và chuyển sang B2.2.2
o B2.2.2. Nếu ch=’#’ và s<>’’ thì kiểm tra maxo B2.2.3. Nếu ch<>’#’ thì s:=s+ch
o B2.2.4. Tăng j lên 1 đơn vị
o B2.2.5. Kiểm tra nếu j>m thì sử dụng lệnh xuống dòng ở tệp f để
xuống đầu dòng tiếp theo đọc dữ liệu và kiểm tra nếu maxmax:=s, s:=’’và chuyển sang B2.3. Nếu j<=m thì quay trở lại
B2.2.1
- B2.3. Tăng i và quay lại B2.2.
- B2.4. Thực hiện đóng tệp f (close(f))  mở tệp để đọc reset(f) để bắt đầu
đọc lại dữ liệu theo hàng dọc, nhưng trước đó phải sử dụng lệnh readln(f)
để bỏ qua dòng đầu tiên chứa 2 số n và m
Bước 3. {Đọc dữ liệu và xử lý dữ liệu theo hàng dọc, với việc xử lý theo hàng
dọc sẽ tốn thời gian hơn một chút}
- B3.1. Khởi tạo mảng a[i] có i chạy từ 1 đến m là rỗng
- B3.2. Gán j:=1 {chỉ số hàng}
- B3.3. Trong khi j<=n thì tiếp tục thực hiện
o B3.3.0. Gán i:=1
o B3.3.1. Trong khi i<=m thì thực hiện đọc dữ liệu bằng thủ tục
read(f,ch)
o B3.3.2. Nếu ch=’#’ và a[i] khác rỗng thì kiểm tra nếu maxlại max:=a[i] và a[i]:=’’ {rỗng}
o B3.3.3. Nếu ch<>’#’ thì a[i]:=a[i]+ch
o B3.3.4. Tăng I lên 1 đơn vị
o B3.3.5. Nếu i>m thì sử dụng lệnh readln(f) đưa con trỏ tệp xuống
đầu dòng tiếp theo còn i<=m thì quay lại B3.3.1
- B3.4. Tăng j lên 1 đơn vị


Trang 10


Sáng kiến kinh nghiệm tin học

- B3.5. Kiểm tra nếu j>n thì thực hiện cho biến k chạy từ 1 đến m nếu
a[k]>max thì gán max:=a[k] và chuyển sang Bước 4 còn không thì quay
trở lại B3.3.
Bước 4. Đưa ra max và kết thúc
Code:
VAR F,G:TEXT;
s,max:ansistring;ch:char;
a:array[1..1000] of ansistring;
i,j,m,n,k: integer;
BEGIN
assign(f,'crosswrd.inp'); reset(f);
assign(g,'crosswrd.out'); rewrite(g);
readln(f,n,m);
s:=''; max:=s; i:=1;
{Tim xau lon nhat theo hang ngang}
while (i<=n) do
begin
j:=1;
while j<=m do
begin
read(f,ch);
if (ch='#')and(s<>'') then
begin
if max

if (ch<>'#') then s:=s+ch;
inc(j);
if j>m then {Kiem tra xem ket thuc dong
chua}
begin
readln(f); {Dua tro chuot xuong
dau dong tiep theo}
if maxend;
end; inc(i);
end;
{Tim xau max theo hang doc}
close(f); reset(f);readln(f); {Mo lai tu dau tep va
xuong 1 dong}
for i:=1 to m do a[i]:='';
j:=1;
while j<=n do
begin
i:=1; while i<=m do
Trang 11


Sáng kiến kinh nghiệm tin học

begin
read(f,ch);
if (ch='#')and(a[i]<>'') then begin
if maxend;
if ch<>'#' then a[i]:=a[i]+ch;

inc(i);
if i>m then readln(f);
end;
inc(j); if j>n then
for k:=1 to m do
if (a[k]>max)then max:=a[k];
end;
write(g,max,length(max));
close(f); close(g);
END.

Với chương trình trên nếu như dữ liệu đầu vào gồm mảng 1000x1000 gồm toàn
các kí tự khác ‘#’ thì chương trình trên vẫn chưa giải quyết được.
Câu 3. (Bài 2 – Kì thi chọn HSG lớp 10 THPT – Năm học: 2012 – 2013)
Xâu moo: S[0]:='moo';
Với xâu k>=0, s[k+1]:=s[k]+'mo...'+s[k] trong đó 'mo.....' gồm k+3 kí tự 'o'
Chẳng hạn:
s[0]:='moo';
s[1]:='moomooomoo';
s[2]:='moomooomoomoooomoomooomoo'
Yêu cầu: cho n≤109, tất cả các xâu có độ dài không nhỏ hơn n đều có kí tự thứ n
giống nhau, yêu cầu in ra kí tự thứ n đó, là 'm' hay 'o'
Ví dụ: n=11  ‘m’
Thuật toán:
Bước 1. Nếu n>109 thì kí tự cuối cùng là ‘o’
Bước 2. Gán s1:=’moo’; k:=0;
Bước 3. Nếu n≤3 thì kí tự cần tìm là s1[n]
Bước 4. Nếu 3≤n≤109 thì
B4.1. j:=3; st:=’moo’
B4.2. Trong khi j

Tăng k lên 1 đơn vị; st:=st+’o’; s2:=s1; s1:=s2+st+s2; j:=length(s1)
B4.3. Nếu j=n thì kí tự cần tìm là ‘o’ còn ngược lại: d1:=length(s1)
Trong khi j>n thực hiện: giảm j, giảm d1.
Kết quả s1[d1]
Trang 12


Sáng kiến kinh nghiệm tin học

Code:
var s,st,s1,s2: ansistring;
k,n,j,d1: int64;
begin
readln(n);
s1:='moo'; k:=0;
if n>1000000000 then write('o') else
if n<=3 then write(s1[n]) else
begin
j:=3;st:='moo';
while jbegin
inc(k);st:=st+'o';s2:=s1;s1:=s2+st+s2;
j:=length(s1);
end;
if j=n then write('o') else
begin
d1:=length(s1);
while j>n do
begin
dec(j); dec(d1);

end; write(s1[d1]);
end;
end;
readln;
end.

Câu 4. (Bài 3 – Kì thi chọn HSG lớp 12 THPT – Năm học: 2012 – 2013)
(Tương tự Bài 2 – Kì thi chọn HSG lớp 10 THPT – Năm học: 2010 – 2011)
Số đẹp. Theo quan niệm của khoa học huyền bí phương Đông, số 6 được
coi là LỘC, số 8 được coi là PHÁT. Nhiều người cố gắng sở hữu các số này để
sử dụng cho số điện thoại, biển số xe,… Số đẹp là số trong biểu diễn thập phân
chỉ chứa 2 số trên. Dãy các số đẹp theo thứ tự là: 6, 8, 66, 68, 86, 88,…
Yêu cầu: tìm số đẹp thứ k (1≤k≤109)
Hướng dẫn thuật toán: với bài tập dạng này các bạn hãy vẽ dạng cây đồ thì với
bên trái là số nhỏ hơn, bên phải là số lớn hơn rồi lần lượt đánh trọng số từ 1, 2,
… Sau đó các bạn sẽ hiểu quy luật dựa vào code sau:
var k:int64;
s:ansistring;
begin
readln(k); {Nhap du lieu}
s:='';
Trang 13


Sáng kiến kinh nghiệm tin học

while k>2 do
begin
if k mod 2=0 then
begin

k:=k div 2-1; s:='8'+s;
end else
begin
k:=k div 2; s:='6'+s;
end;
end;
if k=1 then s:='6'+s;
if k=2 then s:='8'+s;
write(s); readln
end.

Câu 5. (Bài 3 – Kì thi chọn HSG lớp 10 THPT – Năm học: 2011 – 2012)
Số lớn nhất
Cho xâu S độ dài N là biểu diễn thập phân của một số nguyên dương, hãy tìm số
lớn nhất nhận được bằng cách gạch bỏ đi N chữ số trong xâu S
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 S gồm 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≤kVí dụ
NUMMAX.INP

NUMMAX.OUT

NUMMAX.INP

NUMMAX.OUT


31
991

99

42
1924

94

Thuật toán:
Bước 1. M:=n-k với m là số chữ số cần giữ lại
W:=’’ với w là xâu sau khi đã gạch bỏ đi k chữ số; vt:=1;
Bước 2. Trong khi length(w)sang Bước 3
B2.1. max:=s[vt] trong đó s là xâu ban đầu; vt1:=vt
B2.2. Xét từ vị trí vt tới vị trị n-(m-length(w))+1 của xâu s (j=vtn-(mlength(w))+1. Nếu maxB2.3. w:=w+max; vt:=vt1+1 rồi quay lại Bước 2
Trang 14


Sáng kiến kinh nghiệm tin học

Bước 3. Đưa ra xâu w
Code:
VAR k,n,vt,m,j,vt1:longint;
s,w:ansistring;
max:char; g,f:text;
BEGIN
Assign(f,’nummax.inp’);reset(f);

Assign(g,’nummax.out’;rewrite(g);
readln(f,n,k); readln(f,s);
m:=n-k; {So chu so can giu lai}
w:=''; {xau can tim} vt:=1;
while length(w)begin
max:=s[vt]; vt1:=vt;
for j:=vt to n-(m-length(w))+1 do
if maxmax:=s[j]; vt1:=j;
end;
w:=w+max; vt:=vt1+1 ;
end;

write(g,w);

close(f); close(g);
END.

Câu 6. (Bài 3 – Kì thi chọn HSG lớp 10 THPT – Năm học: 2010 – 2011)
Xâu con đối xứng:
Với mỗi xâu T, ta kí hiệu Tr là 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 T được gọi là xâu đối xứng nếu T
= Tr, chẳng hạn abccba, xyzyx là các xâu đối xứng.
Cho xâu S, xác định độ dài xâu con đối xứng dài nhất của S
Dữ liệu (spalin.inp): Chứa xâu S, độ dài không vượt quá 1000, chỉ gồm các chữ
cái latin a..z, A..Z
Kết quả (spalin.out): số nguyên là độ dài xâu con đối xứng dài nhất của S
Ví dụ:
Spalin.inp


Spalin.out

Aaaaxyyxxyyxbbbb

8

Thuật toán:

Trang 15


Sáng kiến kinh nghiệm tin học

Bước 1. Viết hàm đối xứng có kiểu trả về là true nếu xâu đối xứng còn trả về
false nếu xâu không là xâu đối xứng
Bước 2. Kiểm tra xâu s đối xứng thì kết quả là length(s) còn ngược lại chuyển
sang bước 3
Bước 3. Gán d:=length(s)-1 {Sử dụng d để kiểm tra từ xâu có độ dài lớn hơn tới
xâu có độ dài nhỏ dần}
Bước 4. Trong khi d>0 thì thực hiện
B4.1. Cho I chạy từ 1 tới length(s)-d+1 thì thực hiện:
B4.1.1. st:=copy(s,I,d);
B4.1.2. Kiểm tra nếu st là đối xứng thì in ra d chính là độ dài của xâu con đối
xứng dài nhất và sử dụng break để thoát khỏi vòng lặp
B4.2. Kiểm tra nếu khi chưa tìm được xâu đối xứng thì tiếp tục giảm d còn đã
tìm được xâu đối xứng thì gán d:=0 để thoát khỏi vòng lặp ở Bước 4
Code:
Var g, f:text;d, max, i:word; s, st:ansistring;
{Ham kiem tra tinh doi xung cua mot xau}

Function dx(s1:ansistring):boolean;
Var

tg:boolean; j:word;

begin
tg:=true;
for j:=1 to length(s1) div 2 do
if s1[j]<>s1[length(s1)-j+1] then
begin tg:=false;

break;end;

dx:=tg;
end;
BEGIN
assign(f,'spalin.inp'); reset(F);
assign(g,'spalin.out'); rewrite(G);
readln(f,s);
if dx(s) then write(g,length(S)) else
begin
d:=length(s)-1;
while d>0 do
begin
for i:=1 to length(s)-d+1 do
begin
st:=copy(s,i,d);
Trang 16



Sáng kiến kinh nghiệm tin học

if dx(st) then
begin

write(g,d);

break;

end ;

end;
if dx(st)=false then dec(d) else d:=0;
end;
end;

close(f); close(g);

END.

Câu 7. (Bài 2 – Kì thi chọn HSG lớp 12 THPT – Năm học: 2008 – 2009)
Đối xứng
Xét các chữ cái Latin in hoa font Arial:

Một số chữ cái có tính chất đặc biệt:
1) Đối xứng gương qua trục đối xứng đứng, ví dụ chữ cái A (A|A), ngoài A còn
có chữ cái H, I, M, O, T, U,V,W, X, Y cũng có tính chất nói trên
2 Đối xứng gương qua trục đối xứng ngang, ví dụ chữ cái B có tính chất như
vậy, cùng với B còn có các chữ cái C, D, E, H, I, O, X
3) Không đổi khi xoay kí tự 1800, ví dụ chữ S, các chữ cái H, I, N, O, X, Z cũng

có tính chất này
Một xâu có tính chất đặc biệt nếu như mỗi kí tự của xâu đều có tính chất đặc biệt
đó. Ví dụ ‘OTO’ có tính chất 1, ‘DEO’ có tính chất 2, ‘SOS’ có tính chất 3. Có
những xâu có cả 3 tính chất trên như xâu ‘OHO’
Yêu cầu với mỗi xâu cho trước không có quá 250 kí tự, hãy xác định xâu đã cho
có tính chất trên hay không.
Ứng với mỗi xâu dữ liệu vào đưa ra một dòng tương ứng xâu 3 kí tự + hoặc –
cho biết xâu có tính chất thứ nhất, tính chất thứ hai, tính chất thứ ba hay không?
Với dấu + là có, dấu – là không
Ví dụ: OZONOZO  --+
TOMATO  +-Thuật toán: ta sử dụng kiểu tập hợp để giải quyết bài toán này (có thể có nhiều
cách giải quyết khác nhau).
Bước 1. Nhập xâu vào s
Bước 2. Gán 3 biến kiểu tập hợp tương ứng với các kí tự thỏa mãn 3 tính chất
của đầu bài, mỗi nhóm kí tự có tính chất giống nhau sẽ đưa vào 1 biến kiểu tập
hợp

Trang 17


Sáng kiến kinh nghiệm tin học

Bước 3. Duyệt từ đầu xâu tới cuối xâu, nếu tại vị trí s[i] thuộc tính chất nào thì
tương ứng tăng biến đếm lên 1 đơn vị (3 biến đếm tương ứng với 3 tính chất là
d1, d2, d3)
Bước 4. Sau khi duyệt xong toàn bộ xâu, kiểm tra 3 biến đếm, nếu biến đếm nào
có giá trị bằng n tương ứng sẽ có tính chất đó còn ngược lại thì các kí tự trong
xâu không có tính chất tương ứng.
Bước 5. Đưa ra xâu kết quả và kết thúc
Code:

var f,g:text;
t1,t2,t3:set of char;
i,n,d1,d2,d3:integer;
s1,s:string;
k1,k2,k3:boolean;
begin
s:='TOMATO';
t1:=['A','H','I','O','T','U','V','W','X','Y','M'];
t2:=['B','C','D','E','H','I','O','X'];
t3:=['S','H','I','N','O','X','Z'];
for i:=1 to length(s) do
begin
if s[i] in t1 then inc(d1);
if s[i] in t2 then inc(d2);
if s[i] in t3 then inc(d3);
end;

n:=length(s); s1:='';

if d1=n then s1:=s1+'+' else s1:=s1+'-';
if d2=n then s1:=s1+'+' else s1:=s1+'-';
if d3=n then s1:=s1+'+' else s1:=s1+'-';
writeln(s1);
readln
end.

Câu 8. Tìm chữ số thứ k trong dãy số sắp xếp theo quy luật
12345678910…
a. 012345678910111213141516…
b. 02468101214161820…

c. 1123581321…

Trang 18


Sáng kiến kinh nghiệm tin học

Thuật toán không chạy được với dữ liệu đầu vào quá lớn nhưng với giải thuật
này có thể sử dụng để áp dụng với nhiều bài toán tương tự như các phần a, b, c ở
trên. Code:
{chu so thu k tu day 1234567891011121314...}
var

k,n,i:longint; j:byte; s:string;

BEGIN
writeln('nhap k=');readln(k);
if k<10 then writeln(k)else
begin
i:=9;n:=9;
while ibegin
inc(n);s:='';

str(n,s);

i:=i+length(s);

end;
j:=length(s);

while (i>k) do begin dec(j);dec(i); end;
writeln('chu so can tim la:',s[j]);
end

;

readln
END.

Câu 9. Thành lũy
Tên thành lũy phải được chọn là 1 xâu con có các kí tự liên tiếp nhau của xâu W
nào đó, VD: W=’baobaab’ thì tên thành lũy có thể là ‘a’, ‘ba’, ‘baab’,… Các
thành lũy ko được đặt trùng tên. ? Có thể xây dựng tối đa bao nhiêu thành lũy từ
tên W
Input: Bastion.inp gồm 1 dòng chứa tên W, là các chữ cái latinh <255 kí tự
(không chứa dấu cách)
Output: bastion.out chứ 1 số nguyên là số lượng các tên thành lũy
VD:
bastion.inp

bastion.out

baobaab

23

Thuật toán:
- Cho biến I chạy từ đầu xâu đến cuối xâu {I tương ứng là độ dài của xâu
con}
- Gán d:=length(s)-i+1; d1:=d; {d1 chính là số xâu con có độ dài i}

- Tìm kiếm các xâu con có độ dài I giống nhau:
Trang 19


Sáng kiến kinh nghiệm tin học

o Cho j chạy từ 1 đến d
o Gán S1:=copy(s,j,i); k:=pos(s1,s)
o Kiểm tra nếu k<>0, knhau}
- Gán t:=t+d1 {Khi chạy hết vòng lặp của I thì ta tìm ra được số xâu con
của xâu s tương ứng chính là số tên cần tìm của bài toán}
- Đưa ra t
Code:
VAR

s,s1:ANSISTRING; j,i,k:LONGINT; d,d1,t:INT64;

BEGIN
readln(s);
FOR i:=1 TO length(s) DO
BEGIN
d:=length(s)-i+1; d1:=d;
FOR j:=1 TO d DO
BEGIN
s1:=copy(s,j,i);

k:=pos(s1,s);

IF (k<>0)AND (k

END;
t:=t+d1;
END;
writeln(t); readln;
END.

5.

Một số lưu ý
- Các code (chương trình Pascal) cho từng bài ở trên là ý kiến chủ quan của
cá nhân tôi nên có phần nào còn chưa được chuẩn xác mong rằng sẽ có sự
phản hồi từ các bạn đọc.
- Những bài trên đây phần lớn chỉ ra hướng giải quyết chứ code vẫn chưa
chạy được với test với dữ liệu vào quá lớn
- Code của các bài ở trên có thể không sử dụng kiểu dữ liệp tệp, đây là
phần cơ bản nên tất cả các bài tôi có thể chỉ đưa ra phần code chính và
hiển thị kết quả ra màn hình.
- Mỗi bài toán có thể có nhiều thuật toán khác nhau, những thuật toán tôi
đưa ra và những chương trình ở trên có thể chưa phải là cách giải quyết
tối ưu. Hãy coi đó là những thuật toán bổ sung để cải thiện cách giải quyết
các vấn đề nếu như bạn chưa có cách giải quyết bài toán tốt hơn.

Trang 20


Sáng kiến kinh nghiệm tin học

PHẦN III. KẾT LUẬN VÀ KIẾN NGHỊ
6.


Kết luận

- Bản sáng kiến kinh nghiệm trên đây là những kiến thức mà bản thân tôi đã lĩnh
hội được. Có thể mỗi người sẽ có cách giải quyết, trình bày khác nhau nên bản
sáng kiến này mang tính chất cá nhân nên mong bạn đọc có thể đóng góp những
bài toán và thuật toán hay hơn.
- Kiểu xâu kí tự trong ngôn ngữ lập trình Pascal nói riêng, và các ngôn ngữ lập
trình khác nói chung không phải bất cứ ai cũng có thể thành thạo. Do vậy, muốn
học tốt, dạy tốt chúng ta phải tìm hiểu thật nhiều, làm thật nhiều các bài toán
khác nhau như dân gian đã có câu nói “tích tiểu thành đại”.
- Trên đây chỉ là những bài tập mà tôi cảm thấy hay, tuy nhiên còn có rất nhiều
các dạng bài tập khác về xâu mà có thể ngay đến chính bản thân tôi vẫn chưa
nghĩ ra thuật toán, hoặc cũng có những bài tập đơn giản hơn. Nhưng mong rằng
sẽ có sự đóng góp của mọi người về các bài tập ở trên và chỉ ra những lỗi sai nếu
có. Tôi xin cảm ơn rất nhiều!
7.

Kiến nghị

- Như mọi người đều đã biết tất cả các đề thi HS giỏi tỉnh Vĩnh Phúc môn tin
học thường rất khó để biết được code chính xác. Và gần như bản thân tôi cũng
như các HS khi lập trình để giải các bài tập này thường không chạy được giá trị
ở cận lớn nhất mà các bài toán đưa ra. Do vậy, rất mong có được những đáp án
để GV và HS có thể tham khảo.
- Khi giới hạn kiến thức đối với những môn khác có thể giới hạn ở chương trình
như thế nào, học đến đâu nhưng với môn Tin học là vô vàn, không giới hạn do
vậy GV và HS như những trường chúng tôi cũng chỉ biết dạy và học “mò”, rất
mong bằng phương pháp nào đó có thể cải thiện được vấn đề này.
- Có rất nhiều trường THPT trên địa bàn tỉnh Vĩnh Phúc được trang bị những
phòng học đa năng rất tốn kém nhưng hầu như ít sử dụng tới, tôi rất mong Sở

giáo dục có những biện pháp khuyến khích việc sử dụng các phòng học đó một
cách có hiệu quả nhất.

Trang 21


Sáng kiến kinh nghiệm tin học

NHẬN XÉT CỦA TỔ CHUYÊN MÔN VÀ HỘI ĐỒNG CHẤM
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................

.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
.................................................................................................................................
PHỤ LỤC CÂU HỎI
Trang 22


Sáng kiến kinh nghiệm tin học

Câu 1. (Bài 2 – Kì thi chọn HSG lớp 12 THPT – Năm học: 2014 – 2015).....................8
Câu 2. (Bài 3 – Kì thi chọn HSG lớp 10 THPT – Năm học: 2013 – 2014)...................10
Câu 3. (Bài 2 – Kì thi chọn HSG lớp 10 THPT – Năm học: 2012 – 2013)...................13
Câu 4. (Bài 3 – Kì thi chọn HSG lớp 12 THPT – Năm học: 2012 – 2013) (Tương tự
Bài 2 – Kì thi chọn HSG lớp 10 THPT – Năm học: 2010 – 2011)................................14
Câu 5. (Bài 3 – Kì thi chọn HSG lớp 10 THPT – Năm học: 2011 – 2012)...................15
Câu 6. (Bài 3 – Kì thi chọn HSG lớp 10 THPT – Năm học: 2010 – 2011)...................16
Câu 7. (Bài 2 – Kì thi chọn HSG lớp 12 THPT – Năm học: 2008 – 2009)...................18
Câu 8. Tìm chữ số thứ k trong dãy số sắp xếp theo quy luật........................................19
Câu 9. Thành lũy..........................................................................................................20


Trang 23


Sáng kiến kinh nghiệm tin học

DANH MỤC TÀI LIỆU THAM KHẢO
1. Sách
[1]. Hồ Sĩ Đàm, Tin học 11, NXB Giáo dục, 2008
[2]. Hồ Sĩ Đàm, Bài tập tin học 11, NXB Giáo dục, 2008
[3]. Quách Tất Kiên, Kiểm tra đánh giá thường xuyên và định kì môn Tin học
lớp 11, NXB Giáo Dục, Hà Nội, 2008.
[4]. Đinh Văn Đồng, Tự học Turbo Pascal, NXB Văn hóa - Thông tin, 2006
[5]. Lê Khắc Thành, Giáo trình Pascal, NXB Đại học sư phạm
2. Các trang Web
/> /> />o/threads/ngon-ngu-lap-trinh-pascal-11-xau-ki-tu.63/

Trang 24



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×