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).
Nhng 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 . P A 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 ';
III. 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;
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);
1
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)
Thủ tục biến đổi xâu St (biểu diễn số nguyên, thc) 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
2
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}
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 i<length(s)do{Trong khi i < chiều dài của S}
begin
if(s[i]=' ')and(s[i+1]=' ')then delete(s,i,1){Nếu s[i]là ' ' và s[i+1]cũng là ' ' thì}
else inc(i);{Ngợc lại tăng i}
end;
writeln('Sau khi doi : ',s);{Xuất s}
readln;
end.
Bài 2:
{ Nhập chuỗi kí tự, xem chuỗi đó có đối xứng nhau không
VD : "ABBA" là đối xứng
"RADAr" là đối xứng
"AFF" là không đối xứng
Hớng dẫn
i:=1;j:=length(s);
while(upcase(s[i])=upcase(s[j]))and(i<=j)do
begin
inc(i);dec(j);
end;
Nếu i>j thì chuỗi đối xứng, ngợc lại thì không đối xứng}
uses crt;
var
s:string;{Xâu S}
i,j:byte;{i,j kiểu byte}
begin
clrscr;{Xoá màn hình}
write('S = ');readln(s);{Đọc S}
i:=1;j:=length(s);{Gán i bằng 1 và j bằng chiều dài s}
while(upcase(s[i])=upcase(s[j]))and(i<=j)do{Trong khi s[i]=s[j] và i<=k thì}
begin
inc(i);dec(j);{Tăng i. Giảm j}
end;
if i>j then write('Xau doi xung')else write('Xau khong doi xung');{Xuất kết quả}
readln;
end.
3
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]<='Z')then s[i]:=chr(ord(s[i])+32);{Nếu s[i] trong khoảng 'A'..'Z' thì đổi
s[i]thành 'a'..'z'}
writeln(s);{Xuất S}
s[1]:=upcase(s[1]);{Đổi s[1]thành kí tự hoa}
for i:=2 to length(s)do{Cho i chạy từ 2 đến độ dài S}
if(s[i-1]=' ')then s[i]:=upcase(s[i]);{Nếu s[i-1]là ' ' thì đổi s[i]thành kí tự hoa}
writeln(s);{Xuất S}
readln;
end.
Bài 4:
{ Nhập một chuỗi kí tự. Đếm xem trong chuỗi có bao nhiêu từ
Quy ớc mỗi từ viết cách nhau một dấu cách
VD : PHAM HUU NGON
Có 3 từ
Hớng dẫn
Thêm kí tự trắng vào đầu S
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.
4
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;
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}
5