Professional Documents
Culture Documents
Fortran
Fortran
1-5 6 7-72 dành cho các câu lệnh của chương trình 73-80
dành cho
nhãnl
Thường dành cho lệnh xuống dòng (dùng dấu * đặt tại cột số 6)
Định dạng của chương trình FORTRAN
FORTRAN 90/95
◆ Cho phép viết chương trình ở dạng tự do
◆ Những ghi chú được đặt ngay sau dấu (!)
◆ Hỗ trợ đặt tên biến dài (tối đa 31 ký tự)
PROGRAM MAIN
! Phần sau dấu ‘!’ là phần chú thích
DIMENSION X(10)
READ(5,*) (X(I),I=1,10)
WRITE(6,1000) X
1000 FORMAT(1X,’THIS IS A VERY LONG LINE OF TEXT TO SHOW HOW TO CONTINUE ’&
‘THE STATEMENT TO A SECOND LINE’,10F12.4)
! Để xuống dòng quá dài, sử dụng dấu ‘&’ đặt ở sau vị trí cuối của dòng bên trên
End
1 80
Cấu trúc chương trình FORTRAN
● Hầu hết các chương trình FORTRAN gồm có 1 chương
trình chính và một hoặc nhiều chương trình con
(Function hay Subroutine)
● Cấu trúc của chương trình FORTRAN:
Program XXXX
Các khai báo (Declarations): biến, hằng,…
Các biến ban đầu (Variable initializations)
Phần thân chương trình
Các định dạng xuất nhập (nếu có)
END
Các chương trình Con
functions & subroutines)
Các khai báo kiểu dữ liệu
(Data Type Declarations)
● Các kiểu dữ liệu cơ bản
◆ INTEGER – kiểu số nguyên (+/-)
◆ REAL – kiểu số thực
◆ DOUBLE PRECISION – mở rộng độ chính xác
◆ CHARACTER*n – kiểu chuỗi ký tự (n là số ký tự)
◆ LOGICAL – kiểu luận lý ( trả về giá trị .TRUE. hoặc .FALSE.)
◆ COMPLEX – kiểu số phước
● Kiểu biến nguyên và biến thực có thể được qui định số byte dành cho
biến đó:
◆ Theo ngầm định là 4 bytes (ví dụ ta khai báo biến: INTEGER*4 hoặc
REAL*4 tương đương với REAL hoặc INTEGER
◆ DOUBLE PRECISION tương đương với REAL*8
● Các mãng (array) được khai báo:
◆ DIMENSION A(3,5) hoặc REAL A(3,5): Mãng 2 chiều kích thước 3x5
◆ CHARACTER*30 NAME(50) – Cách khai báo trực tiếp một mãng ký tự có
50 phần tử, mỗi phần tử có thể chứa tối đa 30 ký tự
● FORTRAN 90/95 còn cho phép lập trình viên tự định nghĩa kiểu dữ
liệu
Các khai báo ẩn và hiện
Implicit vs Explicit Declarations
● Theo ngầm định, dạng biến ẩn được qui định như sau
◆ Các biến bắt đầu từ ký tự: A-H, O-Z dành cho biến thực (REAL)
bytes)
◆ Các biến bắt đầu từ các ký tự: I-N dành cho biến (INTEGER)
● Chúng ta cũng có thể khai báo IMPLICIT:
◆ IMPLICIT REAL (A-Z): Khai báo tất cả các biến là biến thực
REAL nếu nó không được khai báo
◆ IMPLICIT CHARACTER*2 (W): Khai báo những biến bắt đầu
từ ký tự ’W’ có kiểu dữ liệu là ký tự kích thước 2 ký tự
◆ IMPLICIT DOUBLE PRECISION (D) Khai báo cho những
biến bắt đầu từ ký tự ’D’có kiểu dữ liệu là ‘độ chính xác kép’
(kích thước biến là 8 bytes)
● Nên: Khai báo tất cả các biến ở dạng hiện explicit
◆ IMPLICIT NONE v(nếu dùng lệnh này thì tất cả các biến phải
được khai báo
Các khai báo khác
● Định nghĩa các hằng số (các tham số)
◆ PARAMETER (PI=3.1415927, NAME=‘FORTRAN’)
◆ PARAMETER (PIO2=PI/2, FLAG=.TRUE.)
◆ Các tham số trên sẽ không thay đổi trong toàn bộ chương trình
◆ Cũng có thể sử dụng những tham số này để định nghĩa tham số khác
● Các biến ban đầu
◆ DATA Dùng để khởi tạo các giá trị ban đầu của biến
◆ DIMENSION A(10,10)! Mãng số thực A kích thước 10x10
◆ DATA A/100*1.0/! Tất cả các biến trong mãng A ban đầu có giá trị
là 1.0
◆ DATA A(1,1),A(10,1),A(5,5) /2*4.0,-3.0/ - Gán giá trị ban
đầu: A(1,1)= A(10,1)=4.0 và A(5,5)=-3
◆ DATA ((A(I,J),I=1,5,2),J=1,5) /15*2.0/ - initialize with
implied-do list
◆ …
Các phép toán số học
● Độ ưu tiên tăng dần từ trên xuống
Toán tử hàm
** lũy thừa
* nhân
/ chia
+ cộng
- trừ
● Những biểu thức nằm trong dấu () có độ ưu tiên lớn nhất
Toán tử Ví dụ Ý nghĩa
.AND. A .AND. B Toán tử logic AND
.OR. A .OR. B Toán tử logic OR
.NEQV. A .NEQV. B Toán tử logic không bằng
.XOR. A .XOR. B Toán tử logic XOR (giống như .NEQV.)
.EQV. A .EQV. B Toán tử logic bằng
.NOT. .NOT. A Toán tử logic NOT (phủ định)
● Cần phải xét đến độ ưu tiên của các toán tử trên toàn bộ
biểu thức
Độ ưu tiên của các toán tử
● Gồm một hoặc nhiều biểu thức
logic chỉ nhận một trong hai
giá trị: .TRUE. hoặc .FALSE.
● Các toán tử:
Loại (Category) Toán tử (Operator) Độ ưu tiên (Precedence)
Số (numeric) ** Cao nhất
Số * or /
Số unary + or -
Số binary + or -
Ký tự (character) //
Quan hệ (ralational) .EQ. .NE. .LT. .LE. .GT. .GE.
Luận lý (logical) .NOT.
Luận lý .AND.
Luận lý .OR.
Luận lý .XOR. .EQV. .NEQV. Thấp nhất
Mảng (Array) trong Fortran
● Mảng trong Fortran là mảng 1 hoặc nhiều chiều (tối đa 7
chiều).
● Khai báo mảng bằng cách sử dụng dấu ‘()’
◆ TEST(3) ! Mảng 1 chiều, kích thước 3
◆ FORCE(4,2) ! Mảng 2 chiều, kích thước 4x2
● Kích thước mảng được qui định là số nguyên từ 1…N
● Có thể khai báo mảng dưới nhiều dạng khác nhau
◆ REAL*4 L(2,5) !L là mảng số thực 4 bytes, kích thước 2x5
◆ INTEGER*4 K(1:12) hoặc K(12)
◆ !K là mảng số nguyên 4 bytes, kích thước 12 (gồm 12 phần tử)
chỉ số từ 1-12
- Parmeter (n=10, m=20) Mảng K kích thước 20 (phần tử),
mảng I kích thước 10x20
- Dimension K(n), I(n,m)
● Mảng được lưu trữ dưới theo cột trước, hàng sau
Câu lệnh rẻ nhánh: IF ELSE IF
● Cấu trúc cơ bản:
◆ Cú pháp: IF (biểu thức logic_1) THEN
các câu lệnh thực thi (1)
ELSE IF (biểu thức logic_2) THEN
các câu lệnh thực thi (2)
ELSE
các câu lệnh thực thi (3)
ENDIF
◆ VD:
IF (KEY.EQ.1) THEN
CLASS=‘FRESHMAN’
ELSE IF (KSTAT.EQ.2) THEN
CLASS=‘SOPHOMORE’
ELSE IF (KEY.EQ.3) THEN
CLASS=‘JUNIOR’
ELSE IF (KEY.EQ.4) THEN
CLASS=‘SENIOR’
ELSE
CLASS=‘UNKNOWN’
ENDIF
IF THEN ELSE
● Cấu trúc cơ bản:
◆ Cú pháp: IF (biểu thức logic) THEN
các câu lệnh thực thi (1)
ELSE
Các câu lệnh thực thi (2)
ENDIF
◆ Nếu biểu thức logic là đúng thì chương trình sẽ thực thi các câu
lệnh (1), ngược lại, biểu thức logic sai, các câu lệnh (2) sẽ được
thực thi
◆ VD: IF (KEY.EQ.0) THEN
X=X+1 đúng
KEY= 0? X=X+1
ELSE
sai
X=X+2
X=X+2
ENDIF
Vòng lặp
Cú pháp:
DO nhãn , điều khiển vòng lặp DO điều khiển vòng lặp
các câu lện thực thi Hoặc các câu lện thực thi
Nhãn Continue ENDDO
◆ VD:
DO K=1,10,2
PRINT*,A(K)
ENDDO
Các lệnh điều khiển trong FORTRAN
● GO TO : Nhảy chương trình đến 1 vị trí nào đó
● Lện điều kiện IF (IF, hoặc IF-ELSE,… )
● CASE (gần giống IF)
● Vòng lặp (DO, DO WHILE)
● CONTINUE! Đánh dấu tiếp tục dòng kế tiếp
● PAUSE! Tạm dừng chương trình chờ nhấn 1
phím bất kỳ để tiếp tục
● STOP! Ngừng hẳn chương trình
● CALL! Gọi chương trình con hoặc các thư
viện viết sẵn
● RETURN! Trả về lại vị trí của lệnh CALL
● END! Kết thúc chương trình chính
Các thủ tục nhập/xuất (I/O)
WRITE(6,2000)(A(I),I=1,10)
Lệnh Format
● Cấu trúc chung
◆ Cú pháp: label_no FORMAT(format-specifiers)
◆ VD:
WRITE(6,1000) A,B,KEY
4 FORMAT(F12.4,E14.5,I6)
VD:
Program Test
…
END
Subroutine Test 1
…
Return
END Subroutine
Integer Function (num)
…
Return
END Function
Chương trình con: Subroutine
● Lưu Ý
◆ Cách viết giống như viết chương trình chính
◆ Tầm vực (scope) của biến
– Biến toàn cục: những biến được khai báo trong chương
trình chính
– Biến cục bộ: những biến được khai báo trong chương
trình con
◆ Cách gọi chương trình con subrountine
Program Test Program Test
… …
Call Test1(X,Y) Call Test1(X,Y)
END END
Subroutine Test 1(A,B) Subroutine Trung binh(A, Tbinh)
… …
Return Return
END Subroutine END Subroutine
Bài tập
BT 1: Giải phương trình bậc hai bằng các hệ số được yêu cầu nhập từ bàn phím. (chỉ tính cho
trường hợp nghiệm thực)
BT 2: Viết chương trình nhập vào một ma trận hệ số của 1 hệ phương trình tuyến tính n ẩn. In
phương trình tuyến tính với các hệ số đã nhập dưới dạng:
a11x1 a12x2…a1nxn a1n+1
a21x1 a22x2…a2nxn a2n+1
…
an1x1 an2x2…annxn ann+1
Với n là số ẩn số được nhập từ bàn phím
BT 3a: Viết chương trình tính: giá trị trung bình, giá trị cực đại, giá trị cực tiểu của 1 chuỗi số liệu đã
cho trong hai trường hợp:
(a) chuỗi số liệu được nhập từ bàn phím;
(b) chuỗi số liệu được nhập từ file.
BT 3b: Viết lại chương trình như bài tập 3, bằng cách sử dụng các thư viện sẵn có của Fortran (trung
bình, cực đại, cực tiểu)
BT 4: Viết chương trình sắp xếp một chuỗi số liệu đã cho từ nhỏ tới lớn và ngược lại (từ lớn tới nhỏ).
Với chuỗi số liệu được nhập từ:
(a) Bàn Phím
(b) File
BT (lớn): Từ 1 file dữ liệu của khí áp kế (Barometer), tính:
(a) Trung bình bình chạy 5 điểm, ghi vào file mới thay giá trị cũ thành các giá trị mới vừa tính
(b) Tính trung bình ngày nhiệt độ không khí (Ta) và khí áp (Pa)
(c) Tính các giá trị cực đại cực tiểu trong trong ngày của các giá trị Ta, Pa (kết quả tính toán
được ghi ra file)