Tải bản đầy đủ
Các bài tập nâng cao xử lý xâu

Các bài tập nâng cao xử lý xâu

Tải bản đầy đủ

- Chương trình Rút gọn xâu
Program rutgonxau;
Var St:String;
i: Byte;
begin
write(‘nhap vao xau st’);
readln(st);
i:=1;
while ibegin
if st[i]=st[i+1] then

delete(st,i,1)

else inc(i);
end;
writeln(‘ket qua la:’, St);
readln;
end.
b) Xâu con, xâu con đối xứng
Bài tập 1: Xâu con đối xứng
Cho một xâu S có độ dài không vượt quá 255 kí tự; đếm số lượng xâu con đối
xứng của S. (xâu chỉ gồm 1 ký tự cũng được gọi là xâu con đối xứng)
- ý tưởng: duyệt và tìm tất cả các xâu con của xâu S, mỗi xâu tìm được tiến
hành kiểm tra, nếu xâu đó đối xứng thì tăng giá trị biến đếm lên 1 đơn vị
Chương trình tham khảo (không sử dụng cách viết theo chương trình con vì học
sinh chưa học đến nội dung chương trình con)
Program
Var

demxaudoixung;

S, P,Q:string;
i,j,k,d:word;

begin
write(‘nhap xau S=’);
readln(s);
d:=0;
for i:=1 to length(s) do
for j:=1 to length(s)+1-i do
begin
p:=Copy(s,j,i);
Q:=’’;

14

for k:=1 to length(p) do
Q:=p[k] + Q;
If (P = Q) then Inc(d);
End;
Write(‘so luong xau con doi xung la:’,d);
Readln;
End.
Bài tập 2: Tìm xâu con đối xứng dài nhất
Cho một xâu S có độ dài không vượt quá 255 kí tự; tìm xâu con đối xứng dài
nhất của xâu S
Cách 1:
- Ý 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; {GV giới thiệu thêm kiểu
ansistring }
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
15

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.
Cách 2: Sử dụng phương pháp tìm kiếm tuần tự tương tự bài tập 1 nhưng duyệt
theo chiều ngược lại của biến i đối với xâu S
Program
Var

demxaudoixung;

S, P,Q:string;
i,j,k:word;

begin
write(‘nhap xau S=’);
readln(s);
for i:=length(s) downto 1 do
for j:=1 to length(s)+1-i do
begin
p:=Copy(s,j,i);
Q:=’’;
for k:=1 to length(p) do
Q:=p[k] + Q;
If (P = Q) then
Begin
Write(‘xau con dxdai nhat la:’,P);
Readln;
Exit;
End;
End;
Write(‘xau con doi xung dai nhat la:’,s[1]);
Readln;
End.
Với cách viết này học sinh không cần sử dụng phương pháp quy hoạch động
(phương pháp mà đa số học sinh không hiểu cách vận dụng, liên quan đến kiểu dữ liệu
mảng 2 chiều đã giảm lược khỏi chương trình tin học phổ thông).

16

c. Ứng dụng kiểu xâu vào giải các bài toán kiểu số nguyên
Bài tập 1: 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?
HS:
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
+ 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.
Chương trình:
Program somoidaonguoc;
Uses crt;
Var a,bi,code: longint;
S1,s2:string;
Begin
Write(‘nhap so a’);

Readln(a);

Str(a,s1);
S2:=’’; {tạo xâu rỗng s2}
For i:=length(s1) downto 1 do s2:=s2+s1[i];
Val(s2,b,code);
Write(b);
Readln;
End.
Bài tập 2: 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
Chương trình bài tập 3:
Program taosonguyen;
var

s,h:string;
i,n:integer;

Begin

17

Write('Nhap n=');
Readln(n);
s:='';
for i:=1 to n do
begin
str(i,h);
s:=s+h;
end;
writeln(s);
Repeat
for i:=1 to length(s) do
if i mod 2<>0 then s[i]:=' ';
while pos(' ',s)<>0 do delete(s,pos(' ',s),1);
for i:=1 to length(s) do
if i mod 2=0 then s[i]:=' ';
while pos(' ',s)<>0 do delete(s,pos(' ',s),1);
Until length(s)<=1;
Writeln('KET QUA LA:',S);
Readln;
End.
3. Bài tập tự luyện
Bài 1. 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 2. Chuẩn hóa văn bản
Một văn bản được gọi là văn bản chuẩn hóa nếu:
- Hai từ liền nhau có duy nhất một dấu cách
- Dấu ngắt câu (dấu chấm, dấu chấm phẩy, dấu chấm hỏi, dấu chấm than) được đặt sát
vào từ ngay trước nó, sau đó mới đến dấu cách trống
- Dấu mở ngoặc đặt sát vào phía bên trái của từ bắt đầu mở ngoặc
- Dấu đóng ngoặc đặt sát vào phía bên phải của từ cuối cùng được đóng ngoặc
Hãy viết chương trình kiểm tra và đưa một đoạn văn bản về dạng chuẩn
Input: vanban.inp
Output: vanban.out văn bản đã được chuẩn hóa
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

18

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: 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ừ.
+ Bài toán tách họ tên trong dánh sách.
+ 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
IV. KẾT QUẢ NGHIÊN CỨU
- Bảng số liệu kết quả đạt được của học sinh lớp 11 năm học 2015 -2016 khi chưa thực
hiện đề tài:
STT

Lớp

Sĩ số

Giỏi

Khá

1

11A

43

81.4%

18.6%

2

11B

43

27.9%

65.1%

TB

Áp dụng
phương
pháp


7%

Không

- Bảng số liệu kết quả đạt được của học sinh lớp 11 năm học 2016-2017 sau khi thực
hiện đề tài:
STT

Lớp

Sĩ số

Giỏi

Khá

TB

Áp dụng
phương
pháp

1

11A

40

77.5%

22.5%

không

2

11B

41

97.6%

2.4%



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ới phương pháp giảng dạy này, năm học 2015 – 2016 đội tuyển học sinh giỏi
do tôi hướng dẫn đã đạt giải học sinh giỏi cấp tỉnh với 1 giải ba và 1 giải khuyến
khích.

19