- Trong danh sách đối số, nên liệt kê riêng các đối số đầu vào trước, sau đó mới đến các đối số đầu ra. Bài tập 1. Giả sử có mảng một chiều X với 100 giá trị thực. Hãy viết một thủ tục tạo ra mảng Y theo cách mỗi phần tử của mảng Y bằng phần tử tương ứng của mảng X trừ đi phần tử nhỏ nhất. 2. Viết một thủ tục nhận một mảng giá trị thực X với 50 hàng và 2 cột và trả lại chính mảng đó nhưng dữ liệu được sắp...
- Trong danh sách đối số, nên liệt kê riêng đối số đầu vào trước, sau đến đối số đầu Bài tập Giả sử có mảng chiều X với 100 giá trị thực Hãy viết thủ tục tạo mảng Y theo cách phần tử mảng Y phần tử tương ứng mảng X trừ phần tử nhỏ Viết thủ tục nhận mảng giá trị thực X với 50 hàng cột trả lại mảng liệu xếp lại theo chiều tăng dần cột thứ Viết thủ tục nhận mảng giá trị thực X với n dòng m cột trả mảng Y số dòng, số cột liệu biến đổi cho phần tử tương ứng cột thứ cột thứ J đổi chỗ cho Ax=b ⎛ ⎜ ⎜ A = (a ij ) = ⎜ ⎜ ⎜ ⎝ a11 a 21 a12 a 22 a n1 an2 ⎛ a1n ⎞ ⎛ b1 ⎞ ⎜ ⎟ ⎜ ⎟ a n ⎟ b ⎜ ⎟ x=⎜ ; b=⎜ ; ⎜ ⎟ ⎟ ⎜ ⎟ ⎜ ⎟ ⎜ ⎜ b ⎟ a nn ⎟⎠ ⎝ ⎝ n ⎠ x1 x2 xn ⎞ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ Hãy viết thủ tục GAUSS (A, B, N, X) nhận vào mảng A, B, số ẩn N hệ tính mảng X theo phương pháp loại biến Gauss Xem giải thích phương pháp Gauss phụ lục Giả sử cho trước hai ma trận A ( n dòng, m cột) ma trận B ( m dịng, l cột) Tích AB ma trận C ( n dòng, l cột) với phần tử tính theo cơng thức m c i , j = ∑ a i , k bk , j (i = 1, , n; j = 1, , l ) k =1 Viết thủ tục TICHMT (A, B, N, M, L, C) với đối số đầu vào ma trận A , ma trận B , tham số N, M, L đối số đầu ma trận C Hệ phương trình đại số tuyến tính n ẩn a11 x1 a 21 x1 + + a12 x a 22 x + + a n1 x1 + a n x2 + + + a1n x n a2n xn = = b1 b2 + a nn x n = bn ⎫ ⎪ ⎪ ⎬ ⎪ ⎪⎭ viết dạng ma trận sau 84 Một ký tự coi xâu ký tự với độ dài Do đó, ta gọi chung liệu xâu ký tự liệu ký tự hay liệu văn Dưới thí dụ ký tự độ dài tương ứng chúng: Chương 10 - Kiểu liệu văn Ngoài liệu số số ngun, số thực, máy tính cịn lưu giữ xử lý liệu văn chữ cái, đoạn văn bản, chữ số số ký hiệu khác Trong Fortran gọi chung liệu liệu ký tự Trong chương xét thêm đặc điểm khai báo liệu ký tự, số thao tác với liệu ký tự ứng dụng chúng xử lý thông tin 10.1 Tập ký tự Fortran Tập ký tự Fortran gồm 26 chữ tiếng Anh, mười chữ số từ đến 9, dấu trống 12 ký hiệu sau đây: + − * / = ( ) , ' $ : Ngồi cịn số ký tự khác tùy thuộc vào hệ máy tính khác 'CHU NHAT' ký tự 'SENSOR 23' ký tự '08:40−13:25' 11 ký tự 'LE QUY DON' 10 ký tự ' ' ký tự '''''' ký tự 10.2 Các dạng khai báo biến ký tự ♦ Biến ký tự khai báo lệnh mô tả dạng tổng quát sau: CHARACTER * n Danh sách biến n số ký tự (độ dài) xâu ký tự Thí dụ lệnh CHARACTER * TEN, NGAY TEN NGAY biến chứa ký tự biến ♦ Lệnh CHARACTER biến thể sau cho phép ta khai báo biến ký tự với độ dài khác dòng lệnh CHARACTER TITLE * 10, NUOC * Các ký tự nằm cặp dấu nháy Trong ký tự dấu nháy ' biểu thị hai dấu nháy ‘’ (không phải dấu ngoặc kép) Thí dụ chữ LET'S tiếng Anh viết 'LET''S' ♦ Một mảng chứa số phần tử, phần tử có giá trị xâu ký tự khai báo hai cách tương đương sau: Thông thường người ta xử lý máy tính từ, dịng chữ gồm số ký tự ghép lại với Trong trường hợp người ta gọi xâu ký tự Độ dài xâu ký tự số ký tự ghép lại xâu ký tự CHARACTER NAME (50) * CHARACTER * NAME (50) ♦ Các xâu ký tự dùng chương trình 85 Xâu ký tự phải khai báo lệnh CHARACTER chương trình chương trình Cũng mảng liệu số nguyên, số thực, chương trình khai báo biến ký tự mà không cần định rõ độ dài xâu kích thước mảng Thí dụ: CHARACTER * (*) BCC CHARACTER * (*) NAME (N) 10.3 Nhập, xuất liệu ký tự Khi xâu ký tự dùng lệnh xuất toàn xâu in Những dấu trống tự động chèn vào xâu để tách riêng xâu ký tự với mục in khác dòng Trong lệnh nhập, giá trị biến ký tự phải bao cặp dấu nháy Nếu số ký tự cặp dấu nháy nhiều so với độ dài mơ tả biến ký tự, ký tự thừa bên phải bị bỏ qua (bị cắt bỏ); số ký tự − vị trí thừa bên phải tự động điền dấu trống Để in xâu ký tự lệnh xuất có định dạng, dùng đặc tả A (chú ý, khơng cần rõ số vị trí dành cho mục in) Thí dụ: với đoạn chương trình: Thấy số ký tự gõ vào biến THU 8, không dài tới 20 khai báo Nhưng in hình ta không thấy rõ dấu trống tự động điền vào phía bên phải Nếu lệnh FORMAT lệnh in có dạng FORMAT (1X, A, ' LA NGAY VUA NHAP') hình thấy rõ dấu trống sau: CHARACTER * 20 THU PRINT *, ' HAY NHAP MOT NGAY TRONG TUAN' READ *, THU PRINT 5, THU FORMAT (1X, 'NGAY VUA NHAP LA ', A) END tương tác hình sau: 10.4 Những thao tác với liệu ký tự 10.4.1 Gán giá trị ký tự Những giá trị ký tự gán cho biến ký tự lệnh gán ký tự Nếu có độ dài nhỏ số ký tự khai báo biến, dấu trống tự động điền vào bên phải; có độ dài lớn - ký tự thừa bị bỏ qua Thí dụ: CHARACTER * MONHOC (3) 86 MONHOC (1) = 'TOAN' MONHOC (2) = 'LY' MONHOC (3) = 'HOA HOC' Trong lệnh ta khai báo mảng MONHOC gồm phần tử, phần tử xâu dài ký tự Vậy MONHOC (1) lưu 'TOAN', MONHOC (2) lưu 'LYbb', MONHOC (3) lưu 'HOAb' (chữ b dấu trống) Qua thí dụ ta thấy tầm quan trọng việc sử dụng xâu có độ dài mơ tả biến; không lệnh xử lý sai Một biến ký tự gán giá trị biến ký tự khác lệnh gán, thí dụ CHARACTER * LOAI1, LOAI2 LOAI1 = 'GIOI' LOAI2 = LOAI1 Sau lệnh gán này, hai biến LOAI1 LOAI2 lưu xâu ký tự 'GIOI' Lệnh DATA dùng để khởi xướng giá trị biến ký tự Thí dụ sau gán 12 tên tháng tiếng Anh vào mảng THANG: CHARACTER * THANG (12) DATA THANG / 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', * 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' / 10.4.2 So sánh giá trị ký tự Biểu thức lôgic lệnh IF lơgic phép so sánh biến, ký tự Thí dụ, biến THANG, CH, TG biến ký tự, lệnh sau lệnh đúng: IF (THANG EQ 'FEB') NGAY = 28 IF (CH (I) GT CH (I+1)) THEN TG = CH (I) CH (I) = CH (I+1) CH (I+1) = TG END IF Khi đánh giá biểu thức lôgic với xâu ký tự, trước hết chương trình xét độ dài hai xâu Nếu xâu ngắn xâu khác, xâu ngắn bổ sung thêm dấu trống bên phải cho hai xâu trở thành có độ dài Việc so sánh hai xâu ký tự độ dài thực từ trái sang phải theo ký tự Hai xâu chúng có ký tự thứ tự Các ký tự so sánh với theo chuỗi thứ tự so sánh (collating sequence) Chuỗi liệt kê ký tự từ thấp đến cao Thí dụ, phần chuỗi thứ tự so sánh ký tự ASCII liệt kê ký tự đây: Chuỗi thứ tự so sánh ký tự: b''#$%&()*+,-./ 0123456789 :;=?@ ABCDEFGHIJKLMNOPQRSTUVWXYZ Theo chuỗi này, so sánh sau đúng: 'A1' < 'A2' 'JOHN' < 'JOHNSTON' '175' < '176' 'THREE' < 'TWO' '$' < 'DOLLAR' 87 Nếu xâu ký tự chứa chữ cái, thứ tự từ thấp đến cao thứ tự alphabê, gọi thứ tự từ vựng (lexicographic ordering) 10.4.3 Trích xâu biến giá trị LANG thành 'FORMATT' Nhưng lệnh sau sai thực LANG (3: 5) = LANG (2: 4) Xâu phần trích từ xâu xuất phát giữ nguyên thứ tự ban đầu Trong Fortran xâu viết tên xâu xuất phát, kèm theo hai biểu thức nguyên nằm cặp dấu ngoặc đơn, cách dấu hai chấm Biểu thức thứ vị trí xâu xuất phát mà từ xâu trích Biểu thức thứ hai vị trí cuối Thí dụ, xâu 'FORTRAN' lưu biến LANG, ta có xâu sau Biến Xâu LANG (1 : 1) LANG (1 : 7) LANG (2 : 3) LANG (7 : 7) 'F' 'FORTRAN' 'OR' 'N' 1) Ta không viết biểu thức thứ cặp dấu ngoặc đơn giá trị khơng viết biểu thức thứ hai giá trị độ dài xâu xuất phát Ta khơng viết hai biểu thức Nhưng ba trường hợp phải có dấu hai chấm (:) cặp dấu ngoặc Thí dụ: LANG (:4) LANG (5:) LANG (:) LANG (7: 7) = LANG (6: 6) 'FORT' 'RAN' 'FORTRAN' 2) Khi phép trích xâu sử dụng tên biến, biểu thức cặp dấu ngoặc đơn khơng phủ lên Thí dụ, biến LANG chứa xâu 'FORMATS', lệnh 3) Những trường hợp như: vị trí đầu cuối khơng phải số nguyên, số âm, vị trí đầu lớn vị trí cuối, vị trí đầu vị trí cuối có giá trị lớn độ dài mô tả xâu con, việc trích xâu khơng thể thực đắn Thí dụ 32: Đếm số ký tự văn Giả sử điện dài 50 ký tự Hãy đếm số từ điện Ta biết văn soạn từ cách dấu trống, ta cần đếm số dấu trống văn số từ số dấu trống cộng thêm Với trường hợp chương trình sau đếm số từ: CHARACTER * 50 MESSGE INTEGER COUNT, I COUNT = DO 10 I = 1, 50 IF (MESSGE (I: I) EQ ' ') COUNT = COUNT + 10 CONTINUE PRINT 5, COUNT + FORMAT (1X, 'BUC DIEN GOM ', I2, ' TU') END 10.4.4 Kết hợp xâu ký tự Kết hợp hay cộng thao tác ghép hai số xâu ký tự vào thành xâu ký tự Thao tác thực hai dấu gạch chéo // Thí dụ muốn có từ WORKED ta dùng phép kết hợp 88 'WORK' // 'ED' Nhóm lệnh sau cho phép viết ngày tháng theo quy cách tiếng Việt, tức thêm gạch chéo ngăn cách ký hiệu ngày, tháng năm: chương trình Thí dụ 33: Cấu tạo tên viết tắt người Viết chương trình đọc từ bàn phím họ tên đầy đủ (gồm họ, chữ đệm tên) người in lên hình dạng viết tắt (Thí dụ, nhập vào họ tên đầy đủ sau: TRAN CONG MINH, CHARACTER DAY*2,MONTH*2,YEAR*4,DATE*10 READ *, DAY, MONTH, YEAR DATE = DAY//'/'//MONTH//'/'//YEAR PRINT *, DATE END Theo nhóm lệnh này, thực lệnh READ ta gõ từ bàn phím '05' '10' '1999' ↵ hình in ra: 05/10/1999 10.4.5 Những hàm chuẩn xử lý xâu ký tự • Hàm INDEX Hàm có hai đối số kiểu xâu ký tự, đưa số nguyên vị trí xâu thứ hai xâu thứ Thí dụ ta có biến STR chứa mệnh đề 'TO BE OR NOT TO BE' dùng lệnh K = INDEX (STR, 'BE') biến K có giá trị xâu 'BE' xuất lần xâu STR vị trí thứ • Hàm LEN Hàm LEN có đối số kiểu xâu ký tự, đưa số nguyên độ dài xâu Hàm có ích chương trình chấp nhận xâu ký tự độ dài cần biết độ dài thực tế dạng in T C MINH Chương trình NAMEED cho phép ta gõ từ bàn phím xâu ký tự gồm họ, chữ đệm tên dòng cách dấu trống Thủ tục EXTR cho phép tách riêng phần họ, chữ đệm tên dựa vào vị trí dấu trống họ tên đầy đủ Sau thủ tục EDIT ghép chữ phần họ, chữ đệm kèm theo dấu chấm dấu trống với tên để cấu tạo thành tên viết tắt PROGRAM NAMEED CHARACTER HO *10, DEM *10, TEN *20, HOTEN *25 PRINT *, 'Nhap ho, chu dem, ten cach dau trong' READ 5, HOTEN FORMAT (A) CALL EXTR (HOTEN, HO, DEM, TEN) CALL EDIT (HO, DEM, TEN, HOTEN) PRINT *, HOTEN END SUBROUTINE EXTR (XHOTEN, XHO, XDEM, XTEN) CHARACTER * (*) XHO, XTEN, XDEM, XHOTEN INTEGER B1, B2 B1 = INDEX (XHOTEN, ' ') B2 = B1 + INDEX (XHOTEN (B1 + 1:) , ' ') 89 XHO = XHOTEN (:B1-1) XDEM = XHOTEN (B1+1: B2-1) XTEN = XHOTEN (B2+1:) RETURN END SUBROUTINE EDIT (XHO, XDEM, XTEN, XHOTEN) INTEGER L CHARACTER *(*) XHO, XTEN, XDEM, XHOTEN XHOTEN = XHO(1: 1) // '.' L = INDEX (XHOTEN, ' ') + XHOTEN (L: L + 2) = XDEM (1: 1) // ' ' XHOTEN (L + 3:) = XTEN RETURN END tự so sánh dùng máy tính từ vị trí đến 255 dùng chương trình sau: PROGRAM CSCHAR DO I = 0, 255 PRINT *, I, ' ', CHAR (I) END DO END Chương trình sau cho phép in hình vị trí chữ in hoa tiếng Anh, chữ thường chữ số từ đến chuỗi thứ tự so sánh máy tính bạn dùng: PROGRAM COLSEQ CHARACTER *70 SET SET (1: 26) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' SET (27: 52) = 'abcdefghijklmnopqrstuvwxyz' • Các hàm CHAR ICHAR Các hàm thao tác với ký tự chuỗi thứ tự so sánh dùng máy tính Nếu máy tính có 256 ký tự chuỗi thứ tự so sánh nó, ký tự đánh số từ đến 255 Hàm CHAR nhận đối số nguyên đưa ký tự chuỗi thứ tự so sánh vị trí ứng với số ngun Hàm ICHAR hàm ngược hàm CHAR Nó nhận đối số biến ký tự trả số nguyên ứng với vị trí ký tự chuỗi thứ tự so sánh Vì máy tính khác có chuỗi thứ tự so sánh khác nhau, nên hàm dùng để xác định vị trí ký tự chuỗi thứ tự so sánh Thí dụ, bạn muốn in hình tất ký tự chuỗi thứ SET (53: 62) = '0123456789' DO I = 1, 62 PRINT *, SET (I : I), ICHAR (SET (I : I)) END DO END Với máy tính thơng dụng ngày nay, chạy chương trình này, ta thấy tập chữ số từ ‘0’ đến ‘9’ có vị trí từ 48 đến 57, tập chữ hoa tiếng Anh từ ‘A’ đến ‘Z’ có vị trí từ 65 đến 90 tập chữ thường tiếng Anh từ ‘a’ đến ‘z’ có vị trí từ 97 đến 122 chuỗi thứ tự so sánh Các vị trí cịn lại chuỗi thứ tự so sánh ứng với ký tự khác, có ký tự chuyên dùng để biểu diễn chữ 90 Hy Lạp, ký tự dùng để kẻ biểu bảng Ta khai thác chi tiết để viết thủ tục có ích in biểu bảng đẹp xuất liệu lên hình, tự động tạo tên file chương trình cần thiết • Các hàm LGE, LGT, LLE, LLT Những hàm cho phép ta so sánh xâu văn dựa chuỗi thứ tự so sánh ASCII Những hàm có ích chương trình có so sánh xâu hay xếp ký tự dùng máy tính khác Những hàm trả giá trị lôgic - TRUE FALSE tuỳ thuộc kết so sánh hai đối số kiểu xâu ký tự Thí dụ, ta có hai biến ký tự XAU1, XAU2 LGE (XAU1, XAU2) cho giá trị TRUE XAU1 lớn XAU2 phương diện từ vựng Các hàm LGT, LLE LLT thực phép so sánh “lớn từ vựng”, “nhỏ từ vựng” “nhỏ từ vựng” Nhớ hàm dựa chuỗi thứ tự so sánh ASCII chuỗi thứ tự so sánh máy tính Trong Fortran 90 cịn có hàm ADJUSTL, ADJUSTR dùng để dồn xâu ký tự trái phải cách cắt bỏ dấu trống phía trái phía phải xâu Hàm TRIM cắt bỏ dấu trống xâu văn giảm độ dài xâu cho tương xứng * Thí dụ 34: Sắp xếp danh sách theo thứ tự alphabê Viết chương trình đọc từ bàn phím tên số điện thoại 20 người In lên hình danh sách xếp thứ tự alphabê theo tên người Trong thí dụ ta sử dụng hàm so sánh bảng thứ tự so sánh ASCII Trong thực tế hàm hàm LEN không làm việc người ta mô tả tài liệu, độ dài xâu văn nhận độ dài mô tả độ dài thực tế * PROGRAM NMSORT CHARACTER *8 TEN(20), TEL (20), TEMP DO I = 1, 20 PRINT *, 'NHAP TEN NGUOI THU ', I READ 5, TEN(I) PRINT *, 'SO DIEN THOAI' READ 5, TEL (I) ENDDO FORMAT (A) DO I = 1, 19 K=I DO J = I+1, 20 IF (LGT (TEN (K), TEN (J))) K = J END DO TEMP = TEN (K) TEN (K) = TEN (I) TEN (I) = TEMP TEMP = TEL (K) TEL (K) = TEL (I) TEL (I) = TEMP PRINT *, TEN (I), TEL (I) END DO PRINT *, TEN (20), TEL (20) END Thí dụ 35: Mã hố điện Mã hóa điện làm cho dịng văn bình thường điện có dạng khác thường có người mã hóa hiểu nội dung Người ta mã hoá điện theo cách sau: Lấy xâu gồm 62 chữ chữ số làm khoá Từng chữ 91 bình thường điện mã hoá chữ khoá cho chữ A bình thường thay chữ khoá, chữ B thay chữ thứ hai Dưới chương trình nhận từ bàn phím điện in hình dạng mã hố điện Trong chương trình ta dùng khố chuỗi chữ chữ số xếp theo thứ tự khác thường sau: YXAZKLMBJOCFDVSWTREGHNIPUQ yxazklmbjocfdvswtreghnipuq9087564312 Việc mã hoá chữ điện thực thủ tục ENCODE * * * PROGRAM MSGCOD CHARACTER DIEN*255, MADIEN*255, CHARACTER KHOA*62, ALPH*62 ALPH = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’ // ‘abcdefghijklmnopqrstuvwxyz0123456789' KHOA = 'YXAZKLMBJOCFDVSWTREGHNIPUQ’ // ‘yxazklmbjocfdvswtreghnipuq9087564312' PRINT*, 'ENTER A MESSEAGE’, ‘(MAXIMUM 255 LETTERS)' READ (5, '(A255)') DIEN CALL ENCODE (KHOA, ALPH, DIEN, MADIEN) PRINT 5, MADIEN FORMAT (1X, /, 1X, 'THIS IS ENCODED AS' /, 1X, A /) END SUBROUTINE ENCODE (KEY, ALP, MESSGE, SECRET) CHARACTER MESSGE * (*), SECRET * (*) CHARACTER ALP * (*), KEY * (*), LETTER DO I = 1, LEN (MESSGE) LETTER = MESSGE (I : I) J = INDEX (ALP, LETTER) IF (J EQ 0) THEN SECRET (I : I) = LETTER ELSE SECRET (I : I) = KEY (J : J) END IF END DO RETURN END Bài tập Các biến K J có giá trị sau thực nhóm lệnh sau đây: CHARACTER *18 STRG INTEGER K, J STR = 'TO BE OR NOT TO BE' K = INDEX (STRG, 'BE') J = INDEX (STR (K + 1:), 'BE') + K Giả sử điện mã hố khố thí dụ 31, tức dùng chuỗi chữ chữ số: YXAZKLMBJOCFDVSWTREGHNIPUQ yxazklmbjocfdvswtreghnipuq9087564312 Người ta giải mã sau: Từng chữ mã điện thay chữ bảng chữ alphabê theo quy tắc: chữ mã điện trùng với chữ thứ khố chữ thay 92 chữ A bảng chữ alphabê, trùng với chữ thứ hai thay chữ B Thí dụ, giả sử mã điện dịng chữ Mỗi nhãn cách bốn dòng Chú ý sau tên thành phố dấu phảy, không nên để dấu cách trước dấu phảy DKKG YG YJRWSRG EYGHRZYU Giả sử bạn biết ngày đầu năm năm ngày thứ tuần lễ Hãy viết chương trình in tờ lịch tháng Giêng năm dạng dễ nhìn theo quy tắc trên, ta có điện giải mã sau: MEET AT AIRPORT SATURDAY Viết chương trình cho phép đọc từ bàn phím điện dạng mã hố in lên hình dạng giải mã Giả sử danh mục số điện thoại người quen bạn lưu file TELNUM dạng dòng gồm tên người đầy đủ số điện thoại người với format A30, A8 File khơng có dịng đầu báo thơng tin số dịng liệu khơng có dịng ký hiệu cuối file báo hết liệu Hãy viết chương trình đọc vào từ bàn phím tên người đó, sau kiểm tra xem người có danh mục điện thoại bạn khơng Nếu khơng có đưa thông báo 'KHONG CO TRONG DANH MUC', có in tên người với số điện thoại tìm cho số điện thoại đặt cặp dấu ngoặc sau tên File liệu ADDR chứa khoảng 50 tên người địa Dòng thứ người chứa họ tên đầy đủ (30 ký tự) gồm họ, chữ đệm tên Dòng thứ hai chứa địa số nhà đường phố (35 ký tự), tên thành phố (15 ký tự) số điện thoại (15 ký tự) Mỗi xâu ký tự ghi cặp dấu nháy Hãy viết chương trình đọc liệu in thơng tin người theo mẫu nhãn sau (thí dụ): HUY, N Q 91 NGUYEN THIEN THUAT NHA TRANG, (058)832536 Giả sử bạn biết ngày đầu năm năm thứ tuần lễ Hãy viết chương trình in tờ lịch tháng, năm tương lai dạng dễ nhìn Tháng năm nhập từ bàn phím Viết chương trình in bảng tốn tử lơgic (bảng 4.2, chương 4, trang 56) Viết thủ tục TDBANG (N, TENCOT) N đối số nguyên, TENCOT mảng chiều gồm N phần tử văn chuyên dùng để in tiêu đề cột bảng Thí dụ chương trình gọi thủ tục chuyển đối số thực tế 12 mảng 12 tên viết tắt tháng tiếng Anh ‘JAN’, ’FEB’, ‘MAR’, ‘APR’, ‘MAY’, ‘JUN’, ’JUL’, ‘AUG’, ‘SEP’, ‘OCT’, ‘NOV’, ‘DEC’ chương trình in tít đầu bảng có dạng đây: JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC Số liệu giá trị ngày yếu tố khí tượng thủy văn trạm quan trắc lưu file ASCII có quy cách ghi sau: Dòng ghi tên trạm Dòng thứ có hai số nguyên viết cách tổng số ngày quan trắc số yếu tố quan trắc Dịng thứ ba có số nguyên viết cách ngày, tháng, năm đầu ngày, tháng, năm cuối quan trắc Dòng thứ tiêu đề cột liệt kê tên tất yếu tố quan trắc, tên ghi với độ rộng vị trí bên phải Các dòng tiếp 93 theo ghi giá trị yếu tố, dịng ngày Tính giá trị trung bình tháng tất yếu tố tất năm quan trắc Kết ghi vào file mới, yếu tố file, cho tên file trùng với tên yếu tố quan trắc Chương 11 - Những đặc điểm bổ sung file 11.1 Các file nội (Internal Files) Khi đơn vị file lệnh nhập xuất tên biến ký tự, lệnh chuyển liệu từ vùng lưu giữ nội nhớ sang vùng khác Những vùng lưu giữ gọi file nội (internal file) Thí dụ, ta đọc liệu từ xâu ký tự thay đọc từ dịng liệu file thông thường với lệnh sau đây: CHARACTER * 13 DATA1 INTEGER I, J REAL X DATA1 = '137 65 42.17' READ (DATA1, *) I, J, X Những lệnh có nghĩa khai báo biến có kiểu văn DATA1 với độ dài 13 ký tự Sau gán cho biến dịng văn bản: ‘137 65 42.17 ‘ Đó việc bình thường, biết từ trước đến Nhưng ý đến lệnh cuối Đó lệnh: READ (DATA1, *) I, J, X 94 Trông lệnh giống lệnh đọc liệu bình thường, có khác thay đơn vị file cặp dấu ngoặc đơn ta đưa tên biến DATA1 vào Kết sau lệnh đọc đoạn văn biểu diễn chữ số 137, 65 42.17 đọc số nguyên, số thực gán vào biến nguyên I, J biến thực X danh sách biến cần đọc lệnh READ cách đắn Sau lệnh giá trị biến số sau: I 137, J 65 X 42.17 Đây đặc điểm quan trọng Fortran Ta thấy ích lợi đặc điểm file nội qua thí dụ sau: INTEGER PTR REAL AMOUNT CHARACTER * 15 TEMP READ (12, 5) TEMP FORMAT (A10) IF (INDEX (TEMP, '$') NE 0) THEN PTR = INDEX (TEMP, '$') TEMP (PTR: PTR) = ' ' END IF READ (TEMP, *) AMOUNT Với đoạn chương trình liệu từ đơn vị file (12) thông thường (file ngoại) đọc vào biến ký tự TEMP Trong trường hợp liệu có kèm theo dấu $ bên trái (cách viết dấu la đằng trước dính liền số tiền người Mỹ thường làm), lệnh đọc READ (12,5) TEMP không mắc lỗi kiểu liệu Sau ta xử lý, thay ký tự $ ký tự dấu trống đọc lấy giá trị số thực AMOUNT lệnh đọc file nội READ (TEMP, *) AMOUNT Nhận thấy lệnh đọc liệu từ file nội hoàn toàn tương tự lệnh đọc file thơng thường Thay số hiệu thiết bị hay số hiệu file, ta ghi tên biến (ở biến TEMP) vào vị trí thiết bị hay số hiệu file Bây ta xét thí dụ sử dụng file nội để chuyển đổi liệu số thành liệu văn Giả sử ta muốn tạo 12 tên file ‘GIO.1’, ‘GIO.2’, , ‘GIO.12’ Đoạn chương trình sau làm việc đó: INTEGER J CHARACTER *6 TENF(12), TAM DO J = 1, 12 IF (J LT 10) THEN WRITE (TAM, ‘(I1)’) J ELSE WRITE (TAM, ‘(I2)’) J END IF TENF (J) = ‘GIO’ // ‘.’ // TAM END DO 11.2 Các file truy nhập (Sequential Files) Các file sử dụng tất thí dụ từ trước tới gọi file truy nhập tuần file tạo ra, ta khơng thể cập nhật ghi đơn lẻ Muốn thay đổi ghi, ta phải đọc thơng tin ghi, sửa đổi sau ghi vào file khác Bây ta xét lệnh OPEN phức tạp có thêm định khác so với 95 ... liệu văn Dưới thí dụ ký tự độ dài tương ứng chúng: Chương 10 - Kiểu liệu văn Ngoài liệu số số ngun, số thực, máy tính cịn lưu giữ xử lý liệu văn chữ cái, đoạn văn bản, chữ số số ký hiệu khác Trong. .. khác Trong Fortran gọi chung liệu liệu ký tự Trong chương xét thêm đặc điểm khai báo liệu ký tự, số thao tác với liệu ký tự ứng dụng chúng xử lý thông tin 10.1 Tập ký tự Fortran Tập ký tự Fortran. .. cho mục in) Thí dụ: với đoạn chương trình: Thấy số ký tự gõ vào biến THU 8, không dài tới 20 khai báo Nhưng in hình ta khơng thấy rõ dấu trống tự động điền vào phía bên phải Nếu lệnh FORMAT lệnh