Tin học cơ sở - Chương 3: Tóm lược một số ngôn ngữ lập trình

IV. Chương trình con  Thực hiện một số đoạn mã chương trình nào đó.  Fortran 90 có hai loại chương trình con:  SUBROUTINE Kết quả được trả lại trên các đối số của chương trình con. Sử dung lệnh CALL để gọi đến chương trình con.  FUNCTION Tương tự như nhưng kết quả được trả lại trên tên của chương trình. Tên hàm được đặt trong các biểu thức bên vế phải của phép gán.  Khi nào thì sử dụng chương trình con?  Loại chương trình con cần viết là SUBROUTINE hay FUNCTION ?  Số các đối số càng ít càng tốt

pdf46 trang | Chia sẻ: nguyenlam99 | Lượt xem: 880 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Tin học cơ sở - Chương 3: Tóm lược một số ngôn ngữ lập trình, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Ngo Van Thanh, IOP 11/2011 Chương 3: Tóm lược một 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 :  So sánh tốc độ tính toán:  Tính toán song song (MPI) functionality F90 F77 C++ C Tính toán số 1 2 3 4 Tính toán dữ liệu song song 1 3 3 3 Dữ liệu trừu tượng 1 4 2 3 Lập trình hướng đối tượng 2 4 1 3 Lập trình hàm 1 4 2 3 Trung bình 1.2 3.4 2.2 3.2 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 3 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 và 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 1 hoặc 2 dấu cách (space).  Tên của các chương trình con nên viết đầy đủ sau câu lệnh END.  Từ khoá cho các đối số là 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 trên mỗi dòng : 132 ký tự.  Chú thích : ‘!’  Nỗi các dòng lệnh: `&'  Phân cách giữa các 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 3 sides.' height=a*SIN(theta); Area=0.5*b*height Mã nguồn kiểu cố định (F77)  Chú thích : ‘!’ hoặc ‘c’ tại cột đầu tiên.  Nhãn lệnh được đặt từ cột thứ 2 đến cột thứ 5  Nỗi các dòng lệnh: `&' tại cột thứ 6.  Độ dài tối da trên mỗi dòng : 72 ký tự; câu lệnh bắt đầu từ cột thứ 7 Tập ký tự:  Chữ và 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 cả mọi ký tự phía sau dấu “!” đều là phần chú 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 trong chuỗi ký tự đặt giữa dẫu “ ” hoặc ‘ ’ không phải là chú thích PRINT*, “Thank you for your attention!!!” Tên (biến, hằng số, hàm số)  Bắt đầu phải là một ký tự (a-z).  Chỉ được sử dụng các chữ, số, dấu gạch dưới.  Độ dài tối đa là 32. REAL :: 1x ! Not valid CHARACTER(LEN=8) :: user_name ! Valid name CHARACTER(LEN=8) :: user name ! Not valid  I.2. Đối tượng dữ 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ố và kiểu logic  Syntax: [,] :: [=] [] : tuỳ chọn : các kiểu như : REAL, INTEGER, LOGICAL, CHARACTER : thuộc tính như : PARAMETER, SAVE, INTENT, POINTER, DIMENSION = : Giá trị ban đầu của 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 hằng số  Syntax: ,PARAMETER :: = REAL, PARAMETER :: pi = 3.1416 INTEGER, PARAMETER :: N = 100, D = 3  I.3. Biểu thức toán và phép gán Các biểu thức  2.0*pi*radius ! Numeric valued  “Ngo Van ”//name ! Character valued (where variable name =“Thanh”)  width .GT. height ! Logical valued Phép gán : =  Gán giá trị của các biểu thức bên vế phải cho đối tượng bên vế trái. a = b theta=ACOS((a**2+b**2-c**2)/(2.0*a*b)) full_name = first_name//last_name square = (a.EQ.b) Toán tử số học  ** : luỹ thừa ex.: volume = (4*pi*r**3)/3  * và / : nhân và chia ex.: area = (a*h)/2  + và - : cọng và trừ ex.: a = b-c  Ví dụ: PROGRAM Area_of_Circle IMPLICIT NONE REAL, PARAMETER :: pi = 3.14159 REAL :: r, area ! PRINT*, ‘please enter the radius’ READ*, r area = pi*r**2 PRINT*,’Circle''s area: ‘, area END PROGRAM Area_of_Circle Exercise: write a program for calculating the volume of a sphere Toán tử quan hệ  Kết quả là giá trị logic đúng hoặc sai: .TRUE. or .FALSE. Toán từ logic  .NOT. : Cho giá trị phủ định của biểu thức.  .AND. : Cho giá trị .TRUE. nếu cả hai vế đều .TRUE.  .OR. : Cho giá trị .TRUE. nếu một trong hai hai vế có giá trị .TRUE.  .EQV. : .TRUE. Nếu hai vế giống nhau.  .NEQV. : .TRUE. Nếu hai vế khác nhau. Letter Symbol Description .GT. > greater than .GE. >= greater than or equal to .LE. <= less than or equal to .LT. < less than .NE. /= not equal to .EQ. == equal to  II.1. Câu lệnh điều khiển  Lệnh rẽ nhánh. IF statements IF THEN ELSEIF ELSE ENDIF  Lệnh lặp DO ENDDO  Lệnh lựa chọn SELECT CASE  Nhảy không điều kiện GOTO IF Statement:  The basic form: IF ()  Nếu là .TRUE. thì thực hiện  Ex: IF (x > y) value = y IF(I/=0 .AND. J.NE.0) r = a/(i*j)  Sơ đồ khối IF (I > 12) PRINT*, “I > 12” !next statement IF có cấu trúc:  Dạng đơn giản: IF () THEN ENDIF  Ex: IF (I > 12) THEN PRINT*, “I > 12” END IF  Sơ đồ khối IF (I > 12) THEN PRINT*, “I > 12” ENDIF  IF có thêm lệnh rẽ nhãnh ELSE : IF () THEN ELSE ENDIF  Ex: IF (I > 12) THEN PRINT*, “I > 12” ELSE PRINT*, “I <= 12” END IF IF (I > 12) THEN PRINT*,“I <= 12” ENDIF PRINT*, “I > 12”  IF có thêm rẽ nhãnh kiểu ELSEIF : IF () THEN ELSEIF () THEN ELSE ENDIF  Ex: IF (I > 12) THEN PRINT*, “I > 12” ELSEIF(I==12) THEN PRINT*, “I = 12” ELSE PRINT*, “I < 12” END IF IF (I > 12) THEN ELSEIF(I==12) THEN ENDIF PRINT*, “I > 12” PRINT*, “I < 12” PRINT*, “I = 12” I = 12 Vòng lặp DO :  Số vòng lặp xác định:  Ex: DO I=1,100 PRINT*, I ! i is 1, 2, 100; 100 iterations ENDDO  Syntax: DO =,,[,] ENDDO DO WHILE Loops:  Vòng lặp không xác định:  Ex: DO WHILE (a == b) ENDDO  SELECT CASE Construct: SELECT CASE (I) CASE(1); PRINT*, “I == 1” CASE(2:9); PRINT*, “I >= 2 and I <= 9” CASE(10:); PRINT*, “I >= 10” CASE DEFAULT; PRINT*, “I <= 0” END SELECT CASE SELECT CASE(I) PRINT*, “I == 1” PRINT*, “I >= 2 and I <= 9” PRINT*, “I >= 10” PRINT*, “I <= 0” END SELECT CASE CASE(1) CASE(2:9) CASE(10:) CASE DEFAULT  II.2. Chương trình con có sẵn  F90 có 113 chương trình con có sẵn. Hàm chuyển đổi kiểu dữ liệu và các hàm toán học  REAL(I)  INT(x)  NINT(x)  DBLE(a) SIN(x) ASIN(x) SISH(x) COS(x) ACOS(x) COSH(x) TAN(x) ATAN(x) TANH(x) ATAN2(y,x) EXP(x) LOG(x) LOG10(x) SQRT(x) sine where x is in radians arcsine hyperbolic sine where x is in radians cosine where x is in radians arccosine hyperbolic cosine where x is in radians tangent where x is in radians arctangent hyperbolic tangent where x is in radians arctangent of complex number (x, y) e raised to the power x natural logarithm of x logarithm base 10 of x the square root of x  II.3. Vào ra dữ liệu PRINT Statement: PROGRAM Outie CHARACTER(LEN=*), PARAMETER long_name = “Llanfairphwyll...gogogoch” REAL :: x, y, z LOGICAL :: lacigol x = 1; y = 2; z = 3 lacigol = (y .EQ. x) ! .TRUE. PRINT*, long_name ! Llanfairphwyll...gogogoch PRINT*, "Spock says ""illogical& ! Spock says “illogical Captain” &Captain"" " PRINT*, “x = ”, x , “y = ”, y, “z = ”, z ! x = 1.000 y = 2.000 z = 3.000 PRINT*, “Logical val: ”, lacigol ! x = Logical val: F END PROGRAM Outie READ Statement:  The simplest form of reading unformatted data from the standard input channel READ*, long_name ! Llanfairphwyll...gogogoch READ*, x, y, z ! 1.000 2.000 3.000 READ*, lacigol ! F  III.1 Mảng  Mảng có cấu trúc tương tự như ma trận.  Mảng 1 chiều có 15 phần tử  Mảng 2 chiều có kích thước là 4  5 1 2 3 13 14 15 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 D im e n si o n 1 Dimension 2 Các thuật ngữ trong mảng  Ví dụ: REAL*, DIMENSION(15) :: X REAL*, DIMENSION(1:5, 1:3) :: Y, Z  Nếu cận dưới của mảng không khai báo thì sẽ lấy giá trị ngầm định là 1  Thuật ngữ:  rank : Số chiều của mảng. X có rank 1, Y và Z có rank 2.  bounds : giới hạn trên và giới hạn dưới của mảng X giới hạn dưới là 1 giới hạn trên là 15, Y và Z ???  extent : Số phần từ trong mỗi chiều X có extent là 15, Y và Z có extents 5 và 3.  size : tổng số phần từ của mảng.  shape : rank và extents, X có shape (/15/) Y và Z có shape (/5, 3/).  conformable : Hai mảng là conformable nếu chúng có shape giống nhau. X và Y ???; Y và Z ???. Khai báo  Ví dụ về khai báo mảng: REAL, DIMENSION(100) :: R REAL, DIMENSION(1:10,1:10) :: S REAL :: T(10,10) REAL, DIMENSION(-10:-1) :: X INTEGER, PARAMETER :: lda = 5 REAL, DIMENSION(lda) :: Y REAL, DIMENSION(1+lda*lda,10):: Z REAL, DIMENSION(0:10:2):: A  bounds có thể bắt đầu bởi bất kỳ số nào; giá trị ngầm định của biên dưới là 1  T : là dạng khái báo ngắn gọn Câu hỏi: INTEGER :: i = 3, j = 7 REAL, DIMENSION(1:20) :: A Tham chiếu mảng nào dưới đây là đúng? A(12) A(21) A(I) A(3.0) A(i*j) Biểu diễn mảng  Ví dụ: REAL, DIMENSION(15) :: A REAL, DIMENSION(-4:0,0:2) :: B REAL, DIMENSION(5,3) :: C REAL, DIMENSION(0:4,0:2) :: D A(1) A(2) A(3) A(13) A(14) A(15) B(-4,0) C(1,1) D(0,0) B(0,0) C(5,1) D(4,0) B(-4,2) C(1,3) D(0,2) B(0,2) C(5,3) D(4,2) Thứ tự các phần tử trong mảng  Không phụ thuộc vào thứ tự chỉ số mảng. A(1,1), A(2,1), A(4,1), A(2,1), A(2,2), , A(3,4), A(4,4)  Tính toán trên toàn mảng  A = 0.0 Các phần tử mảng được gán đồng thời.  B = C + D Các mảng ở vế trái và vế phải đều là mảng đồng bộ.  Cách viết khác: B(:) = C(:) + D(:) 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  Thao tác trên từng phần tử của mảng  A(1) = 0.0  B(0,0) = A(3) + C(5,1)  Mảng con  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:14) Trường hợp thứ nhất: A(i) = A(i) + A(i-1)+ + A(2) + A(1) Trường hợp thứ hai: A(i) = A(i) + A(i-1) Mảng động  Mảng có số chiều xác định nhưng số các phần tử trong mỗi chiều là không xác định.  Khai báo:  Thuộc tính ALLOCATABLE : INTEGER, DIMENSION(:), ALLOCATABLE :: ages INTEGER, DIMENSION(:,:), ALLOCATABLE :: speed  Khởi tạo biến mảng động, sử dụng câu lệnh ALLOCATE ALLOCATE(ages(1:10),STAT=ierr) IF (ierr /= 0) THEN PRINT*, “ages Allocation request denied” ENDIF  Có thể khai báo nhiều mảng cùng một lúc: ALLOCATE(A(1:20),B(0:4,1:5)) Giải phóng bộ nhớ các mảng động: DEALLOCATE(ages)  Câu lệnh kiểm tra: ALLOCATED IF (ALLOCATED(ages)) DEALLOCATE(ages, STAT=ierr) Ví dụ: PROGRAM sort_any_number INTEGER, DIMENSION(:), ALLOCATABLE :: nums INTEGER :: temp, I, K, n_to_sort, ierr ! PRINT*, ‘How many numbers to sort’ READ*, n_to_sort ALLOCATE( nums(n_to_sort), STAT=ierr) IF (ierr .NE. 0) THEN PRINT*, ‘nums: Allocation request denied’ STOP ! halts execution END IF PRINT*, ‘Type in ‘,n_to_sort, ‘ values one line at a time’ DO I = 1,n_to_sort READ*, nums(I) END DO DO I = 1, n_to_sort-1 DO K = I+1, n_to_sort IF(nums(I) > nums(K)) THEN temp = nums(K) ! Store in temporary location nums(K) = nums(I) ! Swap the contents over nums(I) = temp END IF END DO END DO DO I = 1,n_to_sort PRINT*, ‘Rank’, I, ‘value is ‘ , nums(I) END DO IF (ALLOCATED(nums)) DEALLOCATE(nums,STAT=ierr) END PROGRAM sort_any_number  IV. Chương trình con  Thực hiện một số đoạn mã chương trình nào đó.  Fortran 90 có hai loại chương trình con:  SUBROUTINE Kết quả được trả lại trên các đối số của chương trình con. Sử dung lệnh CALL để gọi đến chương trình con.  FUNCTION Tương tự như nhưng kết quả được trả lại trên tên của chương trình. Tên hàm được đặt trong các biểu thức bên vế phải của phép gán.  Khi nào thì sử dụng chương trình con?  Loại chương trình con cần viết là SUBROUTINE hay FUNCTION ?  Số các đối số càng ít càng tốt. Thân chương trình chính  Tất cả các chương trình đều 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) ! FUNCTION F(x,y) REAL, INTENT(IN) x,y ! REAL :: F F = sqrt(x**+y**) END FUNCTION F END PROGRAM Thingy Sự liên hợp đối số CALL PrintOut(nums) SUBROUTINE PrintOut(numbers)  Biến “nums” được gọi là đối số thực (actual argument).  Biến “numbers” là đố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 và b tương ứng với y. Giá trị của đối số thực sẽ thay đổi nếu như đối số hình thức bị thay đổi trong chương trình con. Số lượng đối số thực và đối số hình thức phải như nhau Kiểu của mỗi đối số thực và đối số hình thức cũng phải phù hợp với nhau. Biến địa phương SUBROUTINE Madras(i, j) INTEGER, INTENT(IN) :: i, j REAL :: a REAL, DIMENSION(i,j) :: x  a và x là các biến địa phương. Chúng được khởi tạo mỗi khi chương trình con được gọi đến. Khi chương trình con kết thúc thì các biến địa phương sẽ tự động được xoá bỏ.  Mảng x có kích thước khác nhau trong mỗi lần gọi chương trình con nếu như đối số i và j thay đổi.  Thuộc tính INTENT INTENT(IN) : Chỉ được tham chiếu trong chương trình con INTENT(OUT) : Chỉ được phép sử dụng sau khi được gán giá trị. INTENT(INOUT) : Cho phép tham chiếu và 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 toàn cục  Xét ví dụ PROGRAM CalculatePay IMPLICIT NONE REAL :: Pay, Tax, Delta INTEGER :: NumberCalcsDone = 0 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 + 1 END SUBROUTINE PrintPay ! REAL FUNCTION NewTax(Tax, Delta) REAL, INTENT(IN) :: Tax, Delta NewTax = Tax Delta*Tax NumberCalcsDone = NumberCalcsDone + 1 END FUNCTION NewTax END PROGRAM CalculatePay  NumberCalcsDone là biến toàn cục Phạm vi tác dụng của 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 = 0 NumInvocation = NumInvocation + 1 END SUBROUTINE Barmy  NumInvocation được giữ lại giá trị của nó và có thể sử dụng cho lần gọi tiếp theo. SUBROUTINE polo(x,y) IMPLICIT NONE INTEGER :: mint, neck_jumper SAVE REAL :: stick, car END SUBROUTINE polo  SAVE : nằm riêng trên một dòng.  Tất cả các biến địa phương trong chương trình con đều có thuộc tính SAVE: mint, neck_jumper và stick, car.  Thuộc tính SAVE không có ý nghĩa trong chương trình chí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 = 1 END IF END FUNCTION fact END PROGRAM Mayne  Chương trình tính giai thừa  Ví dụ 4!: 4! bằng 4  3! 3! bằng 3  2! 2! bằng 2  1! 1! bằng 1  0! 0! = 1 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 = 1 END IF END SUBROUTINE fact END PROGRAM Mayne  Ví dụ 4!: 4! bằng 4  3! 3! bằng 3  2! 2! bằng 2  1! 1! bằng 1  0! 0! = 1

Các file đính kèm theo tài liệu này:

  • pdfbai_giang_p1_03_5641.pdf
Tài liệu liên quan