FORTRAN και Αντικειμενοστραφής Προγραμματισμός Παραδόσεις Μαθήματος 2016 Δρ Γ Παπαλάμπρου Επίκουρος Καθηγητής ΕΜΠ georgepapalambrou@lmentuagr Εργαστήριο Ναυτικής Μηχανολογίας (Κτίριο Λ) Σχολή Ναυπηγών Μηχανολόγων Μηχανικών Εθνικό Μετσοβιο Πολυτεχνείο March 10, 2016 Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Περιεχόμενα ύλης 1 Εισαγωγή στην γλώσσα FORTRAN 2 Απλοί τύποι δεδομένων, σταθερές, μεταβλητές, εκφράσεις, εντολές 3 Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων [Μ3] 4 Σύνθετες δομές δεδομένων: πίνακες, εγγραφές Παραχώρηση μνήμης 5 Μεταφορά δεδομένων, αρχεία εισόδου/εξόδου 6 Στοιχεία μεθοδολογίας προγραμματισμού: αλγόριθμοι, δομές δεδομένων, επανάληψη, αναδρομή, δομημένος προγραμματισμός 7 Φάσεις ανάπτυξης λογισμικού: προδιαγραφές, σχεδίαση, υλοποίηση, επαλήθευση, τεκμηρίωση, συντήρηση προγραμμάτων 8 Αντικειμενοστραφής προγραμματισμός: τύποι δεδομένων, κλάσεις, αντικείμενα, κληρονομικότητα, πολυμορφισμός 9 Διασύνδεση FORTRAN με άλλες γλώσσες (C/C++, MATLAB) Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δομές ελέγχου-εισαγωγή 1 Μέχρι τώρα είδαμε πώς μπορεί να δωθούν δηλώσεις μεταβλητών, εκφράσεις και εντολές και πώς αυτές μπορεί να διαταχθούν για να σχηματίσουν μια ακολουθία κώδικα που εκτελείται βήμα-βήμα 2 Στους περισσότερες υπολογισμούς ωστόσο, αυτή η απλή αλληλουχία των δηλώσεων είναι από μόνη της ανεπαρκής για την επίλυση του προβλήματος 3 Για παράδειγμα, μπορεί να επιθυμούμε να ακολουθηθεί μια δυνατή διαδρομή μέσω ενός τμήματος του κώδικα, ανάλογα με το αν μια υπολογιζόμενη τιμή είναι θετική ή αρνητική 4 Επίσης μπορεί να θέλουμε να αθροίσουμε 1500 στοιχεία ενός πίνακα, οπότε να θέσουμε 1500 εντολές άθροισης είναι παράλογο 5 Προκύπτει λοιπόν η ανάγκη να υπάρχει η δυνατότητα να επαναλαμβάνεται τμήμα εντολών, να περάσει ο έλεγχος από το ένα μέρος προγράμματος σε ένα άλλο, ή και να σταματήσει η επεξεργασία εντελώς Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δομές ελέγχου-εισαγωγή Για αυτούς τους λόγους, η Fortran διαθέτει διάφορες μεθόδους για να καταστεί δυνατή η λογική ροή μέσα από τις δηλώσεις του προγράμματος Η πιο σημαντική μορφή είναι εκείνη ενός τμήματος κώδικα (block), το οποίο ξεκινά με μια αρχική δήλωση λέξη-κλειδί, μπορεί να έχει ενδιάμεσες λέξεις-κλειδιά, και καταλήγει με μια κατάλληλη δήλωση Τα τμήματα αυτά μπορεί να είναι ένθετα, δηλ ένα τμήμα μπορεί να περιέχει ένα άλλο τμήμα, κοκ Η εκτέλεση ενός τέτοιου τμήματος κώδικα ξεκινάει πάντα με την πρώτη του έκφραση Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία βρόχου If Ο βρόχος ελέγχου If περιέχει μία ή περισσότερες αλληλουχίες από εκφράσεις, από όπου το πολύ μια επιλέγεται για εκτέλεση Η γενική μορφή δείχνεται στο Σχήμα 41 Από εδώ και πέρα θα χρησιμοποιούμε αγκύλες για να δείχνουμε προαιρετικά στοιχεία (optional), και θα ακολουθούν τελείες, αν μπορεί να υπάρξει αριθμός από τέτοια στοιχεία Μπορεί να υπάρξει οποιοσδήποτε αριθμός (συμπεριλαμβανομένου του μηδενός ) από else if εκφράσεις και κανένα ή ένα else Η ονοματοδοσία είναι προαιρετική, αλλά ένα else ή else if μπορεί να ονομαστεί μόνο αν το αντίστοιχο if και end if έχει ονομαστεί, και πρέπει να δοθεί το ίδιο όνομα Το όνομα μπορεί να είναι οποιαδήποτε έγκυρο όνομα στην Fortran (θα το δούμε παρακάτω στις ρουτίνες) Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία βρόχου If Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία βρόχου If Ένα παράδειγμα με την απλούστερη μορφή ενός block με if ακολουθεί: swap: if (x < y) then temp = x x = y y = temp end if swap Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία βρόχου If Η επόμενη απλή μορφή έχει ένα μπλοκ else, αλλά όχι else if Έτσι τώρα υπάρχει ένα εναλλακτικό μπλοκ για την περίπτωση όπου η κατάσταση είναι ψευδής Το πρόσημο του x αλλάζει αν το x είναι μικρότερο του y αλλιώς το πρόσημο του y αλλάζει αν το x είναι μεγαλύτερο ή ίσο με το y:! code: test_if if (x < y) then x = -x else y = -y end if Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία βρόχου If: πρόγραμμα test_if Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία βρόχου If: πρόγραμμα test_if Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία βρόχου If-else if Ο πιο γενικός τύπος δημιουργίας if έχει το else if για να δημιουργήσει διαδοχικούς ελέγχους, όπου κάθε ένας συνδέεται με ομάδα από εκφράσεις Οι έλεγχοι γίνονται ο ένας μετά τον άλλο, μέχρι ένας να ικανοποιηθεί, οπότε οι σχετικές εκφράσεις if ή else if εκτελούνται Έπειτα ο έλεγχος περνάει στο τέλος του if, όπου αν κανένας έλεγχος δεν έχει ικανοποιηθεί τότε και κανένα τμήμα προγράμματος δεν έχει εκτελεστεί, εκτός αν υπάρχει μια τελική συνθήκη τύπου «catch -all» μέσω ένος else Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία βρόχου If φωλιάς Επιτρέπεται η δημιουργία if σε μορφή φωλιάς (nested), με το ένα εντός ενός άλλου σε ένα αυθαίρετο βάθος, όπως φαίνεται στην εικόνα του Σχήμα 42 Εδώ βλέπουμε την αναγκαιότητα τοποθέτησης διαστημάτων tab στον κώδικα, προκειμένου να είναι εύκολα κατανοητή η λογική Για ακόμη πιο σύνθετη διάταξη πολλαπλών if, συνιστάται η ονοματοδοσία τους Οι δηλώσεις πρέπει να είναι ένθετες σωστά σε κάθε επίπεδο, ώστε να περιβάλλονται πλήρως απο το επόμενο εξωτερικό ifelse-end if Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία Case Η Fortran παρέχει και άλλο τρόπο για την επιλογή μίας περίπτωσης ανάμεσα σε πολλές άλλες περιπτώσεις, παρόμοιο με εκείνο της δομής if, αυτόν του case Οι κύριες διαφορές μεταξύ των δύο δομών είναι ότι για την περίπτωση του case μόνο μια έκφραση αξιολογείται για έλεγχο και η έκφραση αυτή μπορεί να ανήκει σε όχι περισσότερο από μία σειρά από προκαθορισμένες τιμές Η μορφή ενός case φαίνεται παρακάτω: Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία Case Η έκφραση expr πρέπει να είναι βαθμωτό μέγεθος και τύπου χαρακτήρα, λογικού, ή ακέραιου, και οι καθορισμένες τιμές σε κάθε selector πρέπει να είναι του ίδιο τύπου Στην περίπτωση χαρακτήρα, τα μήκη επιτρέπεται να διαφέρουν, αλλά όχι ο τύπος Η απλούστερη μορφή του selector είναι ένα βαθμωτό μέγεθος σε παρενθέσεις, όπως στην έκφραση case(1) Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία Case Η γενική μορφή του selector είναι μία λίστα από μη επικαλυπτόμενες τιμές, όλες του ίδιου τύπου όπως η expr, μέσα σε παρενθέσεις, όπως case (1, 2, 7, 10:17, 23) Οι τιμές της λίστας προτείνεται να δίνονται με την σειρά, παρότι αυτό δεν είναι υποχρεωτικό Οι τιμές της λίστας δεν επιτρέπεται να είναι επικαλυπτόμενες Οπότε το μέγιστο είναι μόνο ένας selector να επαληθεύεται Στην περίπτωση που κανένας selector δεν επαληθεύεται, ο έλεγχος του προγράμματος περνά στην επόμενη εκτελέσιμη δήλωση μετά το end select Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία Case Η μορφή case default είναι ισοδύναμη με ένα κατάλογο όλων των δυνατών τιμών expr που δεν περιλαμβάνονται στις υπόλοιπες περιπτώσεις των selector Μπορεί να υπάρχει μόνο μία περίπτωση case default σε δομή case Η μορφή case default δεν πρέπει κατ ανάγκη να είναι η τελευταία έκφραση σε μία δομή case Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία βρόχου Do Πολλά προβλήματα στα μαθηματικά απαιτούν την ικανότητα επανάληψης (iteration) Για παράδειγμα αν θέλουμε να αθροίσουμε τα στοιχεία ενός πίνακα a μήκους 10, θα μπορούσαμε να γράψουμε (με κόπο!) sum = a(1) sum = sum+a(2) : sum = sum+a(10) Η Fortran παρέχει την δυνατότητα γνωστή ως δομή do, η οποία επιτρέπει να μειώσουμε τις παραπάνω δέκα γραμμές κώδικα στα εξής sum = 00 do i = 1,10! i is of type integer sum = sum+a(i) end do Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία βρόχου Do Σε αυτό το κομμάτι του κώδικα θέσαμε πρώτα sum=00, και στη συνέχεια το τμήμα μεταξύ των do και end do εκτελέστηκε δέκα φορές Σε κάθε επανάληψη υπάρχει ένας σχετικός δείκτης (i), ο οποίος λαμβάνει την τιμή 1 για την πρώτη επανάληψη του βρόχου, 2 για την δεύτερη και ούτω καθ εξής μέχρι 10 Η μεταβλητή i είναι ακέραια μεταβλητή αλλά υπόκειται στον κανόνα ότι δεν πρέπει να τροποποιηθεί εντός της δομής do-end do Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία βρόχου Do Αν θέλουμε να αθροίσουμε από το τέταρτο ως το ένατο στοιχείο, θα γράψουμε do i = 4, 9, προσδιορίζοντας έτσι την απαιτούμενη πρώτη και τελευταία τιμή του i Αν, εναλλακτικά, θέλουμε να αθροίσουμε τα μονά στοιχεία, θα γράψουμε do i = 1, 9, 2, όπου η τρίτη από τις τρεις παραμέτρους βρόχου, δηλαδή το 2, διευκρινίζει ότι στο i η αύξηση είναι σε βήματα των 2, και όχι στην προκαθορισμένη τιμή του 1, το οποίο υποτίθεται εάν δεν δίνεται τρίτη παράμετρος Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Δημιουργία πολλαπλού βρόχου Do Οποιοσδήποτε αριθμός δομών do μπορεί να είναι ένθετος (nested) Έτσι μπορούμε να γράψουμε ένα πολλαπλασιασμός πινάκων όπως φαίνεται στο Σχήμα 46 Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Η δήλωση go to Μερικές φορές, ειδικά όταν πρόκειται για συνθήκες σφάλματος, οι δομές ελέγχου που μόλις περιγράψαμε μπορεί να είναι ανεπαρκείς για τις ανάγκες του προγραμματιστή Μία λύση είναι η χρήση δήλωσης go to label, όπου label είναι ονομασία σε κάποια εκτελέσιμη εντολή Η δήλωσης go to αποτελεί μία από τις πιό κακές περιπτώσεις εντολής προγραμματισμού Για παράδειγμα έχουμε x = y + 30 go to 4 3 x = x + 20 4 z = x + y Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Η δήλωση go to Βλέπουμε ότι μετά την εκτέλεση της πρώτης δήλωσης εντολής, το πρόγραμμα μεταφέρεται στην τελευταία δήλωση, με ονομασία 4 Η δήλωση με ονομασία 3 παραλήφθηκε και μπορεί να εκτελεστεί μόνο εάν υπάρχει ένας κλάδος προγράμματος προς σε αυτή την εντολή (με αρ 3) κάπου αλλού Εάν μάλιστα μια δήλωση μετά από ένα go to δεν έχει ονομασία (label), το πρόγραμμα δεν μπορεί ποτέ να φτάσει εκεί, δημιουργώντας την περίπτωση dead code, συνήθως ένα σημάδι κακού προγραμματισμού Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Παράδειγμα προγράμματος μετατροπής Μελετήστε το πρόγραμμα του Σχ 47 του βιβλίου Μπορείτε να το εκτελέσετε στο περιβάλλον Plato? Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων
Βιβλιογραφία M Metcalf, J Reid, M Cohen, Modern Fortran Explained, Oxford, 4th Edition, 2011 κεφάλαιο 4: control constructs Γ Παπαλάμπρου - Μάθημα 3 (Μ3) Δομές ελέγχου, συναρτήσεις, διαδικασίες, πέρασμα παραμέτρων