Δομή προγράμματος στη Fortran Ένα πρόγραμμα γραμμένο σε Fortran αποτελείται από: Την επικεφαλίδα του προγράμματος. Το τμήμα των δηλώσεων. Το τμήμα των προτάσεων (εντολών). Το τμήμα των υποπρογραμμάτων. (Συναρτήσεις FUNCTION, Διαδικασίες SUBROUTINE)
[PROGRAM Όνομα Προγράμματος] IMPLICIT NONE! Δηλώσεις μεταβλητών! Εκτελέσιμες εντολές! END [PROGRAM [Όνομα Προγράμματος]]
Επικεφαλίδα PROGRAM όνομα προγράμματος...... END PROGRAM όνομα προγράμματος
Κατηγορίες δεδομένων Σταθερές. Αυτά που έχουν σταθερή τιμή κατά τη διάρκεια εκτέλεσης του προγράμματος. Οι σταθερές χωρίζονται σε δύο κατηγορίες : α) στις σταθερές χωρίς όνομα π.χ. στην έκφραση 3.14*R**2 το 3.14 αποτελεί μια σταθερά χωρίς όνομα, και β) στις σταθερές με όνομα που τις δηλώνουμε στην αρχή του προγράμματος π.χ. PI*R**2 όπου στην αρχή του προγράμματος δηλώσαμε τη σταθερά PI=3.14. Μεταβλητές. Αυτά που η τιμή τους μεταβάλλεται κατά τη διάρκεια εκτέλεσης του προγράμματος.
Τμήμα δηλώσεων Περιοχή σταθερών: PARAMETER (name1=const, name2=const, ) ή Τύπος δεδομ., PARAMETER:: name1=const, Παράδειγμα: PARAMETER (PI=3.14159,G=9.81) REAL, PARAMETER :: PI=3.14, G=9.81
Περιοχή μεταβλητών: Στην περίπτωση που δεν ορίσουμε τον τύπο των δεδομένων που θα δέχονται οι μεταβλητές μας, τότε αυτές θα ορίζονται αυτόματα (implicitly) σύμφωνα με το όνομα τους, δηλαδή οι μεταβλητές που το όνομά τους αρχίζει από Ι,J,K,L,M,Ν θα είναι ακέραιες, ενώ οι υπόλοιπες μεταβλητές θα είναι πραγματικές. Προκειμένου να αποφύγουμε αυτόν τον τρόπο ορισμού, θα ξεκινούμε πάντα με την εντολή : IMPLICIT NONE που δηλώνει ότι καμιά μεταβλητή δεν θα οριστεί αυτόματα.
Η δήλωση των μεταβλητών Τύπος δεδομένων (type) :: name1,name2 ή Τύπος δεδομένων (type) name1,name2
INTEGER:: N,I,J INTEGER I, J,K Παραδείγματα: REAL::A,B,C REAL SUM,X1 COMPLEX IA CHARACTER A CHARACTER(10) NAME, SURNAME LOGICAL SELECTION
Το τμήμα των προτάσεων Στο τμήμα αυτό περιέχονται οι εκτελέσιμες προτάσεις του προγράμματος. Αν θέλουμε να συνεχίσουμε στην επόμενη γραμμή, θα πρέπει στο τέλος της γραμμής μας να τοποθετήσουμε το σύμβολο &, το οποίο θα μας οδηγήσει στην επόμενη εκτελέσιμη γραμμή (παραλείπονται οι γραμμές σχολίων). Π.χ. Z=X +Y => Ζ=Χ & & +Υ Μπορούμε να έχουμε παραπάνω από μια εντολές στην ίδια γραμμή αρκεί να τις διαχωρίζουμε με το ερωτηματικό ;. Π.χ. READ*,A,B; Z=A+B
Η εντολές εξόδου PRINT, WRITE PRINT, WRITE PRINT, WRITE χωρίς FORMAT Ο Η/Υ επιλέγει τον τρόπο με τον οποίο θα εκτυπωθούν τα δεδομένα. PRINT, WRITE με FORMAT Με την FORMAT επιλέγουμε τον τρόπο με τον οποίο θέλουμε να εκτυπωθούν τα δεδομένα.
Η εντολές εξόδου PRINT, WRITE χωρίς FORMAT Σύνταξη: PRINT*, λίστα {σταθερών, μεταβλητών ή εκφράσεων} ή WRITE(n,*) λίστα {σταθερών, μεταβλητών ή εκφράσεων} όπου n=*,0 ή 6 που δηλώνει ως μονάδα εξόδου την οθόνη. Παράδειγματα: PRINT*, A=,Α, B=, Β WRITE(6,*) A=,Α, B=,Β WRITE(*,*) A=,Α, B=,Β
Η εντολή εκτύπωσης print Γενική μορφή: print*,a print*,a,b,c, όπου a,b,c, μπορεί να είναι σταθερές (αριθμητικές, χαρακτήρων ή συμβολοσειρές), μεταβλητές ή παραστάσεις της Fortran.
! Ασκηση 1 program testprint print*, This is my first program in Fortran.& & It is really simple! end program testprint Αποτέλεσμα: This is my first program in Fortran. It is really simple!
Πως θα τυπώσουμε τις δύο προτάσεις σε ξεχωριστές σειρές; program testprint print*, This is my first program in Fortran. print*, It is really simple! end program testprint
Tι αποτέλεσμα θα είχε το πρόγραμμα; program testprint print*, This is my first program in Fortran. print* print*, It is really simple! end program testprint Αποτέλεσμα: This is my first program in Fortran. It is really simple!
! Άσκηση 2 Εμβαδόν του τριγώνου PROGRAM EMBADON IMPLICIT NONE REAL::A,B,C,P,S A=3.0 B=4.0 C=5.0 P=(A+B+C)/2.0! error if we writing P=(½)*(A+B+C) S=SQRT(P*(P-A)*(P-B)*(P-C)) PRINT*,'Emvadon=',S END PROGRAM EMBADON
! Είναι δυνατό να καταχωρούμε τιμές σε! μεταβλητές ταυτόχρονα με τη δήλωσή τους PROGRAM EMBADON IMPLICIT NONE REAL::A=3.0,B,C,P,S B=4.0 C=5.0 P=(A+B+C)/2.0 S=SQRT(P*(P-A)*(P-B)*(P-C)) PRINT*,'Emvadon=',S END PROGRAM EMBADON
Με ποιο τρόπο θα κάνουμε το προηγούμενο πρόγραμμα πιο γενικό, ώστε ο χρήστης να δίνει τιμές στις A,B,C, και το πρόγραμμα να επιστρέφει εμβαδον; Χρειαζόμαστε λοιπόν ένα τρόπο με τον οποίο να καθοδηγούμε το πρόγραμμα να ζητάει από το χρήστη τα δεδομένα.
Η εντολή εισόδου READ REΑD READ χωρίς FORMAT Τα δεδομένα δίνονται με κόμμα ή κενό ανάμεσα τους READ με FORMAT Τα δεδομένα δίνονται με προκαθορισμένο τρόπο που ορίζεται από την FORMAT
Η εντολή εισόδου READ χωρίς FORMAT Σύνταξη: READ*, λίστα μεταβλητών ή READ(n,*) λίστα μεταβλητών Όπου n=*,0 ή 5 που δηλώνει ως μονάδα εισόδου το πληκτρολόγιο. Παραδείγματα: READ*, Α, Β READ(*,*) Α,Β READ(0,*) A,B ; READ(5,*) Α,Β
Η εντολή read Γενική μορφή: read*,a read*, a,b,c, όπου a,b,c, είναι μεταβλητές.
! Μιά «πιο φιλική» προς το χρήστη μορφή του! προηγούμενου προγράμματος : PROGRAM EMBADON IMPLICIT NONE REAL::A,B,C,P,S PRINT*, Assigne values to A,B,C READ*,A,B,C P=(A+B+C)/2.0 S=SQRT(P*(P-A)*(P-B)*(P-C)) PRINT*,'Emvadon=',S END PROGRAM EMBADON
! Μια «ακόμη πιο φιλική» προς το χρήστη μορφή του! προηγούμενου προγράμματος : PROGRAM EMBADON IMPLICIT NONE REAL::A,B,C,P,S PRINT*, Assigne values to A: READ*,A PRINT*, Assigne values to B: READ*,B PRINT*, Assigne values to C: READ*,C P=(A+B+C)/2.0 S=SQRT(P*(P-A)*(P-B)*(P-C)) PRINT*,'Emvadon=',S END PROGRAM EMBADON
Η εντολή εισόδου READ με FORMAT Σύνταξη : READ m, λίστα μεταβλητών ή READ(n,m) λίστα μεταβλητών όπου n=*,0 ή 5 που δηλώνει ως μονάδα εισόδου το πληκτρολόγιο, m - ετικέτα (label) (θετικός ακέραιος αριθμός) που δηλώνει τη θέση της FORMAT που αντιστοιχεί στην συγκεκριμένη READ m FORMAT(λίστα από περιγραφές) Παράδειγμα READ 10,A READ(*,10) A 10 FORMAT(F6.2)
Η εντολές εξόδου PRINT, WRITE με FORMAT Σύνταξη : PRINT m, λίστα {σταθερών, μεταβλητών ή εκφράσεων} ή WRITE(n,m) λίστα {σταθερών, μεταβλητών ή εκφράσεων} όπου n=*,0 ή 6 που δηλώνει ως μονάδα εξόδου την οθόνη και m - το label (ετικέτα) (θετικός ακέραιος αριθμός) της FORMAT που συνδέεται με την αντίστοιχη PRINT, WRITE. m FORMAT(λίστα από περιγραφές) Παράδειγμα PRINT 10,A WRITE(*,10) A 10 FORMAT(F6.2)
Χαρακτηριστικά της FORMAT( ) Χαρακτηριστικό nx Iw Fw.d Ew.d Dw.d Περιγραφή n κενοί χαρακτήρες w θέσεις για ακέραιο αριθμό w θέσεις για πραγματικό αριθμό από τις οποίες d θέσεις για δεκαδικά. w θέσεις για πραγματικό κινητής υποδιαστολής (εκθετική μορφή) από τις οποίες d θέσεις για δεκαδικά. w θέσεις για πραγματικό διπλής ακρίβειας από τις οποίες d θέσεις για δεκαδικά. (εκθετική μορφή) Aw Lw w θέσεις για αλυσίδα χαρακτήρων w θέσεις για λογικούς χαρακτήρες
FORMAT(I2,A1,I2,A1,I4) 1 9-1 2-1 9 9 5 I1 I1 I1 A1 I1 I1 A1 I1 I1 I1 I1 1 9 / 1 2 / 1 9 9 5
Άσκηση 3 Να γράψετε πρόγραμμα που ζητάει από τον χρήστη την ημέρα, το μήνα και το χρόνο γέννηση του και μετά τους τυπώνει.
! Άσκηση program inout implicit none integer::d,m,y character::a1,a2 print*,"grapste tin imera genisi sou:" read(*,10) d,a1,m,a2,y 10 format(i2,a1,i2,a1,i4) print*,"-------------------------------------" print*,"imeromenia genisi sou einai:" write(*,10) d,a1,m,a1,y end program inout παράδειγμα : 19-12-1995 ( ή 19/12/1995 )