127
Chương 6
Biến ký tự
6.1 Khai báo biến ký tự
Hiểu một cách đơn giản, hằng ký tự là một xâu (dãy) các ký tự nằm giữa các cặp dấu
nháy đơn (‘ ’) hoặc nháy kép (“ ”). Biến ký tự là biến có thể nhận giá trị là các hằng ký tự.
Bởi vì mỗi ký tự chiếm một byte bộ nhớ, nên dung lượng bộ nhớ mà xâu ký tự chiếm phụ
thuộc độ dài của xâu ký tự.
Nói chung có thể có nhiều cách khai báo biến ký tự như đã được đề cập
đến trong mục
1.4.2. Sau đây dẫn ra một số ví dụ về cách khai báo biến ký tự thường dùng.
CHARACTER StrName [,...]
!
Khai báo biến
StrName
có độ dài 1 ký tự
CHARACTER ([LEN=]n) StrName [,...]
!
Khai báo biến
StrName
có độ dài
n
ký tự
CHARACTER *n StrName [,...] !
Tương tự như trên
hoặc:
CHARACTER *(*) , PARAMETER :: ST1 = 'ABDCEF'
Trong trường hợp này độ dài của xâu sẽ là độ dài thực của xâu được gán.
6.2 Các xâu con (SUBSTRING)
Xâu con là một bộ phận của xâu ký tự. Xâu con có thể chỉ có một ký tự cũng có thể là
toàn bộ xâu. Giả sử
TEXT
là một xâu có độ dài cực đại 80 ký tự:
CHARACTER (80) TEXT
Khi đó
TEXT(I:J)
là xâu con gồm các ký tự từ ký tự thứ
I
đến ký tự thứ
J
của xâu
TEXT
. Từng ký tự riêng biệt trong xâu
TEXT
có thể được tham chiếu (truy cập) đến bằng
xâu con
TEXT(I:J)
. Ví dụ:
TEXT(J:J) !
ký tự thứ J của xâu
TEXT
TEXT(:J) !
từ ký tự thứ 1 đến ký tự thứ J
TEXT(1:J) !
TEXT= “Hanoi * Vietnam”
TEXT(2:5) = “ANOI”
sẽ cho
TEXT= “HANOI–Vietnam”
6.3 Xử lý biến ký tự
Xử lý biến ký tự trong Fortran là một vấn đề khá phức tạp. Ở một số ngôn ngữ lập trình
khác (chẳng hạn, PASCAL), việc xử lý biến ký tự nói chung được hỗ trợ bởi nhiều thủ tục
hoặc hàm thư viện. Đối với Fortran, vấn đề này thường phải do người dùng tự lập. Sau đây ta
sẽ xét một số bài toán làm ví dụ minh hoạ.
Ví dụ
6.1
.
Một trong những thủ thuật xử lý biến ký tự là chèn một xâu vào một xâu ký tự
khác. Có thể nêu nguyên tắc thực hiện như sau: Để chèn một xâu
SubStr
vào một vị trí nào đó
của xâu
Str
cho trước cần phải dịch chuyển các ký tự phía sau vị trí cần chèn của xâu
Str
sang
phải một số vị trí bằng độ dài xâu
SubStr.
Giả sử có xâu
TEXT = “Hanoi
−
Saigon”
, nếu muốn chèn xâu con “
Hàm
LEN_TRIM (TEXT)
trong chương trình trả về độ dài xâu
TEXT
sau khi đã loại
bỏ các dấu cách ở bên phải nhất
của xâu. Có thể mô tả tác động của chương trình như sau.
Cho
J
lần lượt nhận các giá trị từ độ dài thực (
LenTEXT
) của xâu
TEXT
đến vị trí cần chèn
xâu con (
I
), mỗi lần như vậy ta sao chép ký tự thứ
J
của xâu
TEXT
đến vị trí
J+LENSub
.
Kết quả của vòng lặp này đã dịch chuyển (sao chép) nội dung
TEXT(I:LenTEXT)
lùi sang
phải
LENSub
vị trí. Tiếp đó ta ghi đè nội dung của xâu con
130
IF (L > 0) THEN !
Nếu còn tìm thấy:
OK = .FALSE.
ST2 = ' ' !
Gán các dấu cách cho ST2
ST2(1:L-1) = ST1(1:L-1)!
Sao chép nội dung ST1
ST2(L:) = ST1(L+1:) !
vào ST2 sau khi loại
!
bỏ bớt 1 dấu cách
ST1 = ST2 !
Sao chép ST2 vào ST1
ELSE
OK = .TRUE. !
Nếu không tìm thấy thì thoát
END IF
END DO
ST = ‘ ‘
ST = ST1
PRINT*,ST
END
FUNCTION ALLTRIM (ST)
CHARACTER *80 ST, ALLTRIM
INTEGER I, J
trong xâu có bao nhiêu từ và cho biết nội dung của chúng.
131
CHARACTER (Len=80) ST, ST1, ST2, ALLTRIM
CHARACTER*10 S(20) !
Mảng chứa nội dung các từ
INTEGER L, I, K
LOGICAL OK
ST=' Ha noi la Thu do cua VIET NAM '
PRINT*, ST
CALL NO_DOUBLE_SPACES(ST)
ST1 = ST
I=0 !
Biến đếm số từ có trong xâu
L=1 !
Vị trí của các từ trong xâu
OK=.FALSE.
DO WHILE (.NOT.OK)
K=INDEX( TRIM(ST1(L:)), ' ')
IF (K > 0) THEN !
Nếu tìm thấy dấu cách giữa 2 từ
I=I+1
S(I)=ST1(L:L+K-1) !
Lưu nội dung từ thứ I
L=L+K
ELSE
OK=.TRUE.
END IF
END DO