xâu kí tự (String) Trong pascal
Xâu kí tự có thể hiểu đơn giản là một mảng một chiều có kiểu phần tử là các kí tự (CHAR). Nhưng xâu kí tự chỉ có thể có tối đa 255 kí tự nhưng nó có các lệnh xử lí xâu như : xoá một đoạn trong xâu, copy một đoạn trong xâu... mà mảng kí tự không có được
String
I. §Þnh nghÜa x©u kÝ tù (String)
X©u kÝ tù cã thÓ hiÓu ®¬n gi¶n lµ mét m¶ng mét chiÒu cã kiÓu phÇn tö lµ c¸c kÝ
tù (CHAR).
Nh ng x©u kÝ tù chØ cã thÓ cã tèi ®a 255 kÝ tù nhng nã cã c¸c lÖnh xö lÝ x©u nh :
xo¸ mét ®o¹n trong x©u, copy mét ®o¹n trong x©u... mµ m¶ng kÝ tù kh«ng cã ®îc
II. C¸ch khai b¸o x©u
VAR Tªn_x©u : STRING [®é_dµi_cùc_®¹i];
VD : Ta khai b¸o
FileName : String[20];
Sau ®ã ta thùc hiÖn phÐp g¸n :
FileName := 'VIDU.PAS';
Lóc nµy chiÒu dµi thùc sù cña x©u lµ 8 mÆc dï ®é dµi cùc ®¹i lµ 20
Ta xÐt cÊu tróc cña x©u :
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
V I D U .PA S* * * * * * * * * * * *
KÝ tù 0 chøa ®é dµi thùc sù cña x©u, ta cã thÓ viÕt
§é_dµi_thùc_sù_cña_x©u = Ord(Filename[0]);
KÝ hiÖu * biÓu diÔn kÝ tù kh«ng x¸c ®Þnh
NÕu trong qu¸ tr×nh thao t¸c, ®é dµi cña x©u vît qu¸ ®é dµi cùc ®¹i th× m¸y sÏ tù
®éng c¾t bá phÇn phÝa sau x©u kÓ tõ vÞ trÝ ®é dµi cùc ®¹i.
VD : Khi ta g¸n
FileName := 'HOI THI TIN HOC TRE KHONG CHUYEN';
Th× lóc ®ã
FileName = 'HOI THI TIN HOC TRE ';
II I. Truy nhËp vµo phÇn tö cña m¶ng
Do cÊu tróc cña x©u t ¬ng tù cña m¶ng nªn c¸ch truy xuÊt cña nã còng t ¬ng tù cña
m¶ng
Tªn_x©u [chØ_sè_phÇn_tö]
VD : Muèn g¸n phÇn tö thø 3 cña x©u lµ 'A'
Filename [3] := 'A';
IV. C¸c thao t¸c trªn x©u
1. PhÐp céng x©u
VD : S1 := 'PHAN MEM ';
S2 := 'SANG TAO';
S := S1 + S2;
1
Sau ®ã S = 'PHAN MEM SANG TAO';
2. So s¸nh x©u kÝ tù
Khi so s¸nh 2 x©u m¸y sÏ so s¸nh tõng cÆp kÝ tù cña 2 x©u tõ tr¸i qua ph¶i theo gi¸
trÞ cña b¶ng m· ASCII
NÕu 2 x©u cã ®é dµi kh¸c nhau song sè kÝ tù gi«ng nhau ®Õn ®é dµi cña x©u ng¾n
nhÊt gièng nhau th× x©u cã ®é dµi ng¾n h¬n th× bÐ h¬n
VD : 'FILENAME' < 'FILENAMEA' cho gi¸ trÞ TRUE
'FiLENAME' < 'FILENAME' cho gi¸ trÞ FALSE
'FILENAME' = 'FILENAME' cho gi¸ trÞ TRUE
3. Thao t¸c nhËp xu©t
Cã thÓ dïng c¸c hµm Write, Writeln, Readln ®èi víi x©u kÝ tù
VD : readln(st);
Writeln(st);
V. C¸c hµm chuÈn xö lÝ x©u kÝ tù
1. Length (St)
Hµm cho ta ®é dµi cña x©u kÝ tù St
VD : l := length(st);
2. Delete (St, Pos, Num)
Thñ tôc xo¸ ®i Num kÝ tù kÓ tõ vÞ trÝ Pos trong x©u St
VD :
S := 'TOI DI HOC';
Delete(s,5,3);
{ Sau ®ã S = 'TOI HOC' }
3. Insert (Obj, St, Pos);
Thñ tôc xen x©u Obj vµo x©u St t¹i vÞ trÝ Pos
VD :
S := 'THANH DA NANG';
Insert('PHO ',S,7);
{ Sau ®ã S = 'THANH PHO DA NANG' }
4. Str (Value, St)
Thñ tôc biÕn ®æi gi¸ trÞ b»ng sè nguyªn hoÆc thùc Value thµnh mét x©u biÓu diÔn
sè ®ã. C¸ch biÓu diÔn cña St sÏ ®îc quy c¸ch do qui c¸ch cña Value
VD : I := 512;
Str(I:5,St);
SÏ cho St = ' 512';
5. Val St, Var1, Code)
2
Thñ tôc biÕn ®æi x©u St (biÓu diÔn sè nguyªn, th c) thµnh mét sè nguyªn thùc chøa
trong Var1.
Code lµ sè nguyªn ®Ó ph¸t hiÖn lçi, nÕu phÐp biÕn ®æi ®óng th× Code cã gi¸ trÞ
b»ng 0. NÕu sai Code sÏ lµ vÞ trÞ cña kÝ tù sai.
VD :
St := '123.56';
Val(st,X,Result);
SÏ cho X=123.56 vµ Result=0
St := '123X';
Val(st,X,result); SÏ cho X kh«ng x¸c ®Þnh vµ Result=4
6. Copy (St, Pos, Size)
Hµm Copy sÏ nhËn Size kÝ tù trong x©u St tõ vÞ trÝ Pos
VD : St := '123456789';
St1 := Copy(St,3,2); SÏ cho St1='34'
7. 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
VD : St1 := 'BORLAND ';
St2 := 'PASCAL '; St3 := '7.0';
St := Concat(St1,St2,St3); SÏ cho St='BORLAND PASCAL 7.0';
C¸ch viÕt nµy t ¬ng tù víi
ST := St1 + St2 + ... + StN
8. Pos (Obj, Target)
Hµm tr¶ l¹i vÞ trÝ ®Çu tiªn cña x©u Obj gÆp trong x©u Target
Pos = 0 nÕu kh«ng t×m thÊy
VD : St := '123456789';
Pos('45',St) cho gi¸ trÞ b»ng 3
Pos('4X',St) @1cho gi¸ trÞ 0 v× kh«ng t×m thÊy
Bµi 1:{ NhËp mét chuçi kÝ tù. TØa bá dÊu c¸ch bªn ph¶i, tr¸i, tØa gi÷a (nÕu gi÷a 2 tõ
cã nhiÒu dÊu c¸ch chØ ®Ó l¹i 1 dÊu c¸ch
VD : " que huong " -> "que huong"}
uses crt;
var
s:string;{X©u S}
i:byte;{i kiÓu byte}
begin
clrscr;{Xo¸ mµn h×nh}
write('S = ');readln(s);{§äc S}
3
while(s[1]=' ')and(s'')do delete(s,1,1);{Xo¸ c¸c dÊu c¸ch ®Çu cña S}
while(s[length(s)]=' ')and(s'')do delete(s,length(s),1);{Xo¸ c¸c dÊu c¸ch ë cuèi}
i:=1;{G¸n i b»ng 1}
while iend.
Bµi 3:
{ NhËp mét chuçi kÝ tù. §æi chuçi nµy thµnh
a. Ch÷ in hoa
b. Ch÷ in th êng
c. Ch÷ in hoa ë ®Çu tõ
VD : luOnG tHe ViNH
In ra : LUONG THE VINH
luong the vinh
Luong The Vinh}
uses crt;
var
s:string;{X©u S}
i:byte;{i kiÓu byte}
begin
clrscr;{Xo¸ mµn h×nh}
write('S = ');readln(s);{§äc S}
for i:=1 to length(s)do s[i]:=upcase(s[i]);{§æi S thµnh hoa (dïng upcase)}
writeln(s);{XuÊt S}
for i:=1 to length(s)do{Cho i ch¹y tõ 1 ®Õn ®é dµi S}
if(s[i]>='A')and(s[i] S := ' '+S;
Cho i ch¹y tõ tr¸i sang ph¶i. NÕu s[i]lµ dÊu c¸ch vµ s[i+1] lµ ch÷ th× t¨ng sè tõ lªn 1}
var s:string;{X©u S}
i,so:byte;{i,so kiÓu byte}
begin
write('S = ');readln(s);{§äc S}
so:=0;{G¸n so b»ng 0}
s:=' '+s;{Thªm dÊu c¸ch vµo ®Çu s}
for i:=1 to length(s)-1 do{Cho i ch¹y tõ 1 ®Õn ®é dµi x©u s-1}
if(s[i]=' ')and(s[i+1]' ')then inc(so);{NÕu s[i]lµ ' ' vµ s[i+1]kh¸c ' ' th× t¨ng so}
writeln('Co ',so,' tu');{XuÊt so}
readln;
end.
Bµi 5:{ NhËp chuçi kÝ tù. §Õm xem trong chuçi cã bao nhiªu kÝ tù, mçi kÝ tù xuÊt
hiÖn bao nhiªu lÇn.
H íng dÉn
Dïng m¶ng solan:ARRAY[0..255]OF byte ®Ó lu sè lÇn xuÊt hiÖn cña c¸c kÝ tù cã m·
ASCII.
VD : Ch÷ A xuÊt hiÖn 3 lÇn th× ta cã
solan[ord('A')]=3
hay solan[65]=3}
uses crt;
var
s:string;{X©u S}
solan:array[0..255]of byte;{M¶ng solan 0..255 kiÓu byte}
i:byte;{i kiÓu byte}
begin
clrscr;{Xo¸ mµn h×nh}
write('S = ');readln(s);{§äc S}
for i:=1 to length(s)do{Cho i ch¹y tõ 1 ®Õn ®é dµi S}
inc(solan[ord(s[i])]);
for i:=0 to 255 do{Cho i ch¹y tõ 0 ®Õn 255}
if solan[i]>0 then{NÕu solan[i]>0 th×}
begin
writeln('Ki tu ',chr(i),' xuat hien ',solan[i],' lan');{XuÊt kÝ tù i vµ solan[i]}
end;
6
readln;
end.
Bµi 6:
{ ViÕt thñ tôc
- Xãa n kÝ tù tõ vÞ trÝ v cña chuçi S (gièng Delete(s,v,n)cña Pascal)
- ChÌn S1 vµo sau vÞ trÝ v cña x©u S (gièng Insert(s1,s,v)cña Pascal)
H íng dÉn
Chóng ta coi chuçi lµ m¶ng c¸c kÝ tù. Sau khi thùc hiÖn c¸c thao t¸c xo¸, dån trªn
chuçi. Ta g¸n l¹i chiÒu dµi cña chuçi b»ng c¸ch
s[0]:=chr(n);
N lµ chiÒu dµi thùc sù}
uses crt;
var s:string;{X©u S}
procedure xoa(var s:string;v,n:byte);
var i:byte;{Khai b¸o i kiÓu byte}
begin
for i:=v to v+n-1 do{Cho i ch¹y tõ v ®Õn ®é dµi v+n-1}
s[i]:=s[i+n];{G¸n s[i]b»ng s[i+n]}
s[0]:=chr(length(s)-n);{CËp nh©t l¹i ®é dµi thùc sù x©u S}
end;
procedure chen(s1:string;var s:string;v:byte);
var i,l:byte;{Khai b¸o i,l kiÓu byte}
begin
l:=length(s1);{G¸n l b»ng ®é dµi x©u S1}
for i:=length(s)+l downto v+l do{Cho i ch¹y tõ ®é dµi S+l ®Õn ®é dµi v+l}
s[i]:=s[i-l];{G¸n s[i]b»ng s[i-l]}
for i:=1 to l do{Cho i ch¹y tõ 1 ®Õn l}
s[v+i-1]:=s1[i];{G¸n s[v+i-1]b»ng s1[i]}
s[0]:=chr(length(s)+l);{CËp nh©t l¹i ®é dµi thùc sù x©u S}
end;
begin
clrscr;{Xo¸ mµn h×nh}
s:='PHAM HUU NGON';
xoa(s,6,4);
writeln(s);
chen('HUU ',s,6);
writeln(s);
7
readln;
end.
Bµi 7:
{ ViÕt hµm
- TrÝch n kÝ tù tõ vÞ trÝ v cña chuçi S (gièng hµm Copy(s,v,n)cña Pascal)
- Tr¶ l¹i vÞ trÝ ®Çu tiªn cã mÆt cña chuçi S1 trong x©u S (gièng hµm POS(s1,s) cña
Pascal)}
uses crt;
var
s:string;{X©u S}
function chep(s:string;v,n:byte):string;
var
s1:string;{X©u s1}
i:byte;{i kiÓu byte}
begin
for i:=1 to n do{Cho i ch¹y tõ 1 ®Õn N}
s1[i]:=s[v+i- 1];{G¸n s1[i]b»ng s[v+i-1]}
s1[0]:=chr(n);{CËp nh©t l¹i ®é dµi thùc sù x©u S}
chep:=s1;{G¸n chep b»ng s1}
end;
function tim(s1:string;s:string):byte;
var i:byte;{Khai b¸o i kiÓu byte}
begin
for i:=1 to length(s)-length(s1)+1 do{Cho i ch¹y tõ 1 ®Õn ®é dµi s-®é dµi s1+1}
if chep(s,i,length(s1))=s1 then{NÕu chep(s,i,length(s1))=s1 th×}
begin
tim:=i;{G¸n tim b»ng i}
exit;{Tho¸t khái ch¬ng tr×nh con}
end;
tim:=0;{G¸n tim b»ng 0}
end;
begin
clrscr;{Xo¸ mµn h×nh}
s:='PHAM HUU NGON';
writeln(chep(s,6,3));
writeln(tim('NGON',s));
readln;
8
end.
Bµi 8:
{ §äc mét chuçi kÝ tù. Cho ch¹y qu¶ng c¸o trªn mµn h×nh
a. Tõ tr¸i qua ph¶i
b. Tõ ph¶i qua tr¸i
c. Ch¹y cïng lóc 2 dßng kÝ tù tõ bªn tr¸i vµ bªn ph¶i vµo gi÷a mµn h×nh
H íng dÉn
ViÕt thñ tôc viet(x,y:integer;s:string) cã t¸c dông viÕt chuçi s ë vÞ trÝ x,y}
uses crt;
var
x,y:integer;{x,y kiÓu integer}
s:string;{X©u S}
procedure viet(x,y:integer;s:string);
var l:byte;{Khai b¸o l kiÓu byte}
begin
l:=length(s);{G¸n l b»ng ®é dµi S}
if x0 th× di chuyÓn tíi (x,y)ngîc l¹i tíi
(1,y)}
write(copy(s,1,80-x));
end
end;
begin
clrscr;{Xo¸ mµn h×nh}
write('S = ');readln(s);{§äc S}
for x:=80 downto -length(s)do{Cho i ch¹y tõ 80 xuèng -length(s)}
begin
viet(x,12,s);
delay(40);
9
gotoxy(1,12);clreol;{Xo¸ dßng 12}
end;
for x:=-length(s)to 80do{Cho i ch¹y tõ -length(s)®Õn 80}
begin
viet(x,12,s);
delay(40);
gotoxy(1,12);clreol;{Xo¸ dßng 12}
end;
for x:=80 downto -length(s)do{Cho i ch¹y tõ 80 xuèng -length(s)}
begin
viet(x,12,s);viet(-length(s)+80-x,12,s);
delay(40);
gotoxy(1,12);clreol;{Xo¸ dßng 12}
end;
end.
Bµi 9:{ §äc mét chuçi kÝ tù. In ra mµn h×nh chuçi kÝ tù ®ã
a. C¨n tr¸i mµn h×nh
b. C¨n ph¶i mµn h×nh
c. C¨n gi÷a mµn h×nh}
var
s:string;{X©u S}
i:byte;{i kiÓu byte}
begin
write('S = ');readln(s);{§äc S}
writeln(s);
writeln(s:80);
writeln(s:40+(length(s)div 2));
readln;
end.
Bµi 10:
{ §äc tõ bµn phÝm chuçi kÝ tù chØ gåm 'A' vµ 'B'. §a ra mµn h×nh chuçi nÐn theo quy
luËt sau. §Õm sè kÝ tù kÒ nhau vµ gièng nhau, thay b»ng kÝ tù ®¹i diÖn vµ sè ®·
nÐn. NÕu sè ®· nÐn b»ng 1 th× kh«ng ghi sè nÐn chØ ghi kÝ tù
VD : AAAAAABAAABBBBBAABABBBBB
Chuçi sau khi nÐn
A6BA3B5A2BAB5
10
H íng dÉn
B¹n cÇn dïng thªm hµm Str(I,S)®Ó ®æi sè I sang chuçi}
var
s,s1,tam:string;{X©u s,s1,tam}
ch:char;{ch kiÓu kÝ tù}
i,j,solan:byte;{i,j,solan kiÓu byte}
begin
write('S = ');readln(s);{§äc S}
s1:='';{G¸n s1 b»ng rçng}
ch:=s[1];{G¸n ch b»ng s[1]}
i:=1;{G¸n i b»ng 1}
while ichiÒu dµi S}
if j-i>1 then{NÕu j-i>1 th×}
begin
str(j- i,tam);{§æi j-i sang chuçi tam}
s1:=s1+tam;{Céng tam vµo sau s1}
end;
i:=j;{G¸n i=j}
if ch='A' then ch:='B' else ch:='A';{G¸n ch b»ng kÝ tù ngîc l¹i}
end;
writeln(s1);{XuÊt s1}
readln;
end.
Bµi 11:{ NhËp N. Sau ®ã nhËp N tªn ngêi (hä tªn)
a. §æi chuçi thµnh c¸c ch÷ c¸i hoa. Sau ®ã ®¶o tªn ngêi lªn ®Çu. In ra mµn h×nh c¸c
chuçi sau khi ®¶o.
b. S¾p xÕp tªn ngêi theo tªn, nÕu cïng tªn th× xÕp theo hä
VD : VU NAM
HO NAM
TRAN ANH
In ra : NAM VU Sau ®ã : TRAN ANH
11
NAM HO HO NAM
ANH TRAN VU NAM
H íng dÉn
a. CÇn x©y dùng thñ tôc dao(s)®Ó ®¶o tªn
b. Dùa vµo c©u a chØ, vµ viÕt thªm thñ tôc tØa c¸c dÊu c¸ch (bµi 1). Sau ®ã ta so
s¸nh chuçi nh b×nh th êng. Sau khi so s¸nh vµ ®æi chç ta l¹i ®¶o tªn ra cuèi}
uses crt;
var
s:array[1..20]of string;{M¶ng s gåm 20 x©u}
i,j,n:byte;{i,j,n kiÓu byte}
tg:string;{X©u tg}
procedure tia(var s:string);
var i:byte;{Khai b¸o i kiÓu byte}
begin
while(s[1]=' ')and(s'')do delete(s,1,1);{Xo¸ c¸c kÝ tù tr¾ng ®Çu S}
while(s[length(s)]=' ')and(s'')do delete(s,length(s),1);{Xo¸ c¸c kÝ tù tr¾ng cuèi S}
i:=1;{G¸n i b»ng 1}
while ibegin
clrscr;{Xo¸ mµn h×nh}
write('N = ');readln(n);{§äc N}
for i:=1 to n do
begin
write('S [',i,'] = ');readln(S[i]);{§äc S[i]}
tia(s[i]);
for j:=1 to length(s[i])do s[i,j]:=upcase(s[i,j]);{§æi s[i] thµnh ch÷ hoa}
dao(s[i]);
end;
writeln('Sau khi dao');
for i:=1 to n do writeln(s[i]);{XuÊt N x©u}
for i:=1 to n-1 do{Cho i ch¹y tõ 1 ®Õn n-1}
for j:=i+1 to n do{Cho i ch¹y tõ i+1 ®Õn n}
if s[i]>s[j]then{NÕu s[i]>s[j] th×}
begin
tg:=s[i];s[i]:=s[j];s[j]:=tg;{§æi chç s[i],s[j]}
end;
writeln('Sau khi sap xep');
for i:=1 to n do{Cho i ch¹y tõ 1 ®Õn n}
begin
daolai(s[i]);
writeln(s[i]);{XuÊt s[i]}
end;
readln;
end.
Bµi 12:{ NhËp 2 sè nguyªn d¬ng A,B (cã thÓ lªn ®Õn 200 ch÷ sè). TÝnh tæng 2 sè ®ã
H íng dÉn
V× A,B qu¸ lín nªn ta ph¶i dïng x©u ®Ó lu råi sau ®ã ph¶i viÕt thñ tôc céng 2 chuçi}
uses crt;
var
a,b:string;{a,b kiÓu string}
function cong(a,b:string):string;
var
tong:string;{tong kiÓu string}
la,lb:byte;{la,lb kiÓu byte}
i,c,nho:byte;{i,c,nho kiÓu byte}
13
begin
la:=length(a);lb:=length(b);{G¸n la,lb b»ng ®é dµi A,B}
if la9 th×}
begin
nho:=1;{G¸n nho b»ng 1}
c:=c-10;{Gi¶m c ®i 10}
end
else nho:=0;{NGîc l¹i g¸n nho b»ng 0}
tong:=chr(c+48)+tong;{Thªm kÝ tù c vµo tr íc tong}
end;
if nho=1 then tong:='1'+tong;{NÕu nho=1 th× thªm '1' vµo ®Çu tong}
cong:=tong;{G¸n cong b»ng tong}
end;
begin
clrscr;{Xo¸ mµn h×nh}
write('So A : ');readln(a);{NhËp x©u A}
write('So B : ');readln(b);{NhËp x©u B}
writeln(cong(a,b));
readln;
end.
14
15