Chương 2. Các kiểu dữ liệu đơn giản chuẩn
8.2. Các thao tác xâu ký tự
Xâu ký tự có thể đ−ợc sử dụng nh− là các toán hạng trong các biểu thức để ghép xâu qua dấu "+". Ví dụ: FileName:= 'A:\' + FileName;
Cho kết quả: FileName = 'A:\VIDU.PAS'
Ch−ơng 8: Kiểu xâu ký tự (string) 77
Không có phép tính trừ, nhân, chia... nh−ng có phép gán := cho x©u ký tù.
8.2.2. So sánh xâu ký tự
Xâu ký tự đ−ợc dùng trong các biểu thức quan hệ để so sánh. Khi so sánh hai xâu ký tự, các ký tự của hai xâu đ−ợc so sánh với nhau theo từng cặp một từ trái qua phải theo giá trị của bảng mã ASCII.
- Nếu hai xâu có độ dài khác nhau song số ký tự giống nhau đến
độ dài xâu ngắn hơn thì xâu có độ dài ngắn hơn đ−ợc coi là bé hơn.
- Hai xâu ký tự bằng nhau nếu nh− cả về nội dung lẫn độ dài của chúng là giống nhau.
Có thể dùng Write(st) và Writeln(st) để viết xâu ký tự st ra màn hình.
Lệnh Readln(st) sẽ đọc các ký tự cho xâu st với độ dài thực là số ký tự gõ vào từ bàn phím. Nếu ta gõ Enter luôn, không cho ký tự nào thì st rỗng.
Chú ý: Để in một dấu nháy đơn ra màn hình, ta viết hai dấu nháy
đơn liền nhau trong chuỗi ký tự. Ví dụ: câu lệnh Writeln('''1:''') sẽ in ra '1:'
8.2.3. Các thủ tục vμ hμm chuẩn xử lý xâu ký tự
- Hμm Length(st) cho ta độ dài của xâu ký tự st. Một xâu ký tự có thể là rỗng (không chứa ký tự nào) và khi đó Length(st) = 0.
- Thủ tục xóa Delete(St, Pos, Num) sẽ xóa bỏ trong xâu ký tự St một số ký tự Num kể từ vị trí Pos. Nếu Pos + Num > Length(St) thì St chỉ bị xóa đi những ký tự từ vị trí Pos đến cuối xâu.
- Thủ tục xen Insert(Obj, St, Pos) sẽ xen vào xâu St một xâu ký tự Obj kể từ vị trí Pos. Nếu Length(Obj) + Length(St) v−ợt quá độ dài cực
đại cho phép thì chỉ những ký tự nào nằm trong khoảng độ dài cho phép mới đ−ợc giữ lại.
- Thủ tục Str(Value, St) sẽ biến đổi giá trị bằng số nguyên hoặc số thực thành một xâu ký tự biểu diễn số đó. Cách biểu diễn của St sẽ
đ−ợc quy định do quy cách của Value.
- Thủ tục Val(St, Var1, Code) sẽ biến đổi xâu ký tự St (biểu diễn một số nguyên hoặc thực) thành một số nguyên hoặc thực chứa trong biến Var1. Code là số nguyên để phát hiện lỗi. Nếu phép biến đổi mà
đúng thì Code có giá trị bằng 0, nếu sai do St không biểu diễn đúng số nguyên hoặc số thực, Code sẽ nhận giá trị bằng vị trí của ký tự sai trong x©u ch÷ St.
- Hμm Copy(St, Pos, Size) sẽ nhận Size ký tự trong xâu St từ vị trí Pos. Nếu Pos > Length(St) thì hàm sẽ cho kết quả là một xâu rỗng.
Nếu Pos + Size > Length(St) thì hàm Copy sẽ chỉ nhận các ký tự nằm trong x©u St.
- Hμm ghép Concat(St1, St2,..., Stn) sẽ ghép nối tất cả các xâu ký tự St1, St2,..., Stn thành một xâu ký tự theo thứ tự đã viết. Tất nhiên nếu tổng số chiều dài của các xâu ký tự lớn hơn 255 thì máy sẽ báo lỗi. Ta có thể dùng phép cộng (+) để ghép xâu ký tự.
- Hμm vị trí Pos(Obj, Target) sẽ cho vị trí đầu tiên của xâu Obj gặp trong xâu Target. Nếu không tìm thấy, Pos có giá trị bằng không.
- Hμm Readkey đọc một ký tự từ bàn phím, ký tự này không hiện lên màn hình.
- Hμm Upcase(ch) đổi ký tự ch thành ký tự in hoa.
8.2.4. Các ví dụ đối với kiểu xâu ký tự
Ví dụ 1: Lập trình thực hiện các công việc sau:
1. Nhập vào một xâu ký tự
2. Đếm và in ra màn hình số l−ợng mỗi loại chữ cái: 'A', 'B',... 'Z' theo mÉu sau:
A: 3 B: 0 ....
Z: 6
Ch−ơng 8: Kiểu xâu ký tự (string) 79
Program vidu_XAU ;
Var x: string; c: char; i,d: integer;
Begin
Write('Doc mot xau:'); readln(x);
for c:='A' to 'Z' do begin
d:=0;
for i:= 1 to length(x) do if c=x[i] then d:= d+1;
write(c,':',D); readln;
end;
readln;
end.
Ví dụ 2: Lập ch−ơng trình thực hiện các công việc sau:
- Đọc qua bàn phím họ và tên của một ng−ời - Hiển thị tên của người đó ra màn hình
Program trich_ten;
var ht: string[20]; ten: string[10];
i:integer;
begin
write('Hay nhap ho va ten');
readln(ht);
ten:=' ' ; i:=length(ht);
while ht[i]<>' ' do begin
ten:= ht[i] _ ten;
i:=i-1;
end;
write('ten nguoi do la:', ten);
end.
Ví dụ 3: Viết chương trình nhập một số nhị phân sau đó đổi ra hệ thập phân và in ra màn hình.
Để giải bài này chúng ta cần nắm đ−ợc quy tắc đổi từ số nhị phân sang thập phân. chẳng hạn số (111)2 = 1*20 + 1*21 +1*22.
Nh− vậy nếu số nhị phân có độ dài là n thì số mũ cao nhất là n-1 và ta phải lấy tổng của các số hạng là ai*2i-1 (i chạy từ 1 đến n là độ dài của chuỗi nhập vào).
Ch−ơng trình nh− sau:
Program nhiphan;
Uses crt;
Const So: array['0'..'1'] of byte =(0,1);
Var S: String[16];
i: byte; h, N:word; ch: char;
Begin Clrscr;
Writeln('Nhap so nguyen N theo kieu nhi phan:');
i:=0;
S:=' '; {Xau rong}
Write('N=');
Repeat ch:=readkey;
If ch in ['0','1'] then Begin
inc(i);
Write(ch);
S:=S+ch;
End;
Until (ch=#13) or (i=16);
h:=1; N:=0;
For i:=length(S) downto 1 do
Ch−ơng 8: Kiểu xâu ký tự (string) 81
Begin
N:=N+So[S[i]]*h;
h:=2*h;
End;
Writeln;
Writeln('So',S,' dang thap phan la',N);
Readln;
End.
Ví dụ 4: Viết ch−ơng trình nhập vào một xâu ký tự (cả chữ cái và con số) sau đó tính có bao nhiêu ký tự là số, bao nhiêu ký tự là chữ cái.
Phân tích thuật toán:
Giả sử xâu s= 'abc123def'. Nh− vậy s có độ dài là 8 và s[1]='a', s[2]='b'... và s[length(s)]= s[8] = 'f'
Ta dùng 2 biến đếm: biến đếm số và biến đếm ký tự, lúc đầu 2 biến này có giá trị là 0.
Ta cần phải lấy ra ký tự thứ i của xâu s[i] (với i chạy từ 1.. length(s)), với mỗi s[i] ta xem:
- Nếu nó có thuộc tập chữ số: '0'..'9' thì biến đếm số := biến đếm sè + 1.
- Nếu nó có thuộc tập chữ cái: 'A'..'Z' thì biến đếm chữ := biến
đếm chữ + 1.
Vì ta xét cả chữ in hoa và chữ in th−ờng nên ta sử dụng hàm Upcase.
Ch−ơng trình nh− sau:
Program xau;
Var S: string;
i, dem, dem1: integer;
Begin
Write('Hay nhap xau ky tu:'); Readln(S);
dem:=0; dem1:=0;
For i:=1 to length(S) do Begin
If (S[i] in ['0'..'9']) then inc(dem);
If (Upcase(S[i]) in ['A'..'Z']) then inc(dem1);
End;
Writeln('So luong cac ky tu la so la:',dem);
Writeln('So luong cac ky tu la chu cai la:',dem1);
Readln;
End.
Ví dụ 5: Cho một xâu ký tự S. Hãy viết ch−ơng trình tính xem trong dãy đó có bao nhiêu loại ký tự khác nhau.
Program vidu5;
var S: string;
i, j, dem: integer;
t: boolean;
Begin
Write('hay nhap xau S:');Readln(S);
dem:=0;
for i:=1 to length(S) do Begin
t:=false;
for j:=1 to i-1 do if (S[j]=s[i]) then t:=true;
if not t then dem:=dem+1;
end;
Write('So ky tu khac nhau cua xau S la:',dem);
readln;
end.
Ch−ơng 8: Kiểu xâu ký tự (string) 83
Bài tập chương 8
Bμi 1: Lập ch−ơng trình nhập vào một xâu từ bàn phím, rồi hiển thị xâu đảo ng−ợc; ví dụ nhập vào chuỗi "HVAN" sẽ nhận đ−ợc "NAVH".
Bμi 2: Lập ch−ơng trình:
- Đọc vào từ bàn phím một xâu
- Đọc một ký tự từ bàn phím rồi đếm số l−ợng ký tự này trong xâu, thông báo kết quả lên màn hình.
Bμi 3: Lập ch−ơng trình thực hiện các công việc sau:
- Đọc từ bàn phím một câu
- Tìm xem câu đó có bao nhiêu từ, sau đó đọc vào từ bàn phím một ký tự, tìm xem câu đó có bao nhiêu từ bắt đầu bằng ký tự đã đọc,
đ−a kết quả ra màn hình.
Bμi 4: Lập trình nhập vào một số nguyên, sau đó đổi số đó ra hệ nhị phân.
Bμi 5: Lập trình thực hiện các công việc sau:
- Đọc vào máy một số nguyên d−ơng - Tính tổng các chữ số của số vừa đọc vào.
Bμi 6: Lập trình đọc một câu từ bàn phím rồi đưa ra màn hình dưới dạng một cột. Thí dụ đọc vào HOC VIEN AN NINH NHAN DAN,
đ−a ra thành:
HOC VIEN AN NINH NHAN DAN
Chương 9
KIỂU DỮ LIỆU CÓ CẤU TRÚC