fortran cơ sở

46
Ngôn ngữ lập trình FORTRAN GV: Hoàng Đỗ Ngọc Trầm

Upload: hajunior9x

Post on 26-Jun-2015

393 views

Category:

Education


18 download

TRANSCRIPT

Page 1: Fortran cơ sở

Ngôn ngữ lập trình

FORTRAN

GV: Hoàng Đỗ Ngọc Trầm

Page 2: Fortran cơ sở

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

Page 3: Fortran cơ sở
Page 4: Fortran cơ sở

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)

Page 5: Fortran cơ sở

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

Page 6: Fortran cơ sở

* 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)

Page 7: Fortran cơ sở
Page 8: Fortran cơ sở

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’

Page 9: Fortran cơ sở

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.

Page 10: Fortran cơ sở

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

Page 11: Fortran cơ sở

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’)

Page 12: Fortran cơ sở

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

Page 13: Fortran cơ sở

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

Page 14: Fortran cơ sở

Câu lệnh điều kiện IF-THEN- ELSE

Page 15: Fortran cơ sở

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

Page 16: Fortran cơ sở

Kiểm tra điều kiện khác không, bằng không?

IF (x==0) THEN …

IF (abs(x)<.0000001) THEN …

Page 17: Fortran cơ sở

Vòng lặp DO

Page 18: Fortran cơ sở

Vòng lặp DO

Page 19: Fortran cơ sở

Vòng lặp DO

Page 20: Fortran cơ sở

Vòng lặp DO

Page 21: Fortran cơ sở

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

Page 22: Fortran cơ sở

Vòng lặp DO

Page 23: Fortran cơ sở

Vòng lặp DO

Page 24: Fortran cơ sở

Vòng lặp DO

Page 25: Fortran cơ sở

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

Page 26: Fortran cơ sở

Vòng lặp DO

Bài tập

Page 27: Fortran cơ sở

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.

Page 28: Fortran cơ sở
Page 29: Fortran cơ sở

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ị>]

Page 30: Fortran cơ sở

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.

Page 31: Fortran cơ sở
Page 32: Fortran cơ sở
Page 33: Fortran cơ sở

Mảng động

Xem alloc.f95, p.29 manual

Page 34: Fortran cơ sở

Mảng

Page 35: Fortran cơ sở
Page 36: Fortran cơ sở

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)

Page 37: Fortran cơ sở

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

Page 38: Fortran cơ sở

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

Page 39: Fortran cơ sở

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

Page 40: Fortran cơ sở

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

Page 41: Fortran cơ sở

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

Page 42: Fortran cơ sở

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

Page 43: Fortran cơ sở
Page 44: Fortran cơ sở

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ụ

Page 45: Fortran cơ sở

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ố

Page 46: Fortran cơ 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