L 2= EN_TRIM(TEN) 3 = EN_TRIM(ST1)
6.5 Tạo định dạng FORMAT bằng xâu ký tự
Biểu thức xâu ký tự có thể đ−ợc sử dụng để tạo định dạng FORMAT tự động trong ch−ơng trình. Ví dụ sau đây cho phép in một số thực dạng dấu phẩy tĩnh với độ rộng tr−ờng bằng 9, còn số chữ số thập phân cần in ra đ−ợc lựa chọn tùy ý (tối đa là 4 chữ số):
CHARACTER (1), DIMENSION(0:4) :: TP = & & (/'0','1','2','3','4'/) ! 123456
CHARACTER (8) :: FMT = "(F9.?)" PRINT*,'Cho so X:' PRINT*,'Cho so X:'
READ*,X
READ*, N
FMT(5:5)=TP(N) ! Thay dấu (?) bởi số chữ số thập phân PRINT FMT, X
END
Ch−ơng trình sau sẽ in N số nguyên d−ơng đầu tiên trên cùng một dòng, mỗi số chiếm 4 vị trí (độ rộng tr−ờng bằng 4): ! 1234567890 CHARACTER *11 :: FMT = '(2X, ???I4)' CHARACTER *3 SubSt PRINT*,'CHO SO N:' READ*,N WRITE(SubSt,'(I3.3)') N ! Đổi số N thành ký tự FMT(6:8)=SubSt WRITE(*, FMT) (I,I=1,N) END
Sau đây là một ví dụ về kết xuất thơng tin dạng mảng ra file TEXT có qui cách. Giả sử trong khi thực hiện ch−ơng trình ta muốn in một mảng hai chiều ra file TEXT d−ới dạng ma trận, tức dữ liệu l−u trữ trong file phải đ−ợc bố trí thẳng hàng thẳng cột, trong khi kích th−ớc của mảng không đ−ợc biết tr−ớc mà chỉ đ−ợc xác định trong q trình tính tốn. Để làm điều đó ta có thể sử dụng đoạn ch−ơng trình sau.
PROGRAM In_Co_Dinh_Dang REAL, ALLOCATABLE :: A(:,:) INTEGER M, N, I, J CHARACTER FMT*80 ... M = ... N = ... ALLOCATE (A(N, M)) ... OPEN (3, FILE=”OUT.TXT”) WRITE (FMT,'(A1,I2.2,A6)') '(', M, 'F15.8)' DO I=1,N WRITE (3,FMT) (A(I,J),J=1,M) ENDDO ... END 6.6 Mảng xâu ký tự
Xâu ký tự có thể khai báo ở dạng biến đơn cũng có thể khai báo ở dạng biến mảng. Mảng xâu ký tự là mảng trong đó mỗi phần tử là một xâu ký tự. Các phần tử trong mảng xâu ký tự phải có độ dài giống nhau. Nh− vậy, nếu mỗi phần tử trong mảng có độ dài là n ký tự, thì mảng một chiều gồm m phần tử sẽ có kích th−ớc n x m ký tự. Ví dụ, ch−ơng
trình sau đây định nghĩa các ngày trong tuần là các xâu ký tự đ−ơc xác định bởi các phần tử t−ơng ứng của một mảng:
&(/ ’Thu 2’, ‘Thu 3’, ‘Thu 4’, ‘Thu 5’,& & ‘Thu 6’,’Thu 7’,’Chu nhat’ /)
PRINT*,’Cac ngay trong tuan la:’ DO I = 1,7
PRINT*, DayOfWeek (I) END DO
END
Trong ví dụ này, mảng DayOfWeek là mảng một chiều gồm 7 phần tử, mỗi phần tử là một xâu có độ dài cực đại bằng 8 ký tự.
Ta cũng có thể truy cập đến từng ký tự riêng biệt trong các phần tử của mảng. Ví dụ, DayOfWeek(1)(5:5) là ký tự thứ 5 của phần tử thứ nhất của mảng, nên nó có giá trị là “2”.
Bài tập ch−ơng 6
6.1 Một từ đ−ợc định nghĩa nh− là một dãy ký tự khác dấu cách đứng liền nhau. Giả thiết giữa các từ chỉ đ−ợc phân cách nhau bởi các dấu cách. Viết ch−ơng trình nhập vào một xâu ký tự có độ dài tùy ý và cho biết trong xâu đó có bao nhiêu từ, mỗi từ dài bao nhiêu ký tự.
6.2 Định nghĩa một câu là một dãy các từ đ−ợc kết thúc bằng dấu chấm (.). Viết ch−ơng trình nhập vào một xâu ký tự và cho biết trong xâu đó có bao nhiêu câu.
6.3 Theo qui định về gõ văn bản, các dấu phân cách nh− chấm câu, dấu phẩy, dấu ngoặc mở, dấu ngoặc đóng, dấu chấm than, dấu hỏi,… phải viết liền ngay sau ký tự kết thúc của một từ. Giả sử có file văn bản (TEXT file) có tên là DOC.TXT mà nội dung của nó gồm N dịng, mỗi dịng dài khơng q 80 ký tự. Viết ch−ơng trình đọc file văn bản và cho biết trong file có bao nhiêu lỗi xảy ra khi gõ các dấu chấm câu và dấu phẩy không đúng qui định.
6.4 Phát triển bài tập 6.3 cho các tr−ờng hợp dấu phân cách khác và sửa các lỗi đó cho file văn bản.
6.5 Viết ch−ơng trình đọc vào một câu (kết thúc bởi dấu chấm) và in lên màn hình (khơng in dấu chấm) theo thứ tự nghịch đảo: a) các từ; b) các ký tự. Ví dụ, “Ha Noi.” ẻ “Noi Ha” và “ioN aH”.
6.6 Cơng thức đồng d− Zeller có thể đ−ợc dùng để tính ngày trong tuần có dạng:
[ ] [ ] [ ]
( m k y y c c)
f = 2.6 −0.2 + + + /4 + /4 −2 modulo 7.
Trong đó m là số thứ tự tháng, với qui −ớc tháng 1 và tháng 2 t−ơng ứng là tháng thứ 11 và tháng thứ 12 của năm tr−ớc, tháng 3 là tháng thứ 1,…, tháng 12 là tháng thứ 10; k là số thứ tự ngày trong tháng; c là số thứ tự thế kỷ; y là số thứ tự năm trong thế kỷ; f=0 là Chủ Nhật, f=1 là Thứ Hai,…; dấu ngoặc vng là ký hiệu lấy phần ngun. Ví dụ, ngày 23 tháng 8 năm 1963 đ−ợc biểu diễn bởi m = 6, k = 23, c = 19, y = 63; ngày 01 tháng 01 năm 1980 đ−ợc biểu diễn bởi m = 11, k = 1, c = 17, y = 99. Viết ch−ơng trình đọc một xâu ký tự mô tả thời gian là một ngày nào đó, chẳng hạn, “Today is 08/03/2005”, chuyển thông tin ngày, tháng, năm từ xâu ký tự này thành dạng số và sử dụng công thức Zeller để xác định ngày đó là ngày thứ mấy trong tuần.
6.7 Viết ch−ơng trình đọc họ và tên (bao gồm cả tên đệm) của một ng−ời và in ra chỉ Họ và Tên (khơng có tên đệm) của ng−ời đó.
6.8 Theo qui −ớc ghi số liệu quan trắc m−a, nếu có m−a nh−ng khơng tiến hành đo l−ợng m−a thì ghi dấu (x), nghĩa là mất số liệu, nếu không m−a thì ghi dấu (−), trong những tr−ờng hợp khác l−ợng m−a đ−ợc biểu thị bằng một số thực không âm. Giả sử file số liệu RAIN.TXT l−u giá trị quan trắc tổng l−ợng m−a ngày trong 10 năm, mỗi năm 12 tháng, của một trạm nào đó, trong đó mỗi dịng gồm tối đa 31 số, cách nhau bởi các dấu
cách, ghi số liệu từng ngày trong một tháng. Viết ch−ơng trình đọc file số liệu và cho biết có bao nhiêu ngày có m−a nh−ng khơng đ−ợc quan trắc, bao nhiêu ngày khơng m−a.
6.9 Viết ch−ơng trình con dạng thủ tục cho phép in một ma trận các số thực có kích th−ớc M hàng N cột vào một file TEXT sao cho trên mỗi hàng có đúng N phần tử, với M và N bất kỳ. Các số đ−ợc in d−ới dạng số thực dấu phẩy tĩnh (Fw.d) với độ rộng tr−ờng (w) và số chữ số sau dấu chấm thập phân (d) cũng đ−ợc xác định qua truyền tham số cho ch−ơng trình con.
Ch−ơng 7. Kiểu file
7.1 Khái niệm
Trong hệ thống vào/ra của Fortran, dữ liệu đ−ợc l−u trữ và chuyển đổi chủ yếu thông qua các file. Tất cả các nguồn vào/ra cung cấp và kết xuất dữ liệu đ−ợc xem là các
file. Các thiết bị nh− màn hình, bàn phím, máy in đ−ợc xem là những file ngồi
(external files), kể cả các file số liệu l−u trữ trên đĩa. Các biến trong bộ nhớ cũng có thể đóng vai trị nh− các file, đặc biệt chúng đ−ợc sử dụng để chuyển đổi từ dạng biểu diễn mã ASCII sang số nhị phân (binary). Khi các biến đ−ợc sử dụng theo cách này, chúng đ−ợc gọi là các file trong.
Các file trong hoặc file ngoài đều đ−ợc liên kết với cái gọi là thiết bị lôgic. Thiết bị lôgic là một khái niệm đ−ợc sử dụng để tham chiếu đến các file. Ta có thể nhận biết một thiết bị lơgic liên kết với một file bằng định danh (UNIT=).
Định danh UNIT đối với một file trong là tên của một biến ký tự liên kết với nó. Định danh UNIT đối với một file ngoài hoặc là một số nguyên d−ơng đ−ợc gán trong lệnh
OPEN, hoặc là một số kết nối tr−ớc nh− là định danh UNIT đối với thiết bị, hoặc dấu sao
(*). Các định danh UNIT ngoài đ−ợc kết nối với các thiết bị nhất định khơng đ−ợc mở (OPEN). Các UNIT ngồi đã kết nối sẽ bị ngắt kết nối khi kết thúc thực hiện ch−ơng trình hoặc khi UNIT bị đóng bởi lệnh CLOSE.
Tại một thời điểm UNIT không thể kết nối với nhiều hơn một file, và file cũng không kết nối với nhiều hơn một thiết bị.
Định danh UNIT liên kết với một file ngoài phải là một số nguyên, một biểu thức nguyên hoặc dấu sao (*). Nếu là số nguyên hoặc biểu thức nguyên, giá trị của nó sẽ liên kết với một file trên đĩa; nếu là dấu sao (*) thì khi đọc vào nó đ−ợc hiểu là bàn phím, cịn khi in ra ngầm định là màn hình. Ví dụ:
OPEN (UNIT = 10, FILE = ‘TEST.dat')
WRITE(10,'(A18,\)')' Ghi vao File TEST.dat & & da lien ket voi UNIT 10‘ WRITE (*, '(1X, A30,\)') ' In ra man hinh.‘
Fortran ngầm định một số thiết bị chuẩn liên kết với định danh UNIT nh− sau: − Dấu sao (*): Màn hình hoặc bàn phím
− UNIT = 0: Màn hình hoặc bàn phím − UNIT = 5: Bàn phím
Ví dụ 7.1. Trong ch−ơng trình sau đây, UNIT 6 nếu khơng liên kết với file ngồi nó
sẽ đ−ợc hiểu là màn hình. Tuy nhiên khi muốn liên kết nó với file ngồi ta phải sử dụng lệnh mở file (OPEN), và để loại bỏ liên kết đó ta dùng lệnh đóng file (CLOSE).
REAL a, b
! In ra màn hình (UNIT 6 đã kết nối tr−ớc). WRITE(6, '('' Day la UNIT 6'')')
! Sử dụng lệnh OPEN để kết nối UNIT 6 ! với file ngồi có tên 'COSINES'.
OPEN (UNIT = 6, FILE = 'COSINES', STATUS = 'NEW') DO a = 0.1, 6.3, 0.1 DO a = 0.1, 6.3, 0.1
b = COS (a)
! Ghi vào file 'COSINES'. WRITE (6, 100) a, b 100 FORMAT (F3.1, F5.2) END DO
! Đóng file, cắt bỏ kết nối với file trên đĩa. CLOSE (6)
! Kết nối lại UNIT 6 với màn hình bằng cách ! ghi ra màn hình
WRITE(6,' ('' Ket thuc chuong trinh '')') END
Định danh UNIT liên kết với file trong là xâu ký tự hoặc mảng ký tự. Đối với các file trong ta chỉ có thể sử dụng các câu lệnh READ hoặc WRITE. Ta khơng thể mở hoặc đóng file trong nh− đối với các file ngồi.
Có thể đọc và ghi các file trong với việc sử dụng lệnh định dạng FORMAT nh− đối với các file ngoài. Tr−ớc khi câu lệnh vào/ra đ−ợc thực hiện, các file trong đ−ợc định vị tại vị trí đầu của bản ghi đầu tiên.
Bằng khái niệm file trong, Fortran cho phép ta chuyển đổi giữa các dạng dữ liệu, chẳng hạn đổi ký tự sang số hoặc đổi số sang dạng ký tự.
Ví dụ 7.2. Chuyển đổi dữ liệu từ ký tự thành số và từ số thành ký tự khi sử dụng
khái niệm file trong.
CHARACTER(10) str INTEGER n1, n2, n3 CHARACTER(14) fname INTEGER I str = " 1 2 3" ! Xâu ký tự READ(str, *) n1, n2, n3 ! Đọc n1, n2, n3 từ xâu str (Chuyển ký tự thành số) PRINT*,n1,n2,n3 I = 4 WRITE (fname, 200) I
! Ghi giá trị của I vào fname (Chuyển số thành ký tự) 200 FORMAT ('FM', I3.3, '.DAT')
PRINT*,fname END
Trong ch−ơng trình trên, Str và Fname là các file trong. Kết quả chạy ch−ơng trình ta sẽ nhận đ−ợc n1=1, n2=2, n3=3, fname = “FM004.DAT”.