
CHUYÊN Đ XÂU KÍ TỀ Ự
A- KI N TH C C B NẾ Ứ Ơ Ả
I. CÁCH KHAI BÁO VÀ TRUY XU T ĐN PH N T XÂUẤ Ế Ầ Ử
1. Cách khai báo:
Var: STRING[đ dài c a xâu];ộ ủ
- Xâu ký t trong b nh nó chi m s byte b ng s ký t c c đi đc khaiự ộ ớ ế ố ằ ố ự ự ạ ượ
báo c ng v i byte đu tiên ch a s ký t hi n có c a xâu. Đ dài t i đa c a xâu kýộ ớ ầ ứ ố ự ệ ủ ộ ố ủ
t 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 mà không có trong turbo pascal) cóỉ
kích th c g n 2GB = 2ướ ầ 30 B nên th ng đc xem là vô h n.ườ ượ ạ
2. Cách nh p/xu t:ậ ấ
Cách đc hay vi t ki u STRING cũng 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(st); Writeln(st);
3. Truy c p t ng ph n t c a xâu ký t :ậ ừ ầ ử ủ ự
Vi c truy c p đn ph n t trong xâu t ng t m ng 1 chi uệ ậ ế ầ ử ươ ự ả ề đc thông quaượ
tên bi n ki u STRING và ch s c a nóế ể ỉ ố ủ
Ví d :ụ St := 'Le Thanh Lam'; write(st[4]);
-> K t qu : cho ra ch T.ế ả ữ
II. CÁC THAO TÁC TRÊN XÂU KÝ TỰ
1. Phép c ng xâu:ộ
Ví d :ụ st1:=’tin’; st2:=’ hoc’; St=st1 + st2;
-> St = ‘tin hoc’
2. Phép so sánh:
Hai xâu ký t có th so sánh v i nhau b ng các phép so sánh =, >, <…ự ể ớ ằ
Nguyên t c so sánh th c hi n nh sau, chúng s đem t ng ký t t ng ng v iắ ự ệ ư ẽ ừ ự ươ ứ ớ
nhau đ so sánh, xâu nào có ký t có s th t trong b ng mã ASCII l n h n thì xâuể ự ố ứ ự ả ớ ơ
đó l n h n.ớ ơ
Hai xâu ký t đc g i là b ng nhau khi chúng hoàn toàn gi ng nhau (có đ dàiự ượ ọ ằ ố ộ
nh nhau).ư
Ví d :ụ st1:=’tin’; st2:=’ hoc’; khi đó st1>st2
3. Các th t c và hàm chu n x lý xâu ký tủ ụ ẩ ử ự
a. Hàm length(st): cho đ dài th c c a xâu ký t stộ ự ủ ự
Ví d : st:=’tin hoc’ thì LENGTH(st) cho b ng 7.ụ ằ
b. Hàm upcase(ch): Cho ký t hoa c a ký t chự ủ ự
Ví d : ch:= 'a'; ch:= upcase(ch)ụ ® ch = 'A'
1

Ví d : Vi t đo n ch ng trình nh p vào m t xâu ký t . Đi xâu đó sang ch inụ ế ạ ươ ậ ộ ự ổ ữ
hoa r i in k t qu ra màn hìnhồ ế ả
var s,s1:string; i:integer;
begin
write('nhap xau s:');
readln(s);
s1:='';
for i:=1 to length(s) do s1:=s1+ upcase(s[i]);
write(s1);
readln;
end.
c. Hàm Ord(ch): Cho mã c a ký t ch trong b ng mã ASCIIủ ự ả
Ví d : ch:='a'; n:= Ord(ch)ụ ® n= 97
d. Hàm Chr(n): Cho ký t có mã là nự
Ví d : Vi t đo n ch ng trình nh p vào m t xâu ký t . Đi xâu đó sang chụ ế ạ ươ ậ ộ ự ổ ữ
th ng r i in xâu đó ra màn hình theo th t ng c l iườ ồ ứ ự ượ ạ
* Ý t ng: Đ th c hi n chuy n đi ký t ch d ng hoa sang d ng th ngưở ể ự ệ ể ổ ự ở ạ ạ ườ
tr c h t ta s d ng hàm ord(ch) đ l y mã ký t đó, sau đó s d ng hàm chr(ord(ch)ướ ế ử ụ ể ấ ự ử ụ
+32) đ đc ký t th ng c a ký t hoa ch (vì mã c a ký t hoa ch l ch mã ký tể ượ ự ườ ủ ự ủ ự ệ ự
th ng t ng ng là 32 nh : ord('A')=65, ord('a')=97)ườ ươ ứ ư
var s,s1:string; i:integer;
begin
write('nhap xau s:');
readln(s);
s1:='';
for i:=1 to length(s) do
if s[i] in ['A'..'Z'] then s1:=s1+ chr(ord(s[i])+32)
else s1:=s1+s[i];
for i:=length(s1) downto 1 do write(s1[i]);
readln;
end.
e. Th t c DELETE(st, pos, num)ủ ụ : xóa num ký t trong xâu st k t v trí posự ể ừ ị
Ví d : st= ‘tin hoc’; Delete(st,4,4); lúc đó st cho ra là ‘tin’ụ
f. Hàm POS(st1,st2): hàm cho v trí tìm th y đu tiên c a xâu s1 trong xâu s2.ị ấ ầ ủ
Ví d : POS(‘tin’,‘tin hoc’) = 1ụ
Ví d : Vi t đo n ch ng trình nh p vào m t xâu ký t . In ra xâu đó sau khi đãụ ế ạ ươ ậ ộ ự
xóa h t ký t tr ng th a trong xâu (Ký t tr ng th a là các ký t đu xâu, cu i xâu vàế ự ắ ừ ự ắ ừ ự ầ ố
n u gi a xâu có 2 ký t tr ng liên ti p nhau thì có m t ký t tr ng th a)ế ữ ự ắ ế ộ ự ắ ừ
* Ý t ng:ưở
- S d ng hàm Pos(' ',s) đ bi t đc v trí i nào đó xu t hi n ký t tr ng và sử ụ ể ế ượ ị ấ ệ ự ắ ử
d ng th t c Delete(s,i,1) đ xóa ký t th i trong xâu sụ ủ ụ ể ự ứ
- Đ xóa ký t tr ng đu xâu ta th c hi n l nh:ể ự ắ ầ ự ệ ệ
while s[1]=' ' do delete(s,1,1);
2

- Đ xóa ký t tr ng cu i xâu ta th c hi n l nh:ể ự ắ ố ự ệ ệ
while s[length(s)] = ' ' do delete(s,length(s),1);
- Đ xóa ký t tr ng gi a xâu ta th c hi n l nh:ể ự ắ ữ ự ệ ệ
while pos(' ',s)<>0 do delete(s, pos(' ',s),1);
var s:string;
begin
write('nhap xau s:');
readln(s);
while s[1]=' ' do delete(s,1,1);
while s[length(s)]=' ' do delete(s,length(s),1);
while pos(' ',s)<>0 do delete(s,pos(' ',s),1);
write(s);
readln;
end.
g. Th t c INSERT(st1, st2, pos)ủ ụ : Th t c cho k t qu b ng cách chèn xâu ký t cóủ ụ ế ả ằ ự
tên là st1 vào xâu st2 t i v trí pos, nh ng ký t đng sau pos s đc d i v phía sauạ ị ữ ự ứ ẽ ượ ờ ề
c a xâu ký t st2.ủ ự
Ví d : st1:= ‘tin ‘; st2:=’hoc kho’; INSERT(st1,st2,5)ụ ® st2=’hoc tin kho’;
Ví d : Vi t đo n ch ng trình nh p vào 3 xâu s1, s2, s (v i xâu s1 xu t hi nụ ế ạ ươ ậ ớ ấ ệ
m t và ch đúng 1 l n trong xâu s). Tìm và thay th xâu s1 thành xâu s2 trong xâu s.ộ ỉ ầ ế
Ch ng h n: s1 := 'hoc'; s2:= 'bai tap'; s :='hoc tin hoc'; k t qu sau khi thay thẳ ạ ế ả ế
s1 thành s2 là s = 'bai tap tin hoc'
var s1,s2,s: string; i:byte;
begin
write('nhap s1:');
readln(s1);
write('nhap s2:');
readln(s2);
write('nhap xau s:');
readln(s);
i:= pos(s1,s);
delete(s,i,length(s1));
insert(s2,s,i);
write(s);
readln;
end.
h. Th t c STR(value, st)ủ ụ : Th t c này th c hi n vi c chuy n đi giá tr ki uủ ụ ự ệ ệ ể ố ị ể
s (value) sang d ng xâu ký t và gán cho bi n st.ố ạ ự ế
Ví d : n:=2014; STR(n,st) s cho k t qu xâu st là: st=’2014’;ụ ẽ ế ả
i. Th t c VAL(st, value,code)ủ ụ đi m t xâu ký t st sang d ng s và gán cho bi nổ ộ ự ạ ố ế
value, n u bi n đi thành công thì code s nh n giá tr b ng 0. ng c l i thì cho giáế ế ố ẽ ậ ị ằ ượ ạ
tr khác khôngị
3

Ví d : VAL(‘2014’,value,code) lúc này code s nh n giá tr b ng 0 vàụ ẽ ậ ị ằ
value=2014
Ví d : Vi t đo n ch ng trình nh p vào s t nhiên a có n con s . Hãy t o raụ ế ạ ươ ậ ố ự ố ạ
s m i b t s a b ng cách in ng c có s xu t hi n trong a. Ch ng h n s a = 123ố ớ ừ ố ằ ượ ố ấ ệ ẳ ạ ố
thì b=321
var a,b:Qword; s,s1:string; i,code:longint;
begin
write('nhap a:');
readln(a);
str(a,s);
s1:='';
for i:=length(s) downto 1 do s1:=s1+s[i];
val(s1,b,code);
write(b);
readln;
end.
j. Hàm CONCAT(s1,s2,…,sn): hàm cho ra 1 xâu m i b ng cách n i đuôi các xâuớ ằ ố
s1,s2,…,sn l i v i nhau.ạ ớ
Ví d : CONCAT(‘hoc ’, ‘tin ’) = ‘hoc tin’;ụ
k. Hàm COPY(st, pos, num): sao chép trong xâu st, num ký t t i v trí pos,ự ạ ị
Ví d : st=’tin hoc’; COPY(st,5,3) = ‘hoc’;ụ
Ví d : Vi t đo n ch ng trình nh p vào m t xâu S (không có d u cách vôụ ế ạ ươ ậ ộ ấ
nghĩa). Đa ra t dài nh t xu t hi n trong xâuư ừ ấ ấ ệ S. Ch ngẳ h n: s = 'xin chao ban'ạ ®k tế
qu tìm đc là t 'chao'ả ượ ừ
* Ý t ng: Dùng hàm pos đ xác đnh ví trí ký t tr ng xu t hi n đu tiênưở ể ị ự ố ấ ệ ầ
trong xâu s. T đó xác đnh đ dài c a t đu tiên trong s. N u ta th c hi n xóa đi từ ị ộ ủ ừ ầ ế ự ệ ừ
đu tiên trong xâu s và l p l i thao tác trên ta s tìm đc t ti p theo, đng th i taầ ặ ạ ẽ ượ ừ ế ồ ờ
s tìm đc t có đ dài l n nh t.ẽ ượ ừ ộ ớ ấ
* Ch ng trình:ươ
var s,tumax:string;
begin
write('nhap xau s:');
readln(s);
while pos(#32,s)<>0 do
begin
if pos(#32,s)>length(tumax) then tumax:=copy(s,1,pos(#32,s));
delete(s,1,pos(#32,s));
end;
writeln(tumax);
readln;
end.
B. CÁC D NG BÀI T P TH NG G PẠ Ậ ƯỜ Ặ
4

1. D ng 1. X lý s nguyên l nạ ử ố ớ
Ph ng pháp chungươ : Đ th c hi n các phép tính ho c x lý v i s nguyênể ự ệ ặ ử ớ ố
ngoài ph m vi bi u di n đc cung c p, cách đn gi n nh t là s d ng xâu kí t đạ ể ễ ượ ấ ơ ả ấ ử ụ ự ể
bi u di n v i m i ký t c a xâu t ng ng v i m t ch s c a s nguyên l n tínhể ễ ớ ỗ ự ủ ươ ứ ớ ộ ữ ố ủ ố ớ
t trái qua ph i. D i đây chúng tôi xin đa ra m t s ng d ng ki u xâu trong x lýừ ả ướ ư ộ ố ứ ụ ể ử
s l n.ố ớ
Bài 1. C ng, tr 2 s nguyên l nộ ừ ố ớ
Cho hai s nguyên d ng l n có có đ dài không quá 200 ch s . Hãy đa raố ươ ớ ộ ữ ố ư
t ng và hi u c a 2 s nguyên đó.ổ ệ ủ ố
* Ý t ngưở : S d ng xâu đ l u 2 s l n. Tr c h t cho 2 xâu b ng nhau b ngử ụ ể ư ố ớ ướ ế ằ ằ
cách chèn thêm nhi u ký t '0' vào tr c xâu ng n h n. Vi c th c hi n c ng 2 s sề ự ướ ắ ơ ệ ự ệ ộ ố ẽ
đc th c hi n b ng cách c ng l n l t các c p ký t s t ng ng t ph i sangượ ự ệ ằ ộ ầ ượ ặ ự ố ươ ứ ừ ả
trái c a các xâu (Đi v i phép tr 2 s nguyên th c hi n t ng t )ủ ố ớ ừ ố ự ệ ươ ự
* Đo n ch ng trìnhạ ươ :
function Add(s1,s2:string):string;
var i,nho,z,x,y:longint; s:string;
begin
while length(s1)<length(s2) do s1:='0'+s1;
while length(s2)<length(s1) do s2:='0'+s2;
i:=length(s1); nho:=0; s:='';
while i>=1 do
begin
x:=ord(s1[i]) - ord('0');
y:=ord(s2[i]) - ord('0');
z:=x+y+nho;
s:= chr(z mod 10 + ord('0')) + s;
nho:= z div 10;
dec(i);
end;
Add:=s;
end;
{======Phép tr ===========}ừ
function sub1(s1,s2:string):string;
var i,nho,z,x,y:longint; s:string;
begin
while length(s1)<length(s2) do s1:='0'+s1;
while length(s2)<length(s1) do s2:='0'+s2;
i:=length(s1); nho:=0; s:='';
while i>=1 do
begin
x:=ord(s1[i]) - ord('0');
y:=ord(s2[i]) - ord('0');
z:=x-y-nho;
if z<0 then
5