Giáo trình Ngôn ngữ lập trình Fortran 90: Phần 2 gồm có những chương cơ bản sau: Chương 5 Mảng, Chương 6 Biến ký tự, Chương 7 Kiểu file, Chương 8 Một số kiến thức mở rộng, Chương 9 Một số bài toán thông dụng. Mời các bạn cùng tham khảo để biết thêm nội dung chi tiết.
Chơng Mảng 5.1 Khái niệm mảng FORTRAN Có thể định nghĩa mảng tập hợp phần tử có kiểu liệu, đợc xếp theo trật tự định, phần tử đợc xác định số giá trị chúng Chỉ số phần tử mảng đợc xem địa phần tử mảng mà đợc dùng để truy cập/tham chiếu đến phần tử mảng Mỗi phần tử mảng đợc xác định địa mảng Mảng mảng chiều nhiều chiều Mảng chiều hiểu vectơ mà phần tử mảng thành phần vectơ Địa phần tử mảng chiều đợc xác định bëi mét chØ sè lµ sè thø tù cđa chóng mảng Mảng hai chiều đợc hiểu nh ma trận mà địa phần tử đợc xác định hai số: số thứ lµ sè thø tù hµng, chØ sè thø hai lµ số thứ tự cột Tơng tự, mảng ba chiều đợc xem nh tập hợp mảng hai chiều, phần tử mảng đợc xác định ba chØ sè: chØ sè thø nhÊt, chØ sè thø hai (tơng ứng hàng cột ma trận) vµ chØ sè thø ba (líp − sè thø tù ma trận), Kiểu liệu phần tử mảng kiểu số số Mỗi mảng đợc xác định tên mảng, số chiều, kích thớc cực đại cách xếp phần tử mảng Tên mảng gọi tên biến mảng, hay ngắn gọn biến mảng Biến mảng biến có chiều Mảng mảng tĩnh mảng động Nếu mảng tĩnh vùng nhớ dành lu trữ mảng cố định không bị giải phóng chừng chơng trình hiệu lực Kích thớc mảng tĩnh bị thay đổi trình chạy chơng trình Nếu mảng mảng động, vùng nhớ lu trữ đợc gán, thay đổi giải phóng chơng trình thực Các trỏ (POINTER) biến động Nếu trỏ mảng kích thớc chiều bị thay đổi lúc chơng trình chạy, giống nh mảng động Các trỏ trỏ đến biến mảng biến vô hớng 5.2 Khai báo mảng Để sử dụng mảng thiết cần phải khai báo Khi khai báo mảng cần phải tên số chiều nó, nhng cha cần kích thớc cách xếp phần tử mảng Có nhiều cách khai báo biến mảng Sau liệt kê số trờng hợp ví dụ 103 REAL A(10, 2, 3) ! Mảng sè thùc chiỊu DIMENSION A(10, 2, 3) ! M¶ng số thực chiều ALLOCATABLE B(:, :) ! Mảng c¸c sè thùc chiỊu POINTER C(:, :, :) ! Mảng số thực chiều REAL,DIMENSION (2,5) :: D ! Mảng số thực chiều REAL,ALLOCATABLE :: E(:,:,:)! M¶ng thùc chiỊu REAL, POINTER :: F(:,:) ! M¶ng số thực chiều Trong ví dụ trên, mảng A(10, 2, 3) mảng ba chiều gồm phần tử có kiểu số thực loại byte, kích thớc cực đại mảng 10 x x = 60 phần tử, dung lợng nhớ cấp phát cho mảng 60 x (byte) = 240 byte, cách xếp phần tử 10 hàng, cột lớp, địa hàng, cột lớp đợc đánh số từ (hàng đến hàng 10, cột đến cột 2, lớp đến lớp 3) Mảng B mảng động chiều, kích thớc cách xếp phần tử cha đợc xác định Mảng C mảng thực ba chiỊu cã kiĨu trá Ta cịng thÊy r»ng, cã thĨ chØ sư dơng c¸c tõ khãa khai b¸o kiĨu, khai báo thuộc tính để định nghĩa mảng, nhng kết hợp từ khóa khai báo kiểu khai báo thuộc tính Khi có kết hợp khai báo kiểu khai báo thuộc tính, chúng cần phải phân tách dấu phẩy sau từ khóa thuộc tính phải có hai dấu hai chấm liền phân tách chúng với tên biến Số chiều, kích thớc cách xếp phần tử mảng đợc định nghĩa với từ khóa thuộc tính tên biến Cách đánh số địa phần tử mảng đặc điểm quan trọng, định cách truy cập đến phần tử mảng Chỉ số xác định địa phần tử mảng phụ thuộc vào giới hạn dới giới hạn dùng để mô tả cách xếp phần tử theo chiều cđa m¶ng VÝ dơ, hai m¶ng INTEGER M(10, 10, 10) INTEGER K(-3:6, 4:13, 0:9) ®Ịu cã cïng kÝch th−íc (10 x 10 x 10), nh−ng m¶ng M cã chØ sè phần tử mảng theo ba chiều biến thiên từ đến 10 (giới hạn dới 1, giới hạn 10), mảng K có số phần tử mảng biến thiên theo chiều thứ (hàng) đến 6, theo chiều thứ hai (cột) đến 13 theo chiều thứ ba (lớp) đến Nh vậy, giới hạn dới số phần tử mảng K tơng ứng 3, 0, giới hạn 6, 13 Các mảng đợc mô tả rõ ràng nh đợc gọi mảng có mô tả tờng minh Đối với mảng mô tả không tờng minh, cách xếp đánh số địa phần tử mảng thờng đợc xác định lúc chơng trình chạy đợc truyền qua tham số chơng trình Ví dụ: REAL X (4, 7, 9) CALL SUB1(X) CALL SUB2(X) 104 END SUBROUTINE SUB1(A) REAL A(:, :, :) END SUBROUTINE SUB1 SUBROUTINE SUB2(B) REAL B(3:, 0:, -2:) END SUBROUTINE SUB2 đây, mảng A chơng trình SUB1 là: A (4, 7, 9) mảng B chơng trình SUB2 là: B (3:6, 0:6, -2:6) Nói chung có nhiều cách khai báo mảng khác tùy thuộc vào yêu cầu bối cảnh cụ thể Sau số dạng cú pháp tổng quát câu lệnh khai báo mảng thờng đợc sử dụng lập trình Dạng 1: Kiểu_DL Tên_biến_mảng (Mô_tả) Dạng 2: Thuộc_tính Tên_biến_mảng (Mô_tả) Dạng 3: Kiểu_DL, Thuộc_tính (Mô_tả) :: Tên_biến_mảng Dạng 4: Kiểu_DL, Thuộc_tính :: Tên_biến_mảng(Mô_tả) Trong Kiểu_DL kiểu liệu phần tử mảng, Thuộc_tính thuộc tính DIMENSION, ALLOCATABLE, POINTER,, Tên_biến_mảng tên biến mảng (nếu có nhiều biến chúng đợc liệt kê cách dấu phẩy), Mô_tả mô tả số chiều, kích thớc mảng cách xếp phần tử mảng Nếu mô tả ẩn cách xếp phần tử mảng cha cần khai báo biến mảng Ví dụ: Dạng 1: REAL*4 X (0:100) REAL Y(12,34) D¹ng 2: DIMENSION N (10,20) ALLOCATABLE Y(:,:) D¹ng 3: REAL, ALLOCATABLE(:,:) :: X INTEGER, DIMENSION(12,34) :: Y D¹ng 4: 105 REAL, ALLOCATABLE :: X (:,:) REAL, DIMENSION Y(12,34) 5.3 Lu trữ mảng nhớ truy cập đến phần tử mảng Nguyên tắc lu trữ mảng nhớ Fortran lu trữ dới dạng vectơ, cho dù mảng chiều hay nhiều chiều Đối với mảng chiều, phần tử mảng đợc xếp theo thứ tự từ phần tử có địa mảng (chỉ số) nhỏ đến phần tử có địa lớn Các phần tử mảng hai chiều đợc xếp thành vectơ, đoạn liên tiếp vectơ cột với số cột tăng dần Các mảng ba chiều đợc xem tập hợp mảng hai chiều với số thứ tự mảng hai chiều (sè thø tù líp) chÝnh lµ chØ sè thø ba mảng Các mảng nhiều chiều đợc lu trữ theo nguyên tắc Nói xác hơn, tùy thuộc vào số chiều mảng mà xếp phần tử mảng, số chiều thứ biến đổi trớc, tiếp đến chiều thứ hai, chiều thứ ba, Các phần tử mảng đợc truy cập đến qua địa chúng mảng Để rõ h¬n ta xÐt mét sè vÝ dơ sau VÝ dơ 5.1 Mảng chiều Giả sử ta khai báo REAL X(5), Y(0:5) Khi mảng X Y đợc s¾p xÕp bé nhí nh− sau: X(1) Y(0) X(2) Y(1) X(3) Y(2) X(4) Y(3) X(5) Y(4) Y(5) Chơng trình sau minh họa cách truy cập đến phần tử mảng REAL X(5), Y(0:5) Y(0) = DO I=1,5 X(I) = I*I ! Gán giá trị cho phần tử X Y(I) = X(I) + I ! Nhận giá trị phần tử X, tính toán ! gán cho phần tử Y END DO PRINT ‘(6F7.1))’, (X(I), I=1,5) ! In c¸c phÇn tư cđa X PRINT ‘(6F7.1))’, (Y(I), I=0,5) ! In phần tử Y END Khi chạy chơng trình ta nhận đợc kết hình lµ: 1.0 1.0 4.0 2.0 9.0 6.0 16.0 12.0 25.0 20.0 30.0 VÝ dơ 5.2 M¶ng hai chiỊu Gi¶ sư ta khai b¸o INTEGER, PARAMETER :: N=3, M=4 INTEGER A(N, 0:M) Khi hiểu mảng A nh mét ma trËn gåm hµng, cét: 106 ⎛ A( 1,0 ) A( 1,1 ) A( 1,2 ) A( 1,3 ) A( 1,4 ) ⎞ ⎟ ⎜ A = ⎜ A( 2,0 ) A( ,1 ) A( ,2 ) A( 2,3 ) A( 2,4 ) ⎟ ⎜ A( 3,0 ) A( 3,1 ) A( 3,2 ) A( 3,3 ) A( 3,4 ) A đợc lu trữ nhớ dới dạng: Ví dụ 5.3 Mảng ba chiều Giả sử mảng A đợc khai báo bëi INTEGER, PARAMETER :: NH=3, MC=4, LLayer=3 INTEGER A(0:NH, MC, LLayer) Khi A mảng ba chiều gồm hµng, cét vµ líp, cã cÊu tróc nh− sau: Và đợc lu trữ nhớ dới dạng: Sau số ví dụ truy cập mảng Nếu mảng A đợc khai báo REAL A(5,10), B(5,10) Khi đó: A = 3.0 ! Gán tất phÇn tư cđa A b»ng A(1,1) = ! Gán phần tử hàng 1, cột 4., A(1,2) = ! Gán phần tử hàng 1, cột A(2,1:8:3)=2.5 ! Gán phần tử cột 1, 4, hµng b»ng 2.5 Tøc lµ A(2,1) = A(2,4) = A(2,7) = 2.5 C¸c chØ sè 1:8:3 cđa chiều thứ hai tơng đơng với vòng lặp DO J=1, 8, 107 B = SQRT(A) ! Gán tất phần tử B ! bậc hai phần tử tơng ứng A Nếu khai báo REAL A(10) Khi đó: A(1:5:2)=3.0 !Gán phần tử A(1), A(3), A(5) 3.0 A(:5:2)=3.0 ! Tơng tự câu lệnh A(2::3)=3.0 ! Gán phần tử A(2), A(5), A(8) 3.0 (Chỉ số cao ngầm định 10 kích thớc cực đại A, tơng đơng với vòng lặp DO I=2, 10, 3) A(7:9) = 3.0 ! Gán phần tử A(7), A(8), A(9) 3.0 ! (Bớc vòng lặp ngầm định 1) A(:) = 3.0 ! T−¬ng tù nh− A = 3.0; Mét vÝ dơ kh¸c, nÕu cã khai b¸o REAL A(10), B(5, 5) INTEGER I(4), J(3) ta gán giá trị cho phần tử mảng I J cách: I = (/ 5, 3, 8, /) J = (/ 3, 1, /) Còn câu lệnh A(I) = 3.0 có nghĩa gán phần tử A(5), A(3), A(8) A(2) 3.0, câu lệnh B(2,J) = 3.0 gán phần tử B(2,3), B(2,1) B(2,5) Qua ví dụ ta thấy cách truy cập đến phần tử mảng Fortran mềm dẻo linh hoạt Đó mạnh ngôn ngữ lập trình 5.3.1 Sử dụng lệnh DATA để khởi tạo mảng Trong số trờng hợp, liệu ban đầu đợc gán trực tiếp cho phần tử mảng chơng trình mà không thiết nhận từ file Một cách gán sử dụng câu lệnh gán thông thờng Tuy nhiên cách làm không hiệu quả, phải lặp lại nhiều lần lệnh gán, làm giÃn dài chơng trình cách không cần thiết Thay cho việc sử dụng câu lệnh gán ®ã, ta cịng cã thĨ sư dơng c©u lƯnh DATA để gán giá trị cho phần tử mảng Ví dô: REAL, DIMENSION(10) :: A, B, C(3,3) 108 DATA A / 5*0, 5*1 / ! Gán phần tử đầu phần tử DATA B(1:5) / 4, 0, 5, 2, -1 / ! Chỉ gán giá trị cho phần tử từ B(1) ®Õn B(5) DATA ((C(I,J), J= 1,3), I=1,3) /3*0,3*1, 3*2/ ! Gán giá trị cho phần tử C lần lợt theo hàng Điều ý sử dụng lệnh DATA để gán giá trị cho phần tử mảng số giá trị gán (nằm hai dấu gạch chéo (/)) phải kích thớc khai báo mảng Nếu có nhiều giá trị lặp lại liên tiếp ta sử dụng cách gán n*value, n số lần lặp lại liên tiếp, value giá trị đợc lặp lại Trật tự xếp giá trị gán phải phù hợp với trật tự truy cập đến phần tử mảng Chẳng hạn, câu lệnh sau đây: DATA ((C(I,J), J= 1,3), I=1,3) /3*0,3*1, 3*2/ cho kết gán C(1,1) = C(1,2) = C(1,3) = 0; C(2,1) = C(2,2) = C(2,3) = 1; C(3,1) = C(3,2) = C(3,3) = Còn câu lÖnh: DATA C / 3*0, 3*1, 3*2 / sÏ cho kết gán C(1,1) = C(2,1) = C(3,1) = 0; C(1,2) = C(2,2) = C(3,2) = 1; C(1,3) = C(2,3) = C(3,3) = Së dÜ nh− vËy lµ vì, câu lệnh thứ nhất, phần tử đợc truy cập lần lợt hàng, từ hàng đến hàng 3, câu lệnh thứ hai, ta không cụ thể nên Fortran ngầm hiểu phần tử mảng đợc truy cập lần lợt theo cột, từ cột đến cột 5.3.2 Biểu thức mảng Có thể thực phép toán biến mảng Trong trờng hợp mảng ph¶i cã cïng cÊu tróc VÝ dơ: REAL, DIMENSION(10) :: X, Y X + Y ! Cộng tơng ứng phần tử X Y: X(I) + Y(I) X * Y ! Nhân tơng ứng phần tử X vµ Y: X(I) * Y(I) X * ! Nhân tơng ứng phần tử X với 3: X(I) * X * SQRT(Y) ! Nhân phần tử X với bậc ! phần tử tơng ứng Y: X(I) * SQRT(Y(I)) X == Y ! Phép toán so sánh, cho kết TRUE ! X(I) == Y(I), FALSE ngợc l¹i 5.3.3 CÊu tróc WHERE ELSEWHERE END WHERE Đây cấu trúc dùng thao tác với mảng Cú pháp câu lệnh nh sau WHERE (Điều_kiện) Câu_lệnh Hoặc 109 WHERE (Điều_kiện) Các_câu_lệnh_1 ELSEWHERE Các_câu_lệnh_2 END WHERE Tác động câu lệnh tìm phần tử mảng thỏa mÃn Điều_kiện, Điều_kiện đợc thỏa mÃn thực Các_câu_lệnh_1, ngợc lại thực Các_câu_lệnh_2 Điều_kiện biểu thức lôgic Ví dụ: REAL A (5) A = (/ 89.5, 43.7, 126.4, 68.3, 137.7 /) WHERE (A > 100.0) A = 100.0 Trong đoạn chơng trình trên, tất phần tử mảng A có giá trị > 100 đợc thay 100 Kết nhận đợc: A = (89.5, 43.7, 100.0, 68.3, 100.0) Mét vÝ dơ kh¸c: REAL A (5), B(5), C(5) A = (/ 89.5, 43.7, 126.4, 68.3, 137.7 /) B = 0.0 C = 0.0 WHERE (A > 100.0) A = 100.0 B = 2.3 ELSEWHERE A = 50.0 C = -4.6 END WHERE đây, kết nhận đợc Mảng PT thứ PT thứ PT thø PT thø PT thø A 50.0 50.0 100.0 50.0 100.0 B 0.0 0.0 2.3 0.0 2.3 C −4.6 −4.6 0.0 −4.6 0.0 5.4 M¶ng động (Dynamical Array) Mảng có kích thớc cách xếp phần tử không đợc xác định từ lúc khai báo gọi mảng động Các mảng động phải có thuộc tính ALLOCATABLE câu lệnh khai báo Trên ta đà gặp số ví dụ khai báo sử dụng mảng động Một cách tỉng qu¸t, cã thĨ cã c¸c c¸ch khai b¸o nh− sau Kiểu_DL,DIMENSION(Mô_tả),ALLOCATABLE :: Tên_biến Kiểu_DL, ALLOCATABLE [::] Tên_biến [(Mô_tả)] 110 ALLOCATABLE [::] Tên_biến [(Mô_tả)] Trong Mô_tả mô tả số chiều mảng, đợc xác định dấu hai chấm (:), phân cách dấu phÈy VÝ dơ: REAL,DIMENSION(:),ALLOCATABLE :: X ! M¶ng chiỊu REAL, ALLOCATABLE :: vector(:) ! M¶ng chiỊu INTEGER,ALLOCATABLE :: matrix(:,:) ! M¶ng chiỊu DIMENSION X (:,:) ! X mảng hai chiều REAL, ALLOCATABLE :: X ! X mảng động, thực ALLOCATABLE :: Y(:,:) ! Y mảng động chiều Vì mảng động cha đợc xác định kích thớc từ đầu nên để sử dụng ta cần phải mô tả rõ kích thớc cách xếp phần tử chúng trớc truy cập Câu lệnh ALLOCATE dùng để định vị kích thớc cách xếp phần tử mảng bé nhí (tøc cÊp ph¸t bé nhí cho biÕn) Câu lệnh DEALLOCATE dùng để giải phóng vùng nhớ mà biến mảng động đà đợc cấp phát Ví dụ 5.4 Xét đoạn chơng trình INTEGER, ALLOCATABLE :: matrix(:,:) REAL, ALLOCATABLE :: vector(:) N = 123 ALLOCATE (matrix(3,5),vector(-2:N+2)) DEALLOCATE matrix, vector Trong đoạn chơng trình trên, vector matrix lần lợt mảng động chiều hai chiều Sau câu lệnh ALLOCATE, matrix đợc cấp phát mét vïng nhí gåm hµng x cét x byte = 60 byte với cách đánh số địa phần tử mảng đến (hàng) đến (cột) Còn vector đợc cÊp ph¸t mét vïng nhí gåm (N+2 − (−2) + 1) phÇn tư x byte = (123+2+2+1) x byte = 512 byte, với địa phần tử mảng đợc đánh số từ đến 125 Ví dụ 5.5 Cấp phát nhớ cho mảng tuỳ thuộc tham số xác định đợc trình thực chơng tr×nh REAL A, B(:,:), C(:), D(:, :, :) ALLOCATABLE C, D READ (*, *) N, M ALLOCATE (C(N), D(M, N, M)) Trong ví dụ này, kích thớc mảng C D đợc xác định sau giá trị N M đà xác định 111 Ví dụ 5.6 Sử dụng hàm ALLOCATED để xác định mảng đà đợc cấp phát nhớ hay cha REAL, ALLOCATABLE :: A(:) IF (.NOT ALLOCATED(A)) ALLOCATE (A (5)) Trong ví dụ này, mảng A đợc cấp phát nhớ cha đợc cấp phát Ví dụ 5.7 Bẫy lỗi trình cấp phát nhớ cho m¶ng REAL, ALLOCATABLE :: A(:) INTEGER ERR ALLOCATE (A (5), STAT = ERR) IF (ERR /= 0) PRINT *,“Khong cap phat duoc" đây, tham số STAT câu lệnh ALLOCATE trả giá trị ERR (số nguyên) Nếu ERR=0 việc cấp phát nhớ thực thành công, ngợc lại không cấp phát đợc giá trị ERR mà lỗi lúc chạy chơng trình Ví dụ 5.8 Chơng trình sau nhập mảng chiều X gồm số thực dơng nhng trớc số phần tử mảng tối đa Do mảng X đợc cấp phát nhớ tăng dần nhập liệu Quá trình nhập liệu kết thúc số nhập vào số âm Thủ thuật thực sử dụng mảng động, ®ã mét m¶ng ®Ĩ l−u sè liƯu trung gian REAL, DIMENSION(:), ALLOCATABLE :: X, OldX REAL A INTEGER N ALLOCATE (X(0)) ! Kích thớc X (lúc đầu 0) N = DO Print*, ‘Cho mot so: ‘ READ(*,*) A IF ( A < ) EXIT ! NÕu A 0) READ (*, *, IOSTAT = Err) Num IF (Err > 0) PRINT*, "Sai du lieu! Vao lai." END DO END SUBROUTINE DocSoNguyen SUBROUTINE HienThi RecNo = 213 EOF = DO WHILE (EOF == 0) READ (1, REC = RecNo, IOSTAT = EOF) Student IF (EOF == 0) THEN PRINT "(A20, I3)", Student END IF RecNo = RecNo + END DO END SUBROUTINE HienThi SUBROUTINE CapNhat CHARACTER (NameLen) Item, Copy LOGICAL Found Found = false EOF = PRINT*, "Sua diem cho ai?" READ "(A20)", Item CALL XoaDauCach( Item ) RecNo = DO WHILE (EOF == AND .NOT Found) READ (1, IOSTAT = EOF, REC = RecNo) Student IF (EOF == 0) THEN Copy = Student % Name CALL XoaDauCach( Copy ) IF (Item == Copy) THEN Found = true ! T×m thÊy PRINT*, 'Found at recno', RecNo, & ' Enter new mark:' CALL DocSoNguyen( Student % Mark ) WRITE (1, REC = RecNo) Student ! Ghi vµo file ELSE RecNo = RecNo + END IF END IF END DO IF (.NOT Found) THEN PRINT*, Item, ' Khong tim thay ' END IF END SUBROUTINE CapNhat SUBROUTINE XoaDauCach( Str ) CHARACTER (*) Str INTEGER I I = DO WHILE (I < LEN_TRIM( Str )) IF (Str(I:I) == " ") THEN Str(I:) = Str(I+1:) ELSE I = I + 214 END IF END DO END SUBROUTINE XoaDauCach 215 Bài tập chơng 9.1 Viết chơng trình nhập vào mảng chiều gồm N phần tử số thực chứa giá trị quan trắc biến ngẫu nhiên Tính đặc trng trung bình số học, phơng sai, độ lệch chuẩn, độ bất đối xứng, trung vị tứ vị chuỗi In kết theo qui cách đặc trng dòng với thích hợp lý 9.2 Cho file sè liƯu d¹ng TEXT chøa kÕt quan trắc biến X1, X2, , Xm Cấu trúc file nh sau Dòng tiêu đề mô tả nội dung file Dòng hai số nguyên dơng (N, M) số lần quan trắc (N dung lợng mẫu) số biến (M) Các dòng dòng chứa M số thực giá trị quan trắc xi1, xi2, , xim lần thứ i (i=1,2,…,N) cđa c¸c biÕn X1, X2, …, Xm, c¸c gi¸ trị đợc viết cách dấu cách HÃy đọc file số liệu tính đặc trng thống kê biến X1, X2, , Xm: trung bình số học, trung vị (median), phơng sai, độ lệch chuẩn, mômen gốc mômen trung tâm bậc 2, 3, In kết vào file dới dạng thích hợp 9.3 Cũng với file số liệu nh tập 9.2, hÃy viết chơng trình tính: Trung bình số học, độ lệch chuẩn biến X1, X2, , Xm ma trận tơng quan, ma trận tơng quan chuẩn hóa chúng In kết vào file 9.4 Cho file số liệu dạng TEXT chứa kết quan trắc biến Y (biến phụ thuộc) biến X1, X2, , Xm (biến độc lập) Cấu trúc file nh sau Dòng tiêu đề mô tả nội dung file Dòng hai số nguyên dơng (N, M) số lần quan trắc (N dung lợng mẫu) số biến độc lập (M) Các dòng dòng chứa M+1 số thực giá trị quan trắc yi, xi1, xi2, , xim lần thứ i (i=1,2,,N) biến Y, X1, X2, , Xm, giá trị đợc viết cách dấu cách HÃy viết chơng trình đọc file số liệu tính: Trung bình số học độ lệch chuẩn biến Y, X1, X2, …, Xm, c¸c hƯ sè a0, a1, …, am cđa phơng trình hồi qui y = a0 + a1x1 + + amxm In kết vào file 9.5 Cho hàm số f(x) = 3sin2x Sử dụng công thức giải tích sơ đồ sai phân với độ xác bậc nhất: f'(x)=(f(x+x)f(x))/x; độ xác bậc hai: f'(x)= (f(x+x) f(xx))/2x; độ xác bậc bốn: f'(x)= (4/3) (f(x+∆x) − f(x−∆x)) / 2∆x − (1/3) (f(x+2∆x) f(x2x))/4x, tính đạo hàm bậc hàm số đoạn [/2; /2] Lấy x = 0.1 radian In kết vào file dới dạng (cột cuối giá trị đạo hàm tính theo công thức gi¶i tÝch): HO TEN: … DAO HAM BAC NHAT CUA HAM SO F(X) = 3*SIN(2*X) 216 X DH1_1 DH1_2 DH1_4 ANAL 9.6 Cho hàm số f(x) = 2cosx Sử dụng công thức giải tích sơ đồ sai phân với độ xác bậc hai độ xác bậc bốn, tính đạo hàm bậc hai hàm số ®o¹n [−π; π] LÊy ∆x = 0.1 radian In kÕt vào file dới dạng tơng tự nh ë bµi tËp 9.5 9.7 Cho hµm sè f(x,y)=sin(x)+cos(y)+sin(x+y), víi x∈[0 ; 2π], y∈ [−π/2 ; π/2] Sư dơng c«ng thức giải tích sơ đồ sai phân điểm độ xác bậc hai điểm độ xác bậc hai, tính Laplaxian hàm số cho h = 0.1 radian In kết vào file dới dạng tơng tự nh tập 9.5 9.8 Giả sử trình truyền nhiệt xuống lớp đất sâu đợc mô tả phơng T 2T = K , ®ã T = T(z, t), với z độ sâu tính từ bề mặt, t thời gian t z trình ngày tính giây (s); K hệ số truyền nhiệt HÃy viết chơng trình tính phân bố nhiệt độ theo độ sâu theo thời gian Cho biết z [0; (m)], t ∈ [0; 24 (h)]; K = 3ì107 z + 18.5 Điều kiện ban đầu: T ( z ,0) = ⎨ ⎩20 z ≤ 0.5 z > 0.5 ; điều kiện biên: T(0, t) = 3cos(2/ (24*3600) * t + 2π/3) + 20; T(1, t) = 20 In kết vào file dới dạng thích hợp 9.9 Viết chơng trình xây dựng sở liệu lu trữ hồ sơ cán quan 217 Tài liệu tham khảo Brian D Hahn: Fortran 90 for scientists and engeneers British Library Cataloguing in Publication Data, 1996, 352pp Elliot B Koffman, Frank L Friedman: Fortran with engineering applications Addison−Wesley Publishing Company, Inc., 1993, 664pp Krishnamutri T N., L Bounoua: An introduction to numerical weather prediction techniques CRC Press, Inc., 1996, 293 pp Phan Văn Tân: Các phơng pháp thống kê khí hậu NXB Đại học Quốc gia Hà Nội, 2003, 208 tr Tuyển tập chơng trình máy tính (ứng dụng giao thông vận tải) Tập NXB Giao thông vận tải, Hà Nội, 1987 218 Phụ lục Trình tự câu lệnh đơn vị chơng trình Fortran Câu lệnh PROGRAM, FUNCTION, SUBROUTINE MODUL Câu lệnh USE Câu lệnh IMPLICIT NONE Các lệnh Các câu lệnh Các câu lệnh định nghĩa định dạng PARAMETER kiểu liệu, khối giao FORMAT DATA diện, khai báo biến, kiểu liệu Các câu lệnh thực Câu lệnh CONTAINS Các chơng trình chơng trình modul Câu lệnh END Tóm tắt câu lệnh Fortran Tên câu lệnh Mô tả ALLOCATABLE Chỉ định thuộc tính động cho biến mảng ALLOCATE Cấp phát nhớ cho biến mảng động trỏ động BACKSPACE Đa trỏ file lùi ghi BLOCK DATA Chơng trình đặc biệt dùng để khởi tạo liệu CALL Lời gọi chơng trình SUBROUTINE CASE Chỉ định tập giá trị đợc chọn câu lệnh SELECT CASE CHARACTER Lệnh khai báo biến, kiểu ký tự CLOSE Lệnh đóng file COMMON LƯnh khai b¸o dïng chung bé nhí COMPLEX LƯnh khai b¸o biÕn, h»ng kiĨu sè phøc CONTAINS LƯnh phân tách phần thân đơn vị chơng trình khối chơng trình CONTINUE Lệnh không thực hiện, thờng dùng để kết thúc chu trình chuyển tiếp đoạn chơng trình 219 Tên câu lệnh Mô tả CYCLE Chuyển điều khiển đến câu lệnh kết thúc chu trình (END DO) DATA Lệnh khởi tạo liệu cho biến DEALLOCATE Giải phóng nhớ cho biến mảng động trỏ động DIMENSION Chỉ định thc tÝnh m¶ng cho biÕn, cã thĨ dïng nh− lƯnh khai báo mảng DO Lệnh mở đầu cho chu trình lặp DO WHILE Lệnh mở đầu cho chu trình lặp có điều kiện DOUBLE PRECISION Lệnh khai báo biến, thực có độ xác gấp đôi END Lệnh kết thúc đơn vị chơng trình chơng trình ENDFILE Ghi vào file ghi kết thúc file vị trí trỏ file thời ENTRY Khi chèn lệnh kèm theo tên danh sách đối số chơng trình vào vị trí chơng trình con, làm thay đổi vị trí bắt đầu chơng trình dùng lời gọi với tên EQUIVALENCE LƯnh khai b¸o dïng chung bé nhí EXIT LƯnh tho¸t khỏi chu trình có điều kiện EXTERNAL Khai báo tên chơng trình FORMAT Khai báo định dạng vào/ra liệu FUNCTION Từ khóa khai báo chơng trình dạng hàm GOTO Lệnh nhảy vô điều kiƯn IF LƯnh rÏ nh¸nh IMPLICIT Khai b¸o danh s¸ch biến, có ký tự ký tự đầu đợc biến, có thuộc tính khai báo ẩn INCLUDE Chỉ tên file (cả đờng dẫn) chứa đoạn chơng trình chèn vào vị trị lệnh INQUIRE Lệnh truy vấn trạng thái thuộc tính file kích thớc nhớ chiếm giữ biến/bản ghi INTEGER Lệnh khai báo biến, có kiểu liệu số nguyên INTENT Lệnh khai báo thuộc tính dự định cho đối số hình thức chơng trình INTERFACE Từ khóa mở đầu khai báo khối giao diện LOGICAL Lệnh khai báo kiểu liệu lôgic MODULE Từ khóa đơn vị chơng trình loại modul NAMELIST Lệnh khai báo danh sách khối biến namelist NULLIFY Đa biến trỏ trạng thái không trỏ vào đâu OPEN Lệnh mở file OPTIONAL Lệnh đối số có thuộc tính tùy chọn chơng trình PARAMETER Khai báo định thuộc tính PAUSE Lệnh tạm dừng chơng trình POINTER Khai báo định biến có thuộc tính trá PRINT LƯnh kÕt xt th«ng tin thiÕt bị chuẩn (thờng hình) 220 Tên câu lệnh Mô tả PRIVATE Khai báo biến, có thuộc tính riªng chØ néi bé cđa modul PROGRAM Tõ khãa đơn vị chơng trình chơng trình PUBLIC Khai báo biến, có thuộc tính công cộng, truy cập đợc từ đơn vị chơng trình khác có sử dụng modul READ Lệnh đọc liệu vào từ thiết bị REAL Lệnh khai báo biến, có kiểu liệu số thực RECURSIVE Chỉ định thủ tục đệ qui cho chơng trình RETURN Lệnh chuyển điều khiển chơng trình gọi từ chơng trình REWIND Đa trỏ file trở đầu file file SAVE Khai báo thuộc tính bảo lu giá trị biến chơng trình SELECT CASE Lệnh định cấu trúc rẽ nhánh SEQUENCE Chỉ định thuộc tính lu trữ theo trình tự xuất kiểu liệu ngời dùng định nghĩa STOP Lệnh dừng hẳn chơng trình thời điểm chơng trình cha kết thúc SUBROUTINE Từ khóa khai báo chơng trình dạng thủ tục TARGET Chỉ định thuộc tính đích cho biến mà đích trỏ TYPE Từ khóa định nghÜa kiĨu d÷ liƯu cđa ng−êi dïng tù thiÕt lËp USE Từ khóa khai báo tên modul đợc sử dụng chơng trình WHERE Câu lệnh thực việc tìm kiếm mảng WRITE Lệnh kết xuất thông tin thiết bị Một số hàm thủ thục Fortran Chức Tên hàm, thủ tục ABS(A) Giá trị tuyệt đối số nguyên, số thực số phức A ACOS(X) Arccosine (hàm ngợc cosine) X AIMAG(Z) Phần ảo số phức Z AINT(A [,KIND]) Phần nguyên (là số thực) lớn không vợt A ANINT(A [,KIND]) Phần nguyên (là số thực) gần A ASIN(X) Arcsine (hàm ngợc sine) X ATAN(X) Arctang (hàm ngợc tang) X, phạm vi /2 đến /2 CEILING(A) Số nguyên nhỏ không nhỏ A CMPLX(X[,Y][,KIND]) Đổi số X (X, Y) số phức CONJG(Z) Liên hợp phức Z COS(X) Cosine cña X COSH(X) Cosine hyperbol cña X DIM(X, Y) max(X−Y, 0) EXP(X) ex Tên hàm, thủ tục Chức 221 FLOOR(A) Số nguyên lớn không vợt A INT(A [,KIND]) Đổi số A thành số nguyên chặt cụt phần thập phân LOG(X) Lôgarit số tự nhiên X LOG10(X) Lôgarit số 10 X MAX(A1,A2[,A3, ]) Giá trị lớn số A1, A2, A3, MIN(A1,A2[,A3, ]) Giá trị nhỏ số A1, A2, A3,… MOD(A, P) Sè d− cña phÐp chia A cho P, A-INT(A/P)*P NINT(A [,KIND]) Số nguyên gần với A REAL(A [,KIND]) Đổi số A thành số thực SIGN(A, B) Trị tuyệt đối A nhân với dấu cña B SIN(A) Sine cña A SINH(A) Sine hyberbol cña A SQRT(A) Căn bậc hai A TAN(A) Tang A TANH(A) Tang hyberbol cña A ACHAR(I) Ký tù cã mà ASCII I với I khoảng 0127 ADJUSTL(STR) Trả xâu STR có độ dài nhng đà lề trái ADJUSTR(STR) Trả xâu STR có độ dài nhng đà lề phải CHAR(I [,KIND]) Ký tự có vị trí I hệ thống xếp thứ tự đợc cho KIND IACHAR(C) Mà ASCII cđa ký tù C ICHAR(C) VÞ trÝ cđa ký tù C hƯ thèng s¾p xÕp thø tù INDEX(STR, SUBSTR [BACK]) Vị trí bắt gặp SUBSTR STR, tính từ bên trái (nếu BACK=FALSEngầm định) bên phải (nếu BACK=TRUE), không tìm thấy LEN_TRIM(STR) Độ dài xâu STR đà cắt bỏ dấu cách bên phải LGE(STR_A, STR_B) Bằng TRUE STR_A tiÕp sau STR_B theo thø tù ASCII hc b»ng (về mặt từ vựng), FALSE ngợc lại LGT(STR_A, STR_B) B»ng TRUE nÕu STR_A tiÕp sau STR_B theo thø tự ASCII, FALSE ngợc lại LLE(STR_A, STR_B) Bằng TRUE nÕu STR_A ®øng tr−íc STR_B theo thø tù ASCII hc b»ng (vỊ mỈt tõ vùng), b»ng FALSE nÕu ngợc lại LLT(STR_A, STR_B) Bằng TRUE STR_A đứng trớcc STR_B theo thứ tự ASCII, FALSE ngợc lại LEN(STR) Số ký tự STR biến vô hớng, số phần tử STR biến mảng REPEAT(STR,NCOPIES) Gộp NCOPIES lần xâu STR TRIM(STR) Trả xâu STR đà cắt bỏ dấu cách bên phải EPSILON(X) Số mà hầu nh bỏ qua so víi (sè v« cïng bÐ HUGE(X) Giá trị lớn biến X có kiểu thực nguyên PRECISION(X) Độ xác thập phân (số chữ số thập phân biểu diễn xác) số thực số phức TINY(X) Số dơng nhỏ số thực 222 p ) Tên hàm, thủ tục Chức BIT_SIZE(I) Số bit lớn biểu diễn số nguyên BTEST(I, POS) B»ng TRUE nÕu bÝt thø POS cña sè nguyªn I b»ng (Chó ý: Sè thø tù bÝt đánh số từ tính từ bên phải sang d·y bÝt biĨu diƠn sè I) IAND(I, J) Tr¶ vỊ số nguyên biểu diễn bít I J tơng ứng 1, ví dụ IAND(255, 128)=128, bít thø cđa hai sè ®Ịu b»ng 1, tøc 128 = 1.27 + 0.26 + … 0.20 ISHFT(I, SHIFT) Gi¸ trị I dịch chuyển tất bít I sang trái (SHIFT dơng) sang phải (SHIFT âm) SHIFT vị trí ALLOCATED(ARRAY) Nhận giá trị TRUE ARRAY đà đợc cấp phát nhớ LBOUND(ARRAY[,DIM]) Trả số mảng (nếu bỏ qua DIM) số chiều DIM ARRAY SHAPE(SOURCE) Trả kích thớc chiều mảng SOURCE, SOURCE vô hớng kích thớc không SIZE(ARRAY [,DIM]) Tr¶ vỊ kÝch th−íc [chiỊu DIM] cđa m¶ng ARRAY UBOUND(ARRAY[,DIM]) Tơng tự nh LBOUND nhng số cuối MAXLOC(ARRAY[,MASK]) Trả địa phần tử mảng có giá trị lớn Nếu có đối số MASK MASK mảng phần tử lôgic có kích thớc với ARRAY; trờng hợp có phần tử TRUE đợc xét đến MERGE(TSOURCE, FSOURCE, MASK) Tr¶ vỊ m¶ng cã cïng kÝch th−íc víi c¶ ba tham số Các phần tử mảng kết giá trị lấy từ mảng TSOURCE FSOURCE tùy thuộc phần tử tơng ứng MASK TRUE hay FALSE MINLOC(ARRAY[,MASK]) Tơng tự nh MAXLOC nhng giá trị nhỏ TRANSPOSE(MATRIX) Trả ma trận chuyển vị MATRIX ASSOCIATED(POINTER [,TARGET]) Nếu TARGET, kết TRUE POINTER đợc liên kết với đích, FALSE ngợc lại Trạng thái POINTER phải cha xác định Nếu có TARGET, kết TRUE POINTER đợc liên kết với Nếu TARGET trỏ đích đợc so sánh với đích POINTER, trả FALSE POINTER TARGET cha đợc liên kết KIND(X) Trả giá trị tham số loại liệu X SELECTED_INT_KIND(R) Giá trị tham số loại liệu kiểu số nguyên biểu diễn tất giá trị nguyên khoảng số nguyên 10 R < n < 10 R víi R lµ SELECTED_REAL_KIND([P] Giá trị tham số loại liệu kiểu số thực có độ xác [,R]) thập phân P, phạm vi số mũ thập phân R hai tham sè P, R ph¶i xt hiƯn RANDOM_NUMBER (X) Thđ tục tạo số ngẫu nhiên (0 X < 1) RANDOM_SEED () Thủ tục khởi tạo giá trị gốc bé sè ngÉu nhiªn cđa bé xư lý 223 Tªn hàm, thủ tục DATE_AND_TIME([DATE] [,TIME] [,ZONE] [,VALUES]) Chức Thủ tục trả giá trị (là trống rỗng HUGE(0) đồng hồ): DATE (Character) dạng CCYYMMDD (thế kỷngày) TIME (Character) dạng HHMMSS.SSS (giờmili giây) ZONE (Character) dạng Shhmm (hiệu địa phơng UTC, S dấu VALUES mảng phần tử, mà giá trị chúng tơng ứng Năm, Tháng, Ngày, hiệu thời gian theo phút so với UTC, giờ, phút, giây mili giây 224 ... Gán tất phần tử A A(1,1) = ! Gán phần tử hµng 1, cét b»ng 4., A(1 ,2) = ! Gán phần tử hàng 1, cột A (2, 1:8:3) =2. 5 ! Gán phần tử cột 1, 4, hàng b»ng 2. 5 Tøc lµ A (2, 1) = A (2, 4) = A (2, 7) = 2. 5 C¸c... char2 NAMELIST /example/ int1, int2, int3, & log1, log2, log3, real1, real2, & z1, z2, char1, char2, array int1 = 11 int2 = 12 int3 = 14 log1 = TRUE log2 = TRUE log3 = TRUE real1 = 24 .0 real2 = 28 .0d0... số địa phần tử mảng đến (hàng) đến (cột) Còn vector đợc cấp phát vïng nhí gåm (N +2 − (? ?2) + 1) phÇn tư x byte = ( 123 +2+ 2+1) x byte = 5 12 byte, với địa phần tử mảng đợc đánh số từ đến 125 Ví dụ