Μετάβαση στο περιεχόμενο
Topos Uranos

Περίληψη

Αυτό το μάθημα κλείνει την πέμπτη ενότητα του κύκλου μαθημάτων, αφιερωμένη στις συναρτήσεις. Ανασυνθέτει την αλυσίδα των εννοιών που οδηγεί από τη δήλωση μιας συνάρτησης στην αναδρομή, περνώντας από τη στοίβα κλήσεων, τη σύμβαση, τη μεταβίβαση των παραμέτρων, την εμβέλεια και τη διάρκεια ζωής των μεταβλητών και τον σχεδιασμό με σταδιακή εκλέπτυνση· ξεχωρίζει όσα από αυτά ισχύουν σε κάθε γλώσσα από όσα είναι ίδια της C++· συγκεντρώνει την απροσδιόριστη συμπεριφορά της ενότητας, μαζί με όσα προειδοποιεί ο μεταγλωττιστής, όσα σταματά ο ανιχνευτής και όσα δεν επισημαίνει κανείς· επαναλαμβάνει στην τελική του αξιολόγηση τις δεξιότητες της αρχικής· και τελειώνει με έξι προκλήσεις που συνδυάζουν ολόκληρη την ενότητα.

Μαθησιακοί στόχοι

  1. Να αναλύουμε ένα πρόβλημα σε συναρτήσεις, την καθεμία με τη διεπαφή της και τη σύμβασή της (προσυνθήκη και μετασυνθήκη), και να τις δοκιμάζουμε χωριστά.
  2. Να επιλέγουμε τον τρόπο μεταβίβασης κάθε παραμέτρου και τον τρόπο επιστροφής των αποτελεσμάτων, και να αιτιολογούμε την επιλογή.
  3. Να λύνουμε ένα πρόβλημα με αναδρομή και να αποδεικνύουμε την ορθότητά της με επαγωγή και τον τερματισμό της με ένα μέτρο που φθίνει, εκτιμώντας το κόστος της σε κλήσεις.
  4. Να αναγνωρίζουμε την απροσδιόριστη συμπεριφορά της ενότητας (τη διαδρομή χωρίς return, την ξεκρέμαστη αναφορά, το αποτέλεσμα που υπερχειλίζει, την εξαντλημένη στοίβα) και να ξαναγράφουμε το πρόγραμμα χωρίς αυτήν.
  5. Να ξεχωρίζουμε, σε όσα μάθαμε στην ενότητα, όσα ισχύουν σε κάθε γλώσσα από όσα είναι ίδια της C++.

Όσα πέτυχε η ενότητα

Η ενότητα έθεσε ως σκοπό να διδάξει πώς αναλύεται ένα πρόβλημα σε μέρη με όνομα, το καθένα με διεπαφή και σύμβαση, και πώς λύνονται προβλήματα με αναδρομή. Ο σκοπός εκπληρώθηκε στηριγμένος μόνο σε όσα η εισαγωγή δήλωσε γνωστά: τους βρόχους της ενότητας 4, με την αναλλοίωτη και τη φθίνουσα ποσότητά τους, την προδιαγραφή του μαθήματος 1.1 και το μοντέλο της μνήμης της ενότητας 2. Το πρόγραμμα των φίλιων αριθμών, του οποίου ο αντιγραμμένος βρόχος άθροιζε τους διαιρέτες του λάθος αριθμού, γράφεται τώρα με μία μόνο συνάρτηση, επαληθευμένη μία φορά απέναντι στη σύμβασή της.

Συναρτήσεις

Το μάθημα Συναρτήσεις δίδαξε πώς δηλώνεται, ορίζεται και καλείται μια συνάρτηση, και ξεχώρισε τρεις στιγμές: κατά τη μεταγλώττιση, κάθε κλήση ελέγχεται απέναντι σε μια δήλωση που προηγήθηκε· κατά τη σύνδεση, αναζητείται ο ορισμός· κατά την εκτέλεση, υπολογίζονται τα ορίσματα, δημιουργείται ένα πλαίσιο στη στοίβα κλήσεων και ο έλεγχος μεταβαίνει στο σώμα. Έδειξε ότι το να φτάσει η ροή στο τέλος μιας συνάρτησης που δεν είναι void χωρίς return είναι απροσδιόριστη συμπεριφορά, και έκλεισε με τη σύμβαση, την προσυνθήκη και τη μετασυνθήκη, που μοιράζει τις ευθύνες ανάμεσα σε όποιον καλεί και στη συνάρτηση.

Παράμετροι και εμβέλεια

Το μάθημα Παράμετροι και εμβέλεια μελέτησε από ποιους δρόμους μπαίνουν τα δεδομένα και βγαίνουν τα αποτελέσματα: η παράμετρος με τιμή είναι ένα αντίγραφο· η παράμετρος με αναφορά, ένα δεύτερο όνομα για το κελί του καλούντος· η σταθερή αναφορά διαβάζει χωρίς να αντιγράφει. Από αυτό έπεται ο κανόνας επιλογής (τιμή για τα μικρά, σταθερή αναφορά για τα μεγάλα που μόνο διαβάζονται, αναφορά μόνο αν σκοπός είναι η τροποποίηση) και, για περισσότερα αποτελέσματα, οι std::pair και std::tuple με δομημένες δεσμεύσεις. Διέκρινε την εμβέλεια ενός ονόματος, ιδιότητα του κειμένου, από τη διάρκεια ζωής μιας μεταβλητής, ιδιότητα της εκτέλεσης, και τελείωσε με την αναφορά που επιζεί του κελιού της.

Σχεδίαση με συναρτήσεις

Το μάθημα Σχεδίαση με συναρτήσεις δίδαξε πώς αποφασίζουμε ποιες συναρτήσεις θα γράψουμε, με σταδιακή εκλέπτυνση: μια σύντομη main που καλεί συναρτήσεις οι οποίες έχουν μόνο δηλωθεί, και η κάθοδος σε καθεμία, έτσι ώστε η αποσύνθεση να σχεδιάζεται σαν δέντρο. Έθεσε τα κριτήρια μιας καλής διεπαφής και τον κανόνα «μία συνάρτηση, μία εργασία», με τις ενδείξεις του (ο σύνδεσμος στο όνομα, η συνάρτηση που δεν χωράει σε μια οθόνη, η σημαία) και τις κρυφές επιδράσεις, όπως η καθολική μεταβλητή· παρουσίασε την υπερφόρτωση, με τη σειρά προτίμησής της και τη διφορούμενη κλήση· και ξανάγραψε τους αλγορίθμους της ενότητας 4 ως συναρτήσεις δοκιμασμένες χωριστά.

Αναδρομή

Το μάθημα Αναδρομή δίδαξε ότι μια συνάρτηση μπορεί να καλεί τον εαυτό της για να λύσει ένα μικρότερο στιγμιότυπο του προβλήματος. Απέδειξε την ορθότητα με επαγωγή, υποθέτοντας σωστή τη μικρότερη κλήση, και τον τερματισμό με ένα φυσικό μέτρο που φθίνει· παρακολούθησε με τη στοίβα τα πλαίσια που στοιβάζονται και αναιρούνται, και έδειξε πώς εξαντλείται· προειδοποίησε ότι ο τύπος του αποτελέσματος υπερχειλίζει πολύ πριν από τη στοίβα· και σύγκρινε τον αναδρομικό και τον επαναληπτικό Φιμπονάτσι: 2 692 5372\,692\,537 κλήσεις έναντι 29 προσθέσεων για τον F30F_{30}.