Περίληψη
Ως εδώ κάθε πρόγραμμα του κύκλου ήταν ένα μόνο μπλοκ, η main, όπου όλα γράφονται εκεί όπου χρησιμοποιούνται. Αυτό το μάθημα διδάσκει πώς δίνουμε όνομα σε ένα μέρος ενός προγράμματος και πώς το χρησιμοποιούμε χωρίς να κοιτάμε το εσωτερικό του: τη συνάρτηση. Μελετώνται η δήλωση, που ανακοινώνει στον μεταγλωττιστή το όνομα, τον τύπο επιστροφής και τις παραμέτρους· ο ορισμός, που προσθέτει το σώμα· και η κλήση, που περνά τον έλεγχο σε αυτό το σώμα και λαμβάνει την επιστρεφόμενη τιμή. Διακρίνεται αυτό που ελέγχει ο μεταγλωττιστής κατά τη μεταγλώττιση (ότι κάθε κλήση συμφωνεί με μια δήλωση) από αυτό που συμβαίνει κατά την εκτέλεση (το άλμα στον ορισμό και η επιστροφή). Εξηγείται γιατί η άφιξη στο τέλος μιας συνάρτησης που πρέπει να επιστρέψει τιμή χωρίς return είναι απροσδιόριστη συμπεριφορά. Η εκτέλεση παρακολουθείται με τη στοίβα κλήσεων, που κρατά ένα πλαίσιο για κάθε κλήση σε εξέλιξη. Και κάθε συνάρτηση προσδιορίζεται με μια σύμβαση, την προσυνθήκη και τη μετασυνθήκη της, που λέει τι απαιτεί η συνάρτηση από όποιον την καλεί και τι εγγυάται σε αντάλλαγμα.
Μαθησιακοί στόχοι
- Να δηλώνονται, να ορίζονται και να καλούνται συναρτήσεις με παραμέτρους και επιστρεφόμενη τιμή, και να επισημαίνεται σε ένα πρόγραμμα ποιο μέρος είναι η δήλωση και ποιο ο ορισμός.
- Να παρακολουθείται με ένα διάγραμμα της στοίβας κλήσεων η εκτέλεση ενός προγράμματος με συναρτήσεις που καλούν η μία την άλλη.
- Να προσδιορίζεται μια συνάρτηση με την προσυνθήκη και τη μετασυνθήκη της, και να γράφεται μια κλήση που παραβιάζει την προσυνθήκη.
- Να εξηγείται γιατί μια συνάρτηση που δεν επιστρέφει τιμή σε κάποια διαδρομή είναι απροσδιόριστη συμπεριφορά, και να αναγνωρίζεται η αντίστοιχη προειδοποίηση του μεταγλωττιστή.
Γιατί συναρτήσεις
Τα προγράμματα της ενότητας που προηγήθηκε έλυναν κάθε πρόβλημα μέσα στη main, και αυτό αρκούσε όσο τα προβλήματα ήταν μικρά. Ωστόσο, μόλις ένα πρόγραμμα μεγαλώσει, εμφανίζονται τρεις δυσκολίες. Η πρώτη είναι η επανάληψη: αν ο ίδιος υπολογισμός χρειάζεται σε τρία σημεία, γράφεται τρεις φορές, και ένα σφάλμα του διορθώνεται τρεις φορές (ή ξεχνάμε να το διορθώσουμε σε ένα από αυτά). Η δεύτερη είναι η ανάγνωση: ένα μπλοκ πενήντα γραμμών δεν λέει τι κάνει, αλλά πώς το κάνει, και ο αναγνώστης πρέπει να ανασυνθέσει την πρόθεση από τον μηχανισμό. Η τρίτη είναι η δοκιμή: αν όλα είναι ανακατεμένα, δεν υπάρχει τρόπος να ελεγχθεί ένα μέρος χωρίς να εκτελεστεί το υπόλοιπο.
Μια συνάρτηση είναι ένα κομμάτι προγράμματος με όνομα, που δέχεται δεδομένα, τα οποία ονομάζονται παράμετροι, και παραδίδει ένα αποτέλεσμα, που ονομάζεται επιστρεφόμενη τιμή. Τα μαθηματικά γνωρίζουν την ιδέα εδώ και αιώνες: η απόσταση δύο σημείων του επιπέδου είναι συνάρτηση των τεσσάρων συντεταγμένων τους, , και όποιος υπολογίζει την περίμετρο ενός τριγώνου δεν επαναλαμβάνει τον τύπο τρεις φορές, αλλά τον ονομάζει και τον εφαρμόζει τρεις φορές. Στη C++ γράφεται το ίδιο πράγμα.
Το πρόγραμμα διαβάζει τις συντεταγμένες των τριών κορυφών ενός τριγώνου και γράφει την περίμετρό του, δηλαδή το άθροισμα των μηκών των τριών πλευρών του.
#include <cmath>#include <iostream>#include <print>// Απόσταση των σημείων (x1, y1) και (x2, y2).double distance(double x1, double y1, double x2, double y2){ const double dx{x2 - x1}; const double dy{y2 - y1}; return std::sqrt(dx * dx + dy * dy);}int main(){ double ax{}; double ay{}; double bx{}; double by{}; double cx{}; double cy{}; std::cin >> ax >> ay >> bx >> by >> cx >> cy; const double perimeter{distance(ax, ay, bx, by) + distance(bx, by, cx, cy) + distance(cx, cy, ax, ay)}; std::println("Περίμετρος: {}", perimeter);}0 0 3 0 0 4Περίμετρος: 12Οι πλευρές του τριγώνου με κορυφές , και έχουν μήκη 3, 5 και 4, και το άθροισμά τους είναι 12.
Η συνάρτηση distance γράφεται μία φορά και χρησιμοποιείται τρεις· η main διαβάζεται σαν τον ορισμό της περιμέτρου, «το άθροισμα τριών αποστάσεων»· και η distance μπορεί να δοκιμαστεί μόνη της, με ένα ζεύγος σημείων των οποίων η απόσταση είναι γνωστή. Κερδίζονται έτσι και τα τρία που έλειπαν. Το γενικό δίδαγμα, που ισχύει σε κάθε γλώσσα, είναι ότι μια συνάρτηση ονομάζει μια ιδέα: όποιος τη χρησιμοποιεί σκέφτεται τι κάνει, όχι πώς το κάνει. Αυτός ο διαχωρισμός της χρήσης από την υλοποίηση ονομάζεται διαδικαστική αφαίρεση, και είναι το θέμα όλης της ενότητας.
Φόρτωση του περιεχομένου…
Ολοκληρώθηκε
Συνδεθείτε για να αποθηκεύσετε την πρόοδό σας