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