1.1 Fortran cơ sở
1.1.1. Cấu trúc chương trình.
1.1.2. Kiểu dữ liệu trong Fortran.
1.1.3. Hằng số và biến số.
1.1.4. Mảng.
1.2. Các câu lệnh cơ bản.
1.2.1. Các biểu thức và lệnh gán.
1.2.2. Lệnh nhập/xuất dữ liệu.
1.2.4. Lệnh điều kiện IF-THEN và SELECT CASE.
1.2.5. Vòng lặp DO.
1.3. Hàm và thủ tục
1.3.1. Đối số.
1.3.2. Biến cục bộ và biến toàn cục.
27 trang |
Chia sẻ: candy98 | Lượt xem: 901 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Ứng dụng các phương pháp tính số - Chương 1: Tóm lược ngôn ngữ lập trình Fortran 90 - Ngô Văn Thanh, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
TS. Ngô Văn Thanh,
Viện Vật lý.
Cao học vật lý – chuyên ngành Vật lý lý thuyết.
Chương.1 Tóm lược ngôn ngữ lập trình Fortran 90.
1.1 Fortran cơ sở
1.1.1. Cấu trúc chương trình.
1.1.2. Kiểu dữ liệu trong Fortran.
1.1.3. Hằng số và biến số.
1.1.4. Mảng.
1.2. Các câu lệnh cơ bản.
1.2.1. Các biểu thức và lệnh gán.
1.2.2. Lệnh nhập/xuất dữ liệu.
1.2.4. Lệnh điều kiện IF-THEN và SELECT CASE.
1.2.5. Vòng lặp DO.
1.3. Hàm và thủ tục
1.3.1. Đối số.
1.3.2. Biến cục bộ và biến toàn cục.
@2009, Ngô Văn Thanh - Viện Vật Lý
1.1 Fortran cơ sở
1.1.1. Cấu trúc chương trình.
Cấu trúc tổng quát của một chương trình Fortran bao gồm 4 phần chính:
Tên chương trình.
Phần khai báo: Khai báo các biến số, hằng số, các kiểu tự định.
Phần chương trình chính: Bao gồm các câu lệnh chạy của chương trình.
Phần liệt kê các chương trình con.
Ví dụ:
[PROGRAM tên_chương_trình]
[Các câu lệnh khai báo]
[Các câu lệnh chạy]
[Các chương trình con]
END [PROGRAM [tên_chương_trình]]
Bắt buộc phải khai báo END để kết thúc chương trình.
Các khai báo trong móc vuông là không bắt buộc.
@2009, Ngô Văn Thanh - Viện Vật Lý
Một số quy tắc soạn thảo mã nguồn.
Các cột từ 1-6 được sử dụng cho một số khai báo đặc biệt:
Cột 1: Khai báo chú thích (comments), bắt đầu bằng ký tự như: “*”, “c”
Cột 2: Khai báo nhãn (label): Nhãn có độ dài tối đa là 5 ký tự.
Cột 6: Khai báo kết nối câu lệnh (khi câu lệnh dài quá).
Các câu lệnh được viết bắt đầu từ cột thứ 7
Mỗi câu lệnh được viết trên một hàng.
Độ dài tối đa cho mỗi câu lệnh là 132 ký tự, trừ ký tự trắng (space).
Nếu mã nguồn được viết kiểu định dạng thì độ dài tối đa cho một dòng
lệnh là 72 cột.
Tên trong chương trình như tên biến, tên hằng số, tên chương trình, tên
chương trình con
Tên có độ dài tối đa là 31 ký tự và không được chứa các ký tự đặc biệt
như: khoảng trắng, “;”, “&”, “!”, “+”, “-”, “*”, “/”
Tên và các từ khoá không có sự phân biệt giữa chữ hoa và chữ thường.
Có thể viết nhiều câu lệnh trên cùng một dòng, các câu lệnh được viết cách
nhau bởi dấu chấm phẩy “;”.
Ví dụ: a = 3.1416; b = a; c = a*b
@2009, Ngô Văn Thanh - Viện Vật Lý
Một câu lệnh quá dài có thể tách ra và viết trên nhiều dòng lệnh
Các dòng lệnh được nối với nhau bởi ký tự “&” ở phía sau mỗi dòng lệnh,
Hoặc đặt ký tự “&” tại cột thứ 6 của dòng lệnh tiếp theo.
Ví dụ:
S(I,J,K) = SX(I,J,K) + SY(I,J,K) &
+SZ(I,J,K)
hoặc
S(I,J,K) = SX(I,J,K) + SY(I,J,K)
& +SZ(I,J,K)
Trong trường hợp câu lệnh chứa một chuỗi ký tự bị cắt thì phải sử dụng hai ký
tự “&” đặt ở cả vị trí cuối dòng lệnh và cả vị trí đầu của dòng lệnh tiếp theo.
Ví dụ:
WRITE(*,’DAY LA CHUONG TRINH GIOI THIEU &
& VE NGON NGU LAP TRINH FORTRAN’)
@2009, Ngô Văn Thanh - Viện Vật Lý
1.1.2 Kiểu dữ liệu trong Fortran
Có 3 bộ kiểu dữ liệu chính:
Kiểu số (bao gồm số thực, số nguyên và số phức).
Kiểu logic.
Kiểu ký tự.
Cú pháp khai báo kiểu số và logic:
[, các thuộc tính] :: [ = ]
Các thuộc tính bao gồm: PARAMETER, SAVE, INTENT, POINTER,
DIMENSION, TARGET
PARAMETER và POINTER không được sử dụng cùng nhau.
là giá trị ban đầu gán cho hằng số hoặc biến số.
số thực: REAL hoặc DOUBLE PRECISION.
Ví dụ: Khai báo hai số thực a và b
REAL :: a,b
hoặc
DOUBLE PRECISION :: a,b
@2009, Ngô Văn Thanh - Viện Vật Lý
số nguyên: INTEGER.
Ví dụ: Khai báo ba số nguyên i, j và k
INTEGER :: i,j,k
số phức: COMPLEX.
Kiểu số phức trong Fortran chứa hai thành phần (a, b).
(a, b) là hai số thực (kiểu ngầm định) hoặc số nguyên.
Ví dụ:
Khai báo số phức với hai phần tử là số thực: zr = a + ib.
COMPLEX :: zr
Khai báo số phức với hai phần tử là số nguyên: zi = a + ib
INTEGER, COMPLEX :: zi
logic: LOGICAL.
Các biến logic chỉ nhận hai giá trị “true” hoặc “false” (.TRUE./.FALSE.)
Ví dụ: LOGICAL :: ISOK = .TRUE.
Cú pháp khai báo kiểu ký tự:
[(LEN = độ dài)] [, thuộc tính] [::] biến [=]
Ví dụ: CHARACTER(LEN=20) :: filein, fileout
@2009, Ngô Văn Thanh - Viện Vật Lý
1.1.3. Hằng số và biến số.
Hằng số: PARAMETER
Giá trị của hằng số không thay đổi trong toàn bộ chương trình.
Phải được gán giá trị ngay từ lúc đầu
Không được phép gán giá trị cho một hằng số trong qua trình tính.
Ví dụ:
INTEGER, PARAMETER :: N=100,M=50
REAL, PARAMETER :: pi=3.1416
Biến số:
Giá trị của biến số có thể thay đổi trong khi chạy chương trình thông qua lệnh
gán.
Giá trị của biến số có thể được gán giá trị ngay từ lúc đầu.
Ví dụ: REAL radius=3.5D0 ! biến số được gán giá trị ban đầu
REAL x, y ! biến số được không gán giá trị ban đầu
x = 3.1416; y = 2.D0*x*radius ! gán giá trị khi chạy
@2009, Ngô Văn Thanh - Viện Vật Lý
1.1.4. Mảng: DIMENSION()
Mảng là một tập các phần tử cùng kiểu (số thực, số nguyên ) có cấu trúc
dạng ma trận một hoặc nhiều chiều.
Lệnh khai báo mảng:
, DIMENSION(DIM1,DIM2, DIMN) :: [ = ]
DIM1,DIM2,DIMN là kích thước hay số phần tử của mỗi chiều của mảng.
Mỗi một phần tử trong mảng được đánh chỉ số .
Các chỉ số bắt đầu từ số 1 (ngầm định).
Ví dụ:
REAL, z
REAL, DIMENSION(10) :: x
INTEGER, DIMENSION(1:5,0:4) :: y,z
INTEGER :: yn(5,4)
INTEGER,DIMENSION(4):: a=(/1,2,3,4/),b=(/i,i=1,4/)
x (4) = 10
z = x(2)+x(3)
@2009, Ngô Văn Thanh - Viện Vật Lý
Một số thuật ngữ liên quan đến mảng:
rank: Số chiều của mảng, số chiều tối đa của 1 mảng bằng 7.
INTEGER :: yn(5,4)
số chiều của mảng yn là 2.
bound: Giới hạn trên và giới hạn dưới của các chỉ số. Giới hạn dưới ngầm
định là 1.
REAL, DIMENSION(10) :: x
Giới hạn trên là 10, giới hạn dưới là 1.
extent: Tổng số các phần tử trong mỗi chiều của mảng.
REAL, DIMENSION(10,20) :: zn
extent của chiều thứ hai của mảng zn là 20.
size: Tổng số các phần tử của toàn bộ mảng.
INTEGER, DIMENSION(100,20) :: ka
size của của mảng ka là 100*20 = 2000.
@2009, Ngô Văn Thanh - Viện Vật Lý
1.2. Các câu lệnh cơ bản.
1.2.1. Các biểu thức và lệnh gán.
Một biểu thức tính phải có ít nhất một phép toán như phép cộng “+”, phép trừ
“-”, phép nhân “*”, phép chia “/” và phép tính luỹ thừa “**”
Lệnh gán: Các biểu thức tính thường được kết hợp với phép toán gán “=”.
Đối tượng ở vế trái là một biểu thức tính hoặc một đối tượng.
Đối tượng ở vế phải bắt buộc là một đối tượng (biến hoặc kiểu tự định
nghĩa).
Ví dụ:
REAL :: a, b, c
LOGICAL :: isok
CHARACTER(20) :: fullname
a = b
c = sin(3.1416/3.0)*15.5
isok = a > b
fullname =’Nguyen Van A’
@2009, Ngô Văn Thanh - Viện Vật Lý
Các phép toán cơ bản:
Các phép toán quan hệ:
Các phép toán logic
Thứ tự ưu tiên của các phép toán:
@2009, Ngô Văn Thanh - Viện Vật Lý
cộng trừ nhân chia luỹ thừa
+ - * / **
bằng nhau lớn hơn lớn hơn hoặc
bằng
bé hơn bé hơn hoặc
bằng
== > >= < <=
phủ định và hoặc
.NOT. .AND. .OR.
** *, / +, - >, >=, < .NOT. .AND. .OR.
Ví dụ: x = a+b/5.0-c**d+1.0*e
Tương đương với: x = ((a+(b/5.0))-(c**d))+(1.0*e)
thứ tự các bước tính như sau: (c**d) => (b/5.0) và (1.0*e), cuối
cùng là các phép toán cộng và trừ.
1.2.2. Lệnh nhập/xuất dữ liệu.
READ : Lệnh nhập dữ liệu từ bàn phím.
Ví dụ: READ*, a,b
READ(5,*), a,b
Lệnh đọc dữ liệu từ bàn phím và gán giá trị cho hai biến a và b.
PRINT/WRITE: Lệnh in ra màn hình
Ví dụ: PRINT*, ’Nghiem cua phuong trinh la: x = ’, x
WRITE(6,*) ’Nghiem cua phuong trinh la: x = ’, x
Lệnh in ra màn hình một dòng text và giá trị của biến x.
Ký hiệu “*” phía sau lệnh READ và PRINT có nghĩa là dữ liệu đọc vào từ
bàn phím hoặc in ra màn hình dạng tự do (không được định dạng).
@2009, Ngô Văn Thanh - Viện Vật Lý
1.2.3. Sử dụng file vào/ra - Đọc dữ liệu từ file và ghi dữ liệu ra file.
Lệnh OPEN(): Mở file để đọc hoặc ghi.
Cú pháp:
OPEN([UNIT=] , FILE=, STATUS=,
ACTION=).
UNIT=: với là một số nguyên được gọi là nhãn
của lệnh OPEN.
Nhãn trong lệnh OPEN phải là một nhãn chưa được sử dụng. Không trùng
với nhãn của lệnh OPEN khác phía trước nó.
FILE=: với là tên file được mở.
STATUS=: Trạng thái của file có các lựa chọn sau:
‘OLD’ : mở file đang tồn tại.
„NEW‟ : tạo file mới
„REPLACE‟ : ghi đè lên file cũ.
„UNKNOWN‟: trạng thái không xác định. Sẽ tạo file mới nếu chưa có file,
hoặc sẽ ghi đè lên file cũ nếu nó đang tồn tại.
@2009, Ngô Văn Thanh - Viện Vật Lý
ACTION=: mục đích mở file, có 3 kiểu mở file:
‘READ’ : mở file để đọc.
‘WRITE’ : mở file để ghi
‘READWRITE’ : mở file để cả đọc và ghi.
Ví dụ:
OPEN(UNIT=10,FILE=’input.dat’, &
STATUS=’OLD’,ACTION=’READ’)
Lệnh mở file để đọc với tên file là input.dat và file này đã tồn tại.
OPEN(UNIT=11,FILE=’output.dat’, &
STATUS=’NEW’,ACTION=’WRITE’)
Lệnh mở file để ghi với tên file là output.dat và file này sẽ được tạo mới
Lệnh CLOSE()
Đóng một file đã được mở trước đó bằng lệnh OPEN với cùng số nguyên
.
Ví dụ: CLOSE(11)
Sau lệnh thì nhãn có thể sử dụng cho lệnh OPEN mới.
@2009, Ngô Văn Thanh - Viện Vật Lý
Lệnh READ():
Cú pháp:
READ([UNIT=] , [FMT=])
: là nhãn trong lệnh OPEN()
: kiểu định dạng dữ liệu.
: liệt kê các biến cần gán giá trị từ file
Ví dụ: READ(10, FMT=’(3(F10.7,1x))’) a,b,c
Lệnh WRITE():
Cú pháp:
WRITE([UNIT=] , [FMT=])
: là nhãn trong lệnh OPEN()
: kiểu định dạng dữ liệu.
: liệt kê các biến cần ghi giá trị ra file.
Ví dụ: WRITE(11, FMT=’(3(I8,1x))’) i,j,k
@2009, Ngô Văn Thanh - Viện Vật Lý
Lệnh FORMAT():
Có 6 kiểu định dạng tương ứng với các kiểu dữ liệu:
Iw : kiểu số nguyên có độ dài là w
Ví dụ. I6 : định dạng số nguyên có độ dài bằng 6.
Fw.d : số thực kiểu thập phân
Ví dụ: F6.4 : số thực có tổng độ dài bằng 6 (kể cả dấu âm, dấu chấm
thập phân) và có 4 chữ số sau dấu chấm thập phân kiểu 1.0000
Ew.d : số thực kiểu luỹ thừa E
Ví dụ: E10.4 là số thực có tổng độ dài bằng 10 (kể cả dấu âm, dấu
chấm thập phân) và có 4 chữ số sau dấu chấm thập phân kiểu
1.0000E+00
Aw : kiểu ký tự
Ví dụ: A10 là chuỗi ký tự có độ dài bằng 10, kể cả ký tự trắng.
L : kiểu logic với giá trị T hoặc F tương ứng với .TRUE. hoặc .FALSE.
nX : n số ký tự trắng được giữ lại; Ví dụ. 2X.
Ví dụ: READ(10,FMT=1) a,b,c
1 FORMAT(3(F10.7,1x))
Số “1” phía trước lệnh FORMAT được gọi là “nhãn”.
@2009, Ngô Văn Thanh - Viện Vật Lý
1.2.4. Lệnh rẽ nhánh IF-THEN và SELECT CASE.
Cú pháp lệnh rẽ nhánh đơn: IF ()
Ví dụ: IF (a > b) x = a
Cú pháp lệnh rẽ khối lệnh:
IF () THEN
ELSEIF () THEN
ELSE
ENDIF
Ví dụ: IF (a > b) THEN
x = a
ELSEIF (a == b) THEN
x = 0.0
ELSE
x = b
ENDIF
@2009, Ngô Văn Thanh - Viện Vật Lý
Cú pháp lệnh rẽ nhánh SELECT CASE:
SELECT CASE()
CASE()
CASE()
CASE DEFAULT
END SELECT CASE
Ví dụ: SELECT CASE(k)
CASE(1)
x = 1.0
CASE(2)
x = 2.0
CASE DEFAULT
x = 0.0
END SELECT CASE
@2009, Ngô Văn Thanh - Viện Vật Lý
1.2.5. Vòng lặp DO.
Vòng lặp xác định
Cú pháp:
DO
ENDDO
Ví dụ: DO i=1,10
gt=gt*i
A(i)=B(i)*C(i)
ENDDO
Vòng lặp không xác định
Cú pháp:
DO WHILE
ENDDO
Ví dụ:
DO WHILE(i<=10)
gt=gt*i
A(i)=B(i)*C(i)
ENDDO
@2009, Ngô Văn Thanh - Viện Vật Lý
1.3. Hàm và thủ tục.
Hàm : FUNCTION()
Hàm là một loại chương trình con mà kết quả của những tính toán của hàm
được trả lại cho tên hàm.
Tên hàm có thể được đặt trong các biểu thức tính hoặc lệnh gán.
Cú pháp:
[] FUNCTION tên_hàm ([])
Khai báo các tham số
Khai báo biến cục bộ
Các lệnh thực hiện chương trình
tên_hàm = kết quả tính
END [FUNCTION []]
Ví dụ:
REAL, FUNCTION F(x,y)
REAL, INTENT(IN) :: x,y
F = SQRT(x*x + y*y)
END FUNCTION F
***************
r = F(2,3)
@2009, Ngô Văn Thanh - Viện Vật Lý
Thủ tục : SUBROUTINE()
Thủ tục cũng là một loại chương trình con mà kết quả của những tính toán
của thủ tục được trả lại cho một hoặc nhiều tham biến.
Thủ tục được thực hiện bằng lệnh CALL tên_thủ_tục(các_tham_số).
Cú pháp:
SUBROUTINE tên_thủ_tục ([])
Khai báo các tham số
Khai báo cục bộ
Các lệnh thực hiện chương trình
END [SUBROUTINE []]
Ví dụ:
SUBROUTINE F(r,x,y)
REAL, INTENT(IN) :: x,y
REAL, INTENT(OUT) :: r
r = SQRT(x*x + y*y)
END SUBROUTINE F
**************
CALL F(2,3)
@2009, Ngô Văn Thanh - Viện Vật Lý
Module: Khai báo các chương trình con không nằm trong thân chương
trình chính.
Các module được gọi đến bằng lệnh USE
Ví dụ:
MODULE Stack
...
CONTAINS
SUBROUTINE push(i)
...
END SUBROUTINE push
END MODULE Stack
PROGRAM StackUser
USE Stack
...
CALL Push(10)
...
END PROGRAM StackUser
@2009, Ngô Văn Thanh - Viện Vật Lý
1.3.1. Đối số.
Đối số là các tham số được khai báo cho chương trình con bao gồm: các biến,
hằng, mảng Có hai loại tham số:
“tham trị”: tham số đưa vào chương trình con mà không bị thay đổi giá trị.
Khai báo tham trị trong chương trình con cần phải có thêm
Ví dụ: REAL, INTENT(IN):: a,b
“tham biến”: tham số có thể thay đổi giá trị của nó bởi các phép gán trong
chương trình con. Khai báo tham biến trong chương trình con cần phải có
thêm một trong hai lựa chọn:
nếu không sử dụng giá trị của tham biến trong chương
trình con.
nếu như phải sử dụng giá trị của tham biến cho các
phép tính trong chương trình con.
SUBROUTINE exam(ts1,ts2,ts3)
REAL,INTENT(IN) :: ts1
INTEGER, INTENT(OUT) :: ts2
REAL, INTENT(INOUT) :: ts3
@2009, Ngô Văn Thanh - Viện Vật Lý
1.3.2. Biến cục bộ và biến toàn cục .
Biến cục bộ là các biến số chỉ được sử dung trong một chương trình con nào
đó
Tên biến cục bộ có thể trùng tên với các biến toàn cục của chương trình
chính, ngoại trừ tên các tham số của chương trình con.
Nó được khởi tạo ngay khi chương trình con bắt đầu thực hiện
Giải phóng ra khỏi bộ nhớ khi chương trình con kết thúc.
Biến cục bộ không sử dụng được cho chương trình chính.
Biến toàn cục là các biến được khai báo và khởi tạo ngay từ đầu chương trình
chính
Các biến toàn cục có thể được sử dụng trong các chương trình con thông
qua hoặc không thông qua các tham số.
Ví dụ:
SUBROUTINE exam(ts1,ts2,ts3)
REAL,INTENT(IN) :: ts1
INTEGER, INTENT(OUT) :: ts2
REAL, INTENT(INOUT) :: ts3
REAL r
@2009, Ngô Văn Thanh - Viện Vật Lý
Ví dụ.
PROGRAM MATMUT
PARAMENTER N =10
REAL,DIMENSION(N,N) :: A, B, C
INTEGER :: I,J,K
!
CALL MC(N,A,B,C)
DO J=1,N
DO I=1,N
DO K = 1,N
C(I,J)=C(I,J)+A(I,K)*B(K,J)
ENDDO
ENDDO
ENDDO
!
CONTAINS
@2009, Ngô Văn Thanh - Viện Vật Lý
SUBROUTINE MC(N,A,B,C)
REAL,DIMENSION(N,N),INTENT(INOUT) :: A, B, C
INTEGER :: I,J
DO J=1,N
DO I=1,N
A(I,J)= FLOAT(I+J)
B(I,J)= FLOAT(I*J)
C(I,J)= 0.0
ENDDO
ENDDO
END SUBROUTINE MC
!
END PROGRAM MATMUT
@2009, Ngô Văn Thanh - Viện Vật Lý