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

Kiểu xâu và kỹ năng vận dụng kiểu xâu qua hệ thống các dạng bài tập

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 (131.24 KB, 20 trang )

A. PHẦN MỞ ĐẦU
1. Lí do chọn đề tài
Trong thực tiễn dữ liệu vào của các bài toán đều liên quan đến các kiểu dữ
liệu khác nhau, để tiện cho việc lập trình và xử lý dữ liệu chúng ta thường đưa
dữ liệu đó về các dạng kiểu dữ liệu chuẩn hoặc kiểu dữ liệu có cấu trúc, một
trong những kiểu dữ liệu có cấu trúc đó là kiểu xâu.
Qua quá trình tham gia giảng dạy Tin học khối 11 ở trường THPT Thiệu
Hóa, 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 không
phải là 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 khá 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 kiểu dữ liệ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. Kỹ năng khi
làm việc với kiểu dữ liệu xâu của học sinh thường không đáp ứng được yêu cầu
đề ra.
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. Nguyên nhân dẫn đến những khó khăn mà học sinh thường gặp là:
+ Gặp khó khăn khi xác định bài toán đặc biệt là xác định dạng bài toán về
kiểu dữ liệu xâu.
+ Khó liên hệ phương pháp giải một bài toán trong toán học với thuật toán
trong tin học.
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ì việc học tập tự giác, tích cực, chủ động,
sáng tạo đò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 do gợi động cơ.
1




Xuất phát từ thực tiễn giảng dạy tại trường THPT Thiệu Hóa, tôi thấy
rằng để đạt hiệu quả cao trong mỗi phần học, tiết học cần có 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, phương tiện dạy học
phải phù hợp với từng đối tượng học sinh. Để qua mỗi phần học, tiết học, học
sinh thích thú với kiến thức mới, hiểu được kiến thức đã học trên lớp, đồng thời
thấy được tầm quan trọng của vấn đề: trước là ứng dụng của kiến thức để đáp
ứng những yêu cầu của môn học, sau đó là ứng dụng vào thực tiễn trong đời
sống xã hội.
Với những lí do trên tôi đã nghiên cứu chuyên đề “Kiểu dữ liệu xâu và kỹ
năng vận dụng kiểu xâu qua hệ thống các dạng bài tập” với mong muốn phần
nào giúp học sinh cũng như giáo viên trong việc tìm ra lời giải cho một số bài
toán liên quan tới kiểu dữ liệu xâu dễ dàng hơn, nhất là giúp cho các em học
sinh có thể yêu thích nhiều hơn nữa ngôn ngữ lập trình Pascal. Chuyên đề được
trình bày dựa trên kinh nghiệm giảng dạy của bản thân và tham khảo một số tài
liệu liên quan.
2. Mục đích nghiên cứu
- Khắc sâu kiểu dữ liệu xâu: khái niệm, cách khai báo, các phép toán, các hàm
và thủ tục trên kiểu dữ liệu xâu.
- Hệ thống các bài toán về kiểu xâu 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.
3. Đối tượng nghiên cứu
- Đối tượng khảo sát: Học sinh khối 11, cụ thể lớp: 11I, 11P.
- Sử dụng ngôn ngữ lập trình Turbo Pascal và Free Pascal để tiến hành lập
trình các bài tập thực nghiệm.
- 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 bài tập về kiểu dữ liệu xâu. Phạm vi thực
hiện trên kiểu dữ liệu xâu.

4. Phương pháp nghiên cứu
- Phương pháp nghiên cứu
2


+ Kết hợp thực tiễn giáo dục ở trường THPT Thiệu Hóa
+ Có tham khảo các tài liệu về ngôn ngữ lập trình Pascal và tài liệu về
sáng kiến kinh nghiệm của đồng nghiệp.
- Phương pháp thuyết trình, quan sát, điều tra cơ bản, phân tích kết quả thực
nghiệm sư phạm,v.v… phù hợp với bài học và môn học.
5. Đóng góp của đề tài
- Học sinh sau khi được giới thiệu một cách hệ thống các dạng bài tập về xâu
và quy trình giải quyết từng dạng đã có thể nhận biết yêu cầu của bài toán và
cách thức giải quyết chúng một cách hiệu quả.
- Hình thành ở HS 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, sử dụng thành thạo vòng lặp biết trước, thủ tục chuẩn vào/ra đơn giản, bước
đầu làm quen với 1 số chương trình con chuẩn dạng thủ tục / hàm tạo điều kiện
thuận lợi cho việc tiếp thu kiến thức về cách viết chương trình có cấu trúc.
- Mở rộng một số bài tập kiểu xâu để học sinh thấy được ứng dụng quan trọng
của kiểu dữ liệu xâu trong lập trình.
- Sáng kiến kinh nghiệm được áp dụng tại lớp 11I, 11P năm học 2019-2020
trường THPT Thiệu Hóa, Thanh Hóa.

3


B. NỘI DUNG
1. Cơ sở lí luận
Pascal là ngôn ngữ khởi đầu, là hành trang cho các em tiếp cận những
ngôn ngữ bậc cao khác dễ dàng hơn. Nhưng để làm được như vậy các em cần

phải hiểu và viết được các chương trình trong Pascal một cách linh hoạt. Muốn
vậy các em cần nắm vững cú pháp, ngữ nghĩa của Pascal, sử dụng thành thạo
các câu lệnh và biết lựa chọn, vận dụng kiều dữ liệu phù hợp cho bài toán. Nhất
là kiểu dữ liệu xâu.
2.Thực trạng của việc sử dụng các kiếu dữ liệu
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 khá 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:
+ Sử dụng các biến điều khiển.
+ Tác động đến biến điều khiển ngay trong vòng lặp.
+ Thông báo kết quả trong vòng lặp dẫn đến tình trạng lặp lại việc thông
báo kết quả khi thực hiện chương trình.
- Với cấu trúc lặp có số lần chưa biết trước HS cũng gặp phải những khó khăn
như:
+ Xác định điều kiện để kết thúc vòng lặp.
+ Khó xác định cấu trúc lặp để triển khai.
+ Thường bỏ quên việc tác động đến điều kiện để kết thúc vòng lặp.
3.Triển khai nội dung vấn đề nghiên cứu
Chương I. Những kiến thức cơ bản về kiểu xâu
1. Khái niệm, tham chiếu đến phần tử xâu
- Khái niệm: Xâu là dãy các 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 một xâu được gọi là độ dài của xâu.
Xâu có độ dài bằng 0 được gọi là xâu rỗng. Trong Turbo Pascal xâu rỗng được
viết bởi ‘’.
VD: cho xâu s=‘Tin hoc’, xâu S có số kí tự 7 =>độ dài xâu s là 7.
4


- Tham chiếu đến phần tử xâu: <tên biến xâu>[chỉ số phần tử]

VD; s[1]=’T’, s[3]=’n’
2. Khai báo: Var <tên biến xâu>: string[độ dài lớn nhất của xâu];
VD: var hoten:string[30];
S:string; {xâu s sẽ có độ dài 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 = 2 30
B
3. Cách nhập/xuất: Cách đọc hay viết kiểu xâu tương tự như các kiểu dữ liệu
khác, ta sử dụng các thủ tục READ, hoặc WRITE.
Ví dụ: Readln(s); Writeln(s);
Chương II. Các phép toán, thủ tục và hàm về xâu
1. Phép ghép xâu : kí hiệu là dấu cộng (+), dùng để ghép nhiều xâu thành một.
VD: ‘Song’ + ’Hong’ cho kết quả cho xâu ‘SongHong’
2. 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 cặp xkí tự đầu tiên khác nhau giữa chúng kể từ trái sang
phải trong xâu A có mã ASCII lớn hơn.
VD: ‘an’>’An binh’, kí tự ‘a’ có mã ASCII là 97, kí tự ‘A’ có mã ASCII là 65.
- 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< B.
VD: ‘hoa’ < ’hoa binh’,
- A=B nếu xâu A và B giống nhau hoàn toàn
VD: ‘hoa’=’hoa’, ‘hoa’<>’Hoa’
3. Một số thủ tục xử lý xâu:
- Thủ tục Delete(s,vt,n): Xóa n kí tự của xâu s, bắt đầu từ vị trí vt
VD: Nếu S=’song’ thì Delete(s,1,3)

cho kết quả S=’g’


- Thủ tục Insert(s1,s2,vt): Chèn xâu s1 vào s2, bắt đầu ở vị trí vt
VD: Nếu S1=’Hinh’ và S2=’hoc’ thì Insert(s1,s2,1) cho kết quả S1=’Hinhhoc’
5


- Thủ tục str(value,s): chuyển đổi giá trị kiểu số (value) sang dạng xâu kí tự và
gán cho biến s.
VD: n:=265;
str(n,s) sẽ cho kết quả xâu s là s=’265’
- Thủ tục val(s,value,code): đổi xâu kí tự s sang dạng số và gán cho biến value,
nếu biến đổi thành công thì code nhận giá trị bằng 0, ngược lại cho giá trị khác
0.
VD: val(‘195’,value,code) lúc này code=0 và value=195
4. Một số hàm:
TT
Hàm
Ý 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
1 Copy(s,vt,n)
2 Length(s)
Cho giá trị là độ dài xâu s
3 Pos(s1,s2)
Cho vị trí xuất hiện đầu tiên của xâu s1 trong xâu s2
4 Upcase(ch)
Cho chữ cái in hoa ứng với chữ cái trong ch
5 Ord(ch)
Cho mã của kí tự ch trong bảng mã ASCII
6 Chr(n)
Cho kí tự có mã là n

7 Concat(s1,s2,..,sn) 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
Chương III: Các dạng bài tập thường gặp
1. Dạng 1: Một số bài tập củng cố kiến thức, tạo hứng thú cho học sinh:
Bài tập 1: Viết chương trình nhập vào một xâu ký tự từ bàn phím. Đổi xâu ký tự
đó sang chữ in hoa rồi in kết quả ra màn hình.
Ví dụ: Input: ‘le thi hoa’
Output: ‘LE THI HOA’
GV nêu câu hỏi: Ứng dụng của viết chữ in hoa các em gặp trong những trường
hợp nào?
HS: khi đi làm giấy khai sinh, kê khai lý lịch, làm hồ sơ thi tốt nghiệp, ĐHCĐ…
GV: Làm thế nào để khi ta nhập họ tên vào máy là chữ thường thì khi hiện lên
trên màn hình là chữ in hoa có dấu?
HS: sử dụng hàm upcase(ch)
Giáo viên: Nhưng hàm upcase(ch) chỉ đổi được 1 kí tự thành ký tự in hoa, ở đây
chúng ta đổi cả 1 xâu kí tự? vậy chúng ta xử lý vấn đề này như thế nào?
HS: đưa ra cách xử lý.
6


Giáo viên: Chúng ta đã biết có thể coi xâu là mảng 1 chiều mà mỗi phần tử là
một kí tự. Mỗi kí tự của xâu được đánh số thứ tự thường bắt đầu từ 1, số kí tự
của xâu chính là độ dài của xâu. Vậy để có thể chuyển 1 xâu nhập từ bàn phím
thành chữ in hoa thì ta sẽ chuyển từng kí tự trong xâu thành kí tự in hoa: duyệt
lần lượt từng phần tử trong xâu và gán phần tử đó bằng giá trị mới upcase(ch);
Câu lệnh for i:=1 to length(s) do S[i]:=upcase(S[i]); dùng để thực hiện yêu cầu
đó.
GV gọi học sinh lên bảng viết chương trình. HS viết chương trình, sau đó GV
nhận xét, sửa chữa nếu có sai sót. Chạy chương trình để HS theo dõi kết quả
thực hiện.
Chương trình:

Program inhoa;
Var

S: String;i:Byte;

Begin
Write(‘Nhap xau S: ‘); Readln(S);
For i:=1 to length(S) do S[i]:=Upcase(S[i]);
Write(‘Xau ket qua: ‘, S);
Readln;
End.
Bài tập 2: Nhập 1 xâu S từ bàn phím (S<=80), đư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: ‘Hello’
Output: ‘olleH’
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?
Học sinh trả lời:
GV: Để 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?
7


HS: trả lời
GV gọi học sinh lên bảng viết CT, 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.
Chương trình:

Program xaunguoc;
Var

S: String[80]; i:Byte;

Begin
Write(‘Nhap xau S: ‘); Readln(S);
For i:=length(S) downto 1 do write(S[i]);
Write(‘Xau nguoc cua xau s la: ‘, S);
Readln;
End.
Bài tập 3: Nhập 1 xâu từ bàn phím, đưa xâu đó ra giữa màn hình, chuyển động
dần về bên trái, các ký tự đầu xâu sẽ lần lượt mất đi nhưng lại xuất hiện lần lượt
ở cuối xâu. Tô màu cho xâu xuất hiện trên màn hình.
GV chạy thử chương trình cho học sinh quan sát kết quả thực hiện, sau đó giáo
viên hướng dẫn HS viết chương trình có sử dụng 2 thủ tục chuchay và catdan ở
bài tập và thực hành số 6, giải thích các câu lệnh trong 2 thủ tục.
Procedure catdan(s1:st79; var s2:st79);
begin
s2:=copy(s1,2,length(s1)-1)+s1[1];
end;
Procedure cangiua(var s:st79);
var i,n:integer;
begin
n:=length(s);
n:=(80-n) div 2;
for i:=1 to n do s:=s+ ‘ ‘;
8



end;
Chương trình: (giáo viên đã cài sẵn trên máy):
Program chuchay;
uses Crt;
type st79=string[79];
var

s1,s2: st79;
stop:bolean;

Procedure catdan(s1:st79; var s2:st79);
begin
s2:=copy(s1,2,length(s1)-1)+s1[1];
end;
Procedure cangiua(var s:st79);
var i,n:integer;
begin
n:=length(s);
n:=(80-n) div 2;
for i:=1 to n do s:=s+ ‘ ‘;
end;
begin
clrscr;
write(‘Nhap xau s1: ‘);
readln(s1);
stop:=false;
while not(stop) do
begin
gotoxy(1,12);
write(s1);

delay(600);
catdan(s1,s2);
s1:=s2;
9


stop:=keypressed
end;
readln;
end.
Ở bài này HS được củng cố thêm về hàm copy(s,vt,n) để tạo ra 1 xâu mới.
Bài tập 4: Viết chương trình cho máy tính kiểm tra mật khẩu. Mật khẩu là
‘tinhoc’. Nếu vào đúng mật khẩu thì cho hiện dòng thông báo ‘Dang nhap thanh
cong’. Nếu gõ sai mật khẩu thì máy cho hiện dòng thông báo ‘Nhap lai
password’.
GV: Các em thấy ở một số máy khi khởi động vào Windows thì máy tính yêu
cầu chúng ta phải gõ mật khẩu, hoặc khi chúng ta không làm việc với máy tính
sau một khoảng thời gian nhất định thì trên màn hình cũng xuất hiện cửa sổ yêu
cầu người dùng phải nhập password. Nếu nhập mật khẩu sai thì chúng ta không
thể làm việc cùng máy tính được nữa? Việc này để tăng cường tính năng bảo vệ
máy tính, bảo mật thông tin. Vậy chúng ta có thể làm được điều đó hay không?
Bài tập này giúp các em củng cố lại phần kiến thức về việc so sánh 2 xâu.
GV: Gợi ý học sinh viết chương trình
Chương trình:
Program ktmatkhau;
Uses crt;
Var s: string;
Begin
Clrscr;
repeat

Write(‘hay nhap password:’);
Readln(s);
Until s=’tinhoc’;
Readln
End.
Đây là chương trình đơn giản so sánh xâu s nhập vào với xâu ‘tinhoc’
10


nhưng khi thực hiện chương trình đã tạo được hiệu ứng tốt đối với học sinh, các
em thấy rất thú vị, thì ra lập trình cũng thật đơn giản. Giáo viên còn giới thiệu
thêm được cấu trúc lặp không biết trước số lần lặp repeat…until, và GV liên hệ
với thực tế việc HS khi truy cập các trang mạng xã hội hoặc sử dụng một số dịch
vụ trên internet đều phải đăng nhập.
2. Dạng 2: 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 1. 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ụ:
XAU.INP
TTTTiiinnhhhhhhooccc

XAU.OUT
Tinhoc


- Ý tưởng: Duyệt từ đầu xâu đến cuối xâu, gặp 2 ký tự liên tiếp giống nhau thì
xóa đi một ký tự.
- Chương trình Rút gọn xâu
Program rutgonxau;
Var s:string; i:integer;
Begin
Write(‘nhap xau s’);
Readln(s);
i:=1;
while ibegin
if s[i]=s[i+1] then delete(s,i,1)
else inc(i);
end;
writeln(‘ Xau s sau khi da rut gon la:’ ,s);
Readln
End.

11


Bi 2. Nộn v gii nộn: Một xâu kí tự có thể "nén" theo cách sau:
Một xâu con gồm n (n>1) kí tự giống nhau, chẳng hạn gồm n
kí tự "a" sẽ đợc ghi thành na. Ví dụ xâu 'aaaabbcd' sẽ đợc nén
thành 4a2bcd. Hãy viết chơng trình nén và giải nén. (Chú ý
trong các xâu đợc nén phải không có chữ số).
Input: Cho trong tệp string.INP
Output: Ghi vào tệp String.Out
string.inp


string.out

Aaaabbcd
3a2b

4a2bcd
Aaabb

- í tng: Vi vic nộn xõu ta ln lt i m cỏc ký t ging nhau liờn tip
trong xõu v s dng mt xõu kq lu kt qu tỡm c cho n khi xột ht
xõu (vic gii nộn c thc hin ngc li)
- Chng trỡnh tham kho
Var i,j,code,n,d:integer;
s1,s2,s,kq,so:string;
ch:char;
BEGIN
Write( nhap xau s1);
Readln(s1);
Write( nhap xau s2);
Readln(s2);
{doan chuong trinh nen du lieu}
d:=1; s1:=s1+#32;ch:=s1[1]; kq:='';
for i:=2 to length(s1) do
if s1[i]=s1[i-1] then inc(d)
else
begin
str(d,s);
if d<>1 then kq:=kq+s+ch else kq:=kq+ch;
d:=1;

ch:=s1[i];
end;
writeln( Xau nen la:,kq);
{Doan chuong trinh giai nen}
i:=1; kq:='';
repeat
12


so:='0';
while s2[i] in ['1'..'9'] do begin so:=so+s2[i];inc(i); end;
val(so,n,code);
if n>1 then
for j:=1 to n do kq:=kq+s2[i]
else kq:=kq+s2[i];
inc(i);
until i> length(s2);
writeln(‘Xau giai nen la:’,kq);
End.
3. Dạng 3. Một số bài tập 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 Palinhdrome.
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.
4. Dạng 4: Ứ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.
13


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 (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.
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: 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ố
14


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.
Chương trình tham khảo:
{$MODE OBJFPC}
Var A : array[1..20] of longint;
S: array[1..20] of ansistring;
st,kq ,sm: ansistring;
code, k,i,p,m,j :longint;
BEGIN
{ Nhap du lieu}
st:='';
Write('Nhap p '); Readln(p);
Write('Nhap k ');Readln(k);
For i:=1 to p do readln(a[i]);
for i:=1 to p do readln(s[i]);
for i:=1 to p do
For j:=1 to A[i] do
st:=st+S[i];
{Xu li du lieu}
j:=0;
m:=length(st)-k;
Repeat
sm:='9';
dec(m);

For i:=j+1 to length(st)-m do
15


If sm>st[i] then
Begin
sm:=st[i];
j:=i;
End;
kq:=kq+sm;
Until m=0;
Val(kq,m,code);
Write(m);
Readln
END.
Bài tập 3: 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
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
16


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.
5. 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
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:
17


+ 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...
Chương IV. Kết quả thực nghiệm
- Quá trình giảng dạy tôi đã áp dụng “Kỹ năng vận dụng kiểu xâu qua hệ thống
các dạng bài tập” vào giảng dạy một số lớp 11 trường THPT Thiệu Hóa. Kết quả
thu được khi đánh giá về phần kiểu xâu như sau:
- Bảng số liệu kết quả đạt được của học sinh lớp 11 năm học 2018-2019 khi
chưa thực hiện SKKN:
Lớp
11I
11P

Sĩ số
45hs
45hs


Giỏi
0
0

Khá
10hs
6hs

TB
30hs
28hs

Yếu
10hs
11hs

Kém
0
0

- Bảng số liệu kết quả đạt được của học sinh lớp 11 năm học 2019-2020 sau khi
thực hiện SKKN trên lớp học có trình độ tương đương:
Lớp
11I
11P

Sĩ số
45hs
45hs


Giỏi
1hs
0

Khá
20hs
15hs

TB
24hs
29hs

Yếu
0
1hs

Kém
0
0

Tôi đã áp dụng SKKN trên 2 lớp có trình độ đầu vào thấp (thấp gần cuối
khóa học) những đã có sự khác nhau rõ rệt ở 2 năm học.
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 đề.
C. KẾT LUẬN
Ngôn ngữ lập trình nói chung đóng vai trò rất quan trọng trong việc xây
dựng các chương trình ứng dụng để phục vụ cho cuộc sống. Nhờ sự phát triển

của tin học trong đó các nhà lập trình chuyên nghiệp đóng vai trò không nhỏ mà
hiện nay hầu hết các lĩnh vực trong xã hội đã ứng dụng được tin học để giải
quyết công viêc nhanh, hiệu quả và chính xác hơn.
18


Hiện nay, ngôn ngữ lập trình Pascal đã trở thành ngôn ngữ lập trình phổ
biến nhất trên thế giới sử dụng trong lĩnh vực giảng dạy. Trong quá trình giảng
dạy các thầy cô có thể đưa ra các vấn đề như lập trình các game nhỏ…để các em
có thể chứng tỏ được khả năng của mình làm cho HS yêu thích môn học, ham
học hỏi và tìm tòi sáng tạo.
SKKN mang tính thực tiễn rất cao, cụ thể là: trong tiết học các em học
sinh đã chủ động tìm tòi lại kiến thức đã học qua đó giải quyết được vấn đề do
giáo viên đặt ra. Trong quá trình giải quyết vấn đề, giáo viên chỉ ra những lỗi mà
các em học sinh mắc phải, giúp cho các em hiểu rõ và vận dụng tốt hơn các kiến
thức đã học vào giải các bài toán do giáo viên đặt ra.
Trên đây là toàn bộ kinh nghiệm của tôi qua nhiều năm liền dạy Tin học ở
khối 11 cũng như tham khảo qua nhiều nguồn thông tin, tư liệu khác nhau, rất
mong được sự đóng góp của các đồng nghiệp nhằm giúp đề tài của tôi được
hoàn thiện thêm.
Tôi xin chân thành cảm ơn!
KIẾN NGHỊ:
Sau khi thực hiện đề tài SKKN “Kiểu xâu và kỹ năng vận dụng kiểu xâu
qua hệ thống bài tâp kiểu xâu”, tôi có một số ý kiến như sau:
- Môn tin là môn học rất cần thiết phải thực hành nên tăng cường cơ sở vật chất
cho phòng thực hành: bổ sung máy tính tối thiểu 2hs/máy, phòng thực hành có
máy chiếu.
- Nhóm tin cần có những buổi họp chuyên môn nhiều hơn để trao đổi kinh
nghiệm chuyên môn.


Trên đây là toàn bộ SKKN của tôi sau nhiều năm giảng dạy, nghiên cứu
và viết lại có sự tham khảo từ nhiều nguồn khác nhau. Tôi xin cam đoan là
không sao chép.
Thiệu Hóa, ngày 5 tháng 7 năm 2020
Người viết SKKN

Xác nhận của thủ trưởng đơn vị
Hiệu trưởng
19


Lê Thị Thắng

Lê Đăng Điển

20



×