fortran cơ sở
TRANSCRIPT
Ngôn ngữ lập trình
FORTRAN
GV: Hoàng Đỗ Ngọc Trầm
1. Fortran cơ sở
1.1. Kiểu dữ liệu trong Fortran.
1.2. Hằng số và biến số.
2. Các câu lệnh cơ bản.
2.1. Các biểu thức và lệnh gán.
2.2. Lệnh nhập/xuất dữ liệu.
2.3. Lệnh điều kiện IF-THEN-ELSE.
2.4. Vòng lặp DO.
3. Mảng.
4. Chương trình con
4.1. Hàm và thủ tục
4.2. Đối số.
4.3. Biến cục bộ và biến toàn cục.
Tóm lược ngôn ngữ lập trình FORTRAN
Kiểu số (số thực, số nguyên
và số phức)
Kiểu dữ liệu trong Fortran
- Kiểu : + REAL (số thực),+ INTEGER (số nguyên),+ COMPLEX hoặc INTEGER , COMPLEX (số phức) + LOGICAL (logic)+ CHARACTER (kí tự)
- Các thuộc tính : PARAMETER, SAVE, INTENT, POINTER, DIMENSION, TARGET (PARAMETER, POINTER không đi cùng nhau).
Kiểu logic(.true., .false.)
Kiểu kí tự
Cú pháp: <kiểu> [([LEN = ] độ dài chuỗi kí tự)] [, các thuộc tính] & :: <các biến> [ = <giá trị ban đầu>]
Ví dụ: REAL :: a,b LOGICAL :: ISOK = .TRUE.INTEGER, COMPLEX :: zi CHARACTER(LEN=20) :: filein, fileout
Z=(a,b)
Hằng số và biến sốHằng số: (PARAMETER)
- Giá trị không đổi trong toàn bộ chương trình,
- Phải được gán ngay từ đầu, không được phép gán giá trị trong quá trình tính.
Ví dụ: INTEGER, PARAMETER :: N=100,M=50REAL, PARAMETER :: pi=3.1416
Biến số:
- Giá trị thay đổi trong khi chạy chương trình (thông qua lệnh gán).
- Có thể được gán giá trị ban đầu.
Ví dụ: REAL :: radius=3.5E0 ! 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
* Tăng độ chính xác cho dữ liệu: (p=6-18)
REAL, PARAMETER :: ikind=selected_real_kind(p=15)REAL (kind=ikind) :: sum, x
* Ý nghĩa câu lệnh: IMPLICIT NONE
* Giá trị giới hạn của các kiểu dữ liệu!!!!(p.25-Manual)
* Lưu ý khi sử dụng các kiểu dữ liệukhác nhau Xem divide.f95 (p.17-Manual)
Các biểu thức và lệnh gánMột biểu thức tính phải có ít nhất một phép toán (cộng, trừ, nhân, chia, luỹ thừa…).
Các biểu thức tính thường được kết hợp với phép toán gán:
<Vế trái>=<Vế phải>
<Vế trái>: một đối tượng (biến hoặc kiểu tự định nghĩa).
<Vế phải>: một biểu thức tính hoặc một đối tượng.
Ví dụ: REAL :: a, b, cLOGICAL :: isokCHARACTER(20) :: fullname
a = bc = sin(3.1416/3.0)*15.5isok = a > bfullname =’Nguyen Van A’
Các biểu thức và lệnh gánCác phép toán cơ bản
Các phép phép toán quan hệ
Các phép toán logic
Thứ tự ưu tiên các phép toán
Ví dụ: x = a+b/5.0-c**d+1.0*e => Thứ tự?
Cộng Trừ Nhân Chia Lũy thừa
+ - * / **
Nhỏ hơn Nhỏ hơnhoặc bằng
Bằng Lớn hơn Lớn hơnhoặc bằng
Khôngbằng
< <= == > >= /=
Phủ định Và Hoặc
.NOT. .AND. .OR.
** *, / +, - <, <=, ==, >=, >, /= .NOT. .OR. .AND.
Các lệnh dựng sẵn
function nametype of argument
type of result Definition
div(n,m) integer integer
mod(n,m) integer integer
sin(x) real real sine
cos(x) real real cosine
tan(x) real real tangent
atan(x) real real arctangent
abs(x) real/integer real/integer absolute value
sqrt(x) real real square root
exp(x) real real ex
log10(x) real real log10x
Lệnh nhập/xuất dữ liệu1. Nhập/xuất dữ liệu từ bàn phím
READ*, a,b ! Đọc dữ liệu từ bàn phím và gán giá trị cho hai biến a và b.READ (*,*) a, bPRINT*,’Nghiem cua phuong trinh la: x = ’, x ! in ra màn hình một dòng textWRITE(*,*) ’Nghiem cua phuong trinh la: x = ’, x ! và giá trị của biến x
2. Đọc/ghi dữ liệu trên file- Mở file:
- Đọc/ghi dữ liệu: READ([UNIT=] <file unit>, [FMT=]<format>) <input list>)WRITE([UNIT=] <file unit>, [FMT=]<format>) <output list>)
VD: READ(10, FMT=’(3(F10.7,1x))’) a,b,cWRITE(11, FMT=’(3(I8,1x))’) i,j,k
- Đóng file: CLOSE(<file unit>)
* Hai file mở cùng một lúc không được có chung nhãn (file unit)
OPEN([UNIT=] <file unit (integer)>, FILE=<‘filename’>, & [STATUS=<status (‘NEW’, ‘OLD’, ‘REPLACE’,’UNKNOWN’)]>,& [ACTION=<mode (‘READ’, ‘WRITE’, ‘READWRITE’)>])
VD: OPEN(UNIT=10,FILE=’input.dat’, STATUS=’OLD’,ACTION=’READ’)
Lệnh FORMAT(): có 6 kiểu định dạng:
- nIw : kiểu số nguyên có độ dài là wVD: I6 là số nguyên có độ dài 6 kí tự
- nFw.d: số thực kiểu thập phân có tổng độ dài bằng w (kể cả dấu âm, dấu chấm thập phân) và có d chữ số sau dấu chấm thập phân.VD: F6.4 là số thực kiểu 1.0000
- nEw.d: số thực kiểu luỹ thừa E có tổng độ dài bằng w (kể cả dấu âm, dấu chấm thập phân và chữ E) và có 4 chữ số sau dấu chấm thập phânVD: E10.4 là số thực kiểu 1.0000E+00
- nAw: kiểu ký tự có độ dài bằng w, kể cả ký tự trắng.
- nL: kiểu logic, có 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ụ: 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”.Xem p. 6-7, 21-22,31-33 Manual
Lệnh nhập/xuất dữ liệu
Câu lệnh điều kiện IF-THEN- ELSE- Câu lệnh đơn: IF (<biểu thức logic>) < câu lệnh>
Ví dụ: IF (a > b) x = a
- Khối lệnh rẽ nhánh:
IF (<biểu thức logic>) THEN<khối lệnh 1>
ELSEIF (<biểu thức logic>) THEN<khối lệnh 2>
ELSE<khối lệnh 3>
ENDIF
Ví dụ: IF (a > b) THENx = a
ELSEIF (a == b) THENx = 0.0
ELSEx = b
ENDIF
Câu lệnh điều kiện IF-THEN- ELSE
Câu lệnh điều kiện IF-THEN- ELSE
Ví dụViết chương trình giải pt bậc hai với các hệ số nhập từ bàn phím
Kiểm tra điều kiện khác không, bằng không?
IF (x==0) THEN …
IF (abs(x)<.0000001) THEN …
Vòng lặp DO
Vòng lặp DO
Vòng lặp DO
Vòng lặp DO
Vòng lặp DO1. Vòng lặp xác định:
DO <biến_chạy = giá_trị_đầu, giá_trị_cuối [, bước_chạy]><khối lệnh>
ENDDO
Ví dụ: DO i=1,10gt=gt*iA(i)=B(i)*C(i)
ENDDO
Vòng lặp DO
Vòng lặp DO
Vòng lặp DO
Vòng lặp DO1. Vòng lặp xác định:
DO <biến_chạy = giá_trị_đầu, giá_trị_cuối [, bước_chạy]><khối lệnh>
ENDDO
Ví dụ: DO i=1,10gt=gt*iA(i)=B(i)*C(i)
ENDDO
2. Vòng lặp không xác định:
Ví dụ: i=1
DO WHILE (i<=10)gt=gt*iA(i)=B(i)*C(i)i=i+1
ENDDO
DO WHILE <biểu_thức_logic><khối lệnh>
ENDDO
DO<khối lệnh>
UNTIL <biểu_thức_logic>ENDDO
Vòng lặp DO
Bài tập
Bài tập1. Viết chương trình tìm nghiệm của phương trình bậc 2 với các hệ
số nhập từ bàn phím.
2. Viết chương trình kiểm tra số nhập vào có phải số nguyêndương hay không, nếu không thì yêu cầu nhập lại.
3. Viết chương trình tính giai thừa của một số nguyên dương nhậpvào từ bàn phím.
4. Viết chương trình kiểm tra một số nhập vào có phải là sốnguyên tố.
5. Viết chương trình phân tích một số ra thừa số nguyên tố.
6. Viết chương trình sắp xếp ba số theo thứ tự giảm dần.
7. Viết chương trình tính sự thay đổi độ cao sau một khoảng thờigian bất kì của một vật đang rơi tự do từ một độ cao cực đai chotrước.
MảngLà 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.
Khai báo:
DIM1,DIM2,…DIMN: kích thước hay số phần tử của mỗi chiều của mảng, mỗi phần tử được đánh một chỉ số (bắt đầu từ 1).
Ví dụ: REAL, zREAL, DIMENSION(10) :: xINTEGER, DIMENSION(1:5,0:4) :: y,zINTEGER :: yn(5,4)INTEGER,DIMENSION(4):: a=(/1,2,3,4/),b=(/i,i=1,4/)x (4) = 10z = x(2)+x(3)
<kiểu>, DIMENSION(DIM1,DIM2,… DIMN) :: <biến> [ = <gtrị>]
MảngMộ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 chiều thứ 2 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 mảng ka là 100*20 = 2000.
Mảng động
Xem alloc.f95, p.29 manual
Mảng
Hàm và thủ tục
Hàm : FUNCTION()
Là một loại chương trình con mà kết quả 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.
[<kiểu dữ liệu>,] FUNCTION tên_hàm ([<các tham_số>])<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ínhEND [FUNCTION [<tên_hàm>]]
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)
Thủ tục : SUBROUTINE()Là một loại chương trình con mà kết quả tính toán của thủ tục đượctrả lại cho một hoặc nhiều tham biến.Được thực hiện bằng lệnh: CALL tên_thủ_tục(các_tham_số)
SUBROUTINE tên_thủ_tục ([<các tham số>])<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 [<tên_thủ_tục>]]
Ví dụ: SUBROUTINE F(r,x,y)REAL, INTENT(IN) :: x,yREAL, INTENT(OUT) :: r
r = SQRT(x*x + y*y)END SUBROUTINE F**************CALL F(r,2,3)
Hàm và thủ tục
Module:
- Khai báo các chương trình con không nằm trong chương trình chính.- Các module đượcgọi đến bằng lệnh: USE <tên module>
Ví dụ: MODULE Stack...
CONTAINSSUBROUTINE push(i)...
END SUBROUTINE pushEND MODULE Stack
PROGRAM StackUserUSE Stack...
CALL Push(10)...
END PROGRAM StackUser
Hàm và thủ tục
Ví dụPROGRAM MATMUTPARAMETER N =10REAL,DIMENSION(N,N) :: A, B, CINTEGER :: I,J,K!CALL MC(N,A,B,C)DO J=1,NDO I=1,NDO K = 1,N
C(I,J)=C(I,J)+A(I,K)*B(K,J) ENDDOENDDOENDDO!CONTAINS
&
SUBROUTINE MC(N,A,B,C)REAL,DIMENSION(N,N),INTENT(INOUT) :: A, B, CINTEGER :: I,JDO J=1,NDO I=1,NA(I,J)= FLOAT(I+J)B(I,J)= FLOAT(I*J)C(I,J)= 0.0ENDDO
ENDDOEND SUBROUTINE MC!END PROGRAM MATMUT
Hàm và thủ tục1. Write a program which calculates the area of a triangle when the side
lengths of a triangle are given. Use a FUNCTION type subprogram.
2. Write a program to calculate the average of a real array, having maximum 100 elements. Use a SUBROUTINE type subprogram.
3. Write a program to evaluate
numerically with trapezoidal integration
where
Các câu ghi
chú và các câu
lệnh EJECT,
INCLUDE
Các câu lệnh: PROGRAM, FUNCTION,
SUBROUTINE, BLOCK DATA
Các câu lệnh
FORMAT vàENTRY
Các câu lệnh
PARAMETER
Các câu lệnh
IMPLICIT
Các câu lệnh
mô tả
Các câu lệnh
DATA
Các câu lệnh –hàm
Các câu lệnh
NAMELIST
Các câu lệnh
thực hiện
Câu lệnh END
Trật tự các câu lệnh trong chương trình
Câu hỏi chuẩn bị bài
1. Sai số là gì? Các loại sai số?
2. Các cách biểu diễn sai số của một giá trị, một hàm số?
3. Cách làm tròn một số, làm tròn sai số?
4. Chữ số có nghĩa là gì? Chữ số đáng tin là gì? Cáchxác định
5. Giải phương trình phi tuyến: khoảng phân ly nghiệm làgì? Cách cách giải khác nhau? Vẽ lưu đồ quy trình giảibằng phương pháp chia đôi
Câu lệnh rẽ nhánh
Lệnh rẽ nhánh SELECT CASE:
SELECT CASE(<biến>)CASE(<giá trị 1 của biến>)
<khối lệnh 1>CASE(<giá trị 2 của biến>)
<khối lệnh 2>CASE DEFAULT
<khối lệnh 3>END SELECT CASE
Ví dụ: SELECT CASE(k)CASE(1)
x = 1.0CASE(2)
x = 2.0CASE DEFAULT
x = 0.0END SELECT CASE
Ví dụ
Là các tham số được khai báo cho chương trình con (CTC), gồm: biến, hằng, mảng… Có hai loại:
“Tham trị”: tham số đưa vào CTC mà không thay đổi giá trị. Khai báo tham trị trong CTC phải thêm: <, INTENT(IN)>
Ví dụ: REAL, INTENT(IN):: a,b
“Tham biến”: tham số có thể thay đổi giá trị bởi các phép gán trong CTC. Khai báo tham biến trong CTC cần phải có thêm một trong hai lựa chọn:- <,INTENT(OUT)> : không sử dụng giá trị của tham biến trong CTC.- <,INTENT(INOUT)>: sử dụng giá trị của tham biến cho các phép tính trong CTC.
Ví dụ: SUBROUTINE exam(ts1,ts2,ts3)REAL,INTENT(IN) :: ts1INTEGER, INTENT(OUT) :: ts2REAL, INTENT(INOUT) :: ts3
Đối số
Biến cục bộ và biến toàn cụcBiến cục bộ là các biến số chỉ được sử dụng trong một chương trình con nào đó.- Được khởi tạo ngay khi chương trình con bắt đầu thực hiện. -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.-Giải phóng ra khỏi bộ nhớ khi chương trình con kết thúc, 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) :: ts1INTEGER, INTENT(OUT) :: ts2REAL, INTENT(INOUT) :: ts3REAL r