Sách Giải

https://sachgiai.com

Kiểu dữ liệu xâu kí tự (string) trong Pascal

Một xâu kí tự được định nghĩa bằng từ khóa STRING, theo sau là các số kí tự cực đại có thể có của xâu kí tự, được đặt trong ngoặc vuông.
1. ĐỊNH NGHĨA XÂU KÍ TỰ (STRING)
Khi Niklaus Wirth thiết kế Pascal, tác giả đã sử dụng máy tính lớn với các thiết bị nhớ và ngoại vi như bìa đục lỗ, băng từ trong đó các dữ liệu có độ dài cố định được sử dụng. Với sự phát triển của kĩ thuật, các phươ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à các 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ụ:
   VAR
        Filename: String[20] ;
        Line: String[80] ; {Dòng 80 kí tự là nhiều nhất}
Cấu trúc của xâu kí tự như sau: Trong bộ nhớ nó chiếm số byte bằng số kí tự cực đại để chứa các kí tự, cộng với 1 byte đầu tiên chứa số kí tự hiện có của xâu kí tự.

■ Ví dụ: biến Filename khai báo ở trên được gán giá trị:
                              Filename:= 'VIDU.PAS' ;
Khi này độ dài xâu kí tự Filename chi là 8 kí tự, mặc dù độ cực đại cho phép của Filename là 20. Như đã trình bày ở trên, byte đầu tiên chứa 1 kí tự để biểu diễn độ đài xâu kí tự (số thứ tự trong bảng mã ASCII của kí tự là độ dài xâu). Vì độ dài xâu kí tự được biểu diễn bằng 1 byte nên ta thấy ngay rằng độ dài xâu kí tự chỉ nằm trong khoảng từ 1 đến 255. Byte đầu tiên có thể truy nhập vào qua chỉ số 0. Vì vậy độ dài thực của xâu kí tự có thể tìm ra như sau:
                              Dodai = Ord(Filenamer[0]) ;
hoặc nếu biết độ dài xâu kí tự. ta có thể tìm ra kí tự biểu diễn độ dài:
                              Filename[0]:= Char[Dodai] ;
• Khi độ dài cực đại của chuỗi là 255 ta có thế khai báo đơn giản STRING thay vì STRING[255].
• 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 đó Lenght(St) = 0. Xâu kí tự rỗng được kí hiệu ‘’.
Chúng ta có thể hiểu String như là một mảng kí tự có chỉ số chạy từ 0 đến độ dài cực đại, phần tử thứ 0 chứa độ dài thực của xâu. Song mảng kí tự có độ dài luôn luôn không đổi. Vì vậy khi ta đọc cả mảng hay viết ra cả mảng kí tự sẽ có những cái bất tiện do độ dài xâu kí tự không thay đổi được. Chúng ta sẽ thấy vai trò ứng dụng to lớn của String trong suốt quá trình lập trình. Còn mảng kí tự ít được dùng hơn String.
• Truy nhập vào 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ư khi truy nhập vào phần tử của mảng. Chỉ số này có thể chạy từ 1 tới độ dài cực đại của xâu kí tự.
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.

2. CÁC THAO TÁC TRÊN XÂU KÍ TỰ
a) Phép cộng xâu:
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 kí tự qua toán tử +.

■ Ví dụ:
                                  Filename:= 'A\' + Filename ;
Cho kết quả                Filename = 'A\VIDU.PAS'
Hoặc                          Filename:= 'Ten' + ‘File' + ‘Pas’ ;
Cho kết quả                Filename = 'TenFile.Pas'
Rõ ràng là 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 lại với nhau vì độ dài của chúng đã cố định.
Không có tính trừ, nhân, chia... cho xâu kí tự.

b) So sánh xâu kí tự:
Xâu kí tự có thể đượ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 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 nhất thì xâu có độ dài ngắn hơn được coi là bé hơn.
'FILENAME' < 'FILENAME A': cho giá trị TRUE.
'FILENAME' < 'FILENAME': cho giá trị FALSE.
- Hai xâu kí tự bằng nhau nếu như cả hai về nội dung lẫn độ dài của chúng là giống nhau.
'FILENAME' = FILENAME' là biểu thức có giá trị TRUE.

c) Khai báo STRING làm tham số CTC:
Tương tự như ARRAY, STRING có thể dùng làm tham số cho chương trình con. Ta phải khai báo kiểu dữ liệu trước khi sử dụng nó.

■ Ví dụ:
FUNCTION VIDUSAI: STRING[30]
PROCEDURE VIDUSAI (ST: STRING[50]) ;
Ta cần phải viết như sau:
TYPE
      ST30 = STRING[30] ;
      ST50 = STRING[50] ;
VAR
      CHUOI: ST30
      CHUOI: ST50 ;
FUNCTION VIDU1: ST30 ;

PROCEDURE VIDU2: (ST: ST50) ;

Khi dùng String làm tham số cho CTC, về nguyên tắc độ dài của tham số thực phải bàng độ dài của tham số hình thức, nghĩa là Turbo Pascal kiểm tra độ dài xâu giữa các tham số (Range Checking). Vì vậy lời gọi thủ tục sau là đúng hoàn toàn:
VI DU2 (CHUOI50) ;
Đó là vì CHUOI50 (tham số thực sự) có kiểu là ST50 trùng với tham số hình thức ST: ST50.
Lời gọi thủ tục VIDU2 (CHUOI30) ; sẽ bị coi là không hợp lệ vì chuỗi CHUOI30 có kiểu là ST30.
Tuy vậy bạn có thể hoàn toàn chuyển tham số STRING có độ dài khác và CTC bằng cách hướng dẫn chương trình dịch Turbo Pascal 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.

d) Viết ra màn hình:
Có thể dùng Write(St) và Writeln(St) cho 1 xâu kí tự St.

e) Đọc:
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õ Return luôn, không cho kí tự nào thì St rỗng (St = ' '), nếu ta gõ vào nhiều hơn số kí tự tối đa của St thì các kí tự cuôi dư ra sẽ bị bỏ qua.

f) Các thủ tục và hàm chuẩn xử lí xâu kí tự:
Do xâu kí tự được dùng rất phổ biến nên Turbo Pascal đã đưa vào một số thủ tục và hàm để xử lí xâu kí tự. Độ dài xâu là 255 được sử dụng để minh họa.
• Hàm Lenght (St) cho ta độ dài thực sự của xâu kí tự St.
Ta có thể tự viết lại hàm Lenght (St) như sau:
FUNCTION LENGHT (St: STRING): BYTE ;
     Begin
         Lenght:= Ord(St[0]) ;
     End ;

■ Ví dụ:
Với St:= 'FILENAME' thì Lenght(St) có giá trị bằng 8.
• Thủ tục xóa Delete( St, Vi_tri, S1) sẽ xóa bỏ trong xâu St một số kí tự S1 kể từ vị trí Vi_tri.

■ Ví dụ:
Với St:= 'FILENAME' thì sau khi gọi Delete(St, 2, 3) St sẽ có giá trị bằng 'FNAME' vì xóa đi 3 kí tự 'ILE'.
Nếu Vi_tri + SI > Lenght(St) thì chỉ xóa những kí tự cuối của nó tính từ Vi_tri.

■ Ví dụ:
Với St:= 'FILENAME' thì sau khi gọi Insert ('TEST', St, 5) St sẽ có giá trị bằng 'FILETESTNAME'.
Nếu Lenght (S1) + Lenght (St) vượt quá độ đài cực đại của St thì các kí tự nằm trong độ dài cực đại mới được giữ lại.
Nếu Vi_tri > Lenght (St) thì SI sẽ được nối vào đuôi của St.
• Thủ tục St (GiaTri, St) sẽ biến đổi giá trị bằng sô nguyên hoặc thực hành một chuỗi kí tự biểu diễn số đó.

■ Ví dụ: với I = 234,
Str (I: 5, St) sẽ cho St = 234(*5 kí tự*).
• Thủ tục Val(St, GiaTri, Maloi) sẽ biến đổi một xâu kí tự St thành một số nguyên hoặc thực chứa kết quả trong Giatri. Maloi dùng để phát hiện lỗi: nếu St chứa chuỗi kí tự tương ứng với một số thì Maloi có giá trị 0. Ngược lại, Maloi sẽ mang giá trị là vị tri của kí tự đầu tiên sai trong St.

Ví dụ: St = '123.456', X là biến thực, Er là biến nguyên.
              Val(St, X, Er) cho ta X = 123.456 và Er = 0.
   Nếu I là biến nguyên
            Val(St, X, Er) cho ta I = 0 và Er = 4.
Nếu St = '23.456’
            Val(St, X, Er) cho ta X = 0 và Er = 3. 
• Hàm Copy(St, Vi_tri, Kt) sẽ nhập kí tự trong St bắt đầu từ vị trí Vi_tri.

■ Ví dụ: St =:='123456789';
               St1:= Copy(St, 4, 3) ; sẽ cho St1= '456'.
• Hàm ghép Concat(St1, St2,…, Stn) sẽ ghép nối tất cả các chuỗi St1, St2, Stn thành một xâu kí tự tương tự ghép +.
Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây