Bài giảng Tin học (Phần 1: Tin học cơ sở)(cao học Vật lý): Chương 3 - TS. Ngô Văn Thanh

46 51 0
Bài giảng Tin học (Phần 1: Tin học cơ sở)(cao học Vật lý): Chương 3 - TS. Ngô Văn Thanh

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài giảng Tin học (Phần 1: Tin học cơ sở) - Chương 3: Tóm lược một số ngôn ngữ lập trình cung cấp cho người đọc các kiến thức: Ngôn ngữ lập trình Fortran, ngôn ngữ lập trình C/C++. Mời các bạn cùng tham khảo nội dung chi tiết.

Ngo Van Thanh, IOP 11/2011 Chương 3: Tóm lược số ngơn ngữ lập trình (LT: 5, TH:5)  Ngơn ngữ lập trình Fortran  Ngơn ngữ lập trình C/C++ 3.1 Ngơn ngữ lập trình Fortran  Tham khảo : http://www.liv.ac.uk/HPC/F90page.html http://iop.vast.ac.vn/~nvthanh/cours/fortran/  So sánh tốc độ tính tốn: functionality F90 F77 C++ C Tính tốn số Tính tốn liệu song song 3 Dữ liệu trừu tượng Lập trình hướng đối tượng Lập trình hàm 1.2 3.4 2.2 3.2 Trung bình  Tính tốn song song (MPI) Compiler Time (sec) F90 1339.91 F77 1550.14 C++ 2797.00  Ví dụ: MODULE Triangle_Operations IMPLICIT NONE CONTAINS FUNCTION Area(a,b,c) REAL :: Area ! function type REAL, INTENT(IN) :: a, b, c REAL :: theta, height theta=ACOS((a**2+b**2-c**2)/(2.0*a*b)) height=a*SIN(theta); Area=0.5*b*height END FUNCTION Area END MODULE Triangle_Operations ! PROGRAM Triangle USE Triangle_Operations IMPLICIT NONE REAL :: x, y, z PRINT*, 'Welcome, please enter the& & lengths of the sides.' READ*, x, y, z PRINT*,'Triangle''s area: ',Area(x,y,z) END PROGRAM Triangle I.1 Lập trình Fortran 90 Kiểu mã nguồn:    Không phân biệt chữ hoa chữ thường Để dễ đọc chương trình nguồn :  Luôn sử dụng câu lện: IMPLICIT NONE   Từ khoá, tên hàm… nên viết hoa Các khối câu lệnh nên viết lùi vào dấu cách (space) Tên chương trình nên viết đầy đủ sau câu lệnh END  Từ khoá cho đối số tuỳ chọn  FUNCTION Area(a,b,c) REAL :: Area ! function type REAL, INTENT(IN) :: a, b, c REAL :: theta, height theta=ACOS((a**2+b**2-c**2)/(2.0*a*b)) height=a*SIN(theta); Area=0.5*b*height END FUNCTION Area Mã nguồn kiểu tự do: Độ dài tối da dòng : 132 ký tự  Chú thích : ‘!’  Nỗi dòng lệnh: `&'  Phân cách câu lệnh : ‘;’ theta=ACOS((a**2+b**2-c**2) & /(2.0*a*b)) ! Angle \theta PRINT*, 'Welcome, please enter the& & lengths of the sides.'  height=a*SIN(theta); Area=0.5*b*height Mã nguồn kiểu cố định (F77)     Chú thích : ‘!’ ‘c’ cột Nhãn lệnh đặt từ cột thứ đến cột thứ Nỗi dòng lệnh: `&' cột thứ Độ dài tối da dòng : 72 ký tự; câu lệnh cột thứ Tập ký tự: Chữ số:    a-z, A-Z, 0-9 and _ Các ký hiệu Symbol Description Symbol Description space = Equal + Plus > Greater than - Minus < Less than * Asterisk ( Left paren / Slash ) Right paren Period & Ampersand , Comma % Percent ‘ Single quote ! Shriek “ Double quote ? Question mark : Colon $ Dolla ; semicolon Chú thích:  Tất ký tự phía sau dấu “!” phần thích ! ! Function to calculate the area of a triangle ! FUNCTION Area(a,b,c) REAL, INTENT(IN) :: a, b, c ! Three side of the triangle  Dâu “!” nằm chuỗi ký tự đặt “ ” ‘ ’ khơng phải thích PRINT*, “Thank you for your attention!!!” Tên (biến, số, hàm số…)    Bắt đầu phải ký tự (a-z) Chỉ sử dụng chữ, số, dấu gạch Độ dài tối đa 32 REAL :: 1x ! Not valid CHARACTER(LEN=8) :: user_name ! Valid name CHARACTER(LEN=8) :: user name ! Not valid I.2 Đối tượng liệu: Kiểu có sẵn (kiểu trong)     Character: CHARACTER Boolean : LOGICAL Numeric : REAL (and DOUBLE PRECISION) INTEGER COMPLEX CHARACTER(LEN=20) :: fullname ! String LOGICAL :: mathematician = TRUE ! Boolean : TRUE or FALSE REAL :: area ! Real DOUBLE PRECISION :: length ! Double precision REAL*8 :: length ! Double precision INTEGER :: index ! Integer COMPLEX :: comp_num ! x + iy Khai báo kiểu số kiểu logic  Syntax: [,] :: [=] […] : tuỳ chọn : kiểu : REAL, INTEGER, LOGICAL, CHARACTER : thuộc tính : PARAMETER, SAVE, INTENT, POINTER, DIMENSION = : Giá trị ban đầu biến số REAL :: a, b, c INTEGER :: i, j, k REAL, DIMENSION(3) :: coords DOUBLE PRECISION :: total REAL, DIMENSION(0:9,0:9) :: latt2d, latt1d(14) LOGICAL :: well_done, in_circle Khai báo số  Syntax: ,PARAMETER :: = REAL, PARAMETER :: pi = 3.1416 INTEGER, PARAMETER :: N = 100, D = Thân chương trình  Tất chương trình phải có cấu trúc chương trình chính: [ PROGRAM []] … … … [CONTAINS END [PROGRAM []  Main Program example PROGRAM Main IMPLICIT NONE REAL x INTRINSIC FLOOR !biggest INTEGER less than or equal to REAL number READ*, x PRINT*, FLOOR(x) PRINT*, Negative(x) CONTAINS REAL FUNCTION Negative(a) REAL, INTENT(IN) :: a Negative(a) = -a END FUNTION Negative END PROGRAM Main Subroutines SUBROUTINE [()] … END [SUBROUTINE []]  Ví dụ PROGRAM Thingy IMPLICIT NONE … CALL PrintOut(nums) … CONTAINS SUBROUTINE PrintOut(numbers) REAL, DIMENSION(:), INTENT(IN) :: numbers PRINT*, ‘Here are the numbers ‘, numbers END SUBROUTINE PrintOut END PROGRAM Thingy Functions [] FUNCTION [()] … END [FUNCTION []]  Ví dụ PROGRAM Thingy IMPLICIT NONE … PRINT*, F(a,b) … CONTAINS REAL, FUNCTION F(x,y) REAL, INTENT(IN) x,y F = sqrt(x**+y**) END FUNCTION F END PROGRAM Thingy ! FUNCTION F(x,y) ! REAL :: F Sự liên hợp đối số CALL PrintOut(nums) SUBROUTINE PrintOut(numbers)  Biến “nums” gọi đối số thực (actual argument)  Biến “numbers” đối số hình thức (dummy argument ) Xét:  PRINT*, F(a,b) FUNCTION F(x,y)  a tương ứng với x b tương ứng với y Giá trị đối số thực thay đổi đối số hình thức bị thay đổi chương trình Số lượng đối số thực đối số hình thức phải Kiểu đối số thực đối số hình thức phải phù hợp với Biến địa phương SUBROUTINE Madras(i, j) INTEGER, INTENT(IN) :: i, j REAL :: a REAL, DIMENSION(i,j) :: x  a x biến địa phương Chúng khởi tạo chương trình gọi đến Khi chương trình kết thúc biến địa phương tự động xoá bỏ   Mảng x có kích thước khác lần gọi chương trình đối số i j thay đổi Thuộc tính INTENT INTENT(IN) : Chỉ tham chiếu chương trình INTENT(OUT) : Chỉ phép sử dụng sau gán giá trị INTENT(INOUT) : Cho phép tham chiếu gán giá trị SUBROUTINE example(arg1,arg2,arg3) REAL, INTENT(IN) :: arg1 INTEGER, INTENT(OUT) :: arg2 CHARACTER, INTENT(INOUT) :: arg3 REAL r ! r = arg1*ICHAR(arg3) ! arg1 is unchanged within the procedure, arg3 is used arg2 = AINT(r) ! value of arg2 is not used until it has been assigned to arg3 = CHAR(MOD(127,arg2)) ! arg3 is re-assigned a value END SUBROUTINE example Biến tồn cục Xét ví dụ  PROGRAM CalculatePay IMPLICIT NONE REAL :: Pay, Tax, Delta INTEGER :: NumberCalcsDone = Pay = … ; Tax = … ; Delta = … CALL PrintPay(Pay, Tax) Tax = NewTax(Tax, Delta) … CONTAINS SUBROUTINE PrintPay(Pay, Tax) REAL, INTENT(IN) :: Pay, Tax REAL :: TaxPaid TaxPaid = Pay*Tax PRINT*, TaxPaid NumberCalcsDone = NumberCalcsDone + END SUBROUTINE PrintPay ! REAL FUNCTION NewTax(Tax, Delta) REAL, INTENT(IN) :: Tax, Delta NewTax = Tax Delta*Tax NumberCalcsDone = NumberCalcsDone + END FUNCTION NewTax END PROGRAM CalculatePay  NumberCalcsDone biến toàn cục Phạm vi tác dụng tên biến  Xét ví dụ PROGRAM Proggie IMPLICIT NONE REAL :: A, B, C ! CALL SUB(A) CONTAINS SUBROUTINE Sub(D) REAL :: D REAL :: C ! C = A**3 D = D**3 + C B = C END SUBROUTINE Sub END PROGRAM Proggie Thuộc tính SAVE SUBROUTINE Barmy(arg1,arg2) INTEGER, SAVE :: NumInvocation = NumInvocation = NumInvocation + END SUBROUTINE Barmy  NumInvocation giữ lại giá trị sử dụng cho lần gọi SUBROUTINE polo(x,y) IMPLICIT NONE INTEGER :: mint, neck_jumper SAVE REAL :: stick, car END SUBROUTINE polo  SAVE : nằm riêng dòng  Tất biến địa phương chương trình có thuộc tính SAVE: mint, neck_jumper stick, car Thuộc tính SAVE khơng có ý nghĩa chương trình  Đối số mảng  Mảng có shape tường minh INTEGER, DIMENSION(8,8), INTENT(IN) :: explicit_shape PROGRAM Main IMPLICIT NONE INTEGER, DIMENSION(8,8) :: A1 INTEGER, DIMENSION(64) :: A2 INTEGER, DIMENSION(16,32) :: A3 CALL subby(A1) CALL subby(A2) ! non conforming CALL subby(A3(::2,::4)) CALL subby(RESHAPE(A2, (/8,8/))) CONTAINS SUBROUTINE subby(explicit_shape) INTEGER, DIMENSION(8,8) :: explicit_shape … END SUBROUTINE subby END PROGRAM Main  Mảng có shape giả định (assumed-shape) PROGRAM Main IMPLICIT NONE REAL, DIMENSION(40) :: X REAL, DIMENSION(40,40) :: Y CALL gimlet(X,Y) CALL gimlet(X(1:39:2),Y(2:4,4:4)) CALL gimlet(X(1:39:2),Y(2:4,4)) ! Invalid, Y is 1D array CONTAINS SUBROUTINE gimlet(a, b) REAL, INTENT(IN) :: a(:), b(:,:) … END SUBROUTINE gimlet END PROGRAM Main  Mảng tự động PROGRAM Main IMPLICIT NONE INTEGER,DIEMSION(10,10) :: IX, IY CALL Use_Bus_Riot(IX,2,3) CALL Use_Bus_Riot(IX,7,2) CONTAINS SUBROUTINE Use_Bus_Riot(A, M, N) INTEGER,INTENT(IN) :: M,N INTEGER,INTENT(INOUT) :: A(:,:) REAL :: A1(M,N) ! automatic REAL :: A2(SIZE(A1,1),SIZE(A,2)) ! ditto REAL :: A3(A(1,1),A(1,1)) ! automatic … END SUBROUTINE Use_Bus_Riot END PROGRAM Main  Hàm kiểu mảng PROGRAM proggie IMPLICIT NONE INTEGER, PARAMETER :: m =6 INTEGER, DIMENSION(M,M) :: im1,im2 IM2 = funnie(im1,1) CONTAINS FUNCTION funnie(ima,scal) INTEGER, INTENT(IN) :: ima(:,:) INTEGER, INTENT(IN) :: scal … INTEGER :: funnie(SIZE(ima,1),SIZE(ima,2)) funnie(:,:) = ima(:,:)*scal … END FUNCTION funnie END PROGRAM proggie Hàm đệ quy (Recursive Function) PROGRAM Mayne IMPLICIT NONE … PRINT*, fact(12) CONTAINS RECURSIVE FUNCTION fact(N) RESULT(N_fact) INTEGER, INTENT(IN) :: N INTEGER :: N_Fact IF(N > 0) THEN N_Fact = N*fact(N-1) ELSE N_Fact = END IF END FUNCTION fact END PROGRAM Mayne   Chương trình tính giai thừa Ví dụ 4!: 4! 3! 2! 1! 0! = bằng bằng  3!  2!  1!  0! Thủ tục đệ quy (Recursive Subroutine) PROGRAM Mayne IMPLICIT NONE … CONTAINS RECURSIVE SUBROUTINE Factorial(N,Result) INTEGER, INTENT(IN) :: N INTEGER, INTENT(INOUT) :: Result IF(N > 0) THEN CALL Factorial(N-1,Result) ELSE Result = END IF END SUBROUTINE fact END PROGRAM Mayne  Ví dụ 4!: 4! 3! 2! 1! 0! = bằng bằng  3!  2!  1!  0! ... ma trận  Mảng chiều có 15 phần tử  … 13 Mảng chiều có kích thước  Dimension  1,1 1,2 1 ,3 1,4 1,5 2,1 2,2 2 ,3 2,4 2,5 3, 1 3, 2 3, 3 3, 4 3, 5 4,1 4,2 4 ,3 4,4 4,5 Dimension 14 15 Các thuật ngữ... Không phụ thuộc vào thứ tự số mảng  1,1 1,2 1 ,3 1,4 2,1 2,2 2 ,3 2,4 3, 1 3, 2 3, 3 3, 4 4,1 4,2 4 ,3 4,4 A(1,1), A(2,1), … A(4,1), A(2,1), A(2,2),… , A (3, 4), A(4,4) Tính tốn toàn mảng   A = 0.0 ... B(0,0) = A (3) + C(5,1) A(2:4) = 0.0 B( -1 :0 ,1:2 ) = C (1:2 ,2 :3) + 1.0 Ví dụ DO i = 2, 15 A(i) = A(i) + A(i-1) ENDDO So sánh với: A(2:15) = A(2:15) + A (1:1 4) Trường hợp thứ nhất: A(i) = A(i) + A(i-1)+

Ngày đăng: 30/01/2020, 14:34