Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεΘέκλα Καλαμογδάρτης Τροποποιήθηκε πριν 9 χρόνια
1
Αναδρομικές Συναρτήσεις Σύνταξη: RECURSIVE type FUNCTION name1 (variables) RESULT (name2) IMPLICIT NONE Τμήμα δηλώσεων Εκτελέσιμες εντολές END FUNCTION name ΠΡΟΣΟΧΗ! Στο name2 τοποθετείται η τιμή που επιστρέφει η συνάρτηση και δεν εμφανίζεται ποτέ δεξιά σε μια παράσταση που βρίσκεται στις εκτελέσιμες εντολές της συνάρτησης. Εκεί μπορεί να βρίσκεται μόνο το name1.
2
Παράδειγμα 1 Να υπολογιστεί το παραγοντικό ενός ακεραίου αριθμού Ν, με την βοήθεια αναδρομικής συνάρτησης, γνωρίζοντας ότι :
3
PROGRAM RECFUNCTIONS1 IMPLICIT NONE INTEGER N 10 READ*, N IF (N<0) THEN PRINT*, ‘ERROR’ GOTO 10 END IF PRINT*,FACTORIAL(N) CONTAINS RECURSIVE INTEGER FUNCTION FACTORIAL(N) RESULT(FACT) IMPLICIT NONE INTEGER, INTENT(IN) :: N
4
IF (N==0) THEN FACT=1 ELSE FACT=N*FACTORIAL(N-1) END IF END FUNCTION FACTORIAL END PROGRAM RECFUNCTIONS1 Παράδειγμα 2 Να υπολογιστεί ο μέγιστος κοινός διαιρέτης δύο ακεραίων αριθμών α,β χρησιμοποιώντας τον αναδρομικό τύπο:
5
Η παραπάνω διαδικασία θα πρέπει να επαναληφθεί ένα πλήθος φορών που δεν γνωρίζουμε, έως ότου οι α,β να γίνουν ίσοι.
6
PROGRAM RECFUNCTIONS2 IMPLICIT NONE INTEGER :: A,B PRINT*,'A,B=' READ*,A,B PRINT*,MKD(A,B)
7
CONTAINS RECURSIVE INTEGER FUNCTION MKD(A,B) RESULT(MKDF) IMPLICIT NONE INTEGER, INTENT(IN) :: A,B IF (A==B) THEN MKDF=A ELSE IF (A>B) THEN MKDF=MKD(A-B,B) ELSE MKDF=MKD(A,B-A) END IF END FUNCTION MKD END PROGRAM RECFUNCTIONS2
8
Παράδειγμα 3 Να γράψετε πρόγραμμα το οποίο με την βοήθεια αναδρομικής συνάρτησης θα υπολογίζει τον n-οστό όρο της ακολουθίας x n =2 x n-1 +3 x n-2, n>2 x 1 =4, x 2 =5.
9
PROGRAM RECFUNCTIONS3 IMPLICIT NONE INTEGER N 10 READ*, N IF (N<=0) THEN PRINT*, ‘ERROR’ GOTO 10 END IF PRINT*, ‘O ‘,N,’-OSTOS OROS EINAI’, & SEQUENCE(N)
10
CONTAINS RECURSIVE INTEGER FUNCTION SEQUENCE(N) RESULT(SEQ) IMPLICIT NONE INTEGER, INTENT(IN)::N IF (N==1) THEN SEQ=4 ELSE IF (N==2) THEN SEQ=5 ELSE SEQ=2*SEQUENCE(N-1)+3*SEQUENCE(N-2) END IF END FUNCTION SEQUENCE END PROGRAM RECFUNCTIONS3
11
Διαδικασίες Οι συναρτήσεις επιστρέφουν ως αποτέλεσμα μια τιμή. Τι γίνεται όμως, αν χρειαζόμαστε παραπάνω από ένα αποτελέσματα ή απλώς μια εκτύπωση ως αποτέλεσμα ; Για παράδειγμα θα μπορούσαμε να εισάγουμε σε ένα υποπρόγραμμα έναν πίνακα Α ως είσοδο και να μη μας επιστρέφει τιμές ως έξοδο, παρά μόνο την εκτύπωση του πίνακα Α. Υπάρχει λοιπόν μια κατηγορία υποπρογραμμάτων που ονομάζονται διαδικασίες, οι οποίες μπορούν να δέχονται ως είσοδο καμία, μία ή περισσότερες μεταβλητές και να έχουν ως έξοδο καμία, μία ή περισσότερες μεταβλητές.
12
Σύνταξη SUBROUTINE name[(λίστα μεταβλητών)] IMPLICIT NONE Τμήμα Δηλώσεων Τμήμα Εκτέλεσης Τμήμα Υποπρογραμμάτων END SUBROUTINE name Η διαδικασία επικοινωνεί με το κυρίως πρόγραμμα μέσo μεταβλητών, τις οποίες και ονομάζουμε τυπικές παραμέτρους (formal arguments). Οι μεταβλητές αυτές ή τυπικοί παράμετροι χωρίζονται σε τρεις κατηγορίες :
13
α) τις μεταβλητές οι οποίες εισάγουν δεδομένα από το κυρίως πρόγραμμα, χωρίς να αλλάζει η τιμή τους μέσα στη διαδικασία, και τις οποίες πρέπει να ορίζουμε μέσα στη διαδικασία μέσo της INTENT(IN), β) τις μεταβλητές οι οποίες εξάγουν αποτελέσματα που υπολογίστηκαν μέσα στη διαδικασία, και τις οποίες πρέπει να ορίζουμε μέσα στη διαδικασία μέσo της INTENT(OUT), γ) τις μεταβλητές οι οποίες εισάγουν δεδομένα από το κυρίως πρόγραμμα, αλλά και επιστρέφουν αποτελέσματα μέσο της διαδικασίας (και συνεπώς αλλάζει η τιμή τους μέσα στη διαδικασία), και τις οποίες πρέπει να ορίζουμε μέσα στη διαδικασία μέσο της INTENT(INOUT).
14
Σε αντίθεση με τις συναρτήσεις, το όνομα της διαδικασίας δε μπορεί να χρησιμοποιηθεί σε υπολογισμούς, παρά μόνο στο κάλεσμα της διαδικασίας. Η διαδικασία καλείται από το κυρίως πρόγραμμα μέσο της εντολής CALL CALL name [(λίστα σταθερών, μεταβλητών ή εκφράσεων)]
15
Παράδειγμα 1 Να γραφεί διαδικασία με το όνομα SWAP, που να μεταθέτει τις τιμές δύο πραγματικών αριθμών Α, Β. PROGRAM SUBROUTINES1 IMPLICIT NONE REAL A,B READ*,A,B CALL SWAP(A,B)
16
PRINT*,A,B CONTAINS SUBROUTINE SWAP(X,Y) IMPLICIT NONE REAL, INTENT(INOUT) :: X,Y REAL S S=X X=Y Y=S END SUBROUTINE SWAP END PROGRAM SUBROUTINES1
17
Παράδειγμα 2 Να γραφούν δύο διαδικασίες, μια που θα διαβάζει και μια που θα εκτυπώνει έναν πραγματικό ΝxΜ πίνακα. PROGRAM SUBROUTINES2 IMPLICIT NONE REAL, ALLOCATABLE :: X(:,:) INTEGER K,L PRINT*,’GIVE DIMENSIONS =’ READ*, K,L ALLOCATE ( X(K,L) ) CALL READMATRIX(X,K,L) CALL PRINTMATRIX(X,K,L)
18
CONTAINS SUBROUTINE READMATRIX(A,N,M) IMPLICIT NONE INTEGER, INTENT(IN) :: N,M REAL, INTENT(INOUT) :: A(N,M) INTEGER I,J READ*, ((A(I,J),J=1,M),I=1,N) END SUBROUTINE READMATRIX
19
SUBROUTINE PRINTMATRIX(A,N,M) IMPLICIT NONE INTEGER, INTENT(IN) :: N,M REAL, INTENT(IN) :: A(N,M) INTEGER I,J DO I=1,N DO J=1,M WRITE(*,10) A(I,J) 10 FORMAT(F7.2\) END DO PRINT* END DO END SUBROUTINE PRINTMATRIX END PROGRAM SUBROUTINES2
20
Αναδρομικές διαδικασίες Παράδειγμα 1 Να γραφεί αναδρομική διαδικασία για τον υπολογισμό του Ν!. PROGRAM RECSUBS1 IMPLICIT NONE INTEGER N,F READ*,N CALL FACTORIAL(N,F) PRINT*,F CONTAINS
21
RECURSIVE SUBROUTINE FACTORIAL(N,P) IMPLICIT NONE INTEGER, INTENT(IN):: N INTEGER, INTENT(INOUT):: P IF (N==0) THEN P=1 ELSE CALL FACTORIAL(N-1,P) P=P*N END IF END SUBROUTINE FACTORIAL END PROGRAM RECSUBS2
22
Παράδειγμα 2 Να γραφεί πρόγραμμα το οποίο με την βοήθεια αναδρομικής διαδικασίας θα υπολογίζει το για n m.
23
PROGRAM RECSUBS2 IMPLICIT NONE INTEGER N,Μ,F 10READ*,N,Μ IF ((N<M).OR.(N<=0).OR.(M<=0)) THEN PRINT*, ‘ERROR’ GOTO 10 ELSE CALL ΒΙFACTORIAL(N,Μ,F) END IF PRINT*,F CONTAINS
24
RECURSIVE SUBROUTINE FACTORIAL(N,P) IMPLICIT NONE INTEGER, INTENT(IN):: N INTEGER, INTENT(INOUT):: P IF (N==1) THEN P=1 ELSE CALL FACTORIAL(N-1,P) P=P*N END IF END SUBROUTINE FACTORIAL
25
SUBROUTINE BIFACTORIAL(N,M,F) IMPLICIT NONE INTEGER, INTENT(IN):: N,M INTEGER, INTENT(OUT) :: F INTEGER P1,P2,P3 CALL FACTORIAL(N,P1) CALL FACTORIAL(M,P2) CALL FACTORIAL(N-M,P3) F=P1/(P2*P3) END SUBROUTINE BIFACTORIAL END PROGRAM RECSUBS2
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.