Δομή προγράμματος στη 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=constant, name2=constant, ) ή Τύπος δεδομ., PARAMETER:: name1=constant, Παράδειγμα: 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 test_print print*, "This is my first program in Fortran.& & It is really simple! " end program test_print Αποτέλεσμα: This is my first program in Fortran. It is really simple!
Πως θα τυπώσουμε αυτές δύο προτάσεις σε ξεχωριστές γραμμές; program test_print print*,"this is my first program in Fortran." print*, "It is really simple! " end program test_print
Τι αποτελέσματα θα έχει το πρόγραμμα; program test_print print*,"this is my first program in Fortran." print* print*, "It is really simple!" end program test_print Αποτέλεσμα: 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! P=(½)*(A+B+C) error 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*, " Assign 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*, " Assign values to A: " READ*,A PRINT*, " Assign values to B: " READ*,B PRINT*, " Assign 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 m, λίστα μεταβλητών ή Η εντολή εισόδου READ με FORMAT 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 n κενοί χαρακτήρες Iw Fw.d w θέσεις για ακέραιο αριθμό w θέσεις για πραγματικό αριθμό από τις οποίες d θέσεις για δεκαδικά. Ew.d Dw.d w θέσεις για πραγματικό αριθμό κινητής υποδιαστολής (εκθετική μορφή) από τις οποίες d θέσεις για δεκαδικά. w θέσεις για πραγματικό αριθμό διπλής ακρίβειας από τις οποίες d θέσεις για δεκαδικά ( εκθετική μορφή ) Aw Lw w θέσεις για αλυσίδα χαρακτήρων w θέσεις για λογικούς χαρακτήρες
Παράδειγμα: Αν θέλουμε το πρόγραμμα μας να διαβάζει και να τυπώνει αυτή την έκφραση (αριθμεί με χαρακτήρες) 19-12 - 1 9 9 5 ή 19 / 12 / 1 9 9 5 I2,A1,I2,A1,I4 πρέπει να χρησιμοποιήσουμε αυτή την εντολή μέσα στο πρόγραμμα 10 FORMAT(I2,A1,I2,A1,I4)
Άσκηση 3 Να γράψετε πρόγραμμα που ζητάει από τον χρήστη την ημέρα, το μήνα και το χρόνο γέννηση του και μετά τους τυπώνει.
program inout implicit none integer::d,m,y character::a1,a2 print*,"grapste tin imera genisi sas:" read(*,10) d,a1,m,a2,y 10 format(i2,a1,i2,a1,i4) print*,"-------------------------------------" print*,"imeromenia genisi sas einai:" write(*,10) d,a1,m,a1,y end program inout παράδειγμα : 19-12-1995 ( ή 19/12/1995 )