Xâu kí tự trong Pascal

Xin chào các bạn, Hôm nay WIKIPASCAL sẽ hướng dẩn các bạn về Xâu kí tự (string) trong Pascal



Xau ki tu trong Pascal
Xâu kí tự trong Pascal



I – Xâu kí tự (String)

Các chương trình dịch Pascal hiện nay đã có một kiểu dữ liệu mới là xâu kí tự để xử lý các chuỗi, các dãy kí tự có độ dài thay đổi... nhằm đáp ứng nhu cầu xử lý văn bản, xử lý từ (ngữ). Một xâu kí tự được định nghĩa bằng từ khóa String theo sau là số kí tự cực đại có thể có của xâu kí tự, được đặt trong ngoặc vuông :


String [ do_dai_cuc_dai ] ;


Ví dụ 1:


Code:
Var Filename : String[20] ;

  Line : String[80] ; (* Dòng 80 kí tự là nhiều nhất *)


Ví dụ 2: Biến Filename khai báo ở trên được gán giá trị :

Code:
Filename := 'Vidu.pas' : 


khi này độ dài của xâu kí tự Filename là 8 kí tự, mặc dù độ dài cực đại cho phép của Filename là 20.

Hàm chuẩn Length (St) cho ta độ dài của xâu kí tự St. Một xâu chữ có thể là rỗng (không chứa kí tự nào) và khi đó St := '' hay Length (St) = 0.

Truy nhập vào các phần tử của xâu kí tự : ta có thể truy nhập vào từng kí tự một của xâu kí tự với tên biến và chỉ số đặt trong ngoặc vuông như khik truy nhập vào phần tử của mảng. Chỉsố này có thể chạy từ 1 đến độ dài cực đại của xâu kí tự

Code:
If filename[3] = 'D' then

  Writeln (' Chu thu ba cua xau ki tu la D ') ;


Nếu vị trí kí tự đó nằm ngoài độ dài thực của xâu kí tự thì phần tử đó của xâu không có giátrị xác định. Vì vậy, khi truy nhập vào từng phần tử của xâu chữ, ta còn cần phải kiểm tra xem vị trí đó có nằm trong khoảng độ dài thực của xâu hay không.

Code:
If 3 < Length(Filename) then

  Writeln (' Chu thu ba cua Filename la : ', Filename[3]) ;

II – Các thao tác trên xâu kí tự

1. Phép cộng xâu:

Xâu kí tự có thể sử dụng như các toán hạng trong các biểu thức để ghép xâu kí tự qua dấu "+".

Ví duï:


Code:
Filename := ' Vidu.pas ' ;

Filename := ' C:\ ' + Filename ;


Cho kết quả của Filename là : ' C:\Vidu.pas ' ;

hoặc
Code:
Filename := ' Ten ' + ' file ' + '.pas ' ;


Cho kết quả của Filename là : ' Tenfile.pas ' ;

Rõ ràng với kiểu mảng kí tự , chúng ta không thể thực hiện được phép cộng để ghép hai mảng với nhau vì độ dài của chúng đã cố định.

*Lưu ý: không có phép tính trừ,nhân,chia cho xâu kí tự.

2. Khai báo String làm tham số chương trình con :

Tương tự Array , String có thể dùng làm tham số cho chương trình con ,

Ví dụ:


Code:
Type

  St20 : String[20] ;

  St30 : String[30] ;

Var

  Ten20 : String[20] ;

  Ten30 : String[30] ;

Function Vidu1 : St20 ;

Procedure Vidu2 ( St : St30 ) ; 


Cách viết sau đây là sai :

Code:
Function Vidusai : String[20] ;

Procedure Vidusai (St : String[30]) ;


Khi dùng String làm tham số cho chương trình con , độ dài của tham số thực phải bằng độ dài của tham số hình thức. Vì vậy lời gọi thủ tục sau là đúng hoàn toàn :

Vidu2(Ten30) ;

vì Ten30(tham số thực) có kiểu là St30 trùng với tham số hình thức (St30).

Tuy vậy , bạn có thể chuyển tham số String có độ dài khác vào chương trình con bằng cách hướng dẫn chương trình dịch không kiểm tra tính tương thích về độ dài. Cách làm : định hướng{$V-}sẽ bỏ việc kiểm tra tính tương thích về độ dài của tham số xâu kí tự và{$V+}sẽ làm hoạt động việc kiểm tra trở lại.

Ví dụ:Lời gọi Vidu2(Ten20) sẽ gây ra lỗi vì Ten20 có độ dài khác St30. Muốn khắc phục điều này , ta chỉ cần thêm định hướng {$V-}:

Code:
{$V-}

Vidu2 (Ten20) ;

{$V+} *

Bạn có thể đặt {$V-} ngay ở đầu chương trình để bỏ việc kiểm tra String trong toàn bộ chương trình.

3. Viết ra màn hình và đọc:

Có thể dùng Write(St) hay Writeln(St) cho một xâu kí tự St.

Read(St) hay 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.

4. Các thủ tục và hàm chuẩn xử lý xâu kí tự:

_Length(St) là hàm cho ta độ dài của xâu St.

Ví dụ:với St := 'Filename' ; thì Length(St) có giá trị bằng 8.

_Delete(St , Pos , Num) là thủ tục xóa đi một số kí tự Num kể từ vị trí Pos trong xâu St.

Ví dụ : Sau khi gọi Delete (St , 2 , 3) ; St sẽ còn ' Fname ' vì bị xóa đi 3 kí tự ' ile '. Nếu Pos + Num > Length (St) thì St sẽ bị xóa toàn bộ kí tự kể từ vị trí Pos.

_Insert(Obj , St , Pos) là thủ tục xen xâu kí tự Obj vào xâu St tại vị trí Pos.

Ví dụ:Sau khi gọn Insert(' 12 ' , St , 4) ; thì St sẽ thành ' Fil12ename '. 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 cực đại cho phép mới được giữ lại.


_Str(Value , St) là thủ tục biến đổi giá trị bằng số nguyên hoặc thực Value thành một dãy kí tự biểu diễn số đó


Ví dụ:I là biến kiểu số nguyên , X là biến kiểu số thực :


Code:
 I := 512 ;

Str(I : 5 , St) ; sẽ cho ra St là '  512 ' (* 5 kí tự *)

X := 123.4567890 ;

Str(X : 12 : 5 , St) ; cho ra St là ' 123.45678 ' (* 12 kí tự *)



_Val(St , Var1 , Code) là thủ tục biến đổi một 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 Var1. Code là số nguyên để phát hiện lỗi.


Ví dụ:

Code:
 St1 := ' 123.45 ' ;

St2 := ' 123X ' ;


Val (St1 , Var1 , Code1) ; cho ta Var1 = 123.45 và Code1 = 0 ;

Val (St2 , Var2 , Code2) ; cho ta Var2 không xác định và Code2 = 4 ;

Lưu ý : Các biến Var1 , Var2 , Code1 , Code2 đều phải được khai báo trước.


_Copy(St , Pos , Size) nhận Size kí tự trong St từ vị trí Pos.


Ví dụ:

Code:
 St := ' 12345678 ' ;

St1 := Copy (St , 3 , 2) ; sẽ cho St1 = ' 34 ' ;


Nếu Pos > Length (St) thì Copy sẽ cho một xâu rỗng.

Nếu Pos + Size > Length (St) thì Copy sẽ chỉ nhận các kí tự nằm trong xâu St.


_Concat(St1 , St2 ,... , StN) là hàm 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 chiều dài của tất cả các xâu kí tự lớn hơn 255 thì máy sẽ báo lỗi.


_Pos(Obj , Target) là hàm cho ta 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 0.

Ví duï : Nếu St = ' 123454545 ' và Obj = ' 45 ' thì

Pos (Obj , St) cho giá trị bằng 4.

Pos (' 4X ' , St) cho giá trị bằng 0 vì không tìm thấy.

Nhận xét

Bài đăng phổ biến từ blog này